如何通过写入以某种方式输出列表?

时间:2017-10-22 13:40:06

标签: prolog

我有一个谓词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。

我将不胜感激任何帮助!

2 个答案:

答案 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(即将其打印到控制台)。