このディレクトリの索引

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件だけ抽出する(_テーブル名,L) :-
   functor(Q,_テーブル名,3),
   重複を排除したidならびの抽出(ID,Q,L1),
   整列(L1,L2),
   findall(L3,(member(ID,L1),idに対して最新の5件だけ抽出する(ID,Q,L3)),L).

idに対して最新の5件だけ抽出する(ID,Q,L) :-
   目標Qの第一引数はID(ID,Q),
   idに対して組ならびを抽出する(Q,L3),
   最新の5件だけ抽出する(L3,L).

idに対して組ならびを抽出する(Q,L3) :-
   findall(L1,(call(Q),引数部分だけ抽出する(Q,L1)),L2),
   整列(L2,L3),!.

重複を排除したidならびの抽出(ID,Q,L1) :- setof(ID,Q,L1).

目標Qの第一引数はID(ID,Q) :- arg(1,Q,ID),!.   

引数部分だけ抽出する(Q,L1) :- Q =.. [_|L1].

最新の5件だけ抽出する(L3,L) :-
   length(L,5),
   append(_,L,L3),!.
最新の5件だけ抽出する(L,L) :- !.