このディレクトリの索引
#  出典: プログラミングのお題スレ Part3 #24
#  お題:
#  リストを与え、昇順でソートされている部分列のリスト出力する
#  [8,3,4,9,9,10,6,1,4,3] => [[8],[3,4,9,9,10],[6],[1,4],[3]]
#  [1,3,3,4,4,6,8,9,9,10] => [[1,3,3,4,4,6,8,9,9,10]]
#  [10,9,9,8,6,4,4,3,3,1] => [[10],[9,9],[8],[6],[4,4],[3,3],[1]]
#  [1,1,1,1,1,1,1,1,1,1] => [[1,1,1,1,1,1,1,1,1,1]]
#  [] => []
#  [1] => [[1]] 


'リストを与え、昇順でソートされている部分列のリスト出力する'(L) :-
        'リストを与え、昇順でソートされている部分列のリストを'(L,LL),
        出力する(LL) :-

'リストを与え、昇順でソートされている部分列のリストを'(L,LL) :-
        findall(L2,(
                    append(L1,L2,L3,L),
                    昇順(L2),
                    'L1,L3とL2は昇順の接続になっていない'(L1,L2,L3)),
                LL).

昇順([A]) :- !.
昇順([A,B|R]) :-
        A =< B,
        昇順([B|R]).

'L1,L3とL2は昇順の接続になっていない'(L1,L2,L3) :-
        'L1とL2は昇順の接続になっていない'(L1,L2),
        'L1とL3は昇順の接続になっていない'(L1,L3).

'L1とL2は昇順の接続になっていない'(L1,L2) :-
        \+((L2=[A|_],最後の要素(L1,B),A >= B)).

'L1とL3は昇順の接続になっていない'(L1,L3) :-
        \+((最後の要素(L2,A),L3=[B|_],A =< B))).

最後の要素(_ならび,_最後の要素) :-
        append(_,[_最後の要素],_ならび).

出力する(L,LL) :-
        writef('%t => %t\n',[L,LL]).