2012-11-15 168 views
6

我已經很難尋找在序言否定明確的答案,所以我道歉,如果這是一個明顯的問題:SWI-Prolog的否定

我試圖寫一個簡單的代碼,就會很自然地說「如果X喜歡Y,只有Y,則X和Y彼​​此相愛。」我的特等代碼看起來是這樣的:

likes(mary,john). 
likes(mary,chad). 
likes(john,mary). 

loves(X,Y):- likes(X,Y), \+likes(X,Z). 

我再運行了一個程序,簡單地問:

?- loves(X,Y). 

,但它永遠是假的。按照我的邏輯,它應該回來說'X =約翰,Y =瑪麗'。

我已經嘗試了用切割分開否定的幾種組合,嘗試用多條線來定義「愛」......我可能缺少否定的一個主要原則,或者甚至有更簡單的方法來實現什麼我正試着在這裏做。請讓我知道如果你能幫助!

我使用的是Debian軟件管理器中的SWI-Prolog(swipl),如果有幫助的話,儘管我懷疑這會產生多大的影響。

回答

5

你的問題是Z當你的規則要求\+likes(X,Z)時,它沒有被綁定,那麼至少總會有Z = Y使愛/ 2失效。我的意思是,因爲喜歡(X,Y)是真的,所以肯定會是真的喜歡(X,Z)。

變化這樣說:

loves(X,Y):- likes(X,Y), \+ ((likes(X,Z), Z \= Y)). 

,你會得到

?- loves(X,Y). 
X = john, 
Y = mary.