我遵循一個Prolog教程,要求定義一個對稱關係。序言:對稱規則
例如說你在知識庫中的以下事實:
colleague(john,bob).
你也想同事(BOB,約翰)是真實的,同樣爲所有同事的事實。
教程說,使用下面的規則...
colleague(X,Y) :- colleague(Y,X).
但也有當我使用下面的查詢時,這樣做的問題...
| ? - colleague(john,X).
X = bob ? ;
X = bob ? ;
X = bob ? ;
X = bob ? ;
...
| ? - colleague(bob,X).
X = john ? ;
X = john ? ;
X = john ? ;
X = john ? ;
...
我想我明白爲什麼這發生了 - 規則是無限遞歸的?但我遇到問題修復它。這就是我想要的......
| ? - colleague(john,X).
X = bob ? ;
no
| ? - colleague(bob,X).
X = john ? ;
no
我看了一下其他的答案就在這裏非常類似的問題,但一直沒能對它進行排序。我試着用在規則,這似乎有更好的表現到底切推杆,但仍然重演一次,包含在知識庫中的事實:
colleague(X,Y) :- colleague(Y,X), !.
_
| ? - colleague(john,X).
X = bob ? ;
X = bob ? ;
no
| ? - colleague(bob,X).
X = john ? ;
no
任何想法我做錯了什麼?
請參閱[密切相關的問題(http://stackoverflow.com/questions/19637063/how-to-generate-a-rule-to-tell-that-this-simple-事實-GO-都-方式/ 19637638#19637638)。添加'!/ 0'只會完全破壞關係,所以我強烈建議避免這種情況。作爲一個簡單的檢查,也總是嘗試最常用的查詢(在你的情況下:'? - colleague(X,Y).'),看看它是否仍然意味着你原來的意思。你會發現使用'!/ 0'徹底確保它*不*。 – mat
本週我在課堂上只是談到了剪輯的使用,我還沒有完全理解剪輯的用法,所以我有點不確定它的用法。感謝您指出,雖然! – Wolff
使用'!/ 0'有一個簡單的規則:總之,**不要**。機會很高,你會完全摧毀你的程序語義時使用它們。作爲一名初學者,使用'!/ 0'確實沒有什麼可以獲得的,只能失去很多時間。 – mat