[英]what's the difference between #= and =:= in SWI prolog
SWI prolog中#=
和=:=
之间有什么区别?
我从SWI prolog中找到了这个定义,但仍然对此感到困惑。
http://www.swi-prolog.org/pldoc/man?section=arithpreds
http://www.swi-prolog.org/pldoc/man?section=clpfd-arith-constraints
?- 3=:=3.
true.
?- (3-2) =:= (9-8).
true.
?- 3 #= 3.
true.
?- (3-2) #= (9-8).
true.
SWI prolog中#=和=:=之间有什么区别?
不同之处在于#=/2
是一个CLPFD库操作符(你需要执行: use_module(library(clpfd)).
才能使用它)并且用于算术约束和包含is/2
和=:=/2
整数 。 这意味着你只能将它用于整数:
例如,使用列表会引发错误:
?- L #= [1,2,3].
ERROR: Domain error: `clpfd_expression' expected, found `[1,2,3]'
(同样使用=:=/2
的列表会引发错误,列表示例仅用于理解两个运算符都用于表达式!)
对于整数,它可以在任何地方使用=:=
可以使用,但如上所述,它可以按原样使用is/2
,这意味着你可以使用它进行统一 - 只需将变量与某个整数值绑定,例如:
?- X #= 2.
X = 2.
因为X在无界变量中,所以上面没有检查X和数字2之间的相等性,它做的是将X与值2绑定。
使用=:=/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之间的关系,绑定一个变量可以导致另一个变量的推理。
在您的测试中,您看到没有区别,因为所有变量都有值(例如它们被实例化),并且您可以简单地检查两个运算符实现的相等性。
看这个例子:
:- use_module(library(clpfd)).
solve_equation_1(X) :- X + 1 =:= 2.
solve_equation_2(X) :- X + 1 #= 2.
solve_equation_3(X,Y,Z) :- X + Y #= Z.
正如您所料, solve_equation_1
适用于实例化的X
,并且不适用于未实例化的=:=
是一个检查表达式相等性的简单运算符:
?- solve_equation_1(1).
true.
?- solve_equation_1(2).
false.
?- solve_equation_1(X).
=:=/2: Arguments are not sufficiently instantiated
对于#=
,情况并非如此。 它并没有真正检查任何东西 - 它只是说某些变量和一些数字以某种特定的方式受到约束 - 例如它们形成一个方程式。 除非约束/等式如此简单以至于可以立即解决, 否则实际检查和计算会在稍后进行。 这就是为什么非常简单的情况(如你的例子) #=
看起来像=:=
。
看看这些例子 - 对于=:=
都是不可能的,它们表明#=
结果不是某些真/假布尔值,而是新约束:
?- solve_equation_2(X).
X = 1.
?- solve_equation_3(X,Y,2).
X+Y#=2.
?- X #= Y + Z, solve_equation_2(X).
X = 1,
Y+Z#=1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.