最終更新日 2007年4月21日

TURING.EXE
 TURING.EXE はチューリング・マシンを模倣するプログラムです。チューリング・マシンのプログラムは 次の五つの記号で表される命令のリストで表現されます。一組の命令は <現在の状態、読み込んだカラー、書き込むカラー、新しい状態、動く方向>の形で表されます。
 このチューリング・マシンではスペース(または空白)のカラーはBで表現します。 また、動く方向はLとRで示します。
 チューリング・マシンの処理は、次の六つのステップの繰り返しです。
■ ヘッドの現在いるセルの記号を読む
■ プログラムの全体を調べて、現在の状態である<現在の状態、読み込んだカラー>で始まる命令セットを見つけだす。 該当する命令セットがなければ、停止する。見つかったら、 その命令セットの<書き込むカラー、新しい状態、動く方向>を確認する。
■ ヘッドの状態を<新しい状態>にする。
■ 現在のセルの内容を<書き込むカラー>の記号に変える。
■ <動く方向>によって指定された位置にヘッドを移動する。
■ 最初のステップに戻る。

TURING.EXE でプログラミングしてみましょう。
 TURING.EXE を立ち上げます。

 セルとヘッドの初期状態はメニューの set の table で指定します。

のダイアログボックスで、初期状態と初期データを入力します。通常、初期状態は 0 ですので、デフォルトのままで良いです。初期データは、1行に一文字入力します。OK のボタンを押すと次のようになります。

チューリング・マシンのプログラムは、小さな子供の遊んでいる様子をイメージすればいいです。

上図のような初期データが与えられたとき 0 をすべて 1 に変えるプログラムを考えて見ます。

先頭から右に一つずつ調べて、0 があれば 1 に変え、1 であればそのままにします。 一つ処理した後も同じことをすればいいので、状態を変える必要はありません。 従って、

0 0 1 0 R
0 1 1 0 R

とプログラミングすればいいです。大して知的なことをしていないので、 プログラムも簡単です。
このプログラムを左側のメモにプログラムを打ち込みます。プログラムは直接編集することも保存することも読み込むこともできます。命令リストの最後は何も書き込まないで下さい。改行だけの行を作らないという意味です。

 Start のボタンを押せば、チューリング・マシンが動き出します。

 初期データを入力し直して、実行してみて下さい。
同様に、0 と 1 をすべて入れ替えるプログラムは、

0 0 1 0 R
0 1 0 0 R

とプログラミングすればいいです。

が、実行すると

となります。次に、

のような初期データから、最初に見つかった 0 を消し、

のように、後ろに持って行くプログラムを考えます。 小さな子供に命令すにはどうすればいいかを考えればいいです。まず。 最初の空白(B で表現する)は 読み飛ばします。これから 0 を見付けなければいけないという状態(1)に変わります。 (本当は、0 が一つもなければ、無限ループになるからですが)

0 B B 1 R

が一つ目の命令です。 0 を見付けなければいけないという状態(1)では、 1 は読み飛ばします。0 を見付けなければいけないという状態(1)に変わりは ありません。

1 1 1 1 R

0 を見付けなければいけないという状態(1)で、0 を見付けると、 空白(B で表現する)を書き込み、0 を抱えたという状態(2)に変わります。

1 0 B 2 R

0 を抱えたという状態(2)では、0 と 1 を読み飛ばします。

2 0 0 2 R
2 1 1 2 R

0 を抱えたという状態(2)で、空白(B で表現する)を見付けると、 次の空白(B で表現する)で 0 を書き込むという状態(3)に 変わる必要があります。

2 B B 3 R

次の空白(B で表現する)で 0 を書き込むという状態(3)で、空白(B で表現する) に出会うと、0 を書き込み、処理が終わったという状態(4)になります。

3 B 0 4 R

これで、プログラムができあがりました。

0 B B 1 R
1 1 1 1 R
1 0 B 2 R
2 0 0 2 R
2 1 1 2 R
2 B B 3 R
3 B 0 4 R

を打ち込み、初期データをセットし、

Start ボタンを押すと、

と確かに実行してくれます。
このプログラムを修正して、すべての 0 を後ろに移動するようにします。 0 を一度に運べれば効率的ですが、幾つの 0 を抱え込んだかの記憶は 状態の変化でしか記憶できないので、小さな子供がやるように、 一つずつ運びます。上のプログラムで一つの 0 は移動できました。 最後の命令を次のように書き換えます。 次の空白(B で表現する)で 0 を書き込むという状態(3)で、空白(B で表現する) に出会うと、0 を書き込み、次のループのために引っ返す状態(4)になります。

