我正在尝试编写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
答案 0 :(得分:4)
首先,根据您的建议,您的版本甚至不适用于1
或2
。还有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