このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1267796762/170
#  【 課題 】入力したテキストに含まれる文字を種類別に使用回数を表示し、降順にソートし出力するプログラムを作れ。  
#  【 形態 】Javaアプリケーション(main()で開始)  
#  【 期限 】6月22日 
#  【 Ver  】1.6.0_20 
#  【 補足 】../test/read.cgi/tech/1267796762/83と同様の問題ですが漢字や記号など全ての種類によらずに統計したい場合です。よろしくお願いします。 
# 
# 

'入力したテキストに含まれる文字別に使用回数を表示し、使用回数で降順にソートし出力する' :-
        get_line(_入力したテキスト),
        テキストを文字のならびに変換する(_入力したテキスト,_文字ならび),
        文字頻度ならびの生成(_文字ならび,[],_文字頻度ならび),
        降順整列(_文字頻度ならび,_降順に整列した文字頻度ならび),
        append(_,[[_頻度,_文字]|R],_降順整列した文字頻度ならび),
        write_formatted('%t %t回\n',[_文字,_頻度]),
        R = [],!.

テキストを文字のならびに変換する(_入力したテキスト,_文字ならび) :-
        atom_chars(_入力したテキスト,_文字ならび).

文字頻度ならびの生成([],L,L) :- !.
文字頻度ならびの生成([A|R1],L1,L) :-
        文字頻度ならびの生成(A,L1,L2,M),
        文字頻度ならびの生成_2(M,A,R1,L2,L),!.

文字頻度ならびの生成_2(1,A,R1,L2,L) :-
        文字頻度ならびの生成(R1,L2,L),!.
文字頻度ならびの生成_2(M,A,R1,L2,L) :-
        文字頻度ならびの生成(R1,[[M,A]|L2],L),!.

文字頻度ならびの生成(A,[],[[1,A]],1) :- !.
文字頻度ならびの生成(A,[[N,A]|R1],R1,N2) :-
        N2 is N + 1,!.
文字頻度ならびの生成(A,[L1|R1],[L1|R2],N) :-
        文字頻度ならびの生成(A,R1,R2,N).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

文字種(数字,_文字) :- _文字 @>= '0',_文字 @=< '9'.
文字種(英大文字,_文字) :- _文字 @>= 'A',_文字 @=< 'Z'.
文字種(英小文字,_文字) :- _文字 @>= 'a',_文字 @=< 'z'.
文字種(英記号,_文字) :- _文字 @>= ' ',_文字 @=< '}',\+(文字種(英小文字,文字)),\+(文字種(英大文字,_文字)).
文字種(全角漢字,_文字) :- _文字 @>= '亜',_文字 @=< '龠'.
文字種(全角平仮名,_文字) :- _文字 @>= 'ぁ',_文字 @=< 'ん'.
文字種(全角片仮名,_文字) :- _文字 @>= 'ァ',_文字 @=< 'ン'.
文字種(全角数字,_文字) :- _文字 @>= '0',_文字 @=< '9'.
文字種(全角英大文字,_文字) :- _文字 @>= 'A',_文字 @=< 'Z'.
文字種(全角英小文字,_文字) :- _文字 @>= 'a',_文字 @=< 'z'.
文字種(全角記号,_文字) :- char_code(_文字,_文字コード),
        _文字コード >= 0xa1a1,_文字コード =< 0xa3fe.

'入力したテキストに含まれる文字を種類別に使用回数を表示し、降順にソートし出力する' :-
        get_chars(L1),
        '入力したテキストに含まれる文字を種類別に使用回数を計測する'(L1,[],L2),
        rsort(L2,L3),
        append(_,[[_頻度,_文字種]|R],L3),
        write_formatted('%t %t回\n',[_文字種,_頻度]),
        R = [].        

'入力したテキストに含まれる文字を種類別に使用回数を計測する'([],L,L) :- !.
'入力したテキストに含まれる文字を種類別に使用回数を計測する'([_文字|R],L1,L) :-
        文字種(_種類,_文字),
        種類別に使用回数を更新(_種類,L1,L2),
        '入力したテキストに含まれる文字を種類別に使用回数をを計測する'(R,L2,L),!.
'入力したテキストに含まれる文字を種類別に使用回数を計測する'([_文字|R],L1,L) :-
        \+(文字種(_種類,_文字))
        '入力したテキストに含まれる文字を種類別に使用回数を計測する'(R,L1,L).

種類別に使用回数を更新(_種類,[],[[1,_種類]]) :- !.
種類別に使用回数を更新(_種類,[[_頻度1,_種類]|R],[[_頻度2,_種類]|R]) :-
        _頻度2 is _頻度1 + 1,!.
種類別に使用回数を更新(_種類,[A|R1],[A|R2]) :-
        種類別に使用回数を更新(_種類,R1,R2).
        
rsort(L1,L2) :-
        sort(L1,L3),
        reverse(L3,L2).