我在理解為什么我的序言中的代碼為什么會根據我放置規則的順序執行某些操作時遇到麻煩。這是我的數據庫:parent(tom, bob).parent(tom, liz).parent(mary, bob).parent(mary, liz).male(tom).male(bob).female(mary).female(liz).以下是規則:%difference(X, Y) ==> Predicate to check if two people X and Y are not the same person.difference(X, Y) :- \==(X, Y).father(X, Y) :- male(X), parent(X, Y), difference(X, Y).mother(X, Y) :- female(X), parent(X, Y), difference(X, Y).sibling(X, Y) :- difference(X, Y), mother(M, X), mother(M, Y), father(F, X), father(F, Y).問題是當我這樣做時?- sibling(bob, X).我懂了X = bob ;X = liz ;false.但是當我更改順序時(我在最后部分放了差(X,Y))sibling(X, Y) :- mother(M, X), mother(M, Y), father(F, X), father(F, Y), difference(X, Y).我打電話?- sibling(bob, X).我懂了X = liz;false.這就是我想要的。到目前為止,我只看到規則的順序在進行遞歸時很重要。所以我不明白鮑勃仍然只是他自己的兄弟姐妹,因為我把差異檢查放在首位。謝謝你的幫助!
3 回答

至尊寶的傳說
TA貢獻1789條經驗 獲得超10個贊
這是因為統一的工作方式。如果先放差異,則X和Y的值尚未統一為任何值。考慮一下跟蹤:
goal list: [sibling(bob, Z)]
goal: sibling(bob, Z).
X-> bob, Y -> Z
goal list: [difference(bob, Y), mother(M, bob), mother(M, Y), father(F, bob), father(F, Y).]
goal: difference(bob, Y) --SUCCESS
goal list: [mother(M, bob), mother(M, Y), father(F, bob), father(F, Y).]
goal: mother(M, bob)
...
當您將差異調用放在最后時,X和Y都已統一,并且如果它們的值相同,則差異將失敗。然后將發生回溯。
使用序言環境的跟蹤功能可以查看執行過程中逐步發生的情況。

慕桂英4014372
TA貢獻1871條經驗 獲得超13個贊
Wrt:“如果將其放在規則的“末尾”,則很有可能最終會出現在“數據記錄”中,并且無論如何都可以直接使用(\ ==)/ 2。這是一個誤解:當單獨使用(\ ==)/ 2時,不能保證結果將是正確的。但是iso_dif/2
只要沒有錯誤,它們就是正確的。
添加回答
舉報
0/150
提交
取消