言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

ステートマシンと言語とオブジェクト

  • もしもオブジェクトが状態を持たない場合、オブジェクトは関数として振舞う。
  • もしもオブジェクトが他のオブジェクトを知らない場合、オブジェクトはステートマシンとして振舞う。
  • もしもオブジェクトが他のオブジェクトを知っている場合、オブジェクトはチューリングマシンとして振舞う。

コンピュータのモデル化はとても面白い話題なので、状態遷移図表よりも分かりやすい表現方法が無いかなーと思う。NFA から DFA を構築する方法や、DFA を単純化する方法なんかは、頭で考えなくても字面を置き換えるだけで計算出来るようにするべきだ。

言語ゲームの問題点として、Smalltalkパラダイム - オブジェクト指向 - との親和性がイマイチ欠けるという事があるように思える。YACC/LEX なんかはバリバリグローバル変数使いまくるわけで、そういう実装に影響されている SmaCC もやはり Smalltalk の環境に置いては特異に見える。一方では、文法クラスは直接ステートマシンと対応できる事も知られている。ステートマシンはいかにもオブジェクトとの対応がスムーズに取れるので、オブジェクト - ステートマシン - 文法と言う線で美味いこと綺麗な対応を考えたいと思う。

オブジェクトが状態を持たない場合、これはクラスメソッドに対応する訳だけれど、ステートマシンで言うと一つしか状態を持たない DFA と見る事が出来るだろう。ある有限の入力に対してある有限の反応を返すだけである。

オブジェクトが他のオブジェクトを知らない場合も、ある有限の入力に対してある反応しか返せない。見た目がちょっと違うだけで、上と機能的には同じかな? 順順にやってくる情報を一つにくっつければ一つの情報とみなせるわけだから。ここは勉強中。文の解析ではなく生成という立場で見れば、これはマルコフ連鎖に相当する。

(本当はここにプッシュダウンオートマトンのクラス - 文脈自由文法 - が入るが、オブジェクトの見方で相当する物を見つけられない。)

最後に普通のオブジェクトのモデル。オブジェクトは無限に存在するほかのオブジェクトの海と通信が出来ると考えるとこれはチューリングマシンになる。個々のオブジェクトが有限の状態しか持てなくても外部と通信する事によりあらゆるシミュレートが出来る。プログラムで記述できる範囲。

そして、その後にチューリングマシンで表現できないクラスが広がる。これを安易に芸術の領域と言って良い物か?