このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/616
#  [1] 授業単元:C言語演習  
#  [2] 問題文(含コード&リンク):  
#  ファイルの中に含まれる文字のエントロピーを計算したい。  
#  次のように作りなさい。  
#  (a)文字をgetchar関数で1文字ずつ読み込み、その文字ciの出現頻度f(ci)をカウントする。  
#  (b)総文字数Sと出現頻度f(ci)から出現確立P(ci)を計算する関数を作成しなさい。  
#  P(ci)=1/S*f(ci)…(1)  
#  S=Σf(ci)…(2)  
#     i  
#  (c)出現確立P(ci)からエントロピーHを計算する関数を作成しなさい。 
#  ただし、0log0=0とみなす。  
#  H=-ΣP(ci)log2(←底)P(ci)…(3)  
#  fopenを使った場合は加点する。  
#  ファイル入出力を使わない場合は、リダイレクトを用いて標準入力から読み込む実行例を示すこと。  
#  また、すべての文字の出現頻度が同じであるファイルを作成し、 その時のエントロピーを示すこと。  
#  下記のプログラム参照。  
#   
#  続く 
# 

一文字読み込んで出現頻度を計算する(_ファイル名,_出現頻度ならび,_出現確率ならび) :-
        open(_ファイル名,read,Instream),
        repeat,
        get_char(Instream,_文字),
        一文字読み込んで出現頻度を計算する(Instream,_文字,1,[[_文字,1]],_総文字数,_文字の出現頻度ならび,_出現確率ならび),
        at_end_of_stream(Instream),
        close(Instream).

一文字読み込んで出現頻度を計算する(Instream,_文字,_総文字数,_文字の出現頻度ならび,_総文字数,_文字の出現頻度ならび,_出現確率ならび) :-
        出現確率を計算する(_総文字数,_文字の出現頻度ならび,_文字の出現確率ならび),
        member([_文字,_出現頻度],_文字の文字の出現頻度ならび2),
        member([_文字,_出現確率],_出現確率ならび),
        writef('文字 = %t, 出現頻度 = %t, 出現確率 = %t\n',[_文字,_出現頻度,_出現確率]).
一文字読み込んで出現頻度を計算する(Instream,_,_総文字数1,_文字の出現頻度ならび1,_総文字数,_文字の出現頻度ならび) :-
        get_char(Instream,_文字),
        出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,_文字の出現頻度ならび2),
        一文字読み込んで出現頻度を計算する(Instream,_文字,_総文字数2,_文字の出現頻度ならび2,_総文字数,_文字の出現頻度ならび).

出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,_文字の出現頻度ならび2) :-
        append(L0,[[_文字,_出現頻度1]|R],_文字の出現頻度ならび1),
        _出現頻度2 is _出現頻度1 + 1,
        _総文字数2 is _総文字数1 + 1,
        append(L0,[[_文字,_出現頻度2]|R],_文字の出現頻度ならび2),!.
出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,[[_文字,1]|_文字の出現頻度ならび1]) :-
        _総文字数2 is _総文字数1 + 1.

出現確率を計算する(_総文字数,[],[]) :- !.
出現確率を計算する(_総文字数,[[_文字,_出現頻度]|R2],[[_文字,_出現確率]|R3]) :-
        _出現確率 is _出現頻度 / _総文字数,
        出現確率を計算する(_総文字数,R2,R2).

出現確率からエントロピーを計算する(_出現確率ならび,_エントロピー) :-
        出現確率からエントロピーを計算する(_出現確率ならび,0.0,_エントロピー).

出現確率からエントロピーを計算する([],_エントロピー,_エントロピー) :- !.
出現確率からエントロピーを計算する([[_,_出現確率]|R],_エントロピーの一,_エントロピー) :-
        _エントロピーのニ is _エントロピーの一 - (log(_出現確率) / log(2) * _出現確率,
        出現確率からエントロピーを計算する(R,_エントロピーのニ,_エントロピー).