手順を実行する機械 Pop1 (2) | Chandler@Berlin

Chandler@Berlin

ベルリン在住

English version

前回は Pop1 が実行できる命令を示した.Pop1 のプログラムは実は固定されていて,変更することができない.サイバネティクス社はプログラムを最重要機密として,社内の人間でも自由に見ることはできない.実はプログラムを開発しているプログラマーも開発しているプログラムを見ることができない.しかし,プログラムを実行させてみると Pop1 がどの命令を実行しているのか教えてくれるので,それを書いてみたのが図 a である.ここで (a), (b), (c) は前回のblogの図を参照のこと.Pop1 には実は命令は3つしかないことに気がついただろうか.

マービン「こんな計算機に3つも命令があるとは無駄なことを.」もちろんいかなる計算機も一つの命令があれば,現存するいかなる計算機ともチューリング等価であることは知られているが,人間には理解というものが必要ということをマービンは忘れている.(いくつかの種類はあるが,私の好きな例は,Computer Architecture: a Quantitative Approach という本にある例である.)


1 (a) 入力コピー
2 (b) 頭尾消去
3 (a) 入力コピー
4 (b) 頭尾消去
5 (c) 頭尾追加
図 a Pop1 プログラム

プログラムを書いたことがない方はこれがプログラム? と思うかもしれないが,これがそうである.結婚式のプログラムでもオリンピックのプログラムでもテレビのプログラムでもある種の小さな手続きの集りであるように,Pop1 プログラムもこのようにできている.

実行の手順を図 b に示す.ここではAnimation が表示されるはずだが,もし上手くいかない場合のために図 (1) から 図 (9) を示す.これは図 (b) と同じである.



Chandler@Berlin-Pop1 (animation)

図b Pop1 procedure execution (Click on the image to see the animation gif)



Chandler@Berlin-Pop1 (1)
図1 initial state

Chandler@Berlin-Pop1 (2)
図2 1. copy the input


Chandler@Berlin-Pop1 (3)

図3 2. delete head and tail


Chandler@Berlin-Pop1 (4)

図4 2. delete head and tail result


Chandler@Berlin-Pop1 (5)

図5 3. copy input


Chandler@Berlin-Pop1 (6)

図6 4. delete head and tail


Chandler@Berlin-Pop1 (7)

図7 4. delete head and tail result


Chandler@Berlin-Pop1 (8)

図8 5. add head and tail


Chandler@Berlin-Pop1 (9)

図9 5. add head and tail result, done.


さて,このプログラムはいったい何をするのか? 別に「人間にとって」意味などない手続きでも良かったのであるが,ここではある計算を考えた.Pop は2つの入力 A, B をとり,一つの出力 C を返す.ここで A, B, C は変数である.もしかしたら変数って何? と思う方もいるかもしれないので,これは覚えていたら後で説明してみよう.

Pop1(A, B) -> C

ここで A を 1, B を 2 とすると,

Pop1(1, 2) -> 3

となる.これは数字 1, 2 をとり,3 を返している.実は,次のような関係がある.

Pop1(0, 0) -> 0
Pop1(0, 1) -> 1
Pop1(0, 2) -> 2

Pop1(1, 0) -> 1
Pop1(1, 1) -> 2
Pop1(1, 2) -> 3

Pop1(2, 0) -> 2
Pop1(2, 1) -> 3
Pop1(2, 2) -> 4

Pop1 の正体がわかっただろうか? これは加算 (Plus operation) である.ついでに何故 Pop という名前なのかもわかっただろう.もちろん名前は人間のためであって,Lambda1 でも Machine1 でも Hokuspokus1 でもかまわない.これは個人的な趣味である.(佐藤・桜井の本に習った)

見慣れた記法に書き直してみよう.

Pop1(0, 0) -> 0 : 0 + 0 = 0
Pop1(0, 1) -> 1 : 0 + 1 = 1
Pop1(0, 2) -> 2 : 0 + 2 = 2

Pop1(1, 0) -> 1 : 1 + 0 = 1
Pop1(1, 1) -> 2 : 1 + 1 = 2
Pop1(1, 2) -> 3 : 1 + 2 = 3

Pop1(2, 0) -> 2 : 2 + 0 = 2
Pop1(2, 1) -> 3 : 2 + 1 = 3
Pop1(2, 2) -> 4 : 2 + 2 = 4

ついに計算機ができた.計算機とは計算をする機械のことである.昔はコンピュータという職業があり,多くは女性だったそうである.この計算機は入力を間違えると怒るほど賢いくせに,数がは何かということは人間のようにはわかっていない.単に教えた手順を実行するだけである.しかし,結果として計算しているように見える.この「見える」というのが重要である.現在の計算機も人間のように数を理解しているわけではない.ある手順を機械的に実行すると,それが計算したように見えるだけである.

見掛けと内容,名前と意味はそれぞれ異なるものである.しかし,formarization というのは見掛けが同じならば内容も同じとする考えである.浅い考えと言うなかれ.完全なコピーであれば,それは同じものと考えることができるのである.例えば,ソフトウェアはコピーであるがその機能はまったく同じである.これは工業的には重要なことだ.もちろん,人間の感情とかいうものまで完全にコピーするのは気持が悪いが,私は二台のコンピュータや,映画の DVDdisk には個性は求めない.それらを違う店で買っても同じものが入手できることを期待する.違っていたら逆に嫌である.

一方で友人から手紙をもらう時には直筆のものの方が嬉しかったりする.数学の中に永遠に不変の真実を求める一方で限りある命を愛しく思うことは一見矛盾しているように見えるかもしれない.宇宙を5回も見てきたマービンは多分違った意見を持っていることだろう.