我一直在阅读我上一个问题的答案和评论,并尝试将给定的解释应用于 Bratko 的一个示例(Prolog Programming for Artificial Intelligence,第 130 页),但我不确定我是否完全理解它。该示例描述如下:
我阅读了树和代码如下:
在目标列表中C :- P, Q, R, !, S, T, U.
,Prolog 会像往常一样一一尝试实例化变量,最终达到true.
. 假设为P
and找到了一个值Q
,并且第一次尝试R
失败,那么 Prolog 可以回溯到找到 and 的情况P
,Q
并尝试另一个选项(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
呢?