2010-04-11 70 views
0

我知道如何使用loop来显示列表。 例如,除了使用循环之外,是否还有其他方式显示列表?

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

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

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

+6

这是Prolog吗?你有它的标签为PHP – 2010-04-11 08:08:10

+0

问题:你的第一条规则的头是不变的:它只定义了原子'a'的'choice'谓词的含义,并且在子句'loop(X)',X '没有约束,所以这不是一个合理的规则。 – 2010-04-13 07:32:00

回答

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). 

第一规则的基础情况匹配;这是当列表中没有元素时。在这一点上,我们应该匹配并停止。第二条规则匹配(统一)列表的,并在后面用换行符将其写入屏幕。最后一行将列表的尾部(余数)再次与write_list函数相结合。

你喜欢的东西下面

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

需要注意的事项可以据此把它们串起来 尽量不要有变量,比如在你的选择规则的X.变量可以统一(匹配)某些东西。 看看良好的声明式编程风格。当你使用像write这样的函数时,它可能会让人产生误解并且很容易以程序的方式对待Prolog,但这只会给你带来问题。

希望这有助于

0

write/1并不只写字符串,它写入任何Prolog项。所以,虽然Oli给出了一个更漂亮的write_list,但下面的工作可以完成:

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