【问题标题】:Why does 'is' in swi-prolog behave differently if sides are switched?如果切换侧面,为什么 swi-prolog 中的“是”表现不同?
【发布时间】:2015-06-13 16:52:48
【问题描述】:

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

[trace] 48 ?- mod(3,3) 为 0。
假的。

[trace] 49 ?- 0 是 mod(3,3)。
真的。

【问题讨论】:

  • 您正在寻找(=:=)/2。
  • 查找description of the is/2 predicate。它没有定义“对称”关系。因此,is 的哪一方面的条款有很大的不同。它评估第二个参数表示的表达式,并将结果与​​第一个参数表示的术语统一。能统一就成功,否则就失败。在您的第二个示例中,显然mod(3,3) 已评估(结果0)与0 统一。但在您的第一个示例中,0(计算为 0)与未计算的术语 mod(3,3) 不一致。
  • 这种行为在 SWI-Prolog 的is/2 的官方文档中有明确的解释。这真是太懒惰了。
  • @Boris the is/2 docs 中明确解释的行为与浮点数与整数有关。虽然它确实说它通常应该与未绑定的左操作数一起使用,但它并没有像某些 other people 那样处理未评估的表达式。最好的搜索 swi 文档让您知道数字是什么以及它们的行为方式是告诉您如何找出 if 某物是一个数字。序言很奇怪。不要刻薄。如果我知道要寻找什么,我就不会在这里问了。
  • 你让我去重新阅读文档。也这样做,注意Number、Value和Expression这三个词。所有你需要知道的就是第一句话。

标签: prolog


【解决方案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,则为真。

一点好奇心不会伤害你。

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多