如果重要,我正在使用swi-prolog版本6.6.6 据我所知,它们应该是等价的,因为唯一的区别是“是”的一面是什么。他们为什么会给出不同的结果?
[追踪] 48? - mod(3,3)为0.
假的。
[追踪] 49? - 0是mod(3,3) 真。
答案 0 :(得分:1)
其他人说的话。 is/2
将右侧评估为算术表达式,统一该评估的结果(假设它实际上是一个有效的算术表达式,左手边。所以你可以这样说:
X is 3+2 * 4 mod 3
0 is 3+2-5
它并不是真正用于算术比较的。但如果您有read the documentation for is/2
:
当
-Number is +Expr
Number
是Expr
评估的值时,为真。 通常,
is/2
应与未绑定的左操作数一起使用。 如果要测试相等性,则应使用=:=/2
。例如:
?- 1 is sin(pi/2).
失败!sin(pi/2)
计算浮点1.0
, 它不与整数1
统一。?- 1 =:= sin(pi/2).
按预期成功。
如果你chase down the docs for =:=/2
and its relatives,你会发现
+Expr1 > +Expr2
。
如果表达式Expr1
的计算结果大于Expr2
,则为真。
+Expr1 < +Expr2
。
如果表达式Expr1
的计算结果小于Expr2
,则为真。
+Expr1 =< +Expr2
。
如果表达式Expr1
的值小于或等于Expr2
,则为真。
+Expr1 >= +Expr2
。
如果表达式Expr1
的计算结果大于或等于Expr2
,则为真。
+Expr1 =\= +Expr2
。
如果表达式Expr1
的计算结果为不等于Expr2
的数字,则为真。
+Expr1 =:= +Expr2
。
如果表达式Expr1
的计算结果等于Expr2
,则为真。
有点好奇不会伤害你。