2017-10-15 178 views

回答

2

What's the difference between #= and =:= in SWI prolog ?

不同的是,#=/2是CLPFD库操作(需要执行:use_module(library(clpfd)).为了使用它),它是用来用于算术约束和包含is/2=:=/2int 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,绑定一个变量可以导致另一个推理。

在你的测试中,你看不出有什么区别,因为你所有的变量都有值(例如它们被实例化),并且你可以简单地检查两个操作符实现的相等性。

1

看到这个例子:

:- 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