2013年11月3日日曜日

「宇宙をプログラムする宇宙」を読みながらのロギングまたはジャーナル

2016/11/23 修正
1. https対応(amazonのリンクを変更)
2. 誤字を修正( (halt,ht)->hlt, sloop->eloop)



前置き。




いつのまにか本棚に出現したこの本。買った覚えはない。もちろん盗んだ覚えも。でも確か、本棚を整理していたとき、カバーがかけてあってタイトルが分からない本を片っ端から(カバーを)剥いていたときに出てきたきがする。


で、そのとき、滅多に読まない本の棚に置かれていたのだが、この前さらに本棚を整理したとき、さすがに情報が古すぎて捨てざるを得ない本をまとめている時、また自分の前に現れて、お、こんな本あったんだ。これは読まねば、と思って、そのうち読む本の列に加わっていたのだが、訳有って昨日から読み始めている。

いつのもことだが、こういう本は読んだ端から疑問だらけで、自分のほうが偉いと錯覚してしまう。なのでブログに文字通りロギングしてみようとしているところ。「またはジャーナル」と付いているのは単なるおまけで、昔はログとは言わず、ジャーナルと言っていたプロジェクトがあったので。

金融系の人が初めて制御系をやったときのプロジェクトなのだが、もしかしたらジャーナルという表現のほうが当たっているかもしれない、と思ったので。


ロギング開始

P16、自己紹介の前まで。

計算を定義せよ。とは口癖だが(正確には「〜(なになに)を定義せよ。」が口癖。実際に口から声を出すわけではないが)、計算とは?

ここで10歳ぐらいの少年に戻って博士に質問してみた。ねー博士、計算って答えを出すためにやるんじゃないの? 宇宙がさー、もし計算してるんなら、何の答えを出そうとしているの?

これはいい。少年に戻ると、質問が非常に分かりやすくなる。

例えばコンピュータが暴走していたら、それは「計算」していると言えるだろうか? まずは原文ではどういう言葉を使っているのか、調べる必要がある。

(追記)amazon.comでkindleを探したらあったので10.7ドル(1051円@今日)で買おうとしたが、思いとどまってamazon.co.jpで探したら981円で売ってたのでレート的に有利なこっちで購入。計算は"compute"だった。つまり計算機の計算。辞書でcalcurateを見ると、正確に計算する時はcomputeとある。(追記)




でさー、僕も宇宙の一部だよね? じゃ僕も何か計算してるんだ。僕は何を計算しているの? 宇宙は宇宙を計算するっていうけど、僕は僕を計算してる、じゃおかしいよね?

計算というのは何か専門的な言い回しなのかもしれないが、今のところ抽象的すぎてこうした質問が浮かんでしまう。

こんなことを考えていると、シュレーディンガーの猫にツッコミが入った。

もし箱に閉じ込められた猫が、重ね合わせの結果(収束)により放たれたガスによって死ぬまで、”だいたい”10時間かかったら、それでも猫は生と死の重ね合わせの状態にあると言えるのか? で、もし、”だいたい”8時間後までの間に猫を救出し解毒剤を投与できたら助かるとしたら、その重ね合わせはどこへ行くのか? あるいはどう変化するのか? そもそもこの猫の”重ね合わさった”生と死とは?

そして、”だいたい”といったのには訳があって、それは猫の実験を何万匹もやったら、そうした時間は非常にアバウトになる、ということもあるが、それより、1匹の猫に注目した時、その日の体調などによって死に至る時間や助かる限界時間が左右されるはずだ。としたら、過去に遡って、あるいは未来に向かって、重ね合わせはどう影響するのか。実験台に立ったのが口がきける猫だったとして、助かった後「いや〜今日は体調がよくて助かったよ。もし昨日ならきっと持たなかったと思う。確実に死んでいたね。」な〜んて言ったら、本当にこの猫に重ね合わせの状態は存在したのだろうか。

もう1つ、ガスが放たれる直前に自然死したらどうなるのか?

こんなことを言い出したら切りがない。つまり、話をすっ飛ばすと、重ね合わせの状態は観測した瞬間に決定する、のではなく、初めから決まっているのだ。観測することも含めて。

(私が読んだ本には、月は見た瞬間実在する、とかなんとか、おかしなことを言う物理学者がいたように確か書かれていて、よくそれで物理学者が勤まるなあと思った覚えがある)

でなければ、重ね合わせ状態はどう伝搬されるというのか? 特により大きな塊(大きな力で巨視的には結合しているもの)の範囲で。



P22、音子ってなんだ? つまり、どうして音を特別扱いするのか。音自体は物質ではないはずなのに。


p24 『年齢に関わらず本書を読み終える頃には、〜(中略)〜原子に単純な計算をやってもらう方法が、理解できていることだろう』

