簡體   English   中英

查詢規則的序言順序

[英]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. 

快速解釋一下為什么查詢中規則的順序如此重要的原因。 謝謝。

\\=是一個奇怪的謂詞……它說:“如果兩個參數的統一成功,則失敗;如果統一失敗,則成功”。 因此,由於自由變量與原子的統一總是成功的,所以失敗了。

一旦Ythor統一,則captainAmericathor的統一失敗,因此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謂詞的調用之前, XY都將被充分實例化。

正如鮑里斯(Boris)在回答中所解釋的那樣,使用dif/2謂詞的替代方法具有使上述條款中的目標順序無關緊要的優點。 但是,有一個警告。 dif/2謂詞不是標准謂詞,並非所有Prolog實現都提供它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM