このディレクトリの索引
#  
#  成績 [氏名,成績1,成績2, ... 成績n]の成績の合計点順の
#  順位を振る非決定性述語
#  

順位付け(_整列した組みならび,_順位,_組) :-
        順位付け(_整列した組みならび,[],[],_順位,_組).

順位付け([_組|_],Ln,_,_順位,_組) :-
        length([_|Ln],_順位).
順位付け([_組_1,_組_2|R],Ln,Ln_2,_順位,_組) :-
        第二項以降の合計点が同じ(_組_1,_組_2),!,
        順位付け([_組_2|R],Ln,[_|Ln_2],_順位,_組).
順位付け([_|R],_,Ln_2,_順位,_組) :-
        順位付け(R,[_|Ln_2],[_|Ln_2],_順位,_組).

第二項以降の合計点が同じ([_|R1],[_|R2]) :-
        sum_list(R1,S),
        sum_list(R2,S).


成績の合計順に降順整列(_成績ならび,_成績の合計順に降順整列したならび) :-
        整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび),
        降順整列(_合計点を先頭に付加された成績ならび,_成績の合計順に降順整列した合計点を先頭に付加された成績ならび),
        先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび).

整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび) :-
        findall([_合計点,_氏名|成績ならび],(
                    member([_氏名|_成績ならび],_成績ならび),
                    sum_list(_成績ならび,_合計点)),
               _合計点を先頭に付加された成績ならび).

先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび) :-
        findall(L,(
                    member([_|L],_成績の合計順に降順整列した合計点を先頭に付加された成績ならび)),
                _成績の合計順に降順整列したならび).

降順整列([],[]).
降順整列([_軸要素|R],L) :-
        降順整列の分割(_軸要素,R,L1,L2),
        降順整列(L1,L1_2),
        降順整列(L2,L2_2),
        append(L1_2,[_軸要素|L2_2],L).

降順整列の分割(_,[],[],[]).
降順整列の分割(_軸要素,[_要素|R],[_要素|L1],L2) :-
        _要素 @>= _軸要素,
        降順整列の分割(_軸要素,R,L1,L2).
降順整列の分割(_軸要素,[_要素|R],L1,[_要素|L2]) :-
        _要素 @< _軸要素,
        降順整列の分割(_軸要素,R,L1,L2).