説明のためにグーグルで試してみましたが、ほとんどのリンクは、「FRACTRANが完成しつつあります。例として、乗算を見てみましょう。
xkcdフォーラムの投稿で、FRACTRANがポスターがチューリングの完全性を理解するのに役立つと言ったのを覚えています。言語メカニズムを見るとあまり明白ではないので、このesolangがチューリング完全である理由に関する直感的な説明を探しています。
説明のためにグーグルで試してみましたが、ほとんどのリンクは、「FRACTRANが完成しつつあります。例として、乗算を見てみましょう。
xkcdフォーラムの投稿で、FRACTRANがポスターがチューリングの完全性を理解するのに役立つと言ったのを覚えています。言語メカニズムを見るとあまり明白ではないので、このesolangがチューリング完全である理由に関する直感的な説明を探しています。
回答:
命令型言語が完全なチューリングであるためには、以下が必要です。
FRACTRANは、データを素数の指数に格納する一連の分数で構成される言語です。
2つの数値を追加したいとしましょう:2 a 3 bは5 abになります
455 11 1 3 11 1 ---、-、-、-、-、- 33 13 11 7 2 3
これは、上記の変更を行うためのFRACTRANプログラムです。
72(2 3 3 2)のような数字から始めます。プログラムは、命令で乗算されたときに別の整数である数値(剰余は許可されない)が見つかるまで「前進」します。
72
に到達するまで前進し11/2
ます。次に、数値を除算して2
乗算します11
(11の累乗は変数です)。これは与える396
。 396
33で割り切れる(3の累乗と11を減らす)と455を掛ける(5、7、13変数の増分)。等々。このプログラムの完全な説明とその状態表は、FRACTRANウィキペディアのページで読むことができ、上記のプログラムの非常に素晴らしいアニメーションgifが含まれています。
:チューリング完全にタッチがで見つけることができることをスタック取引上の他のFRACTRAN材料変換BrainfuckにFractran(OK、だ、本当に自分の時間を生産的使用)
Fractranがチューリング完全である理由は、レジスタマシンをシミュレートするためです。数値の素因数分解はレジスターの内容を格納しますが、除算と乗算はレジスターから条件付きで加算および減算する方法です。
ここでのトリック(と理論に迷うこの開始)の一部が舞台裏で、これがあることであるミンスキーのレジスタマシン、それが特定のテープ(プログラム)がマシンをチューリングされていることが証明されたためにIFテープは次のように表されるゲーデル数でありますFRACTRAN番号が正確に何であるか(リンクされたWikipediaページから):
ゲーデルは素因数分解に基づくシステムを使用しました。彼は最初に、彼が扱っていた算術の正式な言語で各基本記号に一意の自然数を割り当てました。
したがって、条件付きループ、ゲーデル数として保存された任意の変数、チューリングマシンがあります。
FRACTRANの性質のようなCollatzに触れる他のいくつかの楽しい読書はCa n't Decide?で読むことができます。未定!Collatzの推測をFRACTRANと停止問題に関連付けます。
FRACTRANは頭を動かすのが少し難しいです。
次のようなプログラムについて考えてみます。
LABEL: start
block1
block2
block3
...
END
この場合、各ブロックの形式は次のとおりです。
IF(registers X >= a, Y >= b) # or any combination of registers
THEN
X -= a
Y -= b
I += n
J += m
goto start
上記の乗算プログラムの最初のステートメント:
455 --- 33
この形式では次のように記述されます。
IF(register `3` >= 1 && `11` >= 1)
THEN
`3` -= 1
`11` -= 1
`5` += 1
`7` += 1
`13` += 1
goto start
したがって、チューリングの完全性に必要なデータストレージとループ構造を明確に見ることができます。非常に初歩的ですが、存在し、単純なレジスタマシンとして実行されます。
まだ納得できませんか?
これは、計算モデルに関するDimitri Hendricksの講義から大部分を借りています。
これ(2/3)
は、加算器である非常に単純なプログラム(2 a 3 b- > 3 a + b)を取りますが、破壊的です。2の値はプロセスの一部としてクリアされます。
そのような破壊を簡単に行わないようにする、より高いレベルのFRACTRANを書いてみましょう。
元のプログラムは次のように考えることができます:
2 α:-→α 3
F 2では、ソートの「関数」を指定できます。
10 1 α:-→α、-→β 3 1 3 β:-→β 5
F 2プログラム(P)を標準のFRACTRANプログラムに変換するには、次のようにします。
エース p:-→q、-→r、--> s、... bdf
になる:
aq cr es -、-、-、... bp dp fp
これにより、プログラムの状態を格納するために素数p、q、r、sが使用されます。
そして、レジスタマシンがあります...それは、任意の大きな数と2つの命令を格納する有限数のレジスタを持っています。
このレジスタマシンはチューリング完了であることが示されています。
次に、機械的なプロセスの一部として、レジスタマシンプログラムをFRACTRANプログラムにコンパイルするいくつかのスライドのプロセスを示します。
基本的に:
p(i) inc(x(i)、m)= ----→m 1 1 1 jzdec(x(i)、m1、m2)= ----→m2、-→m1 p(i)1
したがって、これら2つのコンピューティングモデルが同等であるため、FRACTRANは完全なチューリングです。
ところで、あなたが本当にあなたの心を吹き飛ばしたいのであれば、Code Golf:Fractranを読んでください。