3 B 0 4 L

次のループのために引っ返す状態(4)で、0 は読み飛ばします。

4 0 0 4 L

次のループのために引っ返す状態(4)で、空白(B で表現する)に出会うと、 空白(B で表現する)に出会うまで引っ返すという状態(5)になります。 次に見付ける空白(B で表現する)は 0 を消した空白(B で表現する)で、 この時点の空白(B で表現する)は、初期データの終わりの印の空白(B で表現する) です。ここで状態変化を起こさないと、 初期データの終わりの印の空白(B で表現する)に出会ったときと 0 を消した空白(B で表現する)に出会ったときの処理という同じ頭を持った2つの 命令が出来、重複してしまうことになります。

4 B B 5 L

空白(B で表現する)に出会うまで引っ返すという状態(5)では、 0 と 1 を読み飛ばします。

5 0 0 5 L
5 1 1 5 L

空白(B で表現する)に出会うまで引っ返すという状態(5)で 空白(B で表現する)に出会うと、空白(B で表現する)を書き込み、 最初にやったことと同じことをすればいいから、 これから 0 を見付けなければいけないという状態(1)に変わります。

5 B B 1 R

これで、大体プログラムができあがりましたが、最初に 0 を運んだ時とは異なり、 0 が既に運ばれているので、 次の空白(B で表現する)で 0 を書き込むという状態(3)で、0 に出会います。 そのときの処理も書いておかなければなりません。

3 0 0 3 R

最初は、このような処理を忘れていても良いです。実行してみて、予期した 結果にならなければ、プログラムが間違っていると言うことですから、 間違いを見付け、作り直せば良いだけです。このような作業をデバッグと 言います。間違えぬに超したことはありませんが、正しいプログラムが できあがるまで、デバッグを楽しむ遊び心を持つことが大切です。 結局、次のようなプログラムになります。

0 B B 1 R
1 1 1 1 R
1 0 B 2 R
2 0 0 2 R
2 1 1 2 R
2 B B 3 R
3 B 0 4 L
4 0 0 4 L
4 B B 5 L
5 0 0 5 L
5 1 1 5 L
5 B B 1 R
3 0 0 3 R

が、実行すると

となります。
次に、1 も 0 の後ろに全部、移動させます。まず、上のプログラムを最小限度の 修正で、プログラミングしてみます。 上の図から分かるように、これから 0 を見付けなければいけないという状態(1) で、初期データの終わりの印の空白(B で表現する)で停止します。 この状態から、最初に見つかる 1 を見付けに戻り、その 1 を 0 の最後に 運びます。すなわち、これから 0 を見付けなければいけないという状態(1) で、初期データの終わりの印の空白(B で表現する)を見付けると、 1 を見付けるために戻るという状態(6)に変化させます。

1 B B 6 L

1 を見付けるために戻るという状態(6)では、空白(B で表現する)を 読み飛ばします。

6 B B 6 L

1 を見付けるために戻るという状態(6)で、1 を見付けると 1 を抱えたという状態(7)に変化します。

6 1 B 7 R

1 を抱えたという状態(7)では、空白(B で表現する)を 読み飛ばします。

7 B B 7 R

1 を抱えたという状態(7)で、0 または 1 に出会うと、 1 を書き込む場所を探すという状態(8)に変化します。

7 0 0 8 R
7 1 1 8 R

1 を書き込む場所を探すという状態(8)では、0 と 1 を読み飛ばします。

8 0 0 8 R
8 1 1 8 R

1 を書き込む場所を探すという状態(8)で、空白(B で表現する)を 見付けると、1 を書き込み、次の 1 を求めて引っ返す状態(9)に なります。

8 B 1 9 L

次の 1 を求めて引っ返す状態(9)では、 0 と 1 を読み飛ばします。

9 0 0 9 R
9 1 1 9 R

次の 1 を求めて引っ返す状態(9)で、空白(B で表現する)を 見付けると、 1 を見付けるために戻るという状態(6)に変化させます。

9 B B 6 L

