2

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

4

2 回答 2

6

c//1q//1是下面定义的定句语法的入口点(也称为顶级生产),您可以在其中找到

c(F) --> ....
q(F) --> ....

不鼓励在 DCG 入口点上使用这种“调用”样式,在这种情况下,通常最好调用短语(Grammar, TextToAnalyze, TextAfterAnalysis)phrase((c(F) ; q(F)), "some text", "")...

运算符通常被-->重写添加 2 个参数,这是您担心的原因。

编辑

IE c(L) --> lead_in,arrange(L),end.

被重写为

c(L,X,Y) :- lead_in(X,X1),arrange(L,X1,X2),end(X2,Y).

于 2012-01-31T19:26:32.407 回答
2

c用 定义-->,实际上添加了两个隐藏参数。其中第一个是要由语法规则解析的列表;第二个是解析后的“剩下的”。c(F,X,[])调用c列表X以获得结果F,期望[]被留下,即解析器应该消耗整个列表X

于 2012-01-31T20:08:27.030 回答