Сначала посмотрим на правила
num(0).
num(X) :- num(X1), X is X1 + 1.
предикат num(Y)
будет немедленно действителен для Y = 0
.
Таким образом, правило
fact(X) :- num(Y), fact(Y,X).
можно упростить до
fact(X) :- fact(0,X).
, который найдет совпадение для fact(0,1)
. Для X = 6
вместо этого происходит следующее: поскольку ни одно из правил не определяет предикат для fact(0,6)
, поиск начинается с fact(-1,V1)
, затем с fact(-2,V2)
и т. Д. ... пока не будет найдено совпадение для fact(-value, Var)
, где локальным результатом будет найденная переменная.
Этого не может быть, и бесконечный цикл потребляет весь стек до тех пор, пока не сработает ошибка.