prolog - swi-prolog 否定

标签 prolog negation

我很难在 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),如果这有帮助的话,尽管我怀疑这会有很大的不同。

最佳答案

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

改成这样:

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

你会得到
?- loves(X,Y).
X = john,
Y = mary.

关于prolog - swi-prolog 否定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13392108/

相关文章:

prolog - clpfd 需要标记才能找到任何解决方案(使用\+时)

javascript - 双非运算符

Prolog计数器问题

Apache 将逻辑否定重定向至波形符 ~

prolog - 让 Prolog 给出算术的所有可能性

prolog - 证明 X 在 Y 之前 Prolog

lua - Lua中的感叹号有什么作用?

regex - perl6 在正则表达式中否定多个单词及其字符的排列

list - Prolog 通过尾部插入列表中的数字

list - Prolog,列表中 Y 之前的 X