なぜFRACTRANは完全に調子を合わせているのですか?


10

説明のためにグーグルで試してみましたが、ほとんどのリンクは、「FRACTRANが完成しつつあります。例として、乗算を見てみましょう。

xkcdフォーラムの投稿で、FRACTRANがポスターがチューリングの完全性を理解するのに役立つと言ったのを覚えています。言語メカニズムを見るとあまり明白ではないので、このesolangがチューリング完全である理由に関する直感的な説明を探しています。


FRACTRANに慣れていない場合:en.wikipedia.org/wiki/FRACTRAN
FrustratedWithFormsDesigner

2
乗算が完全性のチューリングの良い例である理由は、ループとストレージの両方が必要だからです。何かが完全に進行中であるかどうかについての完全なテストではありませんが。最高の「証拠」は、brainfuckエミュレータをその中に書くことです
Earlz

回答:


12

命令型言語が完全なチューリングであるためには、以下が必要です。

  1. 条件付きループ
  2. 任意の数の変数

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の累乗は変数です)。これは与える39639633で割り切れる(3の累乗と11を減らす)と455を掛ける(5、7、13変数の増分)。等々。このプログラムの完全な説明とその状態表は、FRACTRANウィキペディアのページで読むことができ、上記のプログラムの非常に素晴らしいアニメーションgifが含まれています。

:チューリング完全にタッチがで見つけることができることをスタック取引上の他のFRACTRAN材料変換BrainfuckにFractran(OK、だ、本当に自分の時間を生産的使用)

Fractranがチューリング完全である理由は、レジスタマシンをシミュレートするためです。数値の素因数分解はレジスターの内容を格納しますが、除算と乗算はレジスターから条件付きで加算および減算する方法です。

ここでのトリック(と理論に迷うこの開始)の一部が舞台裏で、これがあることであるミンスキーのレジスタマシン、それが特定のテープ(プログラム)がマシンをチューリングされていることが証明されたためにIFテープは次のように表されるゲーデル数でありますFRACTRAN番号が正確に何であるか(リンクされたWikipediaページから):

ゲーデルは素因数分解に基づくシステムを使用しました。彼は最初に、彼が扱っていた算術の正式な言語で各基本記号に一意の自然数を割り当てました。

したがって、条件付きループ、ゲーデル数として保存された任意の変数、チューリングマシンがあります。

FRACTRANの性質のようなCollat​​zに触れる他のいくつかの楽しい読書はCa n't Decide?で読むことができます。未定!Collat​​zの推測を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プログラムに変換するには、次のようにします。

  1. 長さ1のループのクリアP
  2. ギリシャ文字(関数)を新しい素数に置き換える
  3. 遷移を置き換える:
   エース
p:-→q、-→r、--> s、...
   bdf

になる:

aq cr es
-、-、-、...
bp dp fp

これにより、プログラムの状態を格納するために素数p、q、r、sが使用されます。

そして、レジスタマシンがあります...それは、任意の大きな数と2つの命令を格納する有限数のレジスタを持っています。

  • inc(x i、m)-レジスタiをインクリメントして行mに移動
  • jzdec(x i、m 1、m 2)-レジスタiが0の場合は行mに進み、そうでない場合はiをデクリメントして行m2に進みます。

このレジスタマシンはチューリング完了であることが示されています。

次に、機械的なプロセスの一部として、レジスタマシンプログラムを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を読んでください。


2
そして私はBrainf * ckが変だと思った。
Robert Harvey

FractranプログラムはVASとして記述できるため、Vector Addition Systemsは関連しています。また、ペトリネット。
Dan D.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.