これで、繰り返しが完成しました。 しかし、困ったことに、これでは、1 を全部運び終わったことを知る方法がありません そのため、目印になるよう先頭の空白(B で表現する)を X という記号に しておきます。すなわち、一番最初の命令を

0 B X 1 R

と修正します。そして、 1 を見付けるために戻るという状態(6)で、X を見付けると、 空白(B で表現する)を書き込み、すべて終わった状態(10)になります。

6 X B 10 L

これで、プログラムができあがりました。

0 B X 1 R
1 1 1 1 R
1 0 B 2 R
2 0 0 2 R
2 1 1 2 R
2 B B 3 R
3 B 0 4 L
4 0 0 4 L
4 B B 5 L
5 0 0 5 L
5 1 1 5 L
5 B B 1 R
3 0 0 3 R
1 B B 6 L
6 B B 6 L
6 1 B 7 R
7 B B 7 R
7 0 0 8 R
7 1 1 8 R
8 0 0 8 R
8 1 1 8 R
8 B 1 9 L
9 0 0 9 L
9 1 1 9 L
9 B B 6 L
6 X B 10 R

が、実行すると

となります。
実は、このプログラムにはバグがあります。0 が一つもなく、1 だけの 初期データが与えられた時は、無限の彼方へ旅立って行きます(無限ループに 陥ります)。実験してみて下さい。数学やプログラミングでは、このような 極端な状況を常に考えることが重要で、それが数学者やプログラマの本性となっています。 プロの作るプログラムは、このような場合にも対応出来るようにすべきです。 そのためには、0 を運んだかどうかの記憶を状態で蓄えておくか、0 を運んだかどうかをテープ上に 記録しておかなければなりません。 また、初めからプログラムの見直しをします。大変といえば大変ですが、 プログラミングという 作業はこのようなものです。良いものを創作しようとしている人、オリジナルなものを 求めている人は、どの分野でも同じようなことをしているはずです。

諦めて、プログラムをチェックしてみます。問題は 0 が1つも無かった場合と 0 を処理し終えた場合を区別していなかった ことにあります。
空白(B で表現する)に出会うまで引っ返すという状態(5)で 空白(B で表現する)に出会うと、空白(B で表現する)を書き込み、 最初にやったことと同じことをすればいいから、 これから 0 を見付けなければいけないという状態(1)に変わります。

5 B B 1 R

の部分に問題があります。

0 が見つかった場合の処理をします。 空白(B で表現する)に出会うまで引っ返すという状態(5)で 空白(B で表現する)に出会うと、空白(B で表現する)を書き込み、 再度 0 を見付けなければいけないという状態(11)に変わります。

5 B B 11 R

再度 0 を見付けなければいけないという状態(11)では、 1 は読み飛ばします。再度 0 を見付けなければいけないという状態(11)に 変わりはありません。

11 1 1 11 R

再度 0 を見付けなければいけないという状態(11)で、0 を見付けると、 空白(B で表現する)を書き込み、0 を抱えたという状態(2)に変わります。

11 0 B 2 R

再度 0 を見付けなければいけないという状態(11) で、初期データの終わりの印の空白(B で表現する)を見付けると、 1 を見付けるために戻るという状態(6)に変化させます。

11 B B 6 L

これで、今まで通りの動きをするはずです。

そこで、0 が1つも無かった場合の処理を考えます。 これから 0 を見付けなければいけないという状態(1) で、初期データの終わりの印の空白(B で表現する)を見付けると、 0 なしで 1 を見付けるために戻るという状態(12)に変化させます。

1 B B 12 L

0 なしで 1 を見付けるために戻るという状態(12)で、1 を見付けると 0 なしで 1 を抱えたという状態(13)に変化します。

12 1 B 13 R

0 なしで 1 を抱えたという状態(13)では、空白(B で表現する) に出会うと、 0 なしで 1 を書き込む場所を探すという状態(14)に変化します。

13 B B 14 R

0 なしで 1 を書き込む場所を探すという状態(14)で、空白(B で表現する) に出会うと、1 を書き込み、 次の 1 を求めて引っ返す状態(9)に なります。

14 B 1 9 L

これで 0 が1つも無い場合もうまく動くようになったはずです。

最終的なプログラムは次のようになります。

