このディレクトリの索引
%  
%  非決定性の 降順に順位付け/3
%  

降順に順位付け(_先頭に整列対象要素のある要素ならび,_順位,_要素) :-
        降順整列(_先頭に整列対象要素のある要素ならび,_降順に整列したならび),
        append(L1,L2,L3,_降順に整列したならび),
        'L2は同一の整列対象要素の最大集合'(L1,L2,L3),
        順位と要素(L1,L2,_順位,_要素).

'L2は同一の整列対象要素の最大集合'(L1,L2,L3) :-
        先頭の整列対象要素は全て同一(L2,_整列対象要素),
        前後には整列対象要素はない(_整列対象要素,L1,L3),!.

前後には整列対象要素はない(_整列対象要素,L1,L3) :-
        \+(append(_,[[_整列対象要素|_]],L1)),
        \+(L3 = [[_整列対象要素|_]|_]).

順位と要素(L1,L2,_順位,_要素) :-
        length([_|L1],_順位),
        member(_要素,L2).

append([],L2,L3,L4) :-
        append(L2,L3,L4).
append([U|L1],L2,L3,[U|L4]) :-
        append(L1,L2,L3,L4).

先頭の整列対象要素は全て同一([],_).
先頭の整列対象要素は全て同一([[_要素|_]|R],_要素) :-
        先頭の整列対象要素は全て同一(R,_要素).

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

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