このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1354070278/102
#  [1] 授業単元:言語処理 
#  [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/0VyMr7kt 
#  上記のプログラムを変更して、逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力するプログラムを作成せよ. 
#  さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示するプログラムを作成せよ. 
#  

'逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力する.さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :-
        逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび),
        計算結果を出力する(_逆ポーランド式ならび),
        'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル).


逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび) :-
        get_chars(_テキストファイル,_文字ならび),
        数字を値に変換する(_文字ならび,_文字ならび_1),
        空白を除去する(_文字ならび_1,_逆ポーランド式ならび).

数字を値に変換する([],[]).
数字を値に変換する([A|R1],[B|R1]) :-
        数字ならば数に変換(A,B),
        数字を値に変換する(R1,R2),!.
数字を値に変換する([A|R1],[A|R2]) :-
        数字を値に変換する(R1,R2).

空白改行などを除去する([],[]).
空白改行などを除去する([A|R1],[A|R1]) :-
        member(A,[+,-,*,/,0,1,2,3,4,5,6,7,8,9]),
        空白改行などを除去する(R1,R2),!.
空白改行などを除去する([_|R1],[_|R2]) :-
        空白改行などを除去する(R1,R2).

数字ならば数に変換(A,B) :-
        A @>= '0',
        A @=< '9',
        atom_number(A,B).

計算結果を出力する(_逆ポーランド式ならび) :-
        計算結果(_逆ポーランド式ならび,[],_値),
        writef('%t\n',[_値]).

計算結果([],[_値],_値).
計算結果([N|R1],L1,_値) :-
        number(N),
        計算結果(R1,[N|L1],_値),!.
計算結果([_演算子|R1],[N1,N2|R2],_値) :-
        演算(_演算子,N1,N2,N3),
        計算結果(R1,[N3|R2],_値).

演算(_演算子,N1,N2,N3) :-
        F =.. [_演算子,N1,N2],
        N3 is F.

'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :-
        get_lines(_テキストファイル,Lines),
        '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines).

'各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines) :-
        append(_,[_行|R],Lines),
        '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行),
        表示する(_頻度ならび),
        R = [].

'各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行,_頻度ならび) :-
        '各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび),
        各要素の個数をカウントした結果を(_字句ならび,_頻度ならび).

'各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび) :-
        sPLIT(_行,[' ','+','-','*','/','1','2','3','4','5','6','7','8','9','0'],L_1),
        空白を取り除く(L_1,_字句ならび).

各要素の個数をカウントした結果を(_字句ならび,_頻度ならび) :-
        setof(_要素,[_要素] ^ member(_要素,_字句ならび),L_1),
        findall([_頻度,_字句],(
                    member(_字句,L_1),
                    count(member(_字句,_字句ならび),_頻度)),_頻度ならび).

表示する(_頻度ならび) :-
        append(_,[[_頻度,_字句]|R],_頻度ならび),
        writef('%t,%t回  ',[_字句,_頻度]),
        R = [],
        write('\n').