【发布时间】: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/2predicate。它没有定义“对称”关系。因此,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