0 B X 1 R
1 1 1 1 R
1 0 B 2 R
2 0 0 2 R
2 1 1 2 R
2 B B 3 R
3 B 0 4 L
4 0 0 4 L
4 B B 5 L
5 0 0 5 L
5 1 1 5 L
5 B B 11 R
3 0 0 3 R
1 B B 12 L
6 B B 6 L
6 1 B 7 R
7 B B 7 R
7 0 0 8 R
7 1 1 8 R
8 0 0 8 R
8 1 1 8 R
8 B 1 9 L
9 0 0 9 L
9 1 1 9 L
9 B B 6 L
6 X B 10 R
11 1 1 11 R
11 0 B 2 R
11 B B 6 L
12 1 B 13 R
13 B B 14 R
14 B 1 9 L

チューリングマシンのプログラミングはこのようにして、修正に修正を重ねて作っていくので、 自分の作ったプログラムでも、作ってから時間が経つと理解が困難になります。

要するに、チューリングマシンのプログラミングはパズルを解くようなものです。

遊びをせんとや生まれけむ 戯れせんとや生まれけん 遊ぶ子供の声聞けば 我が身さえこそ揺るがるれ 本来、遊女の歌らしいですが、勉強や仕事を遊びに出来れば、人生楽しくなります。
「わたしの外国語学習法」ロンブ・カトー著、米原万里訳 ちくま学芸文庫に どうすれば、楽しく勉強できるか書いています。 「Interesse ist starker, als Liebe」 (興味は愛よりも強し)(starker の a は本当はアーウムラウト)(これはどおゆう意味?)とドイツのことわざにあり、 興味というものは、 人類にとって最悪のひとつである飽きを克服する能力を持ち合わせている。 人間がもっとも興味を持っているのは自分自身であり、「自力で探り当てた 真理ほど身近で貴重なものになる」と繰り返し述べています。

 他人が書いたプログラムを試験の時だけ覚えていても何にも ならないし、第一、意味もよく分からないものを覚えるのは苦痛以外の何者でもありません。上で解説したようにすれば、自力でプログラミングできます。 自力でプログラムが作れたら、その喜びは大変なものであり、俄然プログラミングが楽しくなり、益々、チューリングマシンに対する興味が湧いてきます。

演習問題をいくつかあげておきます。