原題は「PROGRAMING THE UNIVERSE」だ。確かに本書の初めの方で宇宙は宇宙を計算していると言っているが、「宇宙をプログラムする宇宙」というのは、この本の目的から外れすぎている感じがすごくする。

P26 ゼロの発明と10進数は同時なの? 昔から桁っていうのは10進だったの? それとも12とか60とか? ソロバンが先らしいというなら、せめてその進数も書いて欲しかったなあ。

P29 性は楽しいだけでなく、工学的にも優れている
どうもこういう言い回しには反感を覚えてしまう。楽しいと工学的に優れているのは不可分なはずだ。楽しいだけで終わっていたら、長続きしない。長続きしているもので、楽しくないものって何かあるの? 苦痛? それを言ったら性的暴行の被害者は楽しくないじゃないか。

P29 自然淘汰
いいですねこの訳最高です! 最近、自然選択という言葉遣いが散見されるにつけ、少々嫌気がさしてきているので。

選択などという弱々しい訳は全く持ってふさわしくないし、恐らくnatural selectionは、悪魔に使える牧師たるダーウィンにすれば、god's selectionに対する皮肉が込められてる気がしてならない。我々は選ばれたのではない。ただ生き残ったに過ぎないのだ。そう、単なる結果だ。Wikipediaに至っては、「本項では原語に従って「自然選択」で統一する。」などといっているが、selectionは選択が必ずしも原語に従った適訳とは限らない。どうしても選ぶという言葉を使いたいなら、せめて厳選とか精選にすべきだろう。そもそも淘汰という稀に見る広く普及している適訳があるのに、わざわざ「原語に従って」選択などという薄っぺらい凡庸な言葉にする意味が明記されてもいない。独善的と断ずる他あるまい。恐らく(勝手な想像だが)、これを書いた人物は、自分が選ばれたと思いたいのだろう。もしそうだとしたら、それは大きな間違いだ。まったく早くWikipediaのような、勝手な編集管理者が牛耳る全く自由でない編集百科に取って代わる、真に自由なサービスを立ち上げる必要がある。その意味でWikipediaは反面教師として素晴らしい。一体どうやって編集管理者(出入り禁止にしたりする人たち/ちなみに自分は出入り禁止になっているわけではない)が決まっているのだろうか。そんな権限を持つ人間がいるのを一概に悪いとは言わないが、自由な編集を騙るのは止めてもらいたいものだ。Wikipediaは、あくまでWikipediaが許可した文章しか載らないのだ。後から削除されるものが、削除されるまでの間自由に編集できるからといって、それを盾に自由に編集に参加できるというのはおかしい。

(※WikipediaでWikipediaをひくと、冒頭、「誰もが無料で自由に編集に参加できる。」とある。これは「誰もが無料でWikipediaの編集規約(基準)や管理人による管理下の元、自由意志で編集に関わることが出来る」のように、明確に書くベきで、百科事典という立場上、意味に関して、そして最も重要な自分自身の定義について、紛らわしい抽象的な”自由”という言葉を使うべきではない。)


ちょっと戻るが、P28 「性を持たないバクテリアが適合するには〜」と、P29の「定義上、成功した生物とは〜」(この下りは素晴らしい。そう、まず何事も定義する(系を決める)ことが先決で重要)を合わせて考えてみると、おかしなことに気づく。バクテリアにしろウィルスにしろ、人間が彼らより成功しているとは言えないということに。それどころか、人間はいつエボラウィルスのような最強最悪のウィルスで絶滅するとも限らないではないか(可能性は低いかもしれないが)。

菌にしてもMRSAのように、抗生物質に対し、悠々と耐性を獲得するものが出てきている。だから性機能が優秀というのは認めるとしても、それはそれでしかない。つまり定義上の成功に対する中間結果として、一定の過去を評価することは出来ても、せいぜいそこまでが限界だ。

そして、人間は決して、彼らより成功している訳ではない。

P36 精度(今はP38上)
有限であることが精度に依存するというのは新しい見方/説明だ。なるほど。だが関数はどうだ? 無限という関数は、それでも有限の値しか扱えないと言い切れるだろうか? 確かに測定する時間的制約の元では、その範囲で扱える精度が決まるような気はする。がしかし、それはちょっと、時間に対して静的過ぎはしないだろうか。

