首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在prolog中,为什么is‘(1+2) is (2+1)’false?

在prolog中,为什么is‘(1+2) is (2+1)’false?
EN

Stack Overflow用户
提问于 2020-12-01 01:12:38
回答 2查看 278关注 0票数 1

我正在尝试使用gprolog工具学习一些prolog。我想看看列表的总和是否是相同的值。我想弄明白为什么这句话是假的。

代码语言:javascript
复制
{trace,1}
| ?- (2+1) is (1+2).
      2    2  Call: 2+1 is 1+2 ? 
      2    2  Fail: 2+1 is 1+2 ? 

no

1+2和2+1不应该是等价的,因为加法是结合的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-01 01:20:15

这很简单,因为is评估右侧,并试图将其与左侧统一。

因此,你可以得到:

(2+1) = 3.

这两者看起来不一样(实际上,左边的“术语”是打印好的结构+(2,1),您可以通过调用write_canonical(2+1).来检查),而= (即“统一”,而不是比较或赋值)失败。

你在他的案子里想要的是

代码语言:javascript
复制
?- 2+1 =:= 2+1.
true.

它对左手和右侧进行数值计算,然后对结果进行数值比较。

这就是为什么这个失败的原因:

代码语言:javascript
复制
?- X =:= 2+1.
ERROR: Arguments are not sufficiently instantiated

但这是成功的:

代码语言:javascript
复制
?- X = 3, X =:= 2+1.
X = 3.
票数 2
EN

Stack Overflow用户

发布于 2020-12-01 14:28:26

1+22+1这两个术语并不等同。如果将它们计算为算术表达式,则它们具有相同的数值:

代码语言:javascript
复制
?- 1+2 =:= 2+1. % arithmetic equality

或者,您可以显式地评估双方,然后比较:

代码语言:javascript
复制
?- X is 1 + 2, Y is 2 + 1, X == Y.

但这有它自己不同的语义。例如:

代码语言:javascript
复制
?- X is sin(pi/2), X == 1. % no!
?- X is sin(pi/2), X =:= 1. % yes

=的统一和与==的等价是两件不同的事情。这就是统一所能做的:

代码语言:javascript
复制
?- X + 2 = 1 + Y.

如果这两个术语是等价的,则进行等价性检查。+(1, 2)+(2, 1)不是等价的;函子是相同的,但这两个参数是交换的。

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

https://stackoverflow.com/questions/65083397

复制
相关文章

相似问题

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