在以下教程中:http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/7_3.html
有一部分:
test_parser :- repeat,
write('?? '),
read_line(X),
( c(F,X,[]) | q(F,X,[]) ),
nl, write(X), nl, write(F), nl, fail.
Run Code Online (Sandbox Code Playgroud)
现在我对c(F,X,[])和q(F,X,[])部分非常困惑,因为它似乎与我见过的任何东西都不匹配,c只从一个参数中得到一个参数我可以说,这些参数似乎对q没有意义.请帮我理解这里发生了什么.
c // 1和 q // 1是下面定义的Definite Clauses Grammar的入口点(也就是顶级生产),你会发现
c(F) --> ....
q(F) --> ....
Run Code Online (Sandbox Code Playgroud)
不建议在DCG入口点上使用这种"调用"样式,通常最好调用短语(Grammar,TextToAnalyze,TextAfterAnalysis),在这种情况下phrase((c(F) ; q(F)), "some text", "")...
该-->操作通常是重写加入2个参数,这是你关注的原因.
编辑
即
c(L) --> lead_in,arrange(L),end.
被重写为
c(L,X,Y) :- lead_in(X,X1),arrange(L,X1,X2),end(X2,Y).