tags:

views:

106

answers:

2

Hi everyone,

I know on how to display a list by using loop. For example,

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

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

Unfortunately, I don't know on how to display list by using list. Anyone can guide me?

+1  A: 

Hi Joshua, it's not very clear what it is that you're trying to achieve.

I'm not sure from your description whether you have quite got to grips with the declarative style of Prolog. When you wrote your rule for loop you were providing a set of conditions under which Prolog would match the rule. This is different from a set of procedural instructions.

If you want to collect all the countries into a list you can use the setof rule like follows

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

This will return a list [] of the countries matched by the rule.

If you wanted to output each element of this list on a new line you could do something like the following recursive function.

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

The first rule matches the base case; this is when there are no elements left in the list. At this point we should match and stop. The second rule matches (unifies) the head of the list and writes it to screen with a newline after it. The final line unifies the tail (remainder) of the list against the write_list function again.

You could then string them together with something like the following

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

Things to note Try not to have singleton variables such as the X in your choice rule. Variables are there to unify (match) against something. Look into good declarative programming style. When you use functions like write it can be misleading and tempting to treat Prolog in a procedural manner but this will just cause you problems.

Hope this helps

Oli
A: 

write/1 doesn't only write strings, it writes any Prolog term. So, though Oli has given a prettier write_list, the following would do the job:

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