web-dev-qa-db-ja.com

どのように脳性交は完全に調教されています

Brainfuckで少しコードを書こうとしていますが、いくつかの問題に遭遇しました。

私はそれを理解しているので、Brainfuckがどのようにチューリング完全であるかと思いました。チューリング完全とは、言語またはマシンが任意の関数を計算できることを意味します。

どうして私が疑問に思ったのは、私は数字の符号を見つける方法を見つけることができなかったか、または思いつくことができなかったことです。 signum関数は関数であり、チューリング完全マシンはすべての関数を計算できるため、Brainfuckはどのようにチューリング完全になることができますか?

私が探している答えは、自分の発言が正しいか正しくないかの説明か、数値の符号を計算できるアルゴリズムのどちらかです。

8
S.Klumpers

Brainfuckの「メモリセル」に最小値と最大値*があると仮定して、2つのセルに数値を入力し、一方をインクリメントし続け、一方がゼロになるまで他方をデクリメントし続けます。あなたのサインアルゴリズムがあります。

一般的な質問です。 「チューリングコンプリートマシンはすべての関数を計算できる」というのは、「関数」が曖昧すぎるため、最初に定義するのは適切ではありません。これにより、WebサーバーやWebブラウザーを記述できないためBrainfuckが完全なTuringではない、またはマルチスレッドプログラムを記述できない(非標準拡張)。

チューリングの完全性を正式に証明する方法を学ぶことは、計算理論の教科書から最もよく学んだことです。ただし、実際に使用できるヒューリスティックには、次のようなものがあります。

  • 条件付き分岐は、どのチューリング完全言語でも可能です。
  • 無限に多くの反復または任意に多くの有限の反復を実行するループは、どのチューリング完全言語でも可能です。
  • 任意のチューリング完全言語を使用して、無限メモリまたは任意の大量のメモリを必要とするプログラムを作成できます。
  • すべてのチューリング完全言語は、プログラムの少なくともある種の入出力をサポートしています。
  • 停止の問題は、チューリング完全言語では解決できません。言い換えれば、他のプログラムを見て、無限ループに入ることができるかどうかを確実に伝えることができるプログラムを書くことは不可能です。

Brainfuckはこれらの基準をすべて満たしています。ほとんどのBrainfuckの実装は間違いなくメモリの基準を満たしていませんが、現実の世界ではコンピュータのメモリは常に有限であるため、この議論はすべてのプログラミング言語に当てはまります。


*技術的には、 非公式のBrainfuck標準 は「bignum」実装を可能にし、bignum以外の実装の1つのメモリセルに収まらない数値を入力する可能性も無視しています。しかし、私は今のところ、それらの問題を自分でオタクスナイプしないことに決めました。私たちが本当に望めば、それらは解決できると確信しています。

12
Ixrec