Performance 如何切中要害地解释这个Prolog目标,并提高效率

Performance 如何切中要害地解释这个Prolog目标,并提高效率,performance,prolog,prolog-cut,Performance,Prolog,Prolog Cut,我一直在阅读的答案和评论,并尝试将给出的解释应用于Bratko的一个例子(Prolog Programming for Artificial Intelligence,第130页),但我不确定我是否完全理解它。该示例描述如下: 我阅读了树和代码如下: 在目标列表中C:-p,Q,R!,S、 T,U.Prolog会像往常一样一个接一个地尝试实例化变量,最终得到true.。假设为P和Q找到了一个值,并且第一次尝试R失败,那么Prolog可以返回到找到P和Q的情况,并尝试R的另一个选项(如果可用)。但

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

我阅读了树和代码如下:

在目标列表中
C:-p,Q,R!,S、 T,U.
Prolog会像往常一样一个接一个地尝试实例化变量,最终得到
true.
。假设为
P
Q
找到了一个值,并且第一次尝试
R
失败,那么Prolog可以返回到找到
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
的先验信息,我的效率提高了多少?

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

a = (b & c & d)
c = (p & q & r) ~~>! (s & t & u) ; v
使用
&
for
&&:
和其他运算符,从(或者如果不清楚,请将其视为伪代码,
~~>!
传递的解决方案不超过一个)。当达到切割时,
c
被提交,但是
a
仍然可以回溯

如果
A:-B,C,D.
中的
C
成功或失败,无论
B
的值是多少,您也可以按如下顺序重新排列目标:

A :- C, B, D.

切入点
A:-B!,C、 D.
是一个红色切割,它只允许
B
成功一次,但是如果你对它的第二个结果感兴趣呢?红色切割会改变谓词的含义。

谢谢!我很高兴我现在明白了。我应该试着在头脑中更好地区分什么时候该在树上思考,什么时候不该在树上思考。我没有考虑对
A:-C,B,D.
进行重新排序,因为在我看来,这会改变树的顺序,这是不允许的,也会改变声明的含义-但当然不是这样,最终我们只关心查询的结果,而不是顺序。再次感谢你到目前为止对我的指导!很高兴能帮上忙。:)