なんちゃってMathematicaを作る - その11 [なんちゃってMathematica]
前回LISPの評価メカニズムを概観した。Mathematicaも基本的には同じことしかしていない。
「式」はheadとargumentを持っているオブジェクトで、headは別の式をさすポインタ、argumentは配列で、その要素はやはり別の式をさすポインタ、という構造が考えられる。
式以外にシンボルと数値と文字列があって、式のポインタがさす先になり得る。シンボルには書き換え規則のデータベースを保持させて、式のheadポインタにさされているときはそれを使って式を書き換える。
実は、数式処理ソフトウェアがLISPの評価エンジンを使うというのはMathematicaが初めてではない。REDUCEやMacsyma(現在のMaxima)も基本的にはLISPの評価エンジンを使っている。MacsymaはLISPそのもので書かれているし、REDUCEの記述言語はpascalに似た字面を持っていて専用のコンパイラで実行形式に変換されるが、そのpascal風の字面は単なるLISPのシンタクスシュガーである。
CならNULLで終端する文字列として与えられると、スペースを探して、それによって区切られている単語を切り出し、どんな単語がどういう順で現れているか、主語はどれか、動詞はどれかなどを解析することから始めることになるだろう。
LISPにこの文章を与えると、まずスペースによって区切られたものがリストになる。LISPでは初めから入力を単語の連続として内部的に表現することができる。そのあとは新しい単語を追加したり語順を変更したり、ということをすることになるが、それもリストの要素の置き換えという作業になる。
このように、文章を解釈したり置き換えたりという作業はLISPでは簡単になる。文章は構造をもった単語の集合であり、文章の意味とは単語の意味とそれがどういう構造をもって組み合わさっているか、ということであるといえるので、その処理を行うにはLISPはふさわしいということになる。
数値ではなく数式を処理することは記号処理の一種で、それをLISPで実装することは自然だった。MacsymaやREDUCEがLISPで実装されているのはこういう背景があったからである。
LISPは非常に低水準な言語なので、今では人工知能をLISPで実装するというのは歴史的な物語でしかなくなっているが、LISPの評価エンジン(evalと呼ばれることもある。そもそも式を「評価」すると言う言い方はLISPが語源である)のメカニズムは多くの便利な特徴から記号処理的な作業の必要なところに使われている。
8.2 Mathematica用の評価エンジン
ここまでの話で、Mathematicaの式を作ってそれを評価する、というための構造がどういうものがいいか、はだいたい想像がつく。「式」はheadとargumentを持っているオブジェクトで、headは別の式をさすポインタ、argumentは配列で、その要素はやはり別の式をさすポインタ、という構造が考えられる。
式以外にシンボルと数値と文字列があって、式のポインタがさす先になり得る。シンボルには書き換え規則のデータベースを保持させて、式のheadポインタにさされているときはそれを使って式を書き換える。
実は、数式処理ソフトウェアがLISPの評価エンジンを使うというのはMathematicaが初めてではない。REDUCEやMacsyma(現在のMaxima)も基本的にはLISPの評価エンジンを使っている。MacsymaはLISPそのもので書かれているし、REDUCEの記述言語はpascalに似た字面を持っていて専用のコンパイラで実行形式に変換されるが、そのpascal風の字面は単なるLISPのシンタクスシュガーである。
8.2.1 LISPが得意な処理
たとえばある英語の文章を読み、それを疑問文にすることを考えてみる。You have a pen.は
Do you have a pen?となるだろう。入力の文章は
My father has a pen.というのも考えられるだろう。
CならNULLで終端する文字列として与えられると、スペースを探して、それによって区切られている単語を切り出し、どんな単語がどういう順で現れているか、主語はどれか、動詞はどれかなどを解析することから始めることになるだろう。
LISPにこの文章を与えると、まずスペースによって区切られたものがリストになる。LISPでは初めから入力を単語の連続として内部的に表現することができる。そのあとは新しい単語を追加したり語順を変更したり、ということをすることになるが、それもリストの要素の置き換えという作業になる。
このように、文章を解釈したり置き換えたりという作業はLISPでは簡単になる。文章は構造をもった単語の集合であり、文章の意味とは単語の意味とそれがどういう構造をもって組み合わさっているか、ということであるといえるので、その処理を行うにはLISPはふさわしいということになる。
8.2.2 数式処理とLISP
当時、今から4、50年前コンピュータといえば数値計算をするためのものだった。「数値」ではない処理をコンピュータにさせることを、全部ひっくるめて「記号処理」と呼んでいた。この記号処理に向いた言語としてLISPが適しているといわれていた。さっきの疑問文への変換などは記号処理のもっとも簡単なもののひとつである。たとえば最初期の人工知能はLISPによって実装されることが多かった。数値ではなく数式を処理することは記号処理の一種で、それをLISPで実装することは自然だった。MacsymaやREDUCEがLISPで実装されているのはこういう背景があったからである。
LISPは非常に低水準な言語なので、今では人工知能をLISPで実装するというのは歴史的な物語でしかなくなっているが、LISPの評価エンジン(evalと呼ばれることもある。そもそも式を「評価」すると言う言い方はLISPが語源である)のメカニズムは多くの便利な特徴から記号処理的な作業の必要なところに使われている。
2011-11-25 21:08
nice!(0)
コメント(0)
トラックバック(0)
コメント 0