このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1354070278/7
#  [1] 授業単元:問題1:二次元配列 問題2:関数 
#  [2] 問題文(含コード&リンク): 
#  問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを 
#  出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 
#   
#  問題2:1文字を引数としてそれが小文字であれば大文字にして返し 
#  そうでなければそのまま文字を返す関数を作成しキーボードから 
#  文字入力としてこの関数の動作を確認せよ。 
#  [3.1] OS: windows vista 
#   [3.2] コンパイラ名とバージョン:visual studio2010 
#   [3.3] 言語: C言語  
#  [4] 期限: 11月30日  
#  [5]ポインタはやってません。宜しくお願いします 。 
# 
# 

'ファイルから入力した英小文字a-zの頻度のヒストグラムを出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。' :-
        get_chars('c161_7.html',Chars),
        '英小文字a-zの頻度の'(Chars,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]),
        ヒストグラムを出力する([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]).

'英小文字a-zの頻度の'([],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]).
'英小文字a-zの頻度の'([_文字|_残りならび],L1,L) :-
        英小文字ならば頻度を更新(_文字,L1,L2),
        '英小文字a-zの頻度の'(_残りならび,L2,L),!.
'英小文字a-zの頻度の'([_|_残りならび],L1,L) :-
        '英小文字a-zの頻度の'(_残りならび,L1,L).

英小文字ならば頻度を更新(_文字,L1,L2) :-
        nth0(Nth0,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字),
        length(L0,Nth0),
        append(L0,[S|R],L1),
        S2 is S + 1,
        append(L0,[S2|R],L2).

ヒストグラムを出力する(L) :-
        ヒストグラムの用意(L,LL1),
        転置(LL1,LL2),
        出力する(LL2).

ヒストグラムの用意(L,LL1) :-
        最大値(L,_最大値),
        length(L1,_最大値),
        findall(L1,(
                    星のリストに変換(L,L1)),
                LL1).

星のリストに変換(L,L1) :-
        member(N,L),
        length(R,N),
        append(L0,R,L1),
        all(L0,' '),
        all(R,*).

出力する([]).
出力する([L|R]) :-
        atomic_list_concat(L,S),
        writef('%t\n',[S]),
        出力する(R).