如何在Prolog中打印列表

时间:2014-03-29 20:18:12

标签: prolog

我将这样的学生详细信息告诉DB。

assert(details(Age,Name,Dob,Zodiac)).

我希望获得按年龄排序的详细信息列表(asending或desending),然后将其显示出来。

Name : sam
Date of Birth : 1991-8-1
Age : 23
Zodiac Sign : leo

Name : john
Date of Birth : 1993-6-12
Age : 25
Zodiac Sign : cancer

我尝试使用bagof,但是找不到正确的答案。 请帮帮我。

感谢。

1 个答案:

答案 0 :(得分:2)

就订购事实而言,使用setof在这里会有所帮助,假设您的事实在某些方面都是截然不同的。 setof将自动按自然顺序排序,在这种情况下,将由details中的第一个参数进行排序,即年龄:

list_ascending :-
    detail_list(List),
    maplist(write_item, List).

list_descending :-
    detail_list(List),
    reverse(List, DescList),
    maplist(write_item, DescList).

detail_list(List) :-
    setof(details(Age,Name,Dob,Zodiac), details(Age,Name,Dob,Zodiac), List).

然后您只需要创建write_item谓词:

write_item(details(Age,Name,Dob,Zodiac)) :-
    write('Name : '), write(Name), nl,
    write('Date of Birth : '), write(Dob), nl,
    write('Age : '), write(Age), nl,
    write('Zodiac Sign : '), write(Zodiac), nl, nl.

或者,使用format

write_item(details(Age,Name,Dob,Zodiac)) :-
    format('Name : ~w~NDate of Birth : ~w~NAge : ~w~NZodiac Sign : ~w~2N',
           [Name, Dob, Age, Zodiac]).