Обратите внимание, что оба определения (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.