gTuring はチューリング・マシンのシミュレータです。 コンピュータ科学を学ぶものなら誰でも名前は知っていると思いますが、 実際にプログラミングしたことがある人は少ないでしょう。 gTuring で計算機の黎明期に想いを馳せてみてはいかがでしょうか?
(右図をクリックすると大きく表示します。)
作者: Arturo Espinosa Aldama さん他
ホームページ:
http://www.nuclecu.unam.mx/~arturo/gTuring/
バージョン: 1.3 ? (2001/02/06)
ライセンス: GPL
付属ドキュメントを読む
上記の Aldama さんのホームページは
ほとんど更新されていません 消滅したようです。
最近は Germán Poo-Caamaño さんが
GNOME 2 用にメンテナンスしています
(ここ
に少し情報がありますがよく分かりません。
freshmeat の Project ページ はまだ残ってます)。
gTuring は GNOME 1.x のときはなぜか「ゲーム」に分類されていて
gnome-games に含まれていました。
でも LinuxMLD 5 の gnome-games-1.2.0-9.i386.rpm では gTuring
はビルドされないようになっていました
(ゲームと思って動かした人には「なんだ、こりゃぁ」となるでしょうから
Red Hat が外したのでしょう)。
ここで御紹介するパッケージは gnome-games Ver.1.3.90 から
gTuring を取り出したものです。
LinuxMLD 6 の gnome-games-1.4.0.1 には
gTuring を含めています。
インストールすると
LinuxMLD 7
では「ゲーム」→「他のゲーム」にメニュー「Gチューリング」が追加されます。
MLD 5, 6 では「プログラム」→「ゲーム」になります。
ターミナル・エミュレータからは
$ gturing
で起動します。
サンプルがいくつか付いていますから、そのプログラムを動かしてみましょう。
「ファイル」メニューから「開く...」を選択するとファイルダイアログが
開きます。
上に並んでいるボタン右端の「Examples」をクリックするとサンプルのある
ディレクトリに移動します。
一番上の
3ones2zeroes.tur
をやってみましょうか。
ファイルを選択して「了解」すると
と説明 (プログラムのコメント) が出て来ます。
ふむふむ、「1」が連続して3つ出て来たら「0」に置き換える……と。
次に「設定」メニューから「テープ...」を選択して、例えば次のように
入力します。
01011001110011101010
そして「実行」ボタンをクリックします。すると、ゴソゴソ動いて、なるほど、
01011000000000001010
になりました。
「表示」メニューから「状態」を表示させておいて、「ステップ」で実行すると 動きがよく分かります。
入力データの下で左右に移動する「^
」はテープヘッドです。
すなわち、チューリングマシンとは、データをテープ (つまり1次元の文字の列) で
与えると、ヘッドの位置の文字を読み取ってその文字によって内部状態を変える
有限オートマトンです。
ある状態で入力に対してチューリングマシンがすることは、 出力 (テープ上の文字の書き換え)、ヘッドの移動 (右または左)、 次の状態への遷移です。 この5つを組にして書き並べたものがチューリングマシンのプログラムです。
上のプログラム
0 0 0 r 0 0 1 1 r 1 1 0 0 r 0 1 1 1 r 2 2 0 0 r 0 2 1 0 l 2 2 _ _ r 0 |
は次のように表に書き直すと分かりやすくなると思います。状態と 入力に対して、出力、移動、次の状態を並べて書いています。
入力 | |||
---|---|---|---|
状態 | 0 | 1 | _ |
0 | 0R0 | 1R1 | |
1 | 0R0 | 1R2 | |
2 | 0R0 | 0L2 | _R0 |
入力および出力の文字は gTuring では印刷可能な任意の文字が使えます。
ただし空白は、プログラム上はアンダースコア「_」で表します。
ヘッドの移動は小文字で
l
(左) または r
(右) ですが、
上の表では (イチ と エル が紛らわしいので) 大文字で書いています。
gTuring の初期状態は、ヘッドは入力の左端にあり、状態は 0 です。
状態および入力に対して動作が規定されていない状態になったら、停止します。
gTuring のプログラムはテキストファイルですから通常の テキストエディタで簡単に作ることができます。フォーマットについては 「ヘルプ」メニューから表示できるドキュメント (Ver.1.2 だけど フォーマットの変更はないようです) に書かれています。
こんな「マシン」で何が出来るのか、「計算」なんてできるの?
と思う人もいるでしょう。ちゃんとできます。なにしろチューリングマシンは
1936 年に Alan Turing が「計算できる」という意味を示すために
提示した仮想機械です (後の 1945 年に von Neumann が EDVAC で具体化しました)。
言い換えると、チューリングマシンで出来ることが「計算」なのです。
付属サンプルを試してみてください。
add.tur
0
で区切って2つの1進法を与えます。
例えば「01101110
」(つまり 2 と 3) を与えると
「0111110
」が答えです。
addbin.tur
10 11
」(つまり 2 と 3) を与えると
「101
」が答えになります。
bin2dec.tur
もうすこし「賢く」加算をするプログラム
BinaryAdd.tur
を作ってみました。addbin.tur
とは違って桁ごとに計算します。
もうひとつ、
SortABC.tur
は、「A
」「B
」「C
」の
3種類から成る文字の列をソートします。
LinuxMLD 6 では標準でインストールされています。
MLD 5, 7 では
gturing-1.3.90-1.i386.rpm (75,908 bytes)
をインストールします。
rpm コマンドでインストールするにはスーパーユーザになって
# rpm -i gturing-1.3.90-1.i386.rpm
とします。
MLD 5, 6 では
Gnome の GUI でインストールすることもできます。
Ver.1.3 から状態遷移表の編集ができるようになったのですが、 「Editing is still alpha. Come back later or hack.」と警告が表示されるように まだ十分なものではないようです。なにしろ追加はできるけど削除ができません。 1、2ヶ所の修正なら使えますが、別のテキストエディタで修正して 読み込み直した方が早いでしょう。
その場合、 Gnome のメニューから起動するとファイルダイアログのディレクトリが 毎回ホームディレクトリから始まってしまうので、 ターミナルからコマンドで起動する方がいいです。 (Ver.1.2 ではサンプルファイルのあるディレクトリから ダイアログが始まっていたのに比べれば、少しはましになりました。)
新しい
GNOME 2 バージョン
でも編集機能はまだ完成していません。
なお、GNOME 2 バージョンの
.tur プログラムに日本語コメントを付ける場合の文字コードは
UTF-8 にしてください。
ここで御紹介しているパッケージでは調整していますが、 gTuring を収録しているディストリビューションによっては、 日本語環境で動作させるとテープ内容の文字列と、ヘッド位置を示す ^ がプロポーショナルフォントになって、位置がずれてしまうようです。 そういう場合は
$ LANG=C gturing
のようにして (メニュー等英語になりますが) 起動するとよいでしょう。
Web 上の参考になるページを御紹介します。
大分大学教育福祉科学部 の 情報教育の宝島
同名の本の著者によるページですが TuringMachine その他の Mac 用および Java によるシミュレータが あります。ここの TuringMachine は gTuring とは仕様が 異なる (特に初期状態が違い、ヘッドは右端にある) ので プログラムはそのままでは流用できませんが参考になります。
gTuring のサンプルにもいくつか収録されている Busy Beaver Problem について
計算する機械と知性 (アラン M. チューリングの 1950年の論文) -- 新山さん による翻訳
チューリングさんは、第2次世界大戦中にドイツの暗号 ENIGMA
の解読を行なったことでも有名です (そのあいだ「行方不明」になっていたとか)。
genigma のページ
を参照してください。
オートマトンの一種、セル・オートマトンについては
Xlife のページを参照してください。