Prolog谓词呼唤

时间:2012-01-31 19:17:38

标签: prolog dcg

在以下教程中: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没有意义。请帮助我了解这里发生了什么。

2 个答案:

答案 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} }}