我正在尝试使用gprolog工具学习一些prolog。我想看看列表的总和是否是相同的值。我想弄明白为什么这句话是假的。
{trace,1}
| ?- (2+1) is (1+2).
2 2 Call: 2+1 is 1+2 ?
2 2 Fail: 2+1 is 1+2 ?
no1+2和2+1不应该是等价的,因为加法是结合的吗?
发布于 2020-12-01 01:20:15
这很简单,因为is评估右侧,并试图将其与左侧统一。
因此,你可以得到:
(2+1) = 3.
这两者看起来不一样(实际上,左边的“术语”是打印好的结构+(2,1),您可以通过调用write_canonical(2+1).来检查),而= (即“统一”,而不是比较或赋值)失败。
你在他的案子里想要的是
?- 2+1 =:= 2+1.
true.它对左手和右侧进行数值计算,然后对结果进行数值比较。
这就是为什么这个失败的原因:
?- X =:= 2+1.
ERROR: Arguments are not sufficiently instantiated但这是成功的:
?- X = 3, X =:= 2+1.
X = 3.发布于 2020-12-01 14:28:26
1+2和2+1这两个术语并不等同。如果将它们计算为算术表达式,则它们具有相同的数值:
?- 1+2 =:= 2+1. % arithmetic equality或者,您可以显式地评估双方,然后比较:
?- X is 1 + 2, Y is 2 + 1, X == Y.但这有它自己不同的语义。例如:
?- X is sin(pi/2), X == 1. % no!
?- X is sin(pi/2), X =:= 1. % yes与=的统一和与==的等价是两件不同的事情。这就是统一所能做的:
?- X + 2 = 1 + Y.如果这两个术语是等价的,则进行等价性检查。+(1, 2)和+(2, 1)不是等价的;函子是相同的,但这两个参数是交换的。
https://stackoverflow.com/questions/65083397
复制相似问题