首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >swi-prolog否定

swi-prolog否定
EN

Stack Overflow用户
提问于 2012-11-15 13:39:33
回答 1查看 3.6K关注 0票数 7

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

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

代码语言:javascript
复制
likes(mary,john).
likes(mary,chad).
likes(john,mary).

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

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

代码语言:javascript
复制
?- loves(X,Y).

但结果总是错的。根据我的逻辑,它应该返回到'X=john,Y=mary‘。

我尝试了几种组合,用切分来分隔否定,尝试用多行来定义“爱”……我可能遗漏了一个主要的否定原则,或者甚至有一种更简单的方法来实现我在这里试图做的事情。如果你能帮上忙,请告诉我!

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-15 15:47:10

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

将其更改为:

代码语言:javascript
复制
loves(X,Y):- likes(X,Y), \+ (( likes(X,Z), Z \= Y )).

你就会得到

代码语言:javascript
复制
?- loves(X,Y).
X = john,
Y = mary.
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13392108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档