このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/516
#  [1] 授業単元:キーボード入力 
#  [2] 問題文(含コード&リンク): 
#    打ち込む文章を表示して,それをユーザがそっくりに打ち込ませ 
#  その正確さを判定するプログラムを作成せよ. 
#  

'打ち込む文章を表示して,それをユーザにそっくりに打ち込ませその正確さを判定する' :-
        打ち込む文章を表示して(_打ち込む文章ファイル,_打ち込む文章),
        それをユーザにそっくりに打ち込ませ(_ユーザの打ち込んだ文章),
        その正確さを判定する(_打ち込む文章,_ユーザの打ち込んだ文章,_減点数,_正確さの判定),
        判定を表示する(_減点数,_正確さの判定).

打ち込む文章を表示して(_打ち込む文章ファイル,_打ち込む文章) :-
        get_lines(_打ち込む文章ファイル,Lines),
        append(_,[_打ち込む文章|_],Lines),
        writef('%t\n',[_打ち込む文章]).

それをユーザにそっくりに打ち込ませ(_ユーザの打ち込んだ文章) :-
        get_line(_ユーザの打ち込んだ文章).

その正確さを判定する(_打ち込む文章,_ユーザの打ち込んだ文章,_減点数,_正確さの判定).
        atom_chars(_打ち込む文章,_打ち込む文章の文字ならび),
        atom_chars(_ユーザの打ち込んだ文章,_ユーザの打ち込んだ文章の文字ならび),
        語彙判定(_打ち込む文章,_ユーザの打ち込んだ文章,_同一語彙数判定),
        誤字脱字等判定(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字度数判定),
        総合判定(_同一語彙数判定,_誤字脱字度数判定,_減点数,_正確さの判定).

同一語彙数判定(_打ち込む文章,_ユーザの打ち込んだ文章,_同一語彙数判定) :-
        形態素解析(_打ち込む文章,_形態素解析_1),
        形態素解析(_ユーザの打ち込んだ文章,_形態素解析_2),
        語彙の出現数の差異(_形態素解析_1,_形態素解析_2,_語彙の出現数差異度数),
        _同一語彙数判定 is (-1) * 2 * _語彙の出現数差異度数.

語彙の出現数の差異(_形態素解析_1,_形態素解析_2,_語彙の出現数の差異度数) :-
        setof(_形態素,member(_形態素,_形態素解析_1),_整列した形態素),
        findall(_出現数差異,(
                    member(_形態素,_整列した形態素),
                    count(member(_形態素,_形態素解析_1),_度数_1),
                    count(member(_形態素,_形態素解析_2),_度数_2),
                    _出現数差異 is abs(_度数_1 - _度数_2)),
                _語彙の出現数の差異ならび),
        sum(_語彙の出現数の差異ならび,_語彙の出現数の差異度数).


誤字脱字等判定(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字度数判定) :-
        誤字脱字度数(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字数ならび),
        findall(_文字数,(
                    member([_,_文字数],_誤字脱字数ならび)),
                _誤字脱字文字数ならび),
        sum(_誤字脱字文字数ならび,_誤字脱字度数),
        _誤字脱字数判定 is (-1) * _誤字脱字度数.

誤字脱字度数([],[],[]).
誤字脱字度数([A,B|R1],[B|R2],[[脱字,1]|R3]) :-
        \+(A == B),
        誤字脱字度数(R1,R2,R3).
誤字脱字度数([B|R1],[A,B|R2],[[誤字挿入,1]|R3]) :-
        \+(A == B),
        誤字脱字度数(R1,R2,R3).
誤字脱字度数([A,B|R1],[C,B|R2],[[誤字,1]|R3]) :-
        \+(A == C),
        誤字脱字度数(R1,R2,R3).
誤字脱字度数([A|R1],[A|R2],R3) :-
        誤字脱字度数(R1,R2,R3).

総合判定(_同一語彙数判定,_誤字脱字度数判定,_減点数,_正確さの判定) :-
        _減点数 is _同一語彙数判定 + _誤字脱字度数判定,
        分類判定(_減点数,_正確さの判定).

分類判定(0,'1級').
分類判定(_減点数,'2級') :-
        _減点数 < 0,
        _減点数 >= (-3).
分類判定(_減点数,'3級') :-
        _減点数 < (-3),
        _減点数 >= (-7).
分類判定(_減点数,'4級') :-
        _減点数 < (-7),
        _減点数 >= (-12).
分類判定(_減点数,'5級') :-
        _減点数 < (-12).

判定を表示する(_減点数,_正確さの判定) :-
        writef('入力された文章の正確さ判定は誤り減点数 %t で %t です。\n',[_減点数,_正確さの判定]).