Prolog中的算术比较

Arithmetic comparison in Prolog

假设我们有两个变量 XYX53Y52。我想要做的是通过将 1 添加到 Y 来比较它们,这样它将是 53 - 因此 X 将等于 Y + 1

我正在尝试通过对 Y 变量简单地使用等于运算符和加法来做到这一点,如下所示:

X == Y + 1

尽管这看起来很简单,但我得到的结果是 false。我错过了什么?

为了评估表达式树,使用了 is 谓词:

X is Y+1.

但是您必须小心,如果 XY 都接地,这只会作为 测试 起作用。如果右侧的变量(在本例中为 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 等