本物のC

C の前に:チューリング機械*


チューリング機械とは

現在の(ノイマン型)コンピュータの抽象的なモデルとしてチューリング機械(Turing machine)と言うものがあります。

チューリング機械はテープとヘッドから成ります。

テープは十分に長く、枡目が無数に並んでいるものを考えます。それぞれの枡目に書ける記号の種類は予め決めておきます。これはメモリの抽象化であり、実際のメモリ(を容量無限大にしたもの)は記号を 0 と 1 だけに選んだテープと考える事ができます。また 1 バイト毎に区切るとすれば、記号は 0x00 ~ 0xFF を選んだ事になります。

ヘッドはテープの上を動き回って読み書きする機械です。ヘッドは内部状態を持ちます、つまり幾つかの事を憶えておく事ができます。ヘッドがどう動くかは、テープの現在位置から読んだ記号と内部状態によって決まります。これは CPU の抽象化であり、内部状態は全レジスタの値が何であるかに相当します。

0x00 0x00 0x00 0x00 0x00

足し算する

例えば、テープ上の記号に 0x00 ~ 0xFF を選び、内部状態として A、B、C を持つヘッダが

内部状態 テープ上の値 次の状態 テープへの書き込み 移動
A 0x00 以外 B 現在の値 - 1
A 0x00 C - -
B 何でも A 現在の値 + 1
C - (停止状態)

のルールで動くとします。このとき

0x02 0x03 0x00
A

の状態から動作を始めると、今ヘッダがいる位置の記号(値)は 0x00 でないので最初のルールが適用され

0x01 0x03 0x00
B

となります。内部状態が B の場合のルールは一つだけで、これを適用し

0x01 0x04 0x00
A

となって、未だ 0x00 でないので同じ動作が繰り返されます。

0x00 0x04 0x00
B
0x00 0x05 0x00
A

今度は 0x00 なので二つ目のルールが適用され、

0x00 0x05 0x00
C

となってチューリング機械は停止します。

このチューリング機械は、初めの位置の数を 1 ずつ右へ移動する事により足し算を行うものとなっています(0x02 + 0x03 = 0x05)。より複雑な内部状態とルールを定める事で、実際のコンピュータと同じ計算能力を持つもの(万能チューリング機械)をも構成できます。

計算モデル

チューリング機械はコンピュータをそのままモデル化したものですが、それは「入力を一定のルールに従って処理する」という計算モデルの一例に過ぎません。

現在ではλ計算、コンウェイのライフゲーム、マジック:ザ・ギャザリング等多くのシステムが計算モデルとして万能チューリング機械をシミュレートできる、つまりコンピュータと同等の計算能力を持つ事が知られています。