gpt4 book ai didi

math - #= 和 = := in SWI prolog 有什么区别

转载 作者:行者123 更新时间:2023-12-01 11:18:48 24 4
gpt4 key购买 nike

SWI prolog 中#==:= 有什么区别?
我从 SWI 序言中找到了定义,但仍然对它感到困惑。
http://www.swi-prolog.org/pldoc/man?section=arithpreds enter image description here

http://www.swi-prolog.org/pldoc/man?section=clpfd-arith-constraints
enter image description here

?- 3=:=3.
true.

?- (3-2) =:= (9-8).
true.

?- 3 #= 3.
true.

?- (3-2) #= (9-8).
true.

最佳答案

What's the difference between #= and =:= in 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,这意味着您可以将它用于统一 - 简单地将变量与某个整数值绑定(bind),例如:

?- X #= 2.
X = 2.

上面没有检查 X 和数字 2 之间的相等性,因为 X 在无界变量中,它所做的是将 X 与值 2 绑定(bind)。

这对于 =:=/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 之间的关系,绑定(bind)一个变量可以导致对另一个变量的推理。

在您的测试中,您看不到任何差异,因为您的所有变量都有值(例如,它们已被实例化),并且您可以简单地检查两个运算符是否实现了相等性。

关于math - #= 和 = := in SWI prolog 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46756842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com