このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/904
#  [1] 授業単元:C  
#  [2] 問題文(含コード&リンク):  
#  strlen()を利用し、ファイルinput.txtには、複数の英単語のみが(改行を挟みながら)記載されている。 
#  input.txtをEOFまで読み込み、何文字の単語が何個あったのかを表示するプログラムを作成しなさい。このとき、1行には最大80字記載されており、1単語の最大の文字数は15とする。 
#  例) 
#  1文字の単語: 20単語 
#  3文字の単語: 10単語 
#  8文字の単語: 4単語 
#  全34単語 
#   
#  

'input.txtをEOFまで読み込み、何文字の単語が何個あったのかを表示する' :-
          get_chars('input.txt',Chars),
          英単語ならびを得る(Chars,LL1),
          sort(LL1,LL2),
          何文字の単語が何個あったのかを表示する(LL2).

英単語ならびを得る(Chars,LL) :-
        findall([Len,L],(
                    空白または改行で区切る(Chars,L),
                    length(L,Len)),
                LL).          

空白または改行で区切る(Chars,L0) :-
        append(L0,[A|R],Chars),
        空白または改行(A).
空白または改行で区切る(Chars,L) :-
        append(L0,[A|R],Chars),
        空白または改行(A),
        空白または改行で区切る(R,L).
空白または改行で区切る(L,L).

空白または改行(' ').
空白または改行('\n').

何文字の単語が何個あったのかを表示する(LL) :-
        何文字の単語が何個あったのか(LL,LL2),
        全単語数を集計する(LL2,_全単語数),
        表示する(LL2,_全単語数).

何文字の単語が何個あったのかを表示する(LL,[[_文字数,_個数]|R2]) :-
        append(L0,[[_文字数,L1]|R1],LL),
        \+(append(_,[[_文字数,_]|_],L0)),
        all(L0,[_文字数0,_]),
        length(L0,_個数),
        何文字の単語が何個あったのかを表示する([[_文字数,L1]|R1],R2).
何文字の単語が何個あったのかを表示する([[_文字数,_]|R1],[[_文字数,_個数]]) :-
        length([[_文字数,_]|R1],_個数).

全単語数を集計する(LL,_全単語数) :-
        findsum(_単語数,(
                    append(_,[[_,_単語数]|_],LL)),
                _全単語数の一),
        _全単語数 is truncate(_全単語数の一).

表示する(LL,_全単語数) :-
        append(_,[[_文字数,_何個]|R],LL),
        writef('%t文字の単語: %t単語\n',[_文字数,_何個]),
        R = [],
        writef('全%t単語\n',[_全単語数]),!.

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

count(P,N) :-
        findsum(1,P,F),
        N is truncate(F).

findsum(_選択項,_項,_合計値) :-
        findall(_選択項,_項,_値ならび),
        sum(_値ならび,_合計値),!.

sum([],0) :- !.
sum([N|R],X) :-
        sum(R,Y),
        X is N + Y.