このディレクトリの索引
#  お題:二次元配列を各行、各列ともに昇順になるように並べ替える。
#  例
#  1 5 3 4
#  0 4 1 0
#  7 2 3 1
#   ↓
#  0 0 1 4
#  1 2 3 5
#  1 3 4 7 

'二次元配列を各行、各列ともに昇順になるように並べ替える。'(_二次元ならび,_各行各列ともに昇順ならび) :-
        flatten(_二次元ならび,L1),
        要素に重複を許す昇順整列(L1,[L|R2]),
        length(L,Len),
        二次元ならびと同型に構成する([L|R2],Len,_各行各列ともに昇順ならび).

二次元ならびと同型に構成する([],_,[]).
二次元ならびと同型に構成する(L1,Len,[L3|R3]) :-
        length(L3,Len),
        append(L3,R1,L1),
        二次元ならびと同型に構成する(R1,Len,R3).

要素に重複を許す昇順整列([],[]).
要素に重複を許す昇順整列([_軸要素|R],L) :-
        '軸要素で分割する(要素の重複を許す)'(_軸要素,R,L1,L2),
        整列(L1,L1_2),
        整列(L2,L2_2),
        append(L1_2,[_軸要素|L2_2],L).

'軸要素で分割する(要素の重複を許す)'(_,[],[],[]).
'軸要素で分割する(要素の重複を許す)'(_軸要素,[A|R],[A|R1],L2) :-
        _軸要素 @>= A,
        '軸要素で分割する(要素の重複を許す)'(_軸要素,R,R1,L2).
'軸要素で分割する(要素の重複を許す)'(_軸要素,[A|R],L1,[A|R2]) :-
        _軸要素 @< A,
        '軸要素で分割する(要素の重複を許す)'(_軸要素,R,L1,R2).