我知道如何使用loop
来显示列表。 例如,除了使用循环之外,是否还有其他方式显示列表?
choice(a):-write('This is the top 15 countries list:'),nl,
loop(X).
loop(X):-country(X),write(X),nl,fail.
不幸的是,我不知道如何使用list
显示列表上。任何人都可以指导我?
我知道如何使用loop
来显示列表。 例如,除了使用循环之外,是否还有其他方式显示列表?
choice(a):-write('This is the top 15 countries list:'),nl,
loop(X).
loop(X):-country(X),write(X),nl,fail.
不幸的是,我不知道如何使用list
显示列表上。任何人都可以指导我?
这是不是很清楚你试图实现什么。
从您的描述中我不确定您是否完全理解了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,但这只会给你带来问题。
希望这有助于
write/1
并不只写字符串,它写入任何Prolog项。所以,虽然Oli给出了一个更漂亮的write_list,但下面的工作可以完成:
choice(Countries):-write('This is the top 15 countries list:'),nl,write(Countries).
这是Prolog吗?你有它的标签为PHP – 2010-04-11 08:08:10
问题:你的第一条规则的头是不变的:它只定义了原子'a'的'choice'谓词的含义,并且在子句'loop(X)',X '没有约束,所以这不是一个合理的规则。 – 2010-04-13 07:32:00