Я пытаюсь реализовать решение для факториала (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).
С фиксированными фактами факторного, если я называю предикат обратного действия, чтобы открыть факториал 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