2
您好,我是Prolog新手,有些事情只是讓我困惑。更改謂詞變化結果中參數的順序
所以我有事實的這個名單和predecate:
parent(gerlinde,mark).
parent(gerlinde,lena).
.
.
(and so on)
female(gerlinde).
.
.
(and so on)
male(mark).
sister(S,X) :- parent(F,S),parent(F,X),male(F),
parent(M,S),parent(M,X),female(M),female(S),S\==X.
所以,如果我做-sister(S,X)?沒有答案S是她自己的姐姐(S = X),我得到的答案是正確的。但是,如果我改變這樣的順序:
sister(S,X) :- S\==X,parent(F,S),parent(F,X),male(F),
parent(M,S),parent(M,X),female(M),female(S).
或類似的:
sister(S,X) :- parent(F,S),S\==X,parent(F,X),male(F),
parent(M,S),parent(M,X),female(M),female(S).
然後我突然得到答案S = X了。那麼爲什麼會這樣呢?根據我的理解,兩個謂詞之間應該沒有區別。
您可以試着瞭解使用調試器的行爲。在查詢之前輸入'? - trace.',並觀察Prolog對程序評估的看法... – CapelliC
好吧,我已經完成了,但它仍然讓我困惑。 Aksing?-sister(S,eve)起初都是通過很多步驟來做同樣的事情,直到他們都打電話給女性(前夕)。在這兩個版本中,後面跟着exit:female(eve),但不正確的版本然後結束exit:sister(eve,eve),而正確的則表示重做:parent(x,eve)會執行一些步驟,然後結束失敗:姐姐(_131111,夏娃)。在這兩個版本中,我找不到一個步驟,指示Prolog檢查S的身份,並在所有前夕 –
在序言提示符處,您應該使用實例化的參數或不同的「(==)/ 2」不。例如,如果你這樣做了,'X = 1,X \ == 2',它顯然會失敗。但是如果你沒有用'X'統一一個值,'X \ == 2'的結果是什麼?它成功還是失敗?然後用'(\ =)/ 2':'X \ = 2'來嘗試,而不用統一'X'。這是成功還是失敗?你會開始理解'\ =='與'\ ='的含義,它解釋了爲什麼你的結果是不同的。 @CapelliC試圖讓你用'trace'來看看。 :) – lurker