このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1291471791/654
#  [1] 授業単元: プログラミング言語演習  
#  [2] 問題文(含コード&リンク):
#  プログラムにより並べ替えるプログラムを作れ 
#  直接基数プログラム 
#  int i, j, pass, count[256]; 
#  for(pass = 0; pass < 4; pass++){ 
#  for(j = 0;j < 256;j++) 
#  count[j] = 0; 
#  for(i = 1;i <= n; i++) 
#  count[bits(a[i],pass*8,8)]++; 
#  for(j = 1;j < 256;j++) 
#  count[j] = count[j-1] + count[j]; 
#  for(i = n; i >= 1;i--) 
#  b[count[bits(a[i],pass*8,8)]--] = a[i]; 
#  for(i = 1; i <= n; i++) 
#  a[i] = b[i]; 
#  } 
#  直接基数ソートとはランダムに出た数字を二進数に直し、順番に並び変える 
# プログラムです。 


直接基数整列とは乱順に出た数字を二進数に直し、順番に並び変える(_要素数,_整列されたならび) :-
        length(Ln,_要素数),
        乱順に出た数字を二進数に直し(Ln,_乱順に出た数字と反転した二進数字のペアならび),
        基数整列(_乱順に出た数字と反転した二進数字のペアならび,_整列されたならび).

乱順に出た数字を二進数に直し([],[]) :- !.
乱順に出た数字を二進数に直し([_|Ln],[[_乱順に出た数字,_反転した乱順に出た二進数字]|R]) :-
        _乱順に出た数字 is random,
        二進数(_乱順に出た数字,_乱順に出た二進数字),
        reverse(_乱順に出た二進数字,_反転した乱順に出た二進数字),
        乱順に出た数字を二進数に直し(Ln,R).

基数整列(L1,L2) :-
        基数整列(L1,L3,L4),
        append(L3,L4,L5),
        基数整列(L5,L2).
基数整列(L1,L2) :-
        findall(N,append(_,[[N|_]|_],L1),L2),!.

基数整列([],[],[]) :- !.
基数整列([[N,[0|R1]]|R11],[[N,R1]|R2],R3) :-
        基数整列(R11,R2,R3),!.
基数整列([[N,[1|R1]]|R11],R2,[[N,R1]|R2],R3) :-
        基数整列(R11,R2,R3),!.

二進数(J,Y,[J|Y]) :- J < 2.
二進数(J,Y,X) :-
        J >= 2,
        J2 is J // 2,
        M is J mod 2,
        二進数(J2,[M|Y],X).

二進数(_10進数,L) :-
        length(L,32),
        二進数(_10進数,[],X),
        append(L1,X,L),
        L1 all 0.