2012-12-16 65 views
2

我想了解序言和明確的語法語法,但我很難理解他們兩個。非常基本的dcg序言語法

我真的想了解如何使用DCG語法...

這裏我有兩個例子:

第一個實際上是在這個論壇上,但有一個額外的問題,另一個問題的代碼:

的代碼是這樣的:

s --> first, operator, second. 
first --> [X]. 
operator --> ['+']. 
second --> [X]. 

當Prolog是問這個,它返回true/false,但我不能爲生命我想出瞭如何實際修改這個「綁定」的值,所以如果被問到s(X,[2,+,2],[])。它會返回第一個值,所以而不是返回true它會說X = 2

無論如何回到實際問題。我在正常序言中有一些規則,這是其中之一;它實際上並沒有做任何事情,只是作爲一個例子。

do(X, Y, [H|T], Sum):- 
    H == 1, %check if H is 1 
    X = H, 
    Y = T, 
    Additional is H+5, 
    Sum is Additional+Additional. 

基本上,我問,如果有人可以翻譯這DCG這樣我就可以嘗試理解DCG的基本語法!我嘗試閱讀一些教程,但我覺得我沒有得到任何明智的...

回答

2

DCG: foo(A1,A2,A3,...,An) - >酒吧。

序言: FOO(A1,A2,A3,...,AN,X,Y): - 巴(X,Y)

所以,s應改爲:

s(X) --> first(X), operator, second. 
first(X) --> [X]. 
operator --> ['+']. 
second --> [X]. 

當然,返回實際結果可能會更好;要做到這一點,你應該這與{}完成DCG子句中封裝序言代碼:

s(Z) --> first(X), operator, second(Y), {Z is X+Y}. 
first(X) --> [X]. 
operator --> ['+']. 
second(X) --> [X]. 

(當然,如果你有更多的運營商,序言代碼不會這麼簡單)。

關於do/4謂詞,它應該是這樣的:

do(X,Y,[H|T],Sum) --> 
    {H == 1, %check if H is 1 
    X = H, 
    Y = T, 
    Additional is H+5, 
    Sum is Additional+Additional}. 

,但我不明白你爲什麼會想這一點。

最後一個提示:建議使用phrase/3而不是在DCG謂詞中添加最後兩個參數。

1

以有意義的方式將do/4轉換爲DCG並不容易。我刪除了「複製」DCG的參數隱藏的論據。

do(Sum) --> 
    [1], %check if H is 1 
    { % braces allow 'normal' Prolog code (but we have no access to 'hidden' arguments) 
    Additional is H+5, 
    Sum is Additional+Additional 
    }. 

編輯對不起,我忘了的H Additional is H+5,,應閱讀Additional is 1+5, ...