在以下教程中: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.
现在我对c(F,X,[])和q(F,X,[])部分非常困惑,因为它似乎与我见过的任何东西都不匹配,c只需要一个我可以告诉参数,这些参数似乎对q没有意义。请帮助我了解这里发生了什么。
答案 0 :(得分:6)
c // 1 和 q // 1 是下面定义的Definite Clauses Grammar的入口点(也就是顶级制作),您可以在其中找到
c(F) --> ....
q(F) --> ....
不建议在DCG入口点上使用这种“调用”样式,通常最好调用短语(语法,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).
答案 1 :(得分:2)
c
定义为-->
,实际上会为其添加两个隐藏的参数。第一个是由语法规则解析的列表;第二个是"剩下的"解析后。 c(F,X,[])
在列表c
上调用X
以获取结果F
,期望保留[]
,即解析器应使用整个列表{{1} }}