如果切换侧面,为什么swi-prolog中的'是'表现不同?

时间:2015-04-08 15:58:54

标签: prolog

如果重要,我正在使用swi-prolog版本6.6.6 据我所知,它们应该是等价的,因为唯一的区别是“是”的一面是什么。他们为什么会给出不同的结果?

[追踪] 48? - mod(3,3)为0.
假的。

[追踪] 49? - 0是mod(3,3) 真。

1 个答案:

答案 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

     当NumberExpr评估的值时,

为真。   通常,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,则为真。

  •   

有点好奇不会伤害你。