このディレクトリの索引

# もう一度。テーブルtableにキーAの列とキーBの列がある。
# キーBは時系列で、例えば2011年5月6日なら20110506みたいな感じ。
# 昨日なら20110505だな。つまりプライマリではある。
# こいつをキーA毎に上位5つずつ抜き出したデータテーブル(VIEW)を作りたい
# 曜日ごとに、日付の早い順5tuplesをとりだす。
# 
# 曜日(金曜,'20110401').
# 曜日(月曜,'20110404').
# 曜日(火曜,'20110405').
# 曜日(水曜,'20110406').
# 曜日(金曜,'20110408').
# 曜日(土曜,'20110409').
# 曜日(月曜,'20110411').
# 曜日(火曜,'20110412').
# 曜日(木曜,'20110414').
# 曜日(金曜,'20110415').
# 曜日(土曜,'20110416').
# 曜日(日曜,'20110417').
# 曜日(月曜,'20110418').
# 曜日(火曜,'20110419').
# 曜日(木曜,'20110421').
# 曜日(金曜,'20110422').
# 曜日(土曜,'20110423').
# 曜日(月曜,'20110425').
# 曜日(火曜,'20110426').
# 曜日(水曜,'20110427').
# 曜日(木曜,'20110428').
# 曜日(日曜,'20110501').
# 曜日(月曜,'20110502').
# 曜日(火曜,'20110503').
# 曜日(水曜,'20110504').
# 曜日(木曜,'20110505').
# 曜日(土曜,'20110507').
# 曜日(日曜,'20110508').
# 曜日(月曜,'20110509').
# 曜日(火曜,'20110510').
# 曜日(金曜,'20110513').
# 曜日(土曜,'20110514').
# 曜日(日曜,'20110515').
# 曜日(火曜,'20110517').
# 曜日(水曜,'20110518').
# 曜日(木曜,'20110519').
# 曜日(日曜,'20110522').
# 曜日(月曜,'20110523').
# 曜日(火曜,'20110524').
# 曜日(水曜,'20110525').
# 曜日(木曜,'20110526').
# 曜日(金曜,'20110527').
# 曜日(土曜,'20110528').
# 曜日(日曜,'20110529').
# 曜日(月曜,'20110530').
# 曜日(火曜,'20110531').

曜日ごとの最初の五つの日付(_曜日,_最初の五つの日付ならび) :-
        eachsetof(_曜日,曜日(_曜日,_日付),_曜日_1),
        setof(_日付_1,曜日(_曜日_1,_日付_1),L),
        limit_n(5,L,_最初の五つの日付ならび).


%%%% 汎用述語(ユーザ定義) %%%%

limit_n(N,L,_limit_n_L) :-
        length(L,Len),
        Len < N,
        L = _limit_n_L),!.
limit_n(N,L,_limit_n_L) :-
        length(_limit_n_L,N),
        append(_limit_n_L,_,L).

eachsetof(A,B,E) :-
        findsetof(A,B,L),
        append(_,[E|_],L).

findsetof(A,B,L) :-
        findall(A,B,C),
        setof(A,member(A,C),L).