Brainfuck Turingを完全にするのに十分なブラケットのペアは何個ですか?


12

Brainfuckは、8つのシンボル(I / Oを無視する場合は6つ)のみを使用するチューリング完全プログラミング言語です。

それをチューリングの完全性に押し上げる最も注目すべきものは[、と]、本質的にBrainfuckのレーベルとgotoです。

通常、Brainfuckのプログラムはの複数のセットを使用しますが[]、Brainfuck Turingを完成させるためにこれらのブラケットのペアを正確にいくつ使用する必要があるのでしょうか?

もっと簡単に言うと、n状態のチューリングマシンをシミュレートするために必要なブラケットの最小量はどれくらいですか(1、2、および3状態のチューリングマシンのブラケットの数を与えます)。

ノート:

無限のテープを想定しており、計算上の制限はありません。

2シンボルチューリングマシンです。


1
「これらのブラケットを何組使用する必要がありますか?」「使用する必要がある」ことを明確にできますか。たとえば、BrainFにまでカウントするように要求するとどうなります 21000000か?
ジョンL.

@ Apass.Jackブラケットの最小数
MilkyWay90

1
ああ、チューリングマシンをnの関数としてシミュレートするために、ブラケットの最小数を意味しましたか?とにかく、可能な限り簡単な自明でない例を挙げていただけますか?nn
ジョンL.

1
@ Apass.Jackさて、私は1ステートチューリングマシンのために働くバギーBFプログラムを考え出すよ
MilkyWay90

@ Apass.Jack Nevermind、それは私にとってはあまりにも難しいです。基本的に、プログラミング言語のTuring Machine But Way Worseの BFインタープリターを作成し、2つの可能なシンボル(0および1)のみを使用し、I / Oと停止アスペクトを完全に削除します
MilkyWay90

回答:


9

これは@ ais523の答えをさらに発展させたもので、ブラケットを2セットのみに減らし、Golombルーラー理論に基づいたよりコンパクトなセル配置を使用しています。ais523がいるこの建設のためのコンパイラを作っただけでなく、このTIOセッションは TWMカウンタのデバッグ・トレースを実行しているBFプログラムを得られた試料を示します。

オリジナルと同様に、これはウォーターフォールモデルのプログラムから始まり、一般性を失わない制限がいくつかあります。

  1. すべてのカウンターは同じ自己リセット値R持っています。つまり、TWMトリガーマップfは、すべてのx f(x,x)=Rというプロパティがありますx
  2. 停止カウンターhが1つありますhます。
  3. カウンターの数cは、ある素数pに対して(p1)/2p

ゴロム定規

Erdős–Turán構造Welch–Costas配列の置換関数を組み合わせて、必要なプロパティを持つGolombルーラーを取得します。

(この結合された構造は新しいアイデアではないはずですが、Wikipediaからこれらの2つの部分を見つけて組み合わせました。)

ましょうrの原始根でありp=2c+1。関数を定義する

g(k)=4ck((rk1)mod(2c+1)),k=0,,2c1.

  1. gは次数 2 cのゴロム定規です。すなわち、差分 G I - G jは異なる数のすべての対に対して一意である I J { 0 ... 2 C - 1 }2cg(i)g(j)i,j{0,,2c1}
  2. g(k)mod(2c)は、すべての値0,,2c1回だけ取ります。

テープ構造

各TWMカウンタのx{0,,c1}、我々は、2つのBFテープセル位置を割り当てる代替セルを u(x)値セル v(x)

u(x)=g(k1)<v(x)=g(k2) with u(x)v(x)x(modc)

gの2番目の特性により、選択できる正確に2つの異なるk1,k2値があります。

フォールバックセルのコンテンツは、ほとんどの場合0ままになります。ただし、カウンターがちょうどアクセスされたとき、2 Rになるときを除きます。2Rとき、カウンターの自己リセット値の2倍になります。値セルは、対応するTWMカウンターの値の2倍に保たれます。

BFプログラムの実行(有限数)で到達できる他のすべてのセルは、奇数値に保たれるため、常にゼロ以外としてテストされます。初期化後、これは自動的に行われます。これは、すべてのセル調整が均等に行われるためです。

必要に応じて、初期のBFテープ位置の左側への移動を避けるために、すべてのセル位置を定数だけ右にシフトできます。

BFプログラムの構造

LET H=v(h)u(h)停止カウンタの値と代替セル間の距離であり、およびlet N数十分に大きなものであるcN+1v((x+1)modc)u(x)すべてのカウンターx。次に、基本的なBFプログラム構造は

初期化 [ >×(H+cN+1) [ <×c ] 調整 <×H ]

初期化

初期化の最後のカウンターがちょうど訪問していたし、ちょうどアクティブセルがそのフォールバックセルであるかのように、位相状態で、それらの初期値にプログラムによって到達可能なすべてのセルを設定し、u(c1)

  1. 値セルは、カウンター0が事前にデクリメントされることを除いて、対応するTWMカウンターの初期コンテンツの2倍に初期化されます。
  2. フォールバックセルは0に設定されますが、セルu(c1)2R設定されます。
  3. プログラムが到達可能な他のすべてのセル(有限数)は1設定されます。

