如何用cut来解读这个Prolog目标,提高效率

How to interpret this Prolog goal with a cut, and improve efficiency

我一直在阅读 的答案和评论,并且尝试将给定的解释应用于 Bratko 的一个例子(Prolog Programming for Artificial Intelligence,第 130 页),但我不确定我完全理解。例子描述如下:

我读树和代码如下:

在目标列表C :- P, Q, R, !, S, T, U.中,Prolog将像往常一样一个接一个地尝试实例化变量,最终到达true.。假设为 PQ 找到了一个值,并且第一次尝试 R 失败,那么 Prolog 可以回溯到 P 和 [=13] 的情况=] 被发现,并尝试 R 的另一个选项(如果可用)。但是,如果 R 也被发现(导致 P, Q, R = true.),并且 ! 像往常一样成功,我们将丢弃任何 选择点 从那时起就没有什么可以回溯的了(甚至 C :- V. 也不行)。这意味着如果找不到 S 的结果,目标 C :- P, Q, R, !, S, T, U. 将立即失败。 但是 Prolog 仍然可以回溯到A :- B, C, D. 以找到B 的其他值。如果找到 B 的另一个匹配项,将重新尝试 C。等等。

假设我的解释是正确的,如果目标C :- P, Q, R, !, S, T, U.成功或失败而不管B的值如何,你将如何提高效率?我的猜测是将 A :- B, C, D. 重写为 A :- B, !, C, D.

我的解释正确吗?考虑到关于 C 的一些先验信息,我的效率提高如何?

是的,你的理解是正确的。为了看得更清楚,我们可以将谓词重写为

a = (b & c & d)
c = (p & q & r) ~~>! (s & t & u) ; v

with & for &&:,以及其他运算符,来自 this answer(或者如果不清楚,将其视为伪代码,with ~~>! 通过不超过一种解决方案)。当达到 cut 时,c 已提交,但 a 仍可回溯。

如果 A :- B, C, D. 中的 C 成功或失败,无论 B 的值如何,您也可以将目标重新排序为

A :- C, B, D.

A :- B, !, C, D.中的切割是红色切割,它只让B成功一次,但是如果你对它的第二个结果感兴趣怎么办?红色切割改变谓词的含义。