swi-prolog否定

bjs*_*ura 6 prolog negation

我很难在Prolog中寻找关于否定的明确答案,所以如果这是一个显而易见的问题我会道歉:

我正在尝试编写一个简单的代码,逻辑上说"X和Y彼此相爱,如果X喜欢Y而且只有Y." 我的.pl代码看起来像这样:

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

loves(X,Y):- likes(X,Y), \+likes(X,Z).
Run Code Online (Sandbox Code Playgroud)

然后我运行我的程序,只是问:

?- loves(X,Y).
Run Code Online (Sandbox Code Playgroud)

但它总是错误的.根据我的逻辑,它应该回来说'X =约翰,Y =玛丽'.

我尝试了一些将否定与切割分开的组合,尝试多行来定义"爱"......我可能错过了一个主要的否定原则,或者甚至可能有一种更简单的方法来实现我正在尝试的东西在这里做 如果你能提供帮助,请告诉我!

我正在使用Debian软件管理器中的SWI-Prolog(swipl),如果这有帮助的话,尽管我怀疑这会有很大的不同.

Cap*_*liC 5

你的问题是Z它在你的规则要求时没有受到约束\+likes(X,Z),那么至少总会有Z = Y使loves/2无效.我的意思是,因为喜欢(X,Y)是真的,肯定会是真的喜欢(X,Z).

这样改变:

loves(X,Y):- likes(X,Y), \+ (( likes(X,Z), Z \= Y )).
Run Code Online (Sandbox Code Playgroud)

你会得到的

?- loves(X,Y).
X = john,
Y = mary.
Run Code Online (Sandbox Code Playgroud)