このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1305867431/159
#  [1] 授業単元: プログラム 
#  [2] 問題文(含コード&リンク):  
#  英語のテキストデータを入力とし、ファイル内に現れる「単語」(文字列)と 
#  そのカウントをプリントするプログラムを作成せよ。同時に現れた「単語」の総数を 
#  プリントすること。なお、ここで「単語」とはデリミタで区切られるアルファベットだけ 
#  からなる文字列と定義する。「単語」は各データファイルにつき、総単語数は高々2,000単語 
#  しか現れないと仮定して良い。配列でプログラムする場合、1単語長の最大値を適当に固定して良い。 
#   
#  ヒント 
#  デリミタとは、この課題では以下のASCII文字と定義する。 
#  (a) 制御文字 (iscntrl(c)が1となる文字c) 
#  (b) 数字 (isdigit(c)が1となる文字c) 
#  (c) アルファベット以外の印刷可能文字 (isprint(c)が1で、isalpha(c)が0となる文字c) 
#  

'英語のテキストデータを入力とし、ファイル内に現れる「単語」(文字列)とそのカウントをプリントする。同時に現れた「単語」の総数をプリントする'(_ファイル) :-
        get_chars(_ファイル,Chars),
        単語を抽出する(Chars,[],_単語ならび),
        '「単語」(文字列)とそのカウント'(_単語ならび,_単語とそのカウントならび),
        単語とそのカウントをプリントする(_単語とそのカウントならび),
        単語の総数(_単語ならび,_単語の総数),
        単語の総数をプリントする(_単語の総数).

単語を抽出する([],[],[]) :- !.
単語を抽出する([],L,[_単語]) :-
        concat_atom(L,_単語),!.
単語を抽出する([_文字|R1],[],R2) :-
        'デリミタとは、この課題では以下のASCII文字と定義する'(_文字),        
        単語を抽出する(R1,[],R2),!.
単語を抽出する([_文字|R1],L1,R2) :-
        'デリミタとは、この課題では以下のASCII文字と定義する'(_文字),
        concat_atom(L1,_単語),
        単語を抽出する(R1,[],[_単語|R2]),!.
単語を抽出する([_文字|R1],L1,R2) :-
        append(L1,[_文字],L2),
        単語を抽出する(R1,L2,R2),!.

'デリミタとは、この課題では以下のASCII文字と定義する'(_文字) :-
        制御文字(_文字).
'デリミタとは、この課題では以下のASCII文字と定義する'(_文字) :-
        数字(_文字).
'デリミタとは、この課題では以下のASCII文字と定義する'(_文字) :-
        アルファベット以外の印刷可能文字(_文字).

制御文字(_文字) :-
        char_code(_文字,Char_code),
        Char_code < 32,!.

数字(_文字) :-
        append(_,[_文字|_],['0','1','2','3','4','5','6','7','8','9']).

アルファベット以外の印刷可能文字(_文字) :-
        アルファベット以外の(_文字),
        印刷可能文字(_文字),!.

アルファベット以外の(_文字) :-
        \+(アルファベット(_文字)).

アルファベット(_文字) :-
        append(_[_文字|_],['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']),!.
アルファベット(_文字) :-
        append(_,[_文字|_],[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]),!.

印刷可能文字(_文字) :-
        char_code(_文字,Char_code),
        Char_code >= 32,!.

'「単語」(文字列)とそのカウント'(_単語ならび,_単語とそのカウントならび) :-
        setof(_単語,member(_単語,_単語ならび),_単語ならびのニ),
        length(_単語ならびのニ,_単語の総数),
        findall([_単語,_カウント],(
                    append(_,[_単語|_],_単語ならびのニ),
                    count(member(_単語,_単語ならび),_カウント)),
                _単語とそのカウントならび).

単語とそのカウントをプリントする(_単語とそのカウントならび) :-
        append(_,[[_単語,_カウント]|R],_単語とそのカウントならび),
        writef('%t %t\n',[_単語,_カウント]),
        R = [].

単語の総数(_単語ならび,_単語の総数) :-
        length(_単語ならび,_単語の総数),!.

単語の総数をプリントする(_単語の総数) :-
        writef('単語の総数は %t です\n',[_単語の総数]).