繁体   English   中英

SWI prolog中#=和=:=之间的区别是什么

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM