I'm writing a program to print factorial from 1 to N:
factorial(1, 1).
factorial(A, B) :-
A > 0,
C is A-1,
factorial(C, D),
B is A*D.
print_fact(X) :-
print_fact_iter(1, X).
print_fact_iter(X, Max) :-
X < Max+1,
factorial(X, N),
write("factorial("),
write(X),
write(") = "),
write(N),
nl,
Next is X+1,
print_fact_iter(Next, Max).
factorial(1) = 1
factorial(2) = 2
factorial(3) = 6
factorial(4) = 24
factorial(5) = 120
But when I delete Next is X+1,
and replace Next
with X+1
, it prints something strange:
print_fact_iter_weird(X, Max) :-
X < Max+1,
factorial(X, N),
write("factorial("),
write(X),
write(") = "),
write(N),
nl,
print_fact_iter_weird(X+1, Max).
factorial(1) = 1
factorial(1+1) = 2
factorial(1+1+1) = 6
factorial(1+1+1+1) = 24
factorial(1+1+1+1+1) = 120
The computing is correct indeed but it seems X+1
is not reduced during passing as an argument and interpreted as a string?