如何通过削减来解释这个Prolog目标,并提高效率

时间:2016-12-06 11:15:44

标签: performance prolog prolog-cut

我一直在阅读my previous question的答案和评论,我尝试对Bratko(Prolog Programming for Artificial Intelligence,p.130)的一个例子应用给定的解释,但我不确定我理解它完全。示例如下所述:

Bratko p. 130

我读了树和代码如下:

在目标列表中C :- P, Q, R, !, S, T, U. Prolog将逐一尝试实例化变量,最终到达true.。假设找到PQ的值,并且R上的第一次尝试失败,则Prolog可以回溯到P和{{1}的情况找到了,并尝试Q的另一个选项(如果可用)。但是,如果同时找到R(导致R),并且P, Q, R = true.一如既往地成功,我们会丢弃任何选择点并且没有任何内容从那一点开始追踪(甚至不是!)。这意味着,如果找不到C :- V.的结果,则目标S将立即失败。 但是 Prolog仍然可以回溯到C :- P, Q, R, !, S, T, U.以查找A :- B, C, D.的其他值。如果找到B的其他匹配项,则会再次尝试B。等等。

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

我的解释是否正确?考虑到A :- B, !, C, D上的一些先验信息,我的效率有何提高?

1 个答案:

答案 0 :(得分:1)

是的,您的理解是正确的。为了更好地看待它,我们可以将谓词重写为

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

& &&:和其他运算符来自this answer(或者如果不清楚,请将此视为伪代码,~~>!通过不超过一个解决方案)。达到剪切后,将提交c,但a仍然可以回溯。

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

A :- C, B, D.

A :- B, !, C, D.中的剪切是红色剪切,只允许B成功一次,但如果您对其第二个结果感兴趣怎么办?红色削减会改变谓词的含义。