Пролог не имеет арифметических выражений, которые автоматически оцениваются в значения, как в других языках. X-1
не обозначает арифметическое значение; это просто термин.
?- X = 5, Y = X - 1.
X = 5,
Y = 5-1.
Чтобы вычислить арифметическое значение, вы должны использовать предикат is/2
:
?- X = 5, Y is X - 1.
X = 5,
Y = 4.
Таким образом, вместо вызова asc(X-1)
вы должны отдельно вычислить значение X - 1
и передать этот результат рекурсивному вызову:
asc(0) :-
write(0).
asc(X) :-
X > 0,
X1 is X - 1,
asc(X1),
write(X).
Страж X > 0
необходим, чтобы избежать бесконечной рекурсии по отрицательным числам.