我有一个简单的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。我尝试了各种各样的,无论如何这样做了吗?!
非常感谢。
答案 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).