【发布时间】:2015-10-26 19:05:49
【问题描述】:
SWI-Prolog,版本 6.6.6。
考虑以下事实:
p(a, a).
p(a, b).
结果如下:
?- p(a, a).
true ;
false.
但如果我稍微改变一下数据:
p(a, a).
p(b, a).
我得到一个稍微不同的答案...
?- p(a, a).
true.
似乎没有出现第二种情况的回溯,因为问题中谓词的第一个参数没有与其他子句统一。
然而,对于每种情况,人们都希望得到true ; false. 的答案:引擎会尝试第一个谓词子句(导致true),然后回溯并寻找相同谓词的其他子句(导致false) .在第二种情况下,它是一种捷径吗?
这是(有点)标准行为 - 即在编写序言规则时应该考虑 - 还是纯粹是特定于实现的?
【问题讨论】:
-
; false表示:Prolog 不确定是否存在进一步的答案。所以这是关于效率的一个小提示:如果有一个; false,那么 Prolog 成功后需要一些空间。 -
@vmg:不确定您或所引用的文档所说的“标准”是什么意思。至少可以说,Prolog 中没有针对任何与资源相关的问题的标准,并且索引在某些实现中会有所不同,甚至从运行到运行。
-
那么你是对的,“标准”这个词被误用了。这似乎是一个“通用实现”,但并不是真正的标准。不过,我似乎无法通过您的更正来编辑评论
-
true ; false和true在逻辑上是等价的,只是在操作上有所不同。