亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

序言:一個人是他自己的兄弟姐妹嗎?

序言:一個人是他自己的兄弟姐妹嗎?

慕勒3428872 2019-11-04 13:08:35
我在理解為什么我的序言中的代碼為什么會根據我放置規則的順序執行某些操作時遇到麻煩。這是我的數據庫: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都已統一,并且如果它們的值相同,則差異將失敗。然后將發生回溯。


使用序言環境的跟蹤功能可以查看執行過程中逐步發生的情況。


查看完整回答
反對 回復 2019-11-04
?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

Wrt:“如果將其放在規則的“末尾”,則很有可能最終會出現在“數據記錄”中,并且無論如何都可以直接使用(\ ==)/ 2。這是一個誤解:當單獨使用(\ ==)/ 2時,不能保證結果將是正確的。但是iso_dif/2只要沒有錯誤,它們就是正確的。

查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 497 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號