如何使用prolog计算阶乘

时间:2015-05-29 17:06:20

标签: prolog factorial

我有一个计算阶乘的代码如下:

fact(1,1).
fact(X,R):- X1 is X-1, fact(X1,R1), R is R1*X.

在我看来,这段代码应该不能正常工作,但确实如此!我的理由是什么?我想当我们称事实(3,R)时,首先计算“ X1是X1 -1 ”。然后它进入下一个规则事实(X1,R1)。这将再次调用目标部分,代码执行将返回目标“ fact(X,R)”,这将持续到我们达到事实(1,1)。这意味着它永远不会去 R是R1 * X 部分。所以,我觉得我错了。

有人可以一步一步地告诉我这段代码中的代码执行顺序吗? 感谢

1 个答案:

答案 0 :(得分:1)

一旦我们“到达”fact(1,1),它将“返回”到调用的递归迭代,并使用R is R1*X继续进行该迭代的R1=1部分。然后将再次返回到先前的级别,依此类推。让我们看一下非平凡的迭代:

fact(3,R) :
   X <- 3,
   X1 <- 3-1 = 2,
   fact(2,R1) : 
      X' <- 2,
      X1' <- 2-1 = 1,
      fact(1, R1'), => R1'=1 (matched from fact(1,1)) 
      R'<- R1' * X' = 2
      R1 = R' = 2
   R <- R1*X = 2*3 = 6. 

此处带'的变量表示与fact(2,R)迭代对应的变量。没有'的变量用于最顶层的迭代。