このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1247438792/964 
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク): 
#  http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9898.txt 
# 課題: 
# 文字数・単語数・行数を数えるプログラム 
# 内容: 
# 指定されたファイルに含まれる、 
# ・行数 
# ・文字数 
# ・文字毎の出現回数 
# ・単語数 
# ・単語毎の出現回数 
# を判定し、ディスプレイ表示させる。 
# 
# 単語については、1単語をどのように判定するかの定義付けをし、 
# その定義に従って単語を取り出す。 
# 指定ファイル: http://nojiriko.asia/data/You_Raise_Me_Up.txt にコピーさせてもらいました。

t631 :-
    wc(File,_行数,_文字数,_頻度と文字のならび,_単語数,_頻度と語彙のならび),


'_行数,_文字数,_頻度と文字のならび,_単語数,_頻度と語彙のならび' :-
    writef('行数 = %t,文字数 = %t\n',[_行数,_文字数]),
    頻度付き文字ならびの表示(_頻度と文字のならび),
    writef('単語数 = %t,\n',[_単語数]),
    頻度付き語彙ならびの表示(_頻度付き語彙ならび),!.

wc(File,_行数,_文字数,_頻度と文字のならび,_単語数,_頻度と語彙のならび) :-
    行と語彙数の計測(File,_行数,_単語数,_頻度と語彙のならび),
    文字数の計測(File,_小文字語ならび,_文字数,_頻度と文字のならび).

行と語彙数の計測(File,_行数,_単語数,_頻度と語彙のならび) :-
    get_split_lines(File,[' ',':','?','.',',','(',')'],Lines),
    flat(Lines,Words),
    to_lowers(Words,Words2),
    二分木作成(Words2),
    二分木から頻度と値を取り出す(1,_頻度付き語彙ならび),
    length(Lines,_行数),
    length(_頻度付き語彙ならび,_単語数),!.

文字数の計測(File,_小文字語ならび,_文字数,_頻度と文字のならび) :-
    get_chars(File,Chars),
    length(Chars,文字数),
    二分木作成(Chars),
    二分木から頻度と値を取り出す(1,_頻度付き文字ならび),!.

頻度付き文字ならびの表示([[_頻度,_文字|R]) :-
    write_formatted('%t (%t),\n',[_文字,_頻度]),
    頻度付き文字ならびの表示(R).

頻度付き語彙ならびの表示([[_頻度,_語彙|R]) :-
    write_formatted('%t (%t),\n',[_語彙,_頻度]),
    頻度付き語彙ならびの表示(R).

二分木作成(_整数ならび) :-
    abolish(節/5),
    二分木作成(_整数ならび,1,1,_).

二分木作成([],_,_,_).
二分木作成([_値|R],_節,_開始節番号,_次の節番号) :-
    節作成(_値,_節,_開始節番号,_受取節番号),
    二分木作成(R,_節,_受取節番号,_次の節番号).

節作成(_値,_節,_受取節番号,_次の節番号) :- 
    not(節(_節,_,_,_,_)),
    _下 is _受取節番号+1,
    _右 is _受取節番号+2,
    _次の節番号 is _受取節番号+3,
    assertz(節(_節,_下,_右,1,_値)),!.
節作成(_値,_節,_受取節番号,_次の節番号) :-
    節(_節,_下,_右,_頻度2,_値2),
    _値 = _値2,
    _頻度3 is _頻度2 + 1,
    retract(節(_節,_下,_右,_頻度2,_値2)),
    assertz(節(_節,_下,_右,_頻度3,_値2)),!.
節作成(_値,_節,_受取節番号,_次の節番号) :-
    節(_節,_下,_右,_,_値2),
    _値 @> _値2,
    節作成(_値,_下,_受取節番号,_次の節番号).
節作成(_値,_節,_受取節番号,_次の節番号) :-
    節(_節,_下,_右,_,_値2),
    _値 @< _値2 ,
    節作成(_値,_右,_受取節番号,_次の節番号).

二分木から値と頻度を取り出す(_木の根,_頻度と値ならび) :-
    findall([_頻度,_値],二分木から値と頻度を取り出す(_木の根,_,頻度,_,_値),_頻度と値ならび).

二分木から頻度と値を取り出す(_木の根,_頻度1,_頻度,_値1,_値) :-
    根(_木の根,_下,_,_頻度2,_値2),
    二分木から頻度と値を取り出す(_下,_頻度2,_頻度,_値2,_値).
二分木から頻度と値を取り出す(_木の根,_頻度1,_頻度,_値1,_値) :-
    根(_木の根,_,_右,_頻度2,_値2),
    二分木から頻度と値を取り出す(_右,_,頻度,_,_値).
二分木から頻度と値を取り出す(_木の根,_頻度1,_頻度,_値1,_値) :-
    not(var(_値1)),
    not(var(_頻度1)),
    _頻度1=_頻度,
    _値1=_値.

to_lowers([],[]) :- !.
to_lowers([A|R1],[B|R2]) :-
    to_lower(A,B),
    to_lowers(R1,R2).

flat([],[]) :- ! .
flat([A|R],L) :-
    list(A),!,
    flat(A,L1),
    flat(R,L2),
    append(L1,L2,L).
flat([A|R],[A|R1]) :-
    flat(R,R1).