Prolog 回溯策略



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规则时应该考虑 - 还是纯粹特定于实现?

较新版本的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 中不可用。

最新更新