#=
和=:=
在SWI中的区别是什么?
我已经找到了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.
发布于 2017-10-15 15:56:19
#=和=:=在SWI prolog中有什么区别?
区别在于,#=/2
是一个CLPFD库操作符(您需要执行:use_module(library(clpfd)).
才能使用它),它用于算术约束,并包含整数上的is/2
和=:=/2
。这意味着您只能将其用于整数:
例如,使用list会引发错误:
?- 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
和=:=/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之间的关系,绑定一个变量也会导致另一个变量的推理。
在您的测试中,您没有看到任何区别,因为您的所有变量都有值(例如,它们是实例化的),并且您可以简单地检查是否相等,这两个操作符都实现了。
发布于 2017-10-15 16:18:17
见以下示例:
:- 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
https://stackoverflow.com/questions/46756842
复制相似问题