如何使用序言计算阶乘

How to calculate factorial using prolog

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

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

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

谁能一步一步告诉我这段代码中的代码执行顺序? 谢谢

一旦我们 "reach" fact(1,1),它将 "return" 调用递归迭代并继续执行该迭代的 R is R1*X 部分, R1=1.然后将 return 再次提升到上一级,依此类推。让我们看一个非平凡的迭代:

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)次迭代的变量。没有 ' 的变量用于最顶层迭代。