世界の解釈方法

(今日のこの項は今一つまとまっていません。もう少し考えて書き直した方がいいのですけど、かきかけの文章のライブ公開って事で(^^;))
Squeak eToysを初めて触った時、大変感心した事がひとつあります。
「旋回」という動作を実現するためにはeToysのスクリプティングタイルでは「一歩進む」と「ちょっと向きを変える」という二つの行動をほぼ同時に行い、これを時間軸に沿って連続させることによって結果的に「旋回」という動作になるという見せ方を行います。
これは、「フレーム」という単位に慣れ親しんでいるゲーム屋の視点からすると、火を見るよりも明らかな世界の真実なのですが、数学的には「微分方程式によって記述される運動」と表現することが出来ます。
ところが、現実世界に生きているほとんどの人は、時間というのは「ただ単に流れるもの」であって、時間の関数として世界を捕らえることも、時間方向に微分することによってその中間の状態を記述し易くなるということもできない傾向にあります。旋回しながら動いている物体は、「円を描いている」事は分かっても、その行動がどのような方法論で実現できるかには意識が及びづらいです。
そういう意味で、端っから「動く物を作るには微小時間(ノーマル)を時間に沿って何度も繰り返す(チクタク)事によって実現できる」と言い切ったプログラミングスタイルを、ループ何かよりも前に押し付けるeToysって、世界のモデル化のバッサリ感がすごいなぁ、と。
例えば、ほとんどのプログラミングの教材は、移動という行為を以下の形で書きます。懐かしのBASICだとこんな感じ。

10 for i=0 to 40
20 locate i,0
30 print " a "
35 pause(2)
40 next i

ところが、この書き方には大変な問題点があります。ループのための方法論としてループ回数とx座標は全く同じものであるという前提があるため、この中には「時刻」のパラメータは入っていません。もちろん、結果的にループ回数iを「時刻」と見なすこともできますが、残念ながらプログラミングの教材は、こんな書き方を行います。

10 for i=0 to 40 step 2
20 locate i,0
30 print " a "
35 pause(2)
40 next i

確かにこれで速度は速くなります。でも、これでは先程「時刻のパラメータ」と見なした変数iが、不連続な時刻を表現してしまいます。
じゃあ、逆にこんな表現にするとどうなるかというと、

10 for i=0 to 40
20 locate i,0
30 print " a "
35 pause(1)
40 next i

時間のパラメータと見なしたはずの変数iが、連続してこそいれ、元の時間よりもずっと速く流れて行きます。
もちろん、数学的な素養を持つ人ならば分かるはずです。最初の例と二つ目の例は「微小時間あたりの変位」が事なり、三つ目の例とは「微小時間に対する分解能が事なる」ために、結果的にどちらも速度と位置の関数の係数、要は「速度」が変化しているということが。
でも、どちらにしても、iは時刻を表している訳ではありません。結果として、iは座標、正確にはある基準点からの相対座標を表しています。つまり、これらのプログラムは「座標」というものだけを数値化して持っており、「時刻」は観察者の中にしか存在しない、つまり、時間の関数としての座標という考え方は、記述上は存在しないのです。
また、このプログラムには重大な問題点がもう一つあります。
逐次処理を行うというノイマン型コンピュータのプログラミング言語では、純粋に同時に二つ以上の処理を行うことはできません。なので、このプログラムを習得した人に「もう一個、左に向かう文字をつくって、一緒に動かして」というと、そのほとんどは以下のようなミスを犯します。

10 for i=0 to 40
20 locate i,0
30 print " a "
35 pause(2)
40 next i
110 for i=40 to 0 step -1
120 locate i,1
130 print " b "
135 pause(2)
140 next i

確かに文字「b」は左に向かって動きます。
ですが、当然ですが同時に2つの文字は動いてくれません。
これは、元のプログラムをある程度解釈した人でもおおむねこうなります。学習結果を元に以下のように類推できるからです。

  • for文のiが座標のはず
  • 座標を逆に小さくすれば左に行くはず

ところが、この発想の中には二つ以上の物を「同時に」動かすという方法は含まれていません。また、多くの場合それがなぜできないかということも分かりません。気づかないのはなぜかというと、ふだん私達が生きている現実は、「逐次処理」に純粋になっている訳ではなく、暗黙的に並列処理が行われている事が、あまりに当たり前すぎるためです。
これに気づくためには、数学的なブレイクスルーが必要になります。具体的には、以下に気づく必要があります。

  • 世界は時間の関数として記述できる
  • コンピュータの中では時間は離散的なものである
  • 離散的な微小時間に行われたことは、逐次処理的にこなされたとしても観察者からは「同時」と見なせる

これを、 Florian は「Δtの世界に生きる」と呼んでいます。例えば、時間軸に沿った世界のシミュレーションは必ず「Δtの世界に生きる」必要があります。
「Δtの世界」というのは実際には実在する訳ではありません。現実時間はどうやら連続的なものみたいですし(この際、プランク時間は知覚できないので無視(^^;))、同時に起きていることは、純粋に「同時」ということがあり得ます。
じゃあ、「Δtの世界」というのは何かというと、これはもう単なる世界の捕らえ方でしかあり得ません。世界は結構複雑なものですから、複雑なまま、ありのままで捕らえようとすると結構ストレスが大きくなります。これを、例えば微分という方法によって解釈すれば、ある場面(この場合、コンピュータによる現実のシミュレーション)においては大変便利なことが有り得るという、そのための捕らえ方です。
世界の捕らえ方はひとつではありません。たまたまここで扱っているような数値化可能な世界であれば、周期的な数値を扱うための「フーリエ変換」という方法だってあります。数値化不可能な世界であっても今度はそれなりに解釈のための方法論は残されています。


ただ、仮説を立て、仮説を検証することによって解釈のための方法を編み出す・・という自然科学的な方法論は、無意識のうちに人間に備わるものではなく、なんらかの形で習得しないと身につかないものだと思っています。
もちろん、教育者としての Florian はこれをなんとか理解させようといろいろ苦心しています。でも、 Florian はが主に教える二十歳前後の人間に「世界の見方を変えるのだ」といっても理解するまでが一苦労です。彼らだって、それまでの人生で算数や、数学や、理科などの自然科学的方法論にたくさん触れてきているはずなのに。
そういう意味で、なにかもっとうまい教育の方法というのがないものかといつも思っています。
(続く、かな?)