评估因子

时间:2014-05-30 22:20:31

标签: prolog factorial

我正在尝试编写Prolog函数来评估数字的阶乘。

factorial(1, 1).
factorial(X, Y) :-
    factorial(A, B),
    Y is B * X,
    A is X-1.

第一位是基本情况,因子1是1.

1合适!和2 !,但对于任何高于它的数字。

12 ?- factorial(3,X).
ERROR: is/2: Arguments are not sufficiently instantiated

1 个答案:

答案 0 :(得分:4)

首先,根据您的建议,您的版本甚至不适用于12。还有0。你得到答案,但你没有要求下一个答案:

?- factorial(1, F).
F = 1 ;
ERROR: is/2: Arguments are not sufficiently instantiated

那么如何解决问题呢?我会投入 false

factorial(1, 1).
factorial(X, Y) :-
    factorial(A, B),
    Y is B * X, false,
    A is X-1.
?- factorial(2, Y).
ERROR: is/2: Arguments are not sufficiently instantiated

还是同样的问题。所以它必须是(is)/2这是罪魁祸首。

让我们进一步拉出 false

factorial(1, 1) :- false.
factorial(X, Y) :-
    factorial(A, B), false,
    Y is B * X,
    A is X-1.

现在有两个非凡的事情:这个片段总是循环!并且应该明白为什么:头部和递归目标之间没有任何东西。这种情况称为左递归

然后还有一些值得注意的事情:使用两个未实例化的变量调用factorial(A,B)!因此,请在两者之间添加此A is X-1目标,并进一步确保A > 0。并添加0的大小写。

  
    
      

一些不可避免的ceterum censeo:考虑用library(clpfd)代替学习算术。 (is)/2是1970年代的洙。有关详情,请参阅the manual!见Reversible numerical calculations in Prolog

    
  
相关问题