P40 どうもユニークなIDの桁数とそれを同時に存在させることの説明がごっちゃになっている気がする。例えばDNAが小さいのはそれ自身が小さいからで、アミノ酸が4種類の塩基3つセットから組み立てられた、64文字(4の3乗)で構成される、というのとはイコールではない。つまり実際の遺伝子(DNA鎖)の作用は、その1つ1つに重要な機能が折り畳まれているからであって、何でもかんでも64文字あれば記述できるというわけでもない。アルファベット26文字で記述できる文章は無限的だが、ヒトゲノムのように2万1千単語で人が作れるわけでもないし、ましてやランダムに並んだ文字は暗号でもなければ情報とはおそらく言えないだろう。これもまた情報の定義によるわけだが。

P43 コンピュータプログラムに曖昧さがない
それはJavaなどを指しているというだけで、ここでは単に説明しているだけだから、別段突っ込む必要はないといえばない。だが、「あくまでJavaとか」の言語の話であって、この先誰かが(例えば自分が)作るであろう、曖昧な意味を持つ言語とそのコンパイラ(あるいはインタプリタ)のことではない、という断るまでもない断り。

P54 停止問題
自分は停止問題の何が問題なのか、どうしても理解できない大馬鹿ものである。「プログラムが停止するかどうかを見極めるにはそれを走らせてただ見守るしかない」それはウソだ。確かに未知の動きをするインタプリタとそれ用の言語で書かれたプログラムなら動かしてみる以外にどう動くか分からないのだからそうかもしれない。でももしそうなら、停止問題なんてわざわざ言わなくても、分かるわけがないことは自明だ。

だがそれが「プログラムがフリーズしたときの慰めになる」と言うなら、少なくとも既知のプログラムの問題だ。

で、「このプログラムにバグが無いか」という問題なら、カバレッジが無限になる(量子力学的には有限なの?)からという理由で答えられないということはある。しかしそれは別に停止問題ではないし。むしろ鶏が先か卵が先か問題で考えた方が分かりやすい。バグの無いプログラムか調べるにはバグの無いデバッガが必要だが、そのバグの無いデバッガにバグがないことを証明するにはさらにバグの無い別なデバッガが必要だ、そしてこの連鎖に終わりはない、という理屈だ。だがそれは数学を借りずとも論理として自明だし、単にバグがないことを証明できないだけであって、バグのないプログラムが書ける可能性は理論上在り得る。つまり、数学的に不可能だと証明することはできない、ということだ。もちろんそれが実現可能かどうかは別問題。あくまで停止問題として不可能が証明されているというのが納得いかないだけ。つまり言い換えれば、停止問題は数学上の問題であって、物理的な現実の言い訳として、停止問題が解けないからバグは無くならない、という文脈では使えないのではないか、ということ。

ということで、停止問題を解くプログラムMを作って、耐久性を測るコンテストをやればいいのではないだろうか。無事故の連続時間みたいに、このプログラムに挑戦するプログラムAを与えて、停止する/しないの答えを得るのだ。Mは決められた時間(例えば3秒間)動作中のプログレスを更新しないと暴走とみなされ、失格する。また最初に自身の終了予定時間を出し、それを超えると失格。終了予定時間を出すまでの時間は、Mに入力するプログラムのサイズによって機械的に決められ、その時間内に出せないと失格。後は実際にAを実行し、停止しないと判断した場合はコンテストが継続する間、半永久的に実行され、コンテストが継続する間止まらなければ、Mは停止問題を解けないとは断言できない、という中途半端な称号を得られる。停止すると判断した場合は、同時にAが停止する予定時間を出さなければならない。そしてその停止時間までAを実行し、それ以前に停止すれば、Mは停止問題を解けないとは断言できないという称号を得られる。そうでなければ失格。まずは命令の種類の少ないCPUのアセンブラから。4ビットマイコンとかどうだろう。いや、いっそ、1ビットの仮想CPUを作って、gotoとstopの命令しかなくしたらどうだ? それだとプログラムを入力できないか。どっちにしてもまずコンピュータが正しく動いていることを証明できないと停止問題に入れない。前提もおかしいということになる。

なので、プログラムが入力できて、それを読めて、とかいう諸条件をまず定義して、そこから停止問題に入って行って、最も命令数が少なくて済むコンピュータを考えて、プログラムのステップ数もギリギリ少なくしか書けないような仕様にして、でやればいい。相手は数学なんだから、物理的にいくら小さくても構わないはずだ。で、この本は量子力学の本で、物事は有限だと言っているんだから、このコンピュータで記述可能なプログラムの種類が有限であっても文句はあるまい。

そうすれば、前述の終了時間を出すとかいう面倒くさいことはしなくても、仕様として制限時間が決められるし、あ、何よりプログラムの種類が有限なのだから、机上チェックで答え合わせができるはずだ。

ということで、話を整理すると、検査対象のプログラムの置き場所は決まっていて、コンピュータはそのアドレスから読む命令を持っている。停止するプログラムと停止しないプログラムの両方が記述可能。そうするとloopとhltがまず必要。それと条件分岐、プログラムカウンタ。

