简单的Prolog while循环总是返回false?

时间:2014-03-12 11:41:53

标签: while-loop prolog

我有一个简单的Prolog程序,可以打印从X到10的所有值。

print_(X) :- X <= 10, X1 is X + 1, write(X), print_(X1).

因此,例如print_(5)将返回:5 6 7 8 9 10 False。

但是我希望它最后返回True。我尝试了各种各样的,无论如何这样做了吗?!

非常感谢。

3 个答案:

答案 0 :(得分:3)

你也可以使用成功的终止案例来做到这一点:

print_(X) :-
    X =< 10,
    X1 is X + 1,
    write(X), nl,
    print_(X1), !.
print_(X) :- X > 10.

然后你得到:

| ?- print_(5).
5
6
7
8
9
10

yes
| ?-

请注意,此解决方案以及@larsmans提供的解决方案将在print_(11).等情况下成功,但不会显示任何值。

<小时/> 的附录

@CapelliC提出了一个非常简洁的解决方案,如果初始参数超出范围,将会出现故障。使用简单谓词的另一个选择可能是:

print_(X) :-
    X =< 10,
    X1 is X + 1,
    write(X), nl,
    (print_(X1) -> true ; true).

最后一行说:“我不关心查询print_(X1)是成功还是失败,我想成功并继续前进。”但是,如果参数最初超出范围,则print_/2谓词将失败。

这会产生:

| ?- print_(5).
5
6
7
8
9
10

yes
| ?-

| ?- print_(11).

no
| ?-

答案 1 :(得分:2)

为了避免在mbratch回答中指出的缺陷,可以选择

print_(X) :- X =< 10, forall(between(X,10,N), write(N)).

答案 2 :(得分:1)

将其包含在另一个否定结果的谓词中。

print_loop(X) :- \+ print_(X).