このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1349527750/889
#  [1] 授業単元:C言語 
#  [2] 問題 
#  0から255までの整数を8bitの2進数で表わし、小さい方から順に左から右へ並べ、 
#  それらを上位のbitから6bitづつ区切って342個の整数に変換するとき、 
#  (最後に2bitあまるので下位4bitを0で埋める) 
#  変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する。 
#  表示する際は、整数は6bitで表示し、整数の小さい順に出力すること。 
#  例: 
#  00000000 00000001 00000010 ... 
#  ↓ 
#  000000 000000 000100 000010 ... 
#  ↓ 
#  000000 XX回 
#  000001 XX回 
#  ... 
#  111111 XX回 
#   
#  

'0から255までの整数を8bitの2進数で表わし、小さい方から順に左から右へ並べ、 
それらを上位のbitから6bitづつ区切って342個の整数に変換するとき、 
(最後に2bitあまるので下位4bitを0で埋める) 
変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する。 
表示する際は、整数は6bitで表示し、整数の小さい順に出力すること。 
例: 
00000000 00000001 00000010 ... 
↓ 
000000 000000 000100 000010 ... 
↓ 
000000 XX回 
000001 XX回 
... 
111111 XX回' :-
        '0から255までの整数を8bitの2進数で表わし'(_256個の2進数表示ならび),
        'それらを上位のbitから6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_256個の2進数表示ならび,_342個の6ビット2進数表示ならび),
        '変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する'(_342個の6ビット2進数表示ならび).

'0から255までの整数を8bitの2進数で表わし'(_256個の2進数表示ならび) :-
        findall(_二進数表示ならび,(
                    between(0,255,N),
                    二進数表示ならび(N,[],_二進数表示ならび)),
                _256個の2進数表示ならび).

二進数表示ならび(0,L,L) :- !.
二進数表示ならび(N,L1,L) :-
        M is N mod 2,
        D is N // 2,
        二進数表示ならび(D,[M|L1],L).

'それらを上位のbitから6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_256個の2進数表示ならび,_342個の6ビット2進数表示ならび) :-
        flatten(_256個の2進数表示ならび,_平坦化されたビットならび),
        '6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_平坦化されたビットならび,_342個の6ビット2進数表示ならび).

'6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'([_1,_2,_3,_4,_5,_6|R1],[[_1,_2,_3,_4,_5,_6],R2]) :-
        '6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(R1,R2).
'6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_2bitあまり,[_下位4bit0で埋めた6個組]) :-
        append(_2bitあまり,[0,0,0,0],_下位4bit0で埋めた6個組).

'変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する'(_342個の6ビット2進数表示ならび) :-
        _2の6乗の上限値 is truncate(2 ^ 6 - 1),
        between(0,_2の6乗の上限値,N),
        'それぞれの整数の出現数をカウントし'(_342個の6ビット2進数表示ならび,N,_6ビット2進数表示ならび,_頻度),
        整数とその出現数を表示する(_6ビット2進数表示ならび,_頻度),
        N = _2の6乗の上限値.

'それぞれの整数の出現数をカウントし'(_342個の6ビット2進数表示ならび,N,_6ビット2進数表示ならび,_頻度) :-
        '6ビット2進数表示ならび'(N,_6ビット2進数表示ならび),
        count(member(_6ビット2進数表示ならび,_342個の6ビット2進数表示ならび),_頻度).

'6ビット2進数表示ならび'(N,L) :-
        length(L,6),
        二進数表示ならび(N,[],L1),
        append(L0,L1,L),
        all(L0,0).

all([],_).
all([A|R],A) :-
        all(R,A).

整数とその出現数を表示する(_6ビット2進数表示ならび,_頻度) :-
        atomic_list_concat(_6ビット2進数表示ならび,_6ビット2進数表示文字列),
        整数から頭部空白文字列(3,_頻度,_頻度表示文字列),
        writef('%t%t回\n',[_6ビット2進数表示文字列,_頻度表示文字列]).

整数から頭部空白文字列(N桁,_整数,_整数表示文字列) :-
        length(L,N桁),
        nuber_chars(_整数,L1),
        append(L0,L1,L),
        all(L0,' '),
        atomic_list_concat(L,_整数表示文字列).