スタートすると、検査対象プログラムの命令コードを1個読む。命令コードにより分岐する。hltなら結果レジスタに1をセットする命令yes、hltの2つ。eloopだったら結果レジスタに0をセットする命令no、hltの2つ。readなら命令の読み出しは4つスキップされる。しかし最大7ワードなので、残りワード数が4つない場合は、結果レジスタに自動的に1をセットしてhltする。yesなら1つスキップ、noなら1つスキップ。で、Hのコードはread,yes,hlt,no,hlt,yes,hlt.

read
yes
no
hlt
eloop

の5種類。プログラムは7ワードしか置けない。

とすると、組み合わせは5の7乗で78,125通り。げ。もっと少なくしよう。

readとhltとeloopだけ。結果レジスタはreadがセットする。
命令は2ワードしか置けない。

判定結果は結果レジスタにセットされる。
結果レジスタは、未設定(3または2)、停止する(1)、停止しない(0)の3つの状態を表示可能。
判定対象プログラムをセットする領域(メモリ)を2ワード持っている。
判定対象プログラムを読み出す命令read用に読み出しカウンタを持っている。
読み出しカウンタは0,1,2の3つの状態を持つことができる。
Mは起動すると、結果レジスタを未設定にし、読み出しカウンタを0にセットし、開始番地にある命令コードを逐次実行する。
命令コードはread,hlt,eloopの3つ。ただしreadには2つの命令コードが割り当てられ、どちらも全く同じ動きをする。
Mはread,hltのみ。
readはreadが出ると、1ワードスキップ。命令は最大2ワードなので、
2ワード目の場合は結果レジスタに1をセットしてhlt
hltが出ると結果レジスタに1をセットしてhlt
eloopが出ると結果レジスタに0をセットしてhlt

そうすると? 組み合わせは3の2乗で9通り。

  1    2    結果レジスタ
1 read read  1
2 read hlt  1
3 read eloop  0
4 hlt read  1
5 hlt  hlt     1
6 hlt eloop  1
7 eloop read 0
8 eloop hlt     0
9 eloop eloop  0


この中でMは2番。MにMを含むどのプログラムを入力しても必ず停止する。

あとはこの機械がMたるかどうかが、対角線論法とやらで証明されたとされる停止問題上、対象外とされる理由があるかどうか。任意のプログラムは入れられるし、停止するプログラムも無限ループするプログラムも書ける。ちゃんと答えも返せる。あと足りないとしたら何かあるだろうか。

あと疑問なのは、例えばこちらの説明の1.ように、Mが無限ループに入る、というのがおかしい。Mは必ず停止する。問題の定義から、Mはあくまであらゆるプログラムが停止するか否かを判定する機械であるのだから、それ自身が無限ループする場合と停止する場合があるプログラムである必要は全く無い。

さて仕様のまとめ。
Mは任意のプログラムをチェックし、それが停止するかしないかを判定する機械。

構成:
自プログラムメモリ(2ビット2ワード)
判定対象プログラムメモリ(2ビット2ワード)
結果レジスタ(2ビット/PIO出力)
動作状態レジスタ(2ビット/PIO出力)
ループ相対カウンタレジスタ(8ビット/PIO出力)
read用読み出しカウンタ(2ビット)
命令実行ユニット
自プログラムメモリ設定インタフェース(DIPSW)
判定対象プログラム設定インタフェース(DIPSW)

read:命令コード00(B) または 01(B)
動作概要:判定対象プログラム領域から読み出しカウンタの示す命令コードを1ワード取得し、取得したコードに応じた処理を行う。
(1) 読み出しカウンタの値をチェックし、2であれば結果レジスタに2(動作不良)をセットし、停止する。
(2) 読み出しカウンタ位置から命令コードを取得する。命令コードに応じて次の処理を行う。
  (a) readであれば、読み出しカウンタを+1し、値が2であれば、結果レジスタに1(停止する)を設定し、停止する。そうでなければ再び命令コードを取得し、それに応じた処理を行う。
  (b) hltであれば、結果レジスタに1(停止する)をセットし、停止する。
  (c) eloopであれば、結果レジスタに2(停止しない)をセットし、停止する。

hlt:命令コード10(B)
動作概要:停止する。
(1) 動作状態レジスタに1(停止)をセットする。
(2) 停止する。

eloop:命令コード11(B)
動作概要:無限ループする。
(1) 動作状態レジスタに2(動作中)をセットする。
(2) ループ相対カウンタレジスタを+1する。
(3) 1秒ウェイトする。
(4) (2)に戻る。

以上。




0 件のコメント:

コメントを投稿