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

Math 什么';SWI prolog中#=和=:=之间的区别是什么,math,prolog,operator-keyword,clpfd,Math,Prolog,Operator Keyword,Clpfd,SWI prolog中的#=和=:=之间有什么区别。 我从SWI prolog中找到了定义,但仍然对它感到困惑。 在SWI prolog中#=和=:=之间有什么区别? 不同之处在于#=/2是一个CLPFD库运算符(您需要执行:使用模块(库(CLPFD))。才能使用它),它用于算术约束,并将is/2和=/2包含在整数上。这意味着您只能对整数使用它: e、 g使用列表将引发错误: ?- L #= [1,2,3]. ERROR: Domain error: `clpfd_expression'

SWI prolog中的
#=
=:=
之间有什么区别。
我从SWI prolog中找到了定义,但仍然对它感到困惑。


在SWI prolog中#=和=:=之间有什么区别?

不同之处在于
#=/2
是一个CLPFD库运算符(您需要执行:
使用模块(库(CLPFD))。
才能使用它),它用于算术约束,并将
is/2
=/2
包含在整数上。这意味着您只能对整数使用它:

e、 g使用列表将引发错误:

?- 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
显然更具相关性,因为即使约束包含多个变量,例如
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
,而不适用于未实例化的As
=:=
是一个检查表达式相等性的简单运算符:

?- 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
#=运算符错误:语法错误:模块充电后SWI Prolog 8.3.24中需要运算符。有什么想法吗?Thxs
?- 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