このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1276810079/887
#  [1] 授業単元:プログラミング演習  
#  [2] 問題文(含コード&リンク):  
#  fgets() を使って50文字以下の文字列を入力し,文字列中の各 
#  文字の出現回数を数えるプログラムを作成せよ。 
#  実行例 
#  文字列は? abcdef,abb(ccc110) 
#  a : 2 
#  b : 3 
#  c : 4 
#  d : 1 
#  e : 1 
#  f : 1 
#  , : 1 
#  ( : 1 
#  1 : 2 
#  0 : 1 
#  ) : 1 
#  

'50文字以下の文字列を入力し,文字列中の各文字の出現回数を数える' :-
        '50文字以下の文字列を入力し'(_50文字以下の文字列),
        文字列中の各文字の出現回数を数える(_50文字以下の文字列,_文字ごとの出現回数ならび),
        文字ごとの出現回数を表示する(_文字ごとの出現回数ならび).

'50文字以下の文字列を入力し'(_50文字以下の文字列) :-
        get_line(_50文字以下の文字列),
        length(_50文字以下の文字列,_文字数),
        _文字数 =< 50.

文字列中の各文字の出現回数を数える(_文字列,_出現回数ならび) :-
        どんな文字が出現したかならびに数え上げる(_文字列,_重複を許さない文字ならび),
        各文字の出現回数を数える(_文字列,_重複を許さない文字ならび,_出現回数ならび).

どんな文字が出現したかならびに数え上げる(_文字列,_重複を許さない文字ならび) :-
        findsetof(_文字,(
                    sub_atom(_文字列,_,1,_,_文字)),
                _重複を許さない文字ならび).

各文字の出現回数を数える(_文字列,_重複を許さない文字ならび,_出現回数ならび) :-
        findall([_出現回数,_文字],(
                    append(_,[_文字|_],_重複を許さない文字ならび),
                    count(sub_atom(_文字列,_,1,_,_文字),_出現回数)),
                _出現回数ならび).

文字ごとの出現回数を表示する(_文字ごとの出現回数ならび) :-
        append(_,[[_出現回数,_文字]|R],_文字ごとの出現回数ならび),
        writef('%t : %t\n',[_文字,_出現回数]),
        R = [].

%  
%  文字列をならび(リスト)に変換しない場合は、非決定性述語sub_atom/5を使う。
%  
%  出現回数と文字の並びがひっくり返っているのは整列を求められた場合への備えだが、
%  好ましいことではないかも知れない。
%