Prolog回溯策略

Prolog回溯策略,prolog,prolog-toplevel,Prolog,Prolog Toplevel,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. 第二种情况下似乎没有出现回溯,因为问题中谓词的第一个参数与其他子句不统一。 然而,人们希望答案为真;false。对于每种情况:引擎将尝试第一个谓词子句(结果是true),然后回溯并查找同一谓词的其他子句(结果

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.
第二种情况下似乎没有出现回溯,因为问题中谓词的第一个参数与其他子句不统一。
然而,人们希望答案
为真;false。
对于每种情况:引擎将尝试第一个谓词子句(结果是
true
),然后回溯并查找同一谓词的其他子句(结果是
false
)。在第二种情况下,这是一种捷径吗


这是一种(某种程度上)标准行为,即在编写prolog规则时应予以考虑,还是纯粹是特定于实现的行为?

SWI prolog功能的较新版本即时多参数索引。这意味着运行时可以及时决定添加多参数索引,而无需手动声明它们

在本例中,第一个和第二个参数上的多参数索引将消除一个选择点。因为只有一个子句与arg1=a和arg2=a索引匹配。另见:

SWI Prolog为多个参数提供“即时”索引

SWI Prolog并不是唯一一个可以做到这一点的Prolog系统。例如,Jekejeke Prolog也可以执行MA-JIT。但是SWI Prolog可以做更多的事情,即深度多参数索引

Welcome to SWI-Prolog (threaded, 64 bits, version 8.1.15)

q(f(a,a)).
q(f(a,b)).

?- q(f(a,a)).
true.

DMA-JIT目前在Jekejeke Prolog中不可用。

;false
表示:Prolog不确定是否存在进一步的答案。这是一个关于效率的小提示:如果有
;false
,则Prolog在成功后需要一些空间。它是,但有@vmg:不确定您或引用的文档所说的“标准”是什么意思。至少可以说,Prolog中没有任何与资源相关的问题的标准,在某些实现中,索引甚至在运行到运行之间都有所不同。那么您是对的,并且“标准”一词被误用了。它似乎是一个“通用实现”,但实际上并不是一个标准。虽然
true,但我似乎无法用您的更正编辑评论;false
true
在逻辑上是等价的,只是在操作上有所不同。