2012-12-19 65 views
3

我想了解prolog和dcg的基本語法,但確實很難獲得關於真正基本的東西的正確信息。看看下面的代碼,我基本上只是想實現這樣的事情:序言,非常簡單的dcg語法

Output = te(a, st). 

Code: 
    test(te(X,Y)) --> [X], test2(Y). 
    test2(st(_X)) --> [bonk]. 

    ?- test(Output, [a, bonk],[]). 
    Output = te(a, st(_G6369)). 

只要是我想要做的就是添加單詞「ST」末,和我最接近的方式已經做到了這一點,但不幸的是st跟着一堆廢話,最有可能是因爲單身人士_X。我只是希望我的Output包含這樣的:te(a, st).

+0

通過'phrase/2'調用非終端更安全。因此,您的查詢應該是:'? - phrase(test(Output),[a,bonk])。 – false

+0

+1:閱讀答案很有趣* bonk * – CapelliC

回答

2

如果你想接受的形式[Term, bonk]的輸入,並獲得te(Term,st)你應該改變test/2接受邦克返回st

test(te(X,Y)) --> [X], test2(Y). 
test2(st) --> [bonk]. 


?- test(Output, [a, bonk],[]). 
Output = te(a, st). 
+0

現在我確實感到很傻!我可以發誓我沒有任何爭論,事實上,這幾乎是我來到這裏來Stackoverflow的唯一原因!當我自己嘗試時,我一定犯了一些錯誤,因爲正如這裏解釋的解決方案一樣,它確實有效。 – Deragon

1

正如你所說,ST由於_X(基本上,_G6369是變量的內部「名稱」,並且由於該變量保持無實際意義,所以prolog顯示它;「print(X), X=3, print(X).

「 」

無論如何,你可以簡單地刪除(_X),因爲你可以有你想要作爲參數什麼:

test(te(X,Y)) --> [X], test2(Y). 
test2(st) --> [bonk]. 

當然,如果你實際上並沒有在你的輸入bonk的,你只是想添加一個st在最後,你可以把它簡化更:

test(te(X,st)) --> [X]. 

或者,如果你有bonk的:

test(te(X,st)) --> [X,bonk]. 

網絡最後,通常建議使用phrase/3phrase/2而不是手動添加參數。