3

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

这是(有点)标准行为 - 即在编写序言规则时应该考虑 - 还是纯粹是特定于实现的?

4

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

于 2019-12-04T19:54:30.233 回答