このディレクトリの索引
#  【問題】
#  ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。
#  【例】
#  1 3 4 7 11 6 8 9 7 10 13 14
#  
#  これを昇順に並び替えると
#  1 3 4 6 7 7 8 9 10 11 13 14
#  
#  となります。つまり、最初の整数列の、4番目から10番目を並び替えれば良いことになります。このとき、
#  4..10
#  
#  と出力してください。もし、ソートする必要がなければ、
#  0
#  
#  と出力してください。
#  
#  【解答方法】
#  まずはsort.zipをダウンロードしてください。
#  中には6つのファイルが含まれています。
#  
#  answer.txt
#  解答用テキストファイルです。
#  
#  input_case_1.txt
#  input_case_2.txt
#  input_case_3.txt
#  input_case_4.txt
#  input_case_5.txt
#  整数列が含まれたデータファイルです。これらを入力として得られた結果を解答していただきます。
#  データファイルの整数列は、改行区切りになっています。
#  
#  answer.txtに必要事項を記入し、テキストファイルのままアップロードしてください。
#  ※answer.txt以外のファイルをzipに固めてアップロードした場合は評価対象外となります。
#  

:- op(600,xfx,'::').


'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_整数列,_開始位置 :: _終了位置) :-
        範囲の開始位置(_整数列,_開始位置),
        範囲の終了位置(_整数列,_終了位置),!.
'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_,0).

範囲の開始位置(L,_開始位置) :-
        append(L1,[A|L2],L),
        'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2),!,
        length([_|L1],_開始位置).

範囲の終了位置(L,_終了位置) :-
        reverse(L,LR),
        append(L1,[A|L2],LR),
        'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2),!,
        length([A|L2],_終了位置).        

'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :-
        member(B,L1),
        B > A.
'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :-
        member(B,L2),
        B < A.

'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :-
        member(B,L1),
        B < A.
'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :-
        member(B,L2),
        B > A.