このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1291471791/514
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク): 
#  テキストファイルに保存された携帯電話データをコマンド選択により処理する 
#  携帯電話情報管理プログラムを作成せよ 
#   
#  右のテキストファイルを左のように書き換える(昇順ソート) 
#  2 SC-02B docomo 12 118     1 003SH softbank 12 139 
#  3 IS03 au 13 138        → 2 SC-02B docomo 12 118 
#  1 003SH softbank 12 139     3 IS03 au 13 138 
#   
#  

鍵情報(Line,_鍵) :-
        split(Line,[' '],[_,_,_,_鍵]).

切り出し指定行数(100).

昇順併合整列(_対象ファイル) :-
        tmpnam(_併合ファイル1),
        open(_併合ファイル1,read,Instream1),
        open(_対象ファイル,read,Instream),
        昇順併合整列(Instream,Instream1,_併合ファイル1,_整列済みファイル),
        整列済みファイルの表示(_整列済みファイル).

昇順併合整列(Instream,Instream1,_併合ファイル,_併合ファイル) :-
        at_end_of_stream(Instream),
        close(Instream),
        close(Instream1).
昇順併合整列(Instream,Instream1,_,_併合ファイル) :-
        tmpnam(_併合ファイル1),
        先頭から指定行の整列(100,Instream,_整列したならび),
        open(_併合ファイル,write,Outstream),
        昇順併合整列(_整列したならび,Instream1,_Outstream),
        close(Outstream),
        close(Instream1),
        open(_併合ファイル1,read,Instream2),
        昇順併合整列(Instream,Instream2,_併合ファイル1,_併合ファイル).

昇順併合整列(_整列したならび,_整列ファイル,_併合ファイル) :-
        open(_整列ファイル,read,Instream),
        open(_併合ファイル,write,Outstream),
        get_line(Instream,Line),
        昇順併合整列(Instream,Outstream,_整列したならび,Line),
        close(Outstream),
        close(Instream).

先頭から指定行の整列(Instream,_整列したならび) :-
        切り出し指定行数(_切り出し指定行数),
        get_line(Insteam,Line),
        先頭から指定行の切り出し(100,Instream,Line,_100行),
        鍵指定整列(_切り出し指定行数,_整列したならび),!.

先頭から指定行の切り出し(1,Instream,Line,[Line]) :- !.
先頭から指定行の切り出し(_,Instream,end_of_file,[]) :- !.
先頭から指定行の切り出し(N,Instream,Line,[Line|R]) :-
        get_line(Instream,Line2),        
        N1 is N - 1,
        先頭から指定行の切り出し(N,Instream,Line2,R).

昇順併合整列(Instream,Outstream,[],end_of_file) :- !.
昇順併合整列(Instream,Outstream,[],Line) :-
        write_formatted(Outstream,'%t\n',[Line]),
        get_line(Instream,Line2),
        昇順併合整列(Instream,Outstream,[],Line2),!.
昇順併合整列(Instream,Outstream,[A|R],Line) :-
        A @>= Line,
        get_line(Instream,Line2),
        昇順併合整列(Instream,Outstream,[A|R],Line2),!.
昇順併合整列(Instream,Outstream,[A|R],Line) :-
        A @< Line,
        write_formatted(Outstream,'%t\n',[A]),
        昇順併合整列(Instream,Outstream,R,Line),!.

昇順併合(Instream1,Instream2,Outstream) :-
        get_line(Instream1,Line1),
        get_line(Instream2,Line2),
        昇順併合(Instream1,Instream2,Outstream,Line1,Line2).

昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :-
        鍵情報(Line1,_鍵1),
        鍵情報(Line2,_鍵2),
        _鍵1 @=< _鍵2,
        write_formatted(Outstream,'%t\n',[Line1]),
        get_line(Instream1,Line),
        昇順併合(Instream1,Instream2,Outstream,Line,Line2).
昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :-
        write_formatted(Outstream,'%t\n',[Line2]),
        get_line(Instream2,Line),
        昇順併合(Instream1,Instream2,Outstream,Line1,Line).

整列済みファイルの表示(_整列済みファイル) :-
        open(_整列済みファイル,read,Instream),
        get_line(Instream,Line),
        整列済みファイルの表示(Instream,Line),
        close(Instream).

整列済みファイルの表示(_,end_of_file) :- !.
整列済みファイルの表示(Instream,Line) :-
        write_formatted('%t\n',[Line]),
        get_line(Instream,Line2),
        整列済みファイルの表示(Instream,Line2).

鍵指定昇順整列([],[]) :- !.
鍵指定昇順整列([A|R],L) :-
        鍵指定昇順分割(A,R,_Aより小さい,_Aと等しいか大きい),
        鍵指定昇順整列(_Aより小さい,L1),
        鍵指定昇順整列(_Aと等しいか大きい,L2),
        append(L1,[A|L2],L).

鍵指定昇順分割(A,[],[],[]) :- !.
鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :-
        鍵情報(A,_鍵1),
        鍵情報(_行,_鍵2),
        _鍵1 @> _鍵2,
        鍵指定昇順分割(A,R,[_行|_Aより小さい],_Aと等しいか大きい).
鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :-
        鍵情報(A,_鍵1),
        鍵情報(_行,_鍵2),
        _鍵1 @=< _鍵2,
        鍵指定昇順分割(A,R,_Aより小さい,[_行|_Aと等しいか大きい]).