8

我很难在 Prolog 中寻找关于否定的明确答案,所以如果这是一个明显的问题,我深表歉意:

我正在尝试编写一个简单的代码,从逻辑上说“如果 X 喜欢 Y 并且只喜欢 Y,X 和 Y 就会彼此相爱”。我的 .pl 代码如下所示:

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

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

然后我运行我的程序并简单地问:

?- loves(X,Y).

但它总是假的。按照我的逻辑,它应该回来说“X=john, Y=mary”。

我尝试了一些将否定与削减分开的组合,尝试使用多行来定义“爱”......我可能错过了否定的主要原则,或者也许有更简单的方法来实现我正在尝试的内容在这里做。如果您能提供帮助,请告诉我!

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

4

1 回答 1

7

您的问题是,Z当您的规则要求时它不受约束\+likes(X,Z),那么至少总会有 Z=Y 使loves/2 无效。我的意思是,既然喜欢(X,Y)是真的,那么肯定会是真的喜欢(X,Z)。

以这种方式更改它:

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

你会得到

?- loves(X,Y).
X = john,
Y = mary.
于 2012-11-15T07:47:09.583 回答