このディレクトリの索引
#  
#  売上('20120416',トマト,3000).
#  売上('20120417',ナス,1000).
#  売上('20120416',トマト,1500).
#  売上('20120417',ナス,2200).
#  
#  の時に、日付ごとの合計売上が欲しい。
#  
#  ?- 集約加算(_集約値,[_日付,_集約値],[_日付],[_金額],売上(_日付,_品目,_金額),_解).
#  
#  _解 = [['20120416',4500],['20120417',3200]]
#  

集約加算(_集約解変数指定,_選択項,_鍵項,_集約項,P,_解) :-
        findsetof(_鍵項,P,L1),
        findkeysort(_選択項,_鍵項,(
                    member(_鍵項,L1),
                    findsum(_集約項,P,_集約解変数指定)),
                _解_1),
        集約加算の解を平坦化する(_解_1,_解).

集約加算の解を平坦化する(_解_1,_解) :-
        findall(L3,(
                    member(L2,_解_1),
                    平坦化(L2,L3)),
                _解) .


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

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

findkeysort(Select,Keys,P,List) :-
        append(Keys,Select,Keys2),
        findall(Keys2,P,List1),
        sort(List1,List2),
        findall(Select,member(Keys2,List2),List).

平坦化(_深いならび,_平坦化されたならび) :-
        差分ならびによる平坦化(_深いならび,_平坦化されたならび - []) .

差分ならびによる平坦化([_項|_残りならび],_差分ならび頭部 - _差分ならび尾部) :-
        差分ならびによる平坦化(_項,_差分ならび頭部 - _不完全な差分ならび),
        差分ならびによる平坦化(_残りならび,_不完全な差分ならび - _差分ならび尾部) .
差分ならびによる平坦化([],_差分ならび頭部 - _差分ならび尾部) :-
        _差分ならび頭部 = _差分ならび尾部 .
差分ならびによる平坦化(_項,[_項|_差分ならび尾部] - _差分ならび尾部) :-
        \+(list(_項)),!.