在prolog中,=用于统一,据我所知,如果这两个术语可以匹配,如果变量实例化,它们是统一的。
那么为什么下面的查询失败呢?
?- 2+2 = 4.尽管2+2生成4,这与另一个项的数字相同。
发布于 2017-03-31 14:12:03
其他人的回答是正确的,但这里有一些更多的细节。
在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
| ?- 上面的例子在GNU prolog中。请注意,在SWI Prolog中,必须包括CLP(FD)库才能使用对整数进行推理的运算符:
:- use_module(library(clpfd)).发布于 2017-03-31 12:37:13
左边的表达式不是由自己计算的.相反,您比较的是字符串的统一。要比较表达式的计算结果与右侧的统一,需要使用is/2操作符。
?- 4 is 2+2.与以下比较:
?- 2+2 = 2+2.和
?- X is 2+2.发布于 2017-03-31 12:37:56
当你写
2+2=4
答案是否定的,因为prolog将比较一个数字(4)和一个公式(2+2),这是不一样的。为了使其正确,您需要prolog在将公式2 + 2与4进行比较之前对公式进行计算。为此,请使用is操作符:
is运算符是专门用于数学函数的。左参数必须是变量,右参数必须是一个数学函数,所有变量都实例化。=操作符用于统一变量,并且可以用于任意两个参数(尽管如果两个参数不相同,并且不能通过以某种方式实例化变量,则会失败) [来源]。
所以在你的例子中:
4 is 2+2将评估为yes。
https://stackoverflow.com/questions/43140744
复制相似问题