Prolog回溯政策

问题描述 投票:2回答:1

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) 。在第二种情况下,这是一种捷径吗?

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

prolog prolog-toplevel
1个回答
0
投票

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

在当前情况下,第一个和第二个参数上的多参数索引将消除选择点。由于只有一个子句在索引方面匹配arg1 = a和arg2 = a。另请参阅:

SWI-Prolog在多个参数上提供“及时”索引编制https://www.swi-prolog.org/pldoc/man?section=jitindex

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中不可用。

© www.soinside.com 2019 - 2024. All rights reserved.