Prolog谓词呼唤

cst*_*fel 2 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.
Run Code Online (Sandbox Code Playgroud)

现在我对c(F,X,[])和q(F,X,[])部分非常困惑,因为它似乎与我见过的任何东西都不匹配,c只从一个参数中得到一个参数我可以说,这些参数似乎对q没有意义.请帮我理解这里发生了什么.

Cap*_*liC 6

c // 1q // 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).