首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog中的逻辑'not‘是什么?

Prolog中的逻辑'not‘是什么?
EN

Stack Overflow用户
提问于 2011-12-16 00:46:11
回答 5查看 99K关注 0票数 41

我面临的问题,有点微不足道。我想在Prolog中使用logical not,但似乎not/1不是我想要的东西:

代码语言:javascript
复制
course(ai).
course(pl).
course(os).

have(X,Y) :- course(X),course(Y),not(X = Y).

我想问一下:

代码语言:javascript
复制
have(X,Y), write(X-Y), nl , fail.

我没有得到我想要的结果:

EN

回答 5

Stack Overflow用户

发布于 2011-12-16 01:01:31

您需要编写\+ X = YX \= Y来代替not(X = Y)。但请考虑使用dif(X,Y)dif/2存在于B、SWI、YAP、SICStus中。要查看差异,请执行以下操作:

代码语言:javascript
复制
?- X = b, dif(a, X).
X = b.

?- X = b, \+ a = X.
X = b.

因此,到目前为止,一切似乎都很好。但是,如果我们简单地交换两个目标的顺序呢?

代码语言:javascript
复制
?- \+ a = X, X = b.
false.

?- dif(a, X), X = b.
X = b.

(\+)/1现在给了我们一个不同的结果,因为a = X有一个答案,目标\+ a = X将失败。

因此,(\+)/1不是否定,而是意味着在这一点上是不可证明的。

dif/2A safe approximation在ISO Prolog中也是可能的。

票数 42
EN

Stack Overflow用户

发布于 2011-12-16 01:00:38

在SWI-Prolog和GNU Prolog中,都应该可以执行以下操作:

代码语言:javascript
复制
have(X, Y) :- course(X), course(Y), X \= Y.

在SWI-Prolog中,您还可以使用dif/2,这会更方便,因为您可以在谓词中更早地使用它:

代码语言:javascript
复制
have(X, Y) :- dif(X, Y), course(X), course(Y).
票数 13
EN

Stack Overflow用户

发布于 2014-03-18 05:37:06

作为上述用户"false“回答的附加项,即

“您需要写+X= Y来代替not(X = Y),”

这可能会给人留下这样的印象:

a. "not“和"+”是不同的东西

b. +将起作用,而not将不起作用。

我的理解是"not“和"+”是等价的,但在现代Prolog程序中,+是首选的,因为它传达了一种更直观的感觉。具体地说,对于粗心大意的程序员来说," not“可能暗示”不是真的“,而"+”则暗示“不可证明”,这更接近于该操作真正所说的真相。在Prolog中,"not“是”否定为失败“的一个例子,但人们认为+将使程序员更清楚地知道在任何给定的规则中确切地断言了什么。因此,您可以使用"not“(大多数PL实现保留它是为了向后兼容),但要成为一名惯用的现代PL程序员,您可能更喜欢使用+。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8523608

复制
相关文章

相似问题

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