SWI-Prolog的截断机制

 时间:2024-10-11 18:58:44

我们经常会在Prolog的递归中用到截断。尽管回溯是Prolog中最有用的机制之一,但有时我们希望利用截断控制回溯的程序。在这篇经验中,我将介绍截断机制与谓词fail。

SWI-Prolog的截断机制

2、程序中一个谓词常常以多种形式存在,其中一般至少有两种不同形式的谓词丰硕,即递归规则和停止条件。当编写这样的谓词时,必须保证Prolog总是选择谓词的正确形式。如当Prolog应当采用停止条件时,就不应选择递归规则,否则会导致无穷递归。例如,下面这个程序是用于计算X的Y次幂。

SWI-Prolog的截断机制

4、但如果我们要求上例在给出回答后继续回溯,即键入分号,则会试图在知识库中寻找到另一个事实或规则,使其爵奏笆棚与上面的目标匹配。这就是说,Prolog搜索到的另一个Prolog谓词便是递归规则。Prolog与之匹配,使X为2,Y为0,然后Prolog计算Y_tmp得到-1,并试图满足目标:power(X, Y_tmp, Pow_tmp),这等于在计算2⁻¹,依次进行下去,将试图计算2⁻²,2⁻³,等等。这时无穷递归出现了,即递归目标连续产生自己,而永远不能满足停止条件,开始报错。

SWI-Prolog的截断机制SWI-Prolog的截断机制SWI-Prolog的截断机制

2、应当注意,截断与fail联用通常可用否定谓词“\+”代替,\+是Prolog另一个标准谓词,如果目标X失败,则目标\+(X)成功;如果X成功,则会失败。因此上面程序可以重写为图片中的形式。这里把三个eligible规则合成为一个规则,这两种编程方式中哪种可读性更高呢?关于这一问题存在争议,因为这取决于对截断的理解程度。

SWI-Prolog的截断机制
  • 饭后什么时候可以练瑜伽
  • HTML5的网页制作基础
  • 隐函数求导的实质运算法则求导对吗
  • 肌肉的力量与耐力均衡吗
  • VB如何添加高级控件
  • 热门搜索
    膝盖疼怎么办 炖鱼汤的做法 鸡块炖土豆的做法 户口本丢了怎么补办 茼蒿菜的做法 轭怎么读 凉拌莴笋的做法 牛肉馅饺子怎么调馅 炸藕夹的做法 黄骨鱼汤的做法