我将这样的学生详细信息告诉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,但是找不到正确的答案。 请帮帮我。
感谢。
答案 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]).