このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1274827528/722
#  [1] 授業単元: ハフマン符号 
#  [2] 問題文(含コード&リンク): 文字とその確率を入力しそれに対するハフマン符号を文字に割当て 
#  表示する 
#  

文字とその確率を入力しそれに対するハフマン符号を文字に割当て表示する :-
        文字とその確率を入力し(LL1),
        ハフマン符号化(LL1,LL2),
        ハフマン符号表(LL2).

文字とその確率を入力し(LL1) :-
        get_split_lines([' ',','],LL),
        findall([_確率,_文字],(
                    member([_文字,B],LL),
                    atom_to_term(B,_確率,_)),
                LL1).

ハフマン符号化(L1,[[A,'0']|R]) :-
        sort(L1,L2),
        append(L3,[[_,A]],L2),
        ハフマン符号の割り当て(L3,[[B,C]|L4]),
        ハフマン符号に補正する(L4,[[B,C]],R).

ハフマン符号の割り当て([[_,A]],[[A,'1']]) :- !.
ハフマン符号の割り当て([[_,A]|R1],[[A,S1]|R2]) :-
        ハフマン符号の割り当て(R1,R2),
        R2 = [[B,S2]|_],
        concat_atom(['1',S2],S1).

ハフマン符号に補正する([],L,L) :- !.
ハフマン符号に補正する([[A,B]|R1],L1,L) :-
         concat_atom([B,'0'],C),
        ハフマン符号に補正する(R1,[[A,C]|L1],L).

ハフマン符号表([]) :- !.
ハフマン符号表([[A,B]|R]) :-
        write_formatted('%t %t\n',[A,B]),
        ハフマン符号表(R).