10/01/03 19:57:09
>>151
% Prolog は集約は得意としない。その場でこの述語を考えるのは負担が大きいので、
% 以下のような準備が必要だろう。SQLのcount(*)を解決する処理だが。
集約_数_逆順ならび([],L,L) :- !.
集約_数_逆順ならび([A|R1],L1,L) :-
\+(member([_,A],L1)),
集約_数_計測(A,R1,L2,1,Count),
逆順整列([Count,A],L1,L3),
集約_数_逆順ならび(L2,L3,L),!.
集約_数_計測(_,[],[],Count,Count) :- !.
集約_数_計測(A,[A|R1],L2,Count1,Count) :-
Count2 is Count1 + 1,
集約_数_計測(A,R1,L2,Count2,Count),!.
集約_数_計測(A,[B|R1],[B|R2],Count1,Count) :-
\+(A = B),
集約_数_計測(A,R1,R2,Count1,Count),!.
逆順整列(L,[],[L]) :- !.
逆順整列(L,[L1|R1],[L,L1|R1]) :-
L @>= L1,!.
逆順整列(L,[L1|R1],[L1|R2]) :-
逆順整列(L,R1,R2).