このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1322562648/749
#  [1] 授業単元:アルゴリズムとデータ構造 
#  [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/WOUG0 
#  
#  文字列のソートを行うプログラム
#  1) ファイル内の単語をソートする
#  2) 半角小文字(aからzまで)だけで良いとする
#  3) 1単語あたりの文字数は自由に指定してください
#  4) ファイルからの読み込み等と、ソートそのものを別の関数として作成すること
#  5) 採用したデータ構造について説明すること
#  6) ソートのアルゴリズムについて説明すること


ファイル内の単語をソートする(_ファイル) :-
        ファイルからの読み込み(_ファイル,_単語ならび),
        クイックソートアルゴリズムを用いてオンメモリで文字列のソートを行う(_単語ならび,_整列した単語ならび),
        ファイルへ書き戻す(_ファイル).

ファイルからの読み込み(_ファイル,_単語ならび) :-
        open(_ファイル,read,Instream),
        ストリームからの読み込み(Instream,_単語ならび),
        close(Instream).

ストリームからの読み込み(Instream,[]) :-
        at_end_of_stream(Instream),!.
ストリームからの読み込み(Instream,[_単語|R]) :-
        get_line(Instream,_単語),
        ストリームからの読み込み(Instream,R).

クイックソートアルゴリズムを用いてオンメモリで文字列のソートを行う(_単語ならび,_整列した単語ならび) :-
        ソート(_単語ならび,_整列した単語ならび).

ソート([],[]).
ソート(_ならび,_整列済みならび) :-
        軸要素は先頭要素とする,
        _ならび = [_軸要素|R],
        分割する(_軸要素,R,_軸要素より小さいならび,_軸要素と等しいか大きいならび),
        ソート(_軸要素より小さいならび,_整列した軸要素より小さいならび),
        ソート(_軸要素と等しいか大きいならび,_整列した軸要素と等しいか大きいならび),
        append(_整列した軸要素より小さいならび,[_軸要素|_整列した軸要素と等しいか大きいならび],_整列済みならび).

分割する(_軸要素,[],[],[]) :-
        '対象要素がなくなったら第三引数と第四引数の不確定要素を[]に単一化してならびを終止する'.
分割する(_軸要素,[_対象要素|R1],[_対象要素|R2],R3) :-
        対象要素が軸要素より小さい場合は(_対象要素,_軸要素),
        第三引数にコピー,
        分割する(_軸要素,R1,R2,R3).
分割する(_軸要素,[_対象要素|R1],R2,[_対象要素|R3]) :-
        対象要素が軸要素と等しいか大きい場合は(_対象要素,_軸要素),
        第四引数にコピー,
        分割する(_軸要素,R1,R2,R3).

対象要素が軸要素より小さい場合は(_対象要素,_軸要素) :-
        A @< _軸要素.

対象要素が軸要素と等しいか大きい場合は(_対象要素,_軸要素) :-
        A @>= _軸要素.

ファイルへ書き戻す(_ファイル,_整列された単語ならび) :-
        open(_ファイル,write,Outstream),
        append(_,[_単語|R],_整列された単語ならび),
        writef(Outstream,'%t\n',[_単語]),
        R = [],
        close(Outstream).


軸要素は先頭要素とする.

'対象要素がなくなったら第三引数と第四引数の不確定要素を[]に単一化してならびを終止する'.

第三引数にコピー.

第四引数にコピー.