2015-10-02 27 views
3

我遵循一個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 

任何想法我做錯了什麼?

+1

請參閱[密切相關的問題(http://stackoverflow.com/questions/19637063/how-to-generate-a-rule-to-tell-that-this-simple-事實-GO-都-方式/ 19637638#19637638)。添加'!/ 0'只會完全破壞關係,所以我強烈建議避免這種情況。作爲一個簡單的檢查,也總是嘗試最常用的查詢(在你的情況下:'? - colleague(X,Y).'),看看它是否仍然意味着你原來的意思。你會發現使用'!/ 0'徹底確保它*不*。 – mat

+0

本週我在課堂上只是談到了剪輯的使用,我還沒有完全理解剪輯的用法,所以我有點不確定它的用法。感謝您指出,雖然! – Wolff

+1

使用'!/ 0'有一個簡單的規則:總之,**不要**。機會很高,你會完全摧毀你的程序語義時使用它們。作爲一名初學者,使用'!/ 0'確實沒有什麼可以獲得的,只能失去很多時間。 – mat

回答

5

我認爲你必須使規則與事實不同。例如:

known_colleague(bob,john). 
colleague(X,Y) :- known_colleague(X,Y);known_colleague(Y,X). 
+2

這是一個很好的解決方案,+1! – mat

+0

工作,謝謝!我不確定這是否是該教程打算讓我找到的解決方案,但我很樂意與之合作。 – Wolff