我正在尝试在不使用递归的情况下实现阶乘计算(n!)的解决方案,仅使用序言的追溯。例如:
factorial(0, 1).
factorial(1, 1).
factorial(2, 2).
retroaction(X, Y) :-
factorial(K, Y),
not(K = X),
fail.
retroaction(K, Y) :- factorial(K, Y).
使用固定事实factorial,如果我调用谓词追溯来发现 2 的阶乘,例如,我会收到正确的答案:
?- retroaction(2, X).
X = 2.
我正在尝试实施的解决方案是:
factorial_ret(Number, _) :-
retractall(factorial(_, _)),
assertz(factorial(0,1)),
factorial(X, Y),
not(X = Number),
NewNumber is X + 1,
Factorial is Y * NewNumber,
retractall(factorial(_, _)),
assertz(factorial(NewNumber, Factorial)),
fail.
factorial_ret(Number, Y) :-
factorial(Number, Y).
如果我尝试获得大于 1 的数字的阶乘,则不起作用。有人知道为什么吗?