[英]Prolog order of query rules
序言問題:剛開始學習序言,這是我們得到的一項實踐測驗。
avenger(thor).
avenger(captainAmerica).
sibling(thor,loki).
asgardian(thor).
asgardian(X) :- sibling(Y,X),asgardian(Y).
train1(X,Y) :- avenger(X),!,avenger(Y).
train2(X,Y) :- avenger(X),X\=Y,avenger(Y).
train2(A, captainAmerica). %returns A=thor.
train2(captainAmerica, A). %returns false.
我的問題是關於第二個查詢。 為什么不返回A = thor。 ? 我有點亂了,如果我將train2更改為
train2(X,Y) :- avenger(X),avenger(Y),X\=Y.
當我運行第二個查詢時
A=thor.
快速解釋一下為什么查詢中規則的順序如此重要的原因。 謝謝。
\\=
是一個奇怪的謂詞……它說:“如果兩個參數的統一成功,則失敗;如果統一失敗,則成功”。 因此,由於自由變量與原子的統一總是成功的,所以失敗了。
一旦Y
與thor
統一,則captainAmerica
與thor
的統一失敗,因此X \\= Y
成功。
無論如何,在這種情況下,您不應使用\\=
。 而是使用dif/2
。 嘗試弄亂定義為的謂詞:
train3(X, Y) :-
dif(X, Y),
avenger(X),
avenger(Y).
在幾個方面都比其他兩個更好。 您可以使用dif/2
搜索其他問題。
當其參數不統一時, \\=/2
標准謂詞為true。 因此,它要求綁定兩個參數(即不是變量)才有意義。 您的解決方案:
train2(X,Y) :- avenger(X), avenger(Y), X \= Y.
是正確的,因為對avenger/1
謂詞的兩個進行中的調用確保在對\\=/2
謂詞的調用之前, X
和Y
都將被充分實例化。
正如鮑里斯(Boris)在回答中所解釋的那樣,使用dif/2
謂詞的替代方法具有使上述條款中的目標順序無關緊要的優點。 但是,有一個警告。 dif/2
謂詞不是標准謂詞,並非所有Prolog實現都提供它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.