プロローグの遡及のみを使用して、再帰を使用せずに階乗計算 (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を呼び出すと、正しい答えが得られます。
?- 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 より大きい数値の階乗を取得しようとすると、機能しません。誰かが理由を知っていますか?