Пролог переполнение рекурсии - PullRequest
1 голос
/ 22 июня 2011
fact(1,1):-!.
fact(N,F):-
    N1=N-1,
    fact(N1,F1),
    F=F1*N.

Это приводит к переполнению стека (не сайта)!Это не должно быть из-за разреза (!).Работает ли он в SWI-Prolog?

1 Ответ

4 голосов
/ 22 июня 2011

Обратите внимание, что оба определения (OP и pad) не заканчиваются для запроса, подобного fact(0,N). Но также fact(1,2) не заканчивается. Это должно потерпеть неудачу. И для fact(N, F) он дает только один правильный ответ, но их должно быть бесконечно много. Использование порезов для этой цели очень сложно. Самый простой способ исправить это - добавить к правилу цель N > 0 и иметь факт fact(0,1). Существует еще лучший способ, если вы используете SWI-Prolog: используйте library(clpfd). В документации вы найдете n_factorial/2 уже определено. Может использоваться для запросов типа:

?- n_factorial(47, F).
F = 258623241511168180642964355153611979969197632389120000000000 ;
false.

?- n_factorial(N, 1).
N = 0 ;
N = 1 ;
false.

?- n_factorial(N, 3).
false.
...