このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/287
#  [1] 授業単元:C言語プログラミング 
#  [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1356601.txt 
#  
#  問題2
#  配列の各要素(20個)に、3桁の乱数を代入し、この配列データの大きい順に並べ替えよ
#  このとき、ソートの円形として、第2配列を用意してこれに移し変える処理を考えよ
#  (第1配列上で大きいデータを順に取り出し、第2配列に移し替える。第1配列データはそのまま残しておく)

'ならびの各要素(20個)に、3桁の乱数を代入し、このデータの大きい順に並べ替えよ'(_降順に整列されたならび) :-
        'ならびの各要素(20個)に、3桁の乱数を代入し'(_ならび),
        このデータの大きい順に並べ替えよ(_ならび,_降順に整列されたならび).

'ならびの各要素(20個)に、3桁の乱数を代入し'(_ならび) :-
        length(_ならび,20),
        '3桁の乱数を代入し'(_ならび).

'3桁の乱数を代入し'(_ならび) :-
        findall(_3桁の乱数,(
                    append(_,[_3桁の乱数|_],_ならび),
                    _3桁の乱数 is (random mod 900) + 100),
                _ならび),!.

このデータの大きい順に並べ替えよ([],[]) :- !.
このデータの大きい順に並べ替えよ(_ならび,_降順に整列されたならび) :-
        _ならび = [_最初の要素|_残りの要素],
        最初の要素に対し大きい小さいで分割する(_最初の要素,_残りの要素,_最初の要素より小さい要素,_最初の要素に等しいか大きい要素),
        このデータの大きい順に並べ替えよ(_最初の要素より小さい要素,_降順に整列された最初の要素より小さい要素),
        このデータの大きい順に並べ替えよ(_最初の要素に等しいか大きい要素,_降順に整列された最初の要素に等しいか大きい要素),
        append(_降順に整列された最初の要素に等しいか大きい要素,[_最初の要素|_降順に整列された最初の要素より小さい要素],_降順に整列されたならび).

最初の要素に対し大きい小さいで分割する(_,[],[],[]) :- !.
最初の要素に対し大きい小さいで分割する(_最初の要素,[A|R],[A|_最初の要素より小さい要素],_最初の要素に等しいか大きい要素) :-
        A @< _最初の要素,
        最初の要素に対し大きい小さいで分割する(_最初の要素,R,_最初の要素より小さい要素,_最初の要素に等しいか大きい要素),!.
最初の要素に対し大きい小さいで分割する(_最初の要素,[A|R],_最初の要素より小さい要素,[A|_最初の要素に等しいか大きい要素]) :-
        A @>= _最初の要素,
        最初の要素に対し大きい小さいで分割する(_最初の要素,R,_最初の要素より小さい要素,_最初の要素に等しいか大きい要素),!.