如何用prolog计算阶乘

如何用prolog计算阶乘,prolog,factorial,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)。这将再次调用目标部分,代码执行将返回到目标“事实(X,R)”,这将继续,直到我们到达事实(1,1)。这意味着它永远不会去 R是R1*X部分。看来我的想法是错的 有人能一步一步地告诉

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

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

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

一旦我们“到达”了
事实(1,1)
,它将“返回”到调用的递归迭代,并继续进行该迭代的部分
R是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. 
事实(3,R):

X
事实(1,0)
不终止。还有
fact(1,1),false
循环,尽管它应该失败。然而,
fact(1,1)
会给出一个答案,从而引诱你进入安全地带。总是问下一个答案,以确保你没有无限循环。请用事实(3,R)编辑你的答案,因为这是我感到困惑的地方。我想知道当2到3之间为X时会发生什么!在
fact(3,R)
中,第四行将匹配
fact(2,R)
,答案中描述了这一点,因此返回
R=2
。剩下的是sameI编辑您的答案,以便其他用户可以一步一步地跟踪事实(3,R)。但是仍然不能理解最后一部分R,但是为什么在第9行中,你写R1=R'=2?R1=R'?顶部迭代的R1与内部迭代的R匹配。