このディレクトリの索引

http://pc11.2ch.net/test/read.cgi/db/1252492296/594
#(問) 
# ID | DATE     | DATA 
# --+----------+----- 
# 1 | 2007-11-11 | aaa 
# 2 | 2007-11-11 | bbb 
# 1 | 2007-11-10 | ccc 
# 3 | 2007-11-12 | ddd 
# 3 | 2007-11-11 | eee 
# 4 | 2007-11-10 | fff 
# 1 | 2007-11-12 | ggg 
#
# このようなテーブルから、各idに対して最新の5件だけ抽出しなさい

各idに対して最新の5件だけ抽出する(_ID,_DATE,_DATA) :-
        findsetof(_ID,テーブル(_ID_1,_DATE_1,_DATA_1),L1),
        member(_ID,L1),
        findall([_DATE,_ID,_DATE,_DATA],テーブル(_ID1,_DATE,_DATA),L2),
        最新の5件を抽出(L3,Len,_ID,_DATE,_DATA).

最新の5件を抽出(L1,_ID,_DATE,_DATA) :-
        sort(L1,L2),
        reverse(L2,L3),
        length(L3,Len),
        '5件を抽出'(L3,Len,_ID,_DATE,_DATA).

'5件を抽出'(L,Len,_ID,_DATE,_DATA) :-
        Len =< 5,
        member([_,_ID,_DATE,_DATA],L).
'5件を抽出'(L,Len,_ID,_DATE,_DATA) :-
        Len > 5,
        for(1,N,5),
        list_nth(N,L,[_,_ID,_DATE,_DATA]),
        N =< 5.