自動解答系の作り方(6)
解答コマンドの生成には,大きく分けて
【1】問題文の分解と項や論理式の抽出
【2】Mathematicaコードへの変換
【3】コマンドへの埋め込みと合成
のステップがあります.
【1】は$で挟まれたLaTeXコード(及びそれに準じた「$a$は正の数」など)を述語の有無で文字通り機械的に選別すればよく,【2】もMathematicaの処理能力への理解と数学に関わる知識+多少のアイデアがあれば何とかなります.
しかし,【3】の自動化,つまり,問題文の論理的構造を解析する手続きの作成は容易ではありません.理由は「問題文が人間が理解できるであろう程にしか書かれていない」からです.
例えば,今回のシステムでは仮定を「問題全体に対する大域的仮定」「途中から追加され,必要に応じて上書きされる局所的仮定」「直後の論理式に対してのみ有効な,いわゆる前件」に分けて扱っているのですが,次の2012年数ⅡB第4問の問題文の一部における 0
(2)$2$直線$FL$,$MN$が交わることを確かめよう.$0<s<1$とし,線分$FL$を$s:(1-s)$に内分する点を$P$とする. $\vec{OP}$は,$s$と$\vec{a}$,$\vec{b}$,$\vec{c}$を用いて $$\vec{OP}=(ans[4] - \frac{s}{ans[5]}) \vec{a}+s \vec{b}+(ans[6] - s) \vec{c}$$ と表される.$s=\frac{ans[7]}{ans[8]}$のとき,$\vec{MP}=\frac{ans[9]}{ans[10]} \vec{MN}$となるので, $M$,$N$,$P$は一直線上にある.
簡単のため,以下では,0
∃s(A∧B∧D)
ですが,誘導ではsの値(一意的でしょうが)の例まで求めさせているので,目標は
∀s(C→A∧B∧D)
とするのが自然であり,実際のシステムではB以前に「線分$FL$を$s:(1-s)$に内分する点を$P$」をメタレベルの局所的仮定と認識しますので
∀s(C→A∧D)
が目標となる訳です.
一方,上記の出現位置のみからの判定により合成されるのは
∀s(A→(C→D)) つまり ∀s(A∧C→D)
なので,AがFalseとなるansをCに用いると全体はTrueとなり,誤答に至ります.
実際にはこれを避けるため本来の問題の目的に基づく(つまり,多数のマッチングパターンを用意して)仮定の選択を行なわせており,システムの作成ではこうした事象への対応も面白味のある部分の一つです.