是否有其他方法来显示除使用循环之外的列表?

时间:2010-04-11 08:05:13

标签: prolog

我知道如何使用loop显示列表。 例如,

choice(a):-write('This is the top 15 countries list:'),nl,
loop(X).

loop(X):-country(X),write(X),nl,fail.

不幸的是,我不知道如何使用list显示列表。有人可以指导我吗?

2 个答案:

答案 0 :(得分:4)

目前还不是很清楚你想要实现的是什么。

我不能从你的描述中确定你是否已经完全掌握了Prolog的声明式风格。当您为loop编写规则时,您提供了一组Prolog符合规则的条件。这与一套程序指令不同。

如果您想将所有国家/地区收集到列表中,可以使用setof规则,如下所示

top_countries(Cs):-
    setof(C, country(C), Cs).

这将返回与规则匹配的国家/地区的列表[]。

如果你想在新行上输出这个列表的每个元素,你可以做类似下面的递归函数。

write_list([]).
write_list([H|T]):-
        write(H),nl,
    write_list(T).

第一条规则匹配基本情况;这是列表中没有剩余元素的时候。此时我们应该匹配并停止。第二条规则匹配(统一)列表的 head 并将其写入屏幕后面带有换行符。最后一行再次针对write_list函数统一列表的 tail (余数)。

然后,您可以将它们与以下

之类的内容串在一起
choice(a):-
    write('This is the top 15 countries list:'),nl,
    top_countries(X),
    write_list(X).

需要注意的事项 尽量不要在选择规则中使用单例变量,例如X.变量可以统一(匹配)某些东西。 研究良好的声明性编程风格。当你使用像write这样的函数时,以程序的方式处理Prolog可能会产生误导和诱惑,但这只会给你带来问题。

希望这有帮助

答案 1 :(得分:0)

write/1不仅会编写字符串,还会编写任何Prolog术语。所以,尽管Oli给出了一个更漂亮的write_list,但以下内容可以完成这项任务:

choice(Countries):-write('This is the top 15 countries list:'),nl,write(Countries).