次に、プログラムの最初に到達する前に、テープポインターを位置u(c1)H(常にゼロ以外のセル)に移動し[ます。

外側のループの始まり

外側のループの反復の開始時に、テープポインターはいずれかのuになりますu(x)H、カウンター xに対してx Hまたはv(x)Hx

ましょうy=((x+1)modc)訪問に次のカウンタです。

移動>×(H+cN+1)の位置にテープポインタを置きy(modc)v(y)左側ではない。

内側のループ[ <×c ]は、cステップで左方向にゼロセルを検索します。カウンターyの場合yがゼロの、(ゼロ)値のセルv(y)停止します。それ以外の場合、フォールバックセルu(y)が見つかります。

見つかったセルが新しいアクティブセルになります。

調整

調整段階は、アクティブセルに対するそれらの位置に基づいて、テープ上の様々な細胞を調節します。このセクションには+-><コマンドため、これらの調整は無条件に行われます。ただし、すべてのカウンター関連セルはGolombルーラーパターンであるため、現在のアクティブセルに適切ではない調整はすべての重要なセルを見逃し、代わりに無関係なセルを調整します(奇数のまま)。

したがって、アクティブセルの自己調整を除き、アクティブセルと調整済みセルの考えられる必要なペアごとに個別のコードをプログラムに含める必要があります。ただし、調整は相対位置のみに基づいているため、すべてのセルで共有する必要があります。

必要な調整は次のとおりです。

  1. 前のカウンターのフォールバックセルを調整する u(x)2Rます。
  2. 現在のカウンターのフォールバックセルu(y)2調整します2R除いて現在のアクティブセルがある場合v(h)と、我々は停止しなければならないので。
  3. 次のカウンターの値セルv((y+1)modc)2(カウンターをデクリメント)だけ調整します。
  4. アクティブセルが値セルv(y)(カウンターyがゼロに達した)の場合、すべての値セルv(z)をTWMトリガーマップから2f(y,z)だけ調整します。v(y)自体は2Rによって調整されます。

上記第一および第二の調整は、すべてのアクティブセルが調整しなければならないという事実によって必要作られ自体で同じ値で2R値の細胞について、したがってまたフォールバック細胞について。これには、フォールバックセルを準備およびクリーンアップして、値ブランチとフォールバックブランチの両方で確実に0に戻す必要があります。

外側のループの終わり

ムーブメント <×Hは、調整フェーズの終わりに、テープポインターがアクティブセルの左側にH移動することを表します。

停止カウンターの値cell v h 以外のすべてのアクティブセル場合、これは無関係なセルであるため、奇数でゼロ以外であり、外側のループは別の繰り返しを続けます。v(h)

以下のためにv(h)、ポインタではなく、その対応する代替セル上に配置されるu(h)我々はそれがゼロに保つために、上記の例外を作っているため、プログラムは終了最終的な貫通]と停止します。


12

