我知道如何使用loop
显示列表。
例如,
choice(a):-write('This is the top 15 countries list:'),nl,
loop(X).
loop(X):-country(X),write(X),nl,fail.
不幸的是,我不知道如何使用list
显示列表。有人可以指导我吗?
答案 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).