このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1272006124
# <問題>
# 全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。

全社員が売上を記録した日を求めよ(_日) :-
        count(社員(_社員),_社員人数),
        findsetof(_日,売上(_社員,_日,_データ),L1),
        append(_,[_日|R],L1),
        findsetof(_社員,社員(_社員,_日,_データ),L2),
        length(L2,_社員人数).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

count(P,N) :-
        findsum(1,P,F),
        N is truncate(F).

findsum(_選択項,_項,_合計値) :-
        findall(_選択項,_項,_値ならび),
        加算(_値ならび,_合計値),!.

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

加算(trunc(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A is trunc(B)),SL),!.
加算(四捨五入(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!.
加算(切捨て(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!.
加算(切り上げ(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!.
加算([],L) :-
        var(L),
        L = 0.0e+00,!.
加算([],L) :-
        \+(var(L)),
        加算の変数に零をおく(L),!.
加算([L|R],SL) :-
        ならび(L),
        転置([L|R],L1),
        加算_2(L1,SL),!.
加算(X,S) :-
        加算_1(X,0.0e+00,S).

加算_1([],S,S) :- !.
加算_1([A|R],Y,S) :-
        ならび(A),
        ならび(Y),
        !,
        ならび加算(A,Y,Z),
        加算_1(R,Z,S),!.
加算_1([A|R],Y,S) :-
        atom(A),
        atom_number(A,I),
        integer(I),
        Z is I + Y,
        加算_1(R,Z,S),!.
加算_1([A|R],Y,S) :-
        atom(A),
        atom_number(A,F),
        real(F),
        Z is F + Y,
        加算_1(R,Z,S),!.
加算_1([A|R],Y,S) :-
        atom(A),
        加算_1(R,Y,S),!.
加算_1([A|R],Y,S) :-
        A1 は A,
        Z is A1 + Y,
        加算_1(R,Z,S).

加算_2([],[]) :- !.
加算_2([L|R],[S|R2]) :-
        加算(L,S),
        加算_2(R,R2).

ならび加算([],L,L) :- !.
ならび加算(L,[],L) :- !.
ならび加算([A|R],[B|R1],[C|R2]) :-
        C is A + B,
        ならび加算(R,R1,R2).

加算の変数に零をおく([]) :- !.
加算の変数に零をおく([A|R]) :-
        変数(A),
        A = 0.0e+00,
        加算の変数に零をおく(R),!.