このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1274827528/524
#  [1] 授業単元:データ構造  
#  [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10662.txt  
#  

バケツソート(_整列されたならび) :-
        abolish('$temp'/2),
        findall(S,(for(1,_,2000),ランダムな文字列の発生(S)),L),
        バケツソート(L,_整列されたならび),!.

バケツソート(L,_整列されたならび) :-
        バケツに吐き出す(L),
        findall(X,(鍵候補値を昇順に発生させる(S),バケツから拾い上げる(S,X)),_整列されたならび).

数値文字候補ならび(['0','1','2','3','4','5','6','7','8','9']).

鍵候補値を昇順に発生させる(S) :-
        数値文字候補ならび(L),
        member(A,L),member(B,L),member(C,L),member(D,L),member(E,L),
        concat_atom([A,B,C,D,E],S).

ランダムな文字列の発生(S) :-
        数値文字候補ならび(L),
        findall(A,(for(1,_,5),M is (random mod 10) + 1,list_nth(M,L,A)),L2),
        concat_atom(L2,S),!.

バケツに吐き出す([]) :- !.
バケツに吐き出す([S|R]) :-
        retract('$temp'(S,L)),
        assertz('$temp'(S,[_|L])),
        バケツに吐き出す(R),!.
バケツに吐き出す([N|R]) :-
        assertz('$temp'(S,[_])),
        バケツに吐き出す(R),!.

バケツから拾い上げる(S,X) :-
        '$temp'(S,L1),
        all(L1,S),
        member(X,L1).