例えば SAMPLE DATA : XXXXX が与えられた時、 XXXXXX のように、最後に一つ X を追加するプログラムを作れ。 解答例: 0 X X 0 R 0 B X 1 R これを 0 X X 0 R 0 B X 0 R とすると何が起こるか確かめなさい。 例えば SAMPLE DATA : XXXXX が与えられた時、 XXXXXXX のように、最後に2つ X を追加するプログラムを作れ。 解答例: 0 X X 0 R 0 B X 1 R 1 B X 2 R 例えば SAMPLE DATA : BXXXX が与えられた時、 0 B B 1 R 1 X X 1 R 1 B B 2 L 2 X X 2 L 2 B B 1 R のプログラムを実行すると何が起こるか確かめなさい。 ここで、B は空白を示しています。 例えば SAMPLE DATA : BXXXX が与えられた時、 0 B B 1 R 1 X X 1 R 1 B X 2 L 2 X X 2 L 2 B B 1 R のプログラムを実行すると何が起こるか確かめなさい。 ここで、B は空白を示しています。 例えば SAMPLE DATA : XXX が与えられた時、 BBBBXXXXXX のように、X の個数の2倍の X を描くプログラムを作れ。 解答例: 0 X B 1 R 1 X X 1 R 1 B B 2 R 2 X X 2 R 2 B X 3 R 3 B X 4 L 4 X X 4 L 4 B B 5 L 5 X X 5 L 5 B B 0 R 例えば SAMPLE DATA : XXX が与えられた時、 BBBBXXX のように、X 達を移動するプログラムを作れ。 例えば SAMPLE DATA : ()(()()) や (()(() が与えられた時、 括弧がうまく対応しているかどうか判定できるプログラムを作れ。 解答例: 0 ( Y 1 R 0 X X 0 R 0 ) Z 3 R 0 B B 5 R 1 ( ( 1 R 1 ) X 2 L 1 X X 1 R 1 B B 4 R 2 ( X 1 R 2 X X 2 L 2 Y Z 0 R 2 Z Z 3 R 5 B O 6 R 6 B K 7 R 3 ( ( 3 R 3 ) ) 3 R 3 B B 8 R 8 B N 9 R 9 B O 10 R 4 B B 8 R 更に、自分で問題を考えて解いてみて下さい。
最後にチューリングマシンで本物の計算出来ることを示すために、十数年前、 2進数の足し算を実行するプログラムを作りました。 こう言ったことを時間の無駄だと考えずに、レクレーションだと思って やってみることが、プログラミングが好きになることだと思います。 丸一日あれば、自力でプログラミング出来るはずです。 普通、プログラムを作っている人は、C++ で、数千行から数万行のプログラムを 作っています。こんなので音を上げていてはいけません。
以下は私(中村 治)の解答例です。

2進数の足し算のプログラム(Copyright Osamu NAKAMURA)
0 0 Z 1 R
0 1 W 1 R
1 0 0 1 R
1 1 1 1 R
1 + + 1 R
1 = = 2 L
2 0 Y 4 L
2 1 Y 5 L
3 0 Y 5 L
3 1 Y 6 L
4 + + 7 L
5 + + 8 L
6 + + 9 L
7 X X 7 L
8 X X 8 L
9 X X 9 L
7 0 X 10 R
7 1 X 11 R
8 0 X 11 R
8 1 X 12 R
9 0 X 12 R
9 1 X 13 R
10 0 0 10 R
10 1 1 10 R
10 + + 10 R
10 = = 10 R
10 X X 10 R
10 Y Y 10 R
11 0 0 11 R
11 1 1 11 R
11 + + 11 R
11 = = 11 R
11 X X 11 R
11 Y Y 11 R
12 0 0 12 R
12 1 1 12 R
12 + + 12 R
12 = = 12 R
12 X X 12 R
12 Y Y 12 R
13 0 0 13 R
13 1 1 13 R
13 + + 13 R
13 = = 13 R
13 X X 13 R
13 Y Y 13 R
10 B B 14 L
11 B B 15 L
12 B B 16 L
13 B B 17 L
14 0 B 18 R
14 1 B 19 R
15 0 B 20 R
15 1 B 21 R
16 0 B 22 R
16 1 B 23 R
17 0 B 24 R
17 1 B 25 R
18 B 0 14 L
19 B 1 14 L
20 B 0 15 L
21 B 1 15 L
22 B 0 16 L
23 B 1 16 L
24 B 0 17 L
25 B 1 17 L
14 B B 14 L
15 B B 15 L
16 B B 16 L
17 B B 17 L
14 = = 26 R
15 = = 27 R
16 = = 28 R
17 = = 29 R
26 B 0 2 L
27 B 1 2 L
28 B 0 3 L
29 B 1 3 L
2 = = 2 L
3 = = 3 L
2 Y Y 2 L
3 Y Y 3 L
2 + + 30 L
3 + + 31 L
30 X X 30 L
31 X X 31 L
30 Z X 32 R
30 W X 33 R
31 Z X 33 R
31 W X 34 R
7 Z X 32 R
7 W X 33 R
8 Z X 33 R
8 W X 34 R
9 Z X 34 R
9 W X 35 R
32 X X 32 R
32 + + 32 R
32 Y Y 32 R
32 = = 32 R
32 0 0 32 R
32 1 1 32 R
33 X X 33 R
33 + + 33 R
33 Y Y 33 R
33 = = 33 R
33 0 0 33 R
33 1 1 33 R
34 X X 34 R
34 + + 34 R
34 Y Y 34 R
34 = = 34 R
34 0 0 34 R
34 1 1 34 R
35 X X 35 R
35 + + 35 R
35 Y Y 35 R
35 = = 35 R
35 0 0 35 R
35 1 1 35 R
32 B B 36 L
33 B B 37 L
34 B B 38 L
35 B B 39 L
36 0 B 40 R
36 1 B 41 R
37 0 B 42 R
37 1 B 43 R
38 0 B 44 R
38 1 B 45 R
39 0 B 46 R
39 1 B 47 R
40 B 0 36 L
41 B 1 36 L
42 B 0 37 L
43 B 1 37 L
44 B 0 38 L
45 B 1 38 L
46 B 0 39 L
47 B 1 39 L
36 B B 36 L
37 B B 37 L
38 B B 38 L
39 B B 39 L
36 = = 48 R
37 = = 49 R
38 = = 50 R
39 = = 51 R
48 B 0 -1 R
49 B 1 -1 R
50 B 0 52 R
51 B 1 52 R
52 0 0 52 R
52 1 1 52 R
52 B B 53 L
53 0 B 54 R
53 1 B 55 R
54 B 0 53 L
55 B 1 53 L
53 B B 53 L
53 = = 56 R
56 B 1 -1 R
30 0 X 57 R
30 1 X 58 R
31 0 X 58 R
31 1 X 59 R
57 X X 57 R
57 + + 57 R
57 Y Y 57 R
57 = = 57 R
57 0 0 57 R
57 1 1 57 R
58 X X 58 R
58 + + 58 R
58 Y Y 58 R
58 = = 58 R
58 0 0 58 R
58 1 1 58 R
59 X X 59 R
59 + + 59 R
59 Y Y 59 R
59 = = 59 R
59 0 0 59 R
59 1 1 59 R
57 B B 60 L
58 B B 61 L
59 B B 62 L
60 0 B 63 R
60 1 B 64 R
61 0 B 65 R
61 1 B 66 R
62 0 B 67 R
62 1 B 68 R
63 B 0 60 L
64 B 1 60 L
65 B 0 61 L
66 B 1 61 L
67 B 0 62 L
68 B 1 62 L
60 B B 60 L
61 B B 61 L
62 B B 62 L
60 = = 69 R
61 = = 70 R
62 = = 71 R
69 B 0 2 L
70 B 1 2 L
71 B 0 3 L
4 0 0 72 L
4 1 1 72 L
5 0 0 73 L
5 1 1 73 L
6 0 0 74 L
6 1 1 74 L
72 0 0 72 L
72 1 1 72 L
73 0 0 73 L
73 1 1 73 L
74 0 0 74 L
74 1 1 74 L
72 + + 75 L
73 + + 76 L
74 + + 77 L
75 X X 75 L
76 X X 76 L
77 X X 77 L
75 0 X 10 R
75 1 X 11 R
76 0 X 11 R
76 1 X 12 R
77 0 X 12 R
77 1 X 13 R
75 Z X 78 R
75 W X 79 R
76 Z X 79 R
76 W X 80 R
77 Z X 80 R
77 W X 81 R
78 X X 78 R
78 + + 78 R
78 0 0 78 R
78 1 1 78 R
78 Y Y 78 R
78 = = 78 R
79 X X 79 R
79 + + 79 R
79 0 0 79 R
79 1 1 79 R
79 Y Y 79 R
79 = = 79 R
80 X X 80 R
80 + + 80 R
80 0 0 80 R
80 1 1 80 R
80 Y Y 80 R
80 = = 80 R
81 X X 81 R
81 + + 81 R
81 0 0 81 R
81 1 1 81 R
81 Y Y 81 R
81 = = 81 R
78 B B 82 L
79 B B 83 L
80 B B 84 L
81 B B 85 L
82 0 B 86 R
82 1 B 87 R
83 0 B 88 R
83 1 B 89 R
84 0 B 90 R
84 1 B 91 R
85 0 B 92 R
85 1 B 93 R
86 B 0 82 L
87 B 1 82 L
88 B 0 83 L
89 B 1 83 L
90 B 0 84 L
91 B 1 84 L
92 B 0 85 L
93 B 1 85 L
82 B B 82 L
83 B B 83 L
84 B B 84 L
85 B B 85 L
82 = = 94 R
83 = = 95 R
84 = = 96 R
85 = = 97 R
94 B 0 98 L
95 B 1 98 L
96 B 0 99 L
97 B 1 99 L
98 = = 98 L
99 = = 99 L
98 Y Y 98 L
99 Y Y 99 L
98 0 Y 78 R
98 1 Y 79 R
99 0 Y 79 R
99 1 Y 80 R
98 + + -1 R
99 + + 100 R
100 Y Y 100 R
100 = = 100 R
100 0 0 100 R
100 1 1 100 R
100 B B 101 L
101 0 B 102 R
101 1 B 103 R
102 B 0 101 L
103 B 1 101 L
101 B B 101 L
101 = = 104 R
104 B 1 -1 R

 最初に*のある行はコメント行です。  セルとヘッドの初期状態はメニューの set の table で指定します。

 初期状態とデータを入力すれば、OK ボタンを押します。

 Start のボタンを押せば、チューリング・マシンが動き出します。

 メニューの set の timer でスピードをミリ秒単位で指定できます。
 このプログラムはフリーソフトです。

ホームページに戻る

数学教育を改善するためのソフト開発に戻る