我正在编写一个程序来打印从1到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
但是,当我删除Next is X+1,
并将Next
替换为X+1
时,会打印出奇怪的内容:
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
阶乘(1 + 1)= 2
阶乘(1 + 1 + 1)= 6
阶乘(1 + 1 + 1 + 1)= 24
阶乘(1 + 1 + 1 + 1 + 1)= 120
计算确实是正确的但似乎X+1
在作为参数传递并被解释为字符串时没有减少?
答案 0 :(得分:0)
正如你所说,prolog在检查谓词时从不评估整数表达式,例如在foo(X + 1)中。
记住&#34; X + 1&#34;在prolog中,是一个带有&#34; +&#34;作为类型和两个元素,X和1.即,X + 1&lt; =&gt; +(X,1)。另一个例子是:1 + 1 + 1&lt; =&gt; +(1,+(1,1))
这个术语与声明变量统一。
为了评估整数表达式,&#34;是&#34;应该使用,就像你的第一个例子一样。