SWI-Prolog的截断机制

我们经常会在Prolog的递归顶用到截断 。 尽管回溯是Prolog中最有效的机制之一 , 但有时我们但愿操纵截断节制回溯的法式 。 在这篇经验中 , 我将介绍截断机制与谓词fail 。
1SWI-Prolog的递归
1SWI-Prolog的算术运算

SWI-Prolog的截断机制

文章插图

需要这些哦
电脑
SWI-Prolog
包管准确地选择法则1Prolog为用户供给了一种可存在于法式中并节制回溯程度的机制 , 即所谓的“截断(cut)” 。 Porlog顶用叹号“!”暗示截断 。 当在几个方针合取中设置了截断时 , 其感化就恰似安上了一扇单标的目的门 。 截断作为方针老是当作功的 , 且不克不及反复知足 。 例如 , 下面的法则:
example :- a, b, c, !, d, e, f.
Prolog可以在方针a、b、c之间肆意回溯 , 但一旦方针c一经知足 , 将经由过程截断符号 , 然后Prolog继续沿着方针链试图知足方针d、e、f , 回溯可能在d、e、f之进步行 , 然而不克不及经由过程“!”回溯前面的 , 即使导致总体方针example掉败也是如斯 。

SWI-Prolog的截断机制

文章插图

2法式中一个谓词经常以多种形式存在 , 此中一般至少有两种分歧形式的谓词丰硕 , 即递归法则和遏制前提 。 当编写如许的谓词时 , 必需包管Prolog老是选择谓词的准确形式 。 如当Prolog该当采用遏制前提时 , 就不该选择递归法则 , 不然会导致无限递归 。 例如 , 下面这个法式是用于计较X的Y次幂 。
2Prolog的根基概念和语律例则
1SWI-Prolog的递归

SWI-Prolog的截断机制

文章插图

3若是我们对Prolog提出扣问:
?- power(2,3,Result).
将会以以下体例进行操作:
23 = 22 * 2 , 22 = 21 * 2 , 21 = 2? * 2 , 且2? = 1 。

SWI-Prolog的截断机制

文章插图

4但若是我们要求上例在给出回覆后继续回溯 , 即键入分号 , 则会试图在常识库中寻找到另一个事实或法则 , 使其与上面的方针匹配 。 这就是说 , Prolog搜刮到的另一个Prolog谓词即是递归法则 。 Prolog与之匹配 , 使X为2 , Y为0 , 然后Prolog计较Y_tmp获得-1 , 并试图知足方针:
power(X, Y_tmp, Pow_tmp),
这等于在计较2?1 , 依次进行下去 , 将试图计较2?2 , 2?3 , 等等 。 这时无限递归呈现了 , 即递归方针持续发生本身 , 而永远不克不及知足遏制前提 , 起头报错 。

SWI-Prolog的截断机制

文章插图

5上面的环境显然不是我们所期望的 , 它可以经由过程在遏制前提中设置截断而得以避免 , 如许就获得了下列新的、加倍健全和靠得住的power谓词形式:
power(_, 0, 1). :- !.
power(X, Y, Pow) :-    Y_tmp is Y - 1,    power(X, Y_tmp, Pow_tmp),

推荐阅读