首页 > 解决方案 > 在序言中按升序打印 0 到 10

问题描述

我尝试过遵循代码,但没有奏效。此代码中的错误是什么..?

asc(0):-
    write(0).
asc(X):-
    asc(X-1),
    write(X).

标签: recursionprolog

解决方案


Prolog 没有像其他语言那样自动评估为值的算术表达式。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来避免沿负数的无限递归。


推荐阅读