2012-01-31 113 views
2

在下面的教程:http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/7_3.htmlProlog的謂詞主叫

有部分:

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

c-->,這實際上增加了兩個隱藏的參數來定義它。第一個是由語法規則解析的列表;第二個是解析後的「剩下的」。 c(F,X,[])在列表X上調用c以獲得結果F,期望[]被留下,即解析器應該消耗整個列表X

6

Ç// 1q // 1是定條款如下語法定義,你找到

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

「呼」的這種風格的入口點(又名頂級製作)在DCG入口點氣餒,通常是更好地調用短語(語法,TextToAnalyze,TextAfterAnalysis),在這種情況下phrase((c(F) ; q(F)), "some text", "")...

-->運營商通常是rewritte ñ添加2個參數,這是你關心的原因。

編輯

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

改寫爲

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

+0

這並沒有幫助我理解q(F,X,[])的含義。有沒有其他方法可以嘗試解釋你想說的話? – csteifel 2012-01-31 19:37:59