我試圖實現一個階乘計算(n!)的解決方案,而不使用遞歸,只使用prolog的retroaction。例如:沒有使用遞歸的因子計算
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).
有了固定的事實階乘,如果我叫謂詞倒行逆施發現的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,不起作用。有人對此有任何想法嗎?
對,@luker。發佈更新。 – rwehresmann
這有點令人困惑。你想調用哪個謂詞來獲得階乘?它看起來是'factorial/2',但是你的例子使用'retroaction/2',你的主要實現在'factorial_ret/2'中,而不是從其他地方調用。 – lurker
獲得階乘的謂詞是'factorial/2'。 'retroaction/2'只是一個例子來展示階乘非遞歸解決方案的意義。 – rwehresmann