如何用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.
。假设为 P
和 Q
找到了一个值,并且第一次尝试 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
成功一次,但是如果你对它的第二个结果感兴趣怎么办?红色切割改变谓词的含义。
我一直在阅读
我读树和代码如下:
在目标列表C :- P, Q, R, !, S, T, U.
中,Prolog将像往常一样一个接一个地尝试实例化变量,最终到达true.
。假设为 P
和 Q
找到了一个值,并且第一次尝试 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
成功一次,但是如果你对它的第二个结果感兴趣怎么办?红色切割改变谓词的含义。