What's the difference between #= and =:= in SWI prolog ?
不同的是,#=/2
是CLPFD库操作(需要执行:use_module(library(clpfd)).
为了使用它),它是用来用于算术约束和包含is/2
和=:=/2
int egers。这意味着,你只能用它的整数:
例如,使用列表将引发错误:
?- L #= [1,2,3].
ERROR: Domain error: `clpfd_expression' expected, found `[1,2,3]'
(也使用列表中=:=/2
会引发错误,列表例子只是为了理解这两个运营商用于表达式)
对于整数它可以在任何地方使用,可以使用=:=
但如上所述可以作为is/2
这意味着你可以用它来统一 - !干脆来个变量绑定某个整数值,例如:
?- X #= 2.
X = 2.
上述不检查,因为在无限可变X X和编号2之间的平等,但它确实与值2
粘接X什么,这是不可能用=:=/2
操作者:
?- X =:= 2.
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [8] _2494=:=2
ERROR: [7] <user>
这是因为=:=/2
只用于检查是否相等!
这是#=/2
和=:=/2
之间的区别。 检查两个算术表达式之间的相等性,但使用=:=/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,绑定一个变量可以导致另一个推理。
在你的测试中,你看不出有什么区别,因为你所有的变量都有值(例如它们被实例化),并且你可以简单地检查两个操作符实现的相等性。