【问题标题】:Prolog backtracking policyProlog 回溯策略
【发布时间】: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 ; falsetrue 在逻辑上是等价的,只是在操作上有所不同。

标签: prolog prolog-toplevel


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多