SWI prolog 中的 #= 和 =:= 有什么区别?
不同之处在于#=/2
是一个 CLPFD 库操作符(需要执行:use_module(library(clpfd)).
为了使用它)并且它用于算术约束并包含两者is/2
and =:=/2
超过整数。这意味着您只能将它用于整数:
例如使用列表会引发错误:
?- L #= [1,2,3].
ERROR: Domain error: `clpfd_expression' expected, found `[1,2,3]'
(也使用列表=:=/2
会引发错误,列表示例只是为了理解两个运算符都用于表达式!)
对于整数,它可以在任何地方使用=:=
可以使用,但如上所述,它可以用作is/2
这意味着您可以使用它进行统一 - 只需将变量与某个整数值绑定,例如:
?- X #= 2.
X = 2.
上面的代码并没有检查 X 和数字 2 之间的相等性,因为 X 是无界变量,它所做的是将 X 与值 2 结合起来。
这是不可能的=:=/2
操作员:
?- X =:= 2.
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [8] _2494=:=2
ERROR: [7] <user>
那是因为=:=/2
仅用于检查相等性!
这就是之间的区别#=/2
and =:=/2
. Both 检查是否相等在两个算术表达式之间但是使用时=:=/2
所有变量都应该被实例化。使用时#=/2
对于变量,这设置了这些变量之间的约束:
?- X #= 2.
X = 2. % constraints X to integer value 2
?- X + Y #= 2.
X+Y#=2. % constraints X,Y such that sum equals to 2 see next example:
?- X + Y #= 2 , X = 3.
X = 3,
Y = -1. % binds Y with -1 in order to succeed the constraint
?- X + Y #= 2 , X = 3 , Y > 0.
false. % false since constraint can't succeed!
如你看到的#=/2
显然更具相关性,因为即使具有多个变量的约束,例如X + Y #= 2.
这设置了 X、Y 之间的关系,绑定一个变量可以导致对另一个变量的推理。
在您的测试中,您看不到任何差异,因为所有变量都有值(例如它们被实例化)并且您简单地检查两个运算符都实现的相等性。