このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1289913298/958
#  【質問テンプレ】  
#  [1] 授業単元:C言語演習 
#  [2] 問題文(含コード&リンク):ランダムな整数列を生成し,クイックソートにより並 
#                べ替えるプログラムを作れ 

'ランダムな整数列を生成し,クイックソートにより並べ替える'(L1,L2) :-
        ランダムな整数列を生成し(L1),
        クイックソートにより並べ替える(L1,L2).

ランダムな整数列を生成し(L1) :-
        _乱順整数 is random,
        ランダムな整数列を生成し([_,_,_],_乱順整数,L1).

ランダムな整数列を生成し([_],_乱順整数,[]) :-
        55 is _乱順整数 mod 100,!.
ランダムな整数列を生成し([_|Ln],_乱順整数,[_乱順整数の一|R]) :-
        55 is _乱順整数 mod 100,
        _乱順整数の一 is _乱順整数 mod 1000,
        _乱順整数の二 is random,
        ランダムな整数列を生成し(Ln,_乱順整数の二,R).
ランダムな整数列を生成し(Ln,_乱順整数,[_乱順整数の一|R]) :-
        _乱順整数の一 is _乱順整数 mod 1000,
        _乱順整数の二 is random,
        ランダムな整数列を生成し(Ln,_乱順整数の二,R).

クイックソートにより並べ替える([],[]) :- !.
クイックソートにより並べ替える([A|L1],L2) :-
        'Aに対して大小で分割する'(A,L1,_Aより小さいならび,_Aに等しいかAより大きいならび),
        クイックソートにより並べ替える(_Aより小さいならび,L3),
        クイックソートにより並べ替える(_Aに等しいかAより大きいならび,L4),
        append(L3,[A|L4],L2).

'Aに対して大小で分割する'(A,[],[],[]) :- !.
'Aに対して大小で分割する'(A,[B|R1],[B|R2],R3) :-
        A @> B,
        'Aに対して大小で分割する'(A,R1,R2,R3).
'Aに対して大小で分割する'(A,[B|R1],R2,[B|R3]) :-
        A @=< B,
        'Aに対して大小で分割する'(A,R1,R2,R3).