09/12/26 16:42:37
>>109
% Prolog (その一) 一般化できる部分のみ。集約データの収集/3,_述語/_アリティに対応する述語定義
% データベースの項目に関する情報述語と集約項目に関する述語が別に必要。
集約述語の生成(_述語/_アリティ,_集約述語ならび) :-
findall(_集約キー,集約キーの生成(_述語/_アリティ,_集約キー),_集約キーならび),
集約述語の生成(_述語/_アリティ,_集約キーならび,_集約述語ならび).
集約述語の生成(_述語/_アリティ,[],[]) :- !.
集約述語の生成(_述語/_アリティ,[_集約キー|R1],[_集約述語名/_アリティ2|R2]) :-
concat_atom(_集約キー,'・',_集約述語名),
length([_|_集約キー],_アリティ2),
集約データの収集(_述語/_アリティ,_集約キー,_集約データならび),
集約データの定義(_集約述語名,_集約データならび),
集約述語の生成(_述語/_アリティ,R1,R2).
集約データの定義(_,[]) :- !.
集約データの定義(_集約述語名,[_集約データ|R]) :-
P =.. [_集約述語名|_集約データ],
assertz(P),
集約データの定義(_集約述語名,R).
集約キーの生成(_述語/_アリティ,_集約キー) :-
集約項目(_述語/_アリティ,L),
append(L1,_,L),
\+(L1=[]).