我一直在阅读my previous question的答案和评论,我尝试对Bratko(Prolog Programming for Artificial Intelligence,p.130)的一个例子应用给定的解释,但我不确定我理解它完全。示例如下所述:
我读了树和代码如下:
在目标列表中C :- P, Q, R, !, S, T, U.
Prolog将逐一尝试实例化变量,最终到达true.
。假设找到P
和Q
的值,并且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
上的一些先验信息,我的效率有何提高?
答案 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
成功一次,但如果您对其第二个结果感兴趣怎么办?红色削减会改变谓词的含义。