2015-10-19 60 views
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了。那麼爲什麼會這樣呢?根據我的理解,兩個謂詞之間應該沒有區別。

+1

您可以試着瞭解使用調試器的行爲。在查詢之前輸入'? - trace.',並觀察Prolog對程序評估的看法... – CapelliC

+0

好吧,我已經完成了,但它仍然讓我困惑。 Aksing?-sister(S,eve)起初都是通過很多步驟來做同樣的事情,直到他們都打電話給女性(前夕)。在這兩個版本中,後面跟着exit:female(eve),但不正確的版本然後結束exit:sister(eve,eve),而正確的則表示重做:parent(x,eve)會執行一些步驟,然後結束失敗:姐姐(_131111,夏娃)。在這兩個版本中,我找不到一個步驟,指示Prolog檢查S的身份,並在所有前夕 –

+0

在序言提示符處,您應該使用實例化的參數或不同的「(==)/ 2」不。例如,如果你這樣做了,'X = 1,X \ == 2',它顯然會失敗。但是如果你沒有用'X'統一一個值,'X \ == 2'的結果是什麼?它成功還是失敗?然後用'(\ =)/ 2':'X \ = 2'來嘗試,而不用統一'X'。這是成功還是失敗?你會開始理解'\ =='與'\ ='的含義,它解釋了爲什麼你的結果是不同的。 @CapelliC試圖讓你用'trace'來看看。 :) – lurker

回答

0

這是因爲X\==S\+X == S相同,而\+T意味着'T不能證明'。所以,在你的第二個謂語:

sister(S,X) :- S\==X,parent(F,S),parent(F,X),male(F), 
       parent(M,S),parent(M,X),female(M),female(S). 

S\==X被調用時,都小號X是變量。因此,'不能證明'S == X和這個目標成功。

然後,作爲謂詞繼續評估,parent(F,S)將接地S - 在您的情況下,mark。 然後,parent(F,X)將再次接地X - 至markSX不同,這再也不需要了。當然,由於S = X = mark謂詞失敗,因爲mark不是女性(female(S)失敗)。但不是lena;她將確實是她自己的妹妹。