2組のブラケットを使用してこれを行うことが不可能であることは100%確信できません。ただし、BFテープのセルが無制限の値を許可する場合、3組のブラケットで十分です。(簡単にするために、テープヘッドを開始点を超えて左に移動できると仮定しますが、この構造はテープの限られた領域のみを使用するため>、以下の構成では、Artinの推測を想定する必要があります。、任意の大きなプログラムをコンパイルできるます。ただし、Artinの推測が誤っている場合でも、以下の構造を使用してチューリング完全言語のインタープリターをBFに変換することにより、チューリング完全性を間接的に示すことが可能です。

無制限のBFにコンパイルしているチューリング完全言語は、最も単純な既知の計算モデルの1つであるウォーターフォールモデルです。まだ知らない人のために、それはいくつかのカウンター(およびそれらの初期値)、およびカウンターのペアから整数への関数fれています。プログラムの実行は、すべてのカウンターから1を繰り返し減算し、カウンターxが0の場合、各カウンターyにf(x,y)を追加することで構成されますy(プログラムは、これが同時に複数のカウンターに起こらないように書かれています)。リンクの背後には、この言語のチューリング完全性の証明があります。一般性を失うことなく、すべてのカウンタが同じ自己リセット値を持っていると仮定します(つまり、f(x,x)はすべてのx同じです)。これは、特定のxについて、同じ定数を各f(x,y)もプログラムの動作は変わらないです。

してみましょうpカウンターの数です。一般性(アルティンの予想を仮定)を損なうことなく、と仮定p有する原始根 2のlet qでありp(1+s+s2)s 2よりも大きいの最小電力であるp。一般性を失うことなく、2q2p未満になります(2qは多項式で区切られ、2pは指数関数的に増加するため、十分に大きいpが機能します)。

テープの構成は以下の通りである:我々は整数で各カウンタに番号0i<p(一般性を失うことなく、我々は、単一の停止カウンタと番号ことがあることを前提と2)。ほとんどのカウンタの値は、テープセル2 qに格納されているカウンタ0を除き、テープセル2iに格納されています。セル-1から2 p + 1 + 2 p + 1までの奇数のテープセルごと2q2p+1+2p+1、そのテープセルは常に1を保持します。ただし、カウンターのすぐ左にある場合は、常に0を保持します。カウンターとして使用されていない偶数番号のテープセルには、無関係な値があります(0 ); また、指定された範囲外の奇数番号のテープセルにも無関係な値があります。テープを適切な初期状態に設定するには、有限個のテープ要素を初期化して定数値にする必要があることに注意してください。つまり、<>+-命令(実際に>+は必要なだけ)で行うことができます。この初期化の最後に、テープポインターをセル-1に移動します。

プログラムの一般的な形状は次のようになります。

初期化 [>>>[ >×(2p1) [ <×(2p) ]>-] 調整 <<<]

初期化により、テープが予想される形状になり、ポインターがセル-1に配置されます。これはカウンターの左側のセルではないため(0は2の累乗ではない)、値は1であり、ループに入ります。この最も外側のループのループ不変式は、テープポインターが(各ループの繰り返しの開始時と終了時)カウンターの左に3セルあることです。したがって、ループはカウンター2の左に3つのセルがある場合にのみ終了することがわかります(他の各カウンターには左に1つの3つのセルがあり、0を持っていると2つのカウンターのテープ位置が暗示されます) 2セル離れていました; 2だけ異なる2の2のべき乗は2122であり、qのバイナリ表現は0の文字列からの文字列に変化します1秒またはその逆は少なくとも4回であるため、2の累乗から1を離れることはできません。

2番目のループはカウンターを繰り返しループし、カウンターをデクリメントします。ループ不変式は、テープポインターが常にカウンターを指していることです。したがって、あるカウンタが0になるとループが終了し-ます。デクリメントはちょうどです。あるカウンターから次のカウンターに到達する方法はより複雑です。基本的な考え方は、移動することである2p1から右にスペースを2x奇数セル上で私たちを配置します2p+2x1(任意のカウンターの右にある、2p、最後のカウンターです2x1ため正でありx正です。モジュロ2p、この値は(フェルマーの小定理による)2x+1と一致します。最も内側のループを繰り返すことにより、左に移動する2p、テープ細胞モジュロの指数変化しない、スペース2p、最終的に細胞の一致を見つけなければならない2x+1モジュロ2pにセルされる値を有します(カウンターの左側)原始ルートの要件により、そのようなセルは1つだけです(2q1 pを法として1一致し2p、および2log2,p(r)+11は他のrの2r1一致します。ここで、log 2 ppを法とする2を底とする離散対数です。さらに、2 pを法とするテープポインターの位置は、中間ループを回るたびに2ずつ増加することがわかります。したがって、テープポインターは、すべてのpカウンター間で(2 pを法とする値の順序で)循環する必要があります。したがって、すべてのprlog2,pp2p2p2pp繰り返し、すべてのカウンターを減らします(必要に応じて)。ループが反復の途中で中断した場合、ループに再び入ったときに減少を再開します(最も外側のループの残りの部分はテープポインターの位置に最終的な変更を加えないため)。

f(x,y)f(x,y)yxxy

  • 100xyq10q このような遷移が少なくとも4つ含まれている場合、減算では2)しか削除できないため、2の2のべき乗のすべての違いとは異なります。これらの違いも明らかに異なります。

x=yf(x,y)

したがって、3組のブラケット、つまり3組を使用して、BFへのウォーターフォールモデルのプログラム(停止動作を含むが、チューリング完全性に必要ではないI / Oは含まない)の作業コンパイルができました。角括弧はチューリング完全性に十分です。


良くやった!TNBでこれに取り組んでいるようです!
MilkyWay90

sは少なくともp + 2である必要があると思います。s = p + 1の場合、qは2のべき乗よりも1少ない値です。
Ørjan Johansen

I think I found a much simpler (as in requiring no prime number theory) counter placement: 2p*2^i+2i.
Ørjan Johansen

@ØrjanJohansen: Right, I think I mentioned that construction in #esoteric (some time after I wrote this post)? All you actually need is a Golomb ruler for which each element is distinct modulo the number of elements, and there are various ways to construct those (although finding optimal ones is hard; the longest I've found (via brute force) is [0, 1, 3, 7, 20, 32, 42, 53, 58] for p=9).
ais523

ああ、あなたはそうしました(私の脳が数学モードになることを拒否したと言った直前に、私の言い訳があります:P)。k = 0で十分であることがわかったと思います。WikipediaのErdős-Turan_constructionは、要素の前半(残りの半分の繰り返し(mod p))を使用する場合、多項式成長(およびおそらくO()-最適?)を与えると思います。
Ørjanヨハンセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.