このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1250204272/770
#  [1] 授業単元:プログラミング演習2  
#  [2] 問題文(含コード&リンク):  
#  テキストファイルを読み込み、 
#  文字コード表を利用して種類ごとに文字を分類し、それぞれをカウントするプログラムを作れ 
#  分類は以下の通りとする。 
#  1.半角英数 
#  2.半角カナ 
#  3.半角記号 
#  4.全角かな 
#  5.全角記号 
#  6.漢字 
#  以上のように分類した上で「半角英数:XX字、半角カナ:XX字・・・」というように結果をファイルに出力せよ。 
#  使用する文字コード表は自由だが一般に使われているものを選択せよとのことでした。 
#  コード内にコメントで使用した文字コードを注釈として記載するようにとの連絡がありました。 

eucコード分類(半角英数,0x30,0x39).
eucコード分類(半角英数,0x51,0x5a).
eucコード分類(半角英数,0x61,0x6a).
eucコード分類(全角数字,0xa3b0,0xa3b9).
eucコード分類(半角カナ,0x8ea1,0x8ed6).
eucコード分類(全角カナ,0xa5a1,0xa5f6).
eucコード分類(全角かな,0xa4a1,0xa4f3).
eucコード分類(全角記号,0xa101,0xa2fe).
eucコード分類(全角漢字,0xb0a1,0xfcee).

文字コード分類(_テキスト,_分類ならび) :-
    atom_codes(_テキスト,Codes),
    文字コード分類(Codes,[],_分類ならび).

文字コード分類([],_分類ならび,_分類ならび).
文字コード分類([A|R1],_分類ならびの一,_分類ならび) :-
    eucコード分類(_分類,_コード下限,_コード上限),
    A >= _コード下限,
    A =< _コード上限,
    分類ならびの更新(_分類ならびの一,_分類,_分類ならびの二),
    文字コード分類(R1,_分類ならびの二,_分類ならび),!.
文字コード分類([_|R1],_分類ならびの一,_分類ならび) :-
    文字コード分類(R1,_分類ならびの一,_分類ならび).

分類ならびの更新([],_分類,[[_分類,1]]) :- !.
分類ならびの更新([[_分類,_頻度の一]|R],_分類,[[_分類,_頻度の二]|R]) :-
    _頻度の二 is _頻度の一 + 1,!.
分類ならびの更新([U|R1],_分類,[U|R2]) :-
    分類ならびの更新(R1,_分類,R2).

分類文字数(_分類文字数ならび) :-
    findall([_分類,_文字数],(eucコード分類(_分類,S,E),分類文字数計算(_分類,S,E,_文字数)),
            _分類文字数ならび).

分類文字数計算(_分類,S,E,_文字数) :-
    sub_atom(_分類,1,2,_,半角),
    _文字数 is E - S + 1.
分類文字数計算(_分類,S,E,_文字数) :-
    sub_atom(_分類,1,2,_,半角),
    _文字数 is (E - S) // 2  + 1.

分類文字のN字目(_分類,N,_文字コード) :-
    sub_atom(_分類1,2,_,半角),
    eucコード分類(_分類,S,E),
    _文字コード is S + N - 1.
分類文字のN字目(_分類,N,_文字コード) :-
    sub_atom(_分類1,2,_,全角),
    eucコード分類(_分類,S,_),
    _文字コード is (S + (N - 1) * 2).