在prolog中=
用于统一,据我所知,如果两个术语可以与变量实例化时的帮助匹配,则它们是统一的。
以下查询失败的原因
?- 2+2 = 4.
虽然2 + 2收益率为4,但与另一个词的数量相同。
答案 0 :(得分:3)
补充其他帖子,在推理整数时,我建议(#=)/2
作为(is)/2
的更具说明性的替代方案。
(#=)/2
表示整数表达式的算术相等。这涉及评估步骤,因此不同于语法相等。在你的情况下,你期望前者,但得到后者。
使用示例,使用GNU Prolog:
| ?- 4 #= 2+2. yes
(#=)/2
的主要优势在于它适用于所有方向:
| ?- 4 #= 2+X. X = 2
相反,我们使用(is)/2
:
| ?- 4 is 2+X. uncaught exception: error(instantiation_error,(is)/2)
当初学者第一次学习算术时,这些问题很常见(参见instantiation-error),因此我建议你至少在开始时使用更多的声明性谓词。
答案 1 :(得分:2)
其他人的回答是正确的,但这里有更多细节。
在Prolog中,术语2+2
只是术语'+'(2, 2)
的语法替代词。这是一个带有仿函数+
和两个参数(2和2)的术语。术语2
只是一个整数,没有参数。 =/2
运算符尝试统一术语。它不执行算术表达式评估。这些术语明显不同,不能统一(他们甚至没有相同数量的论点)。
Prolog中有运营商将执行表达式评估。对于表达式相等,您可以使用=:=/2
或更好,因为@mat指出了对整数的推理,您可以使用#=/2
。所以以下内容将起作用:
| ?- 2+2 =:= 4.
yes
| ?- 2+2 #= 4.
yes
| ?-
还有is/2
仅评估第二个参数,并确定它的值是否与第一个参数的值相同。因此,将发生以下情况:
| ?- 2+2 is 4.
no
| ?- 4 is 2+2.
yes
| ?-
答案 2 :(得分:1)
左侧的表达式本身不进行评估。而是比较字符串的统一。要比较表达式评估与右侧的统一,您需要使用is / 2运算符。
?- 4 is 2+2.
与:比较:
?- 2+2 = 2+2.
和
?- X is 2+2.
答案 3 :(得分:1)
写作时
2 + 2 = 4
答案是否定的,因为prolog会将数字(4)与公式(2 + 2)进行比较,这些不相同。为了使其正确,您需要序言评估公式2 + 2
,然后再将其与4
进行比较。为此,请使用is
运算符:
is
运算符专门用于数学函数。左参数必须是变量,右参数必须是一个数学函数,所有变量都被实例化。
=
运算符用于统一变量,并且可以与任何两个参数一起使用(尽管如果两个参数不相同并且不能使它们相同则会失败通过以某种方式实例化变量)[source]。
所以在你的例子中:
4 is 2+2
评估为yes
。