Prolog中的算术比较
Arithmetic comparison in Prolog
假设我们有两个变量 X
和 Y
。 X
是 53
,Y
是 52
。我想要做的是通过将 1
添加到 Y
来比较它们,这样它将是 53
- 因此 X
将等于 Y + 1
。
我正在尝试通过对 Y
变量简单地使用等于运算符和加法来做到这一点,如下所示:
X == Y + 1
尽管这看起来很简单,但我得到的结果是 false
。我错过了什么?
为了评估表达式树,使用了 is
谓词:
X is Y+1.
但是您必须小心,如果 X
和 Y
都接地,这只会作为 测试 起作用。如果右侧的变量(在本例中为 Y
)未接地,则始终会出错。
swipl
演示:
?- X = 53, Y = 52, X is Y+1.
X = 53,
Y = 52.
?- X = 53, Y = 52, X is Y.
false.
?- X = 53, X is Y+1.
ERROR: is/2: Arguments are not sufficiently instantiated
?- Y = 52, X is Y+1.
Y = 52,
X = 53.
如果您对整数进行推理,请使用您的 Prolog 系统的 CLP(FD) 约束 来比较和评估算术整数表达式。
例如,在SICStus、SWI和YAP中,在use_module(library(clpfd)
之后:
?- 53 #= 52 + 1.
true.
这适用于所有方向。
其他示例:
?- X #= 52 + 1.
X = 53.
?- 53 #= Y + 1.
Y = 52.
?- 53 #= 52 + 1.
true.
?- X = 50+2, Y = 50+1, X =:= Y + 1.
如您所见,(=:=)/2 评估双方,(>)/2 等
假设我们有两个变量 X
和 Y
。 X
是 53
,Y
是 52
。我想要做的是通过将 1
添加到 Y
来比较它们,这样它将是 53
- 因此 X
将等于 Y + 1
。
我正在尝试通过对 Y
变量简单地使用等于运算符和加法来做到这一点,如下所示:
X == Y + 1
尽管这看起来很简单,但我得到的结果是 false
。我错过了什么?
为了评估表达式树,使用了 is
谓词:
X is Y+1.
但是您必须小心,如果 X
和 Y
都接地,这只会作为 测试 起作用。如果右侧的变量(在本例中为 Y
)未接地,则始终会出错。
swipl
演示:
?- X = 53, Y = 52, X is Y+1.
X = 53,
Y = 52.
?- X = 53, Y = 52, X is Y.
false.
?- X = 53, X is Y+1.
ERROR: is/2: Arguments are not sufficiently instantiated
?- Y = 52, X is Y+1.
Y = 52,
X = 53.
如果您对整数进行推理,请使用您的 Prolog 系统的 CLP(FD) 约束 来比较和评估算术整数表达式。
例如,在SICStus、SWI和YAP中,在use_module(library(clpfd)
之后:
?- 53 #= 52 + 1.
true.
这适用于所有方向。
其他示例:
?- X #= 52 + 1.
X = 53.
?- 53 #= Y + 1.
Y = 52.
?- 53 #= 52 + 1.
true.
?- X = 50+2, Y = 50+1, X =:= Y + 1.
如您所见,(=:=)/2 评估双方,(>)/2 等