先日、『精霊の箱 チューリングマシンをめぐる冒険』を読み終えたのですが、非常に面白かったので、いくつか実際に動かしてみました。
turing_machine.rb
ショールマンに割り当てられた設計図
1行目に入力文字列、2行目以降にファウマン卿の記述方法を書いていきます。本の中では、終了状態が丸付き数字で表現されていましたが、最後の行の最右の数字を終了状態にしています。
$ cat input.txt
○○●●○○●○●
1○○→1
1●●→1
1 ○←2
2○○←2
2●●←2
2 →3
3○ →4
3● →4
実行
ショールマンに割り当てられた設計図は入力数を2倍するものでした。
$ ruby turing_machine.rb < input.txt
○○●●○○●○●: 状態1
↑
○○●●○○●○●: 状態1
↑
(途中略)
○○●●○○●○●○: 状態3
↑
○●●○○●○●○: 状態4
↑
ララヴに割り当てられた設計図
$ cat input.txt
○●○○●●●○●○○●●○
1○○→1
1 →5
1●●→2
2●●→4
2○○←3
2 ←3
3●○→1
4●●→4
4○○→1
4 →5
実行
ララヴに割り当てられた設計図は、○と○に挟まれた単独の●が○に変えられ、●の連続だけが残るものでした。
$ ruby turing_machine.rb < input.txt
○●○○●●●○●○○●●○: 状態1
↑
○●○○●●●○●○○●●○: 状態1
↑
(途中略)
○○○○●●●○○○○●●○ : 状態1
↑
○○○○●●●○○○○●●○ : 状態5
↑
ヤークフに割り当てられた設計図
$ cat input.txt
○●●○○
1○○→1
1●●→1
1 |←2
2××←2
2○×→3
2●×→4
2 →6
3○○→3
3●●→3
3××→3
3||→3
3 ○←5
4○○→4
4●●→4
4××→4
4||→4
4 ●←5
5○○←5
5●●←5
5||←2
6× →6
6| →7
実行
ヤークフに割り当てられた設計図は、元の文字列を反転させるものでした。
$ ruby turing_machine.rb < input.txt
○●●○○: 状態1
↑
○●●○○: 状態1
↑
(途中略)
|○○●●○: 状態6
↑
○○●●○: 状態7
↑
全角スペースのところで表示が崩れていますが、実際は以下のように表示されています。
参考