我有一个谓词numbers/3
,它将两个数字作为输入,并生成它们之间的所有数字作为列表。现在我想以某种方式输出这个列表,例如:
?- niceList(1,5).
1
2
3
4
5
.
我知道我必须编写一个递归子句来实现这一点,但我仍然坚持如何去做。 到目前为止,这是我尝试过的:
niceList(N1, N2):-
numbers(N1, N2, [H|T]),
write(H), nl,
numbers(N1, N2, [T]).
我的想法是拿下列表,记下Head然后继续Tail,这将成为新的[H | T]。我写的不正确,因为它只打印Head然后返回False。
我将不胜感激任何帮助!
答案 0 :(得分:1)
打印当前头后,您必须以列表中的下一个数字(让我们将其称为niceList
作为第一个参数)递归调用NH
。
类似的东西:
niceList(N1, N2):-
numbers(N1, N2, [H|[NH|_]]),
write(H), nl,
niceList(NH, N2).
请注意,它不会打印到最后一个数字。
根据@ lurker在下面的评论,我添加了一个基本案例,其中包含了最后一个数字并返回成功。
niceList(N1, N2):-
numlist(N1, N2, [H|[NH|_]]),
write(H), nl,
niceList(NH, N2),
!.
niceList(_, N):- write(N).
示例输出:
?- niceList(1,5).
1
2
3
4
5
true.
答案 1 :(得分:0)
如果你正在运行Swi-Prolog,你可以使用forall / 2谓词和/ 3之间的结合:
niceList(N1, N2) :-
forall(
between(N1, N2, N),
format('~w~n', [N])
).
forall的工作原理如下:对于作为第一个参数给出的谓词的每个解,执行第二个参数。在我们的例子中,对于发现在N1和N2之间的每个数字N,执行format / 3(即将其打印到控制台)。