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

成績の合計順に順位付けする(_成績ならび,_順位,_組) :-
成績の合計順に(_成績ならび,_成績の合計順に降順整列したならび),
順位付けする(_成績の合計順に降順整列したならび,_順位,_組).


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

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

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


降順整列([],[]).
降順整列([_軸要素|R],L) :-
軸要素との大小で二列を作りそれぞれ降順整列したものを結合する(_軸要素,R,L).

軸要素との大小で二列を作りそれぞれ降順整列したものを結合する(_軸要素,R,L) :-
降順整列の分割(_軸要素,R,L1,L2),
それぞれ降順整列したものを結合する(_軸要素,L1,L2,L).

降順整列の分割(_,[],[],[]).
降順整列の分割(_軸要素,L,L1,L2) :-
'軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2).

'軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2) :-
'L1に要素を付加してさらに分割を続ける'(_軸要素,L,L1,L2).
'軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2) :-
'L2に要素を付加してさらに分割を続ける'(_軸要素,L,L1,L2).

'L1に要素を付加してさらに分割を続ける'(_軸要素,[_要素|R],[_要素|L1],L2) :-
_要素 @>= _軸要素,
降順整列の分割(_軸要素,R,L1,L2).

'L2に要素を付加してさらに分割を続ける'(_軸要素,[_要素|R],L1,[_要素|L2]) :-
_要素 @< _軸要素,
降順整列の分割(_軸要素,R,L1,L2).

それぞれ降順整列したものを結合する(_軸要素,L1,L2,L) :-
降順整列(L1,L1_2),
降順整列(L2,L2_2),
append(L1_2,[_軸要素|L2_2],L).


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

順位付けする([_組|_],Ln,_,_順位,_組) :-
length([_|Ln],_順位).
順位付けする(L,Ln,Ln_2,_順位,_組) :-
同順位になる場合を考慮しながら順位付けをしていく(L,Ln,Ln_2,_順位,_組).

同順位になる場合を考慮しながら順位付けをしていく(L,Ln,Ln_2,_順位,_組) :-
順位調整(L,Ln,Ln_2,_新しいL,_新しいLn,_新しいLn_2),
順位付けする(_新しいL,_新しいLn,_新しいLn_2,_順位,_組).

順位調整(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位) :-
'合計点が同点の場合は同順位。_位置順位のみ更新する'(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位),!.
順位調整(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位) :-
'合計点が同点でない場合は、順位とはすなわち_位置順位である'(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位).

'合計点が同点の場合は同順位。_位置順位のみ更新する'([_組_1,_組_2|R],_順位,_位置順位,[_組_2|R],_順位,[_|_位置順位]) :-
第二項以降の合計点が同じ(_組_1,_組_2).

'合計点が同点でない場合は、順位とはすなわち_位置順位である'([_|R],_,_位置順位,R,[_|_位置順位],[_|_位置順位]).

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