2012-11-15 169 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.