Performance 如何切中要害地解释这个Prolog目标,并提高效率
我一直在阅读的答案和评论,并尝试将给出的解释应用于Bratko的一个例子(Prolog Programming for Artificial Intelligence,第130页),但我不确定我是否完全理解它。该示例描述如下: 我阅读了树和代码如下: 在目标列表中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的另一个选项(如果可用)。但
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.
进行重新排序,因为在我看来,这会改变树的顺序,这是不允许的,也会改变声明的含义-但当然不是这样,最终我们只关心查询的结果,而不是顺序。再次感谢你到目前为止对我的指导!很高兴能帮上忙。:)