Brainfuckで少しコードを書こうとしていますが、いくつかの問題に遭遇しました。
私はそれを理解しているので、Brainfuckがどのようにチューリング完全であるかと思いました。チューリング完全とは、言語またはマシンが任意の関数を計算できることを意味します。
どうして私が疑問に思ったのは、私は数字の符号を見つける方法を見つけることができなかったか、または思いつくことができなかったことです。 signum関数は関数であり、チューリング完全マシンはすべての関数を計算できるため、Brainfuckはどのようにチューリング完全になることができますか?
私が探している答えは、自分の発言が正しいか正しくないかの説明か、数値の符号を計算できるアルゴリズムのどちらかです。
Brainfuckの「メモリセル」に最小値と最大値*があると仮定して、2つのセルに数値を入力し、一方をインクリメントし続け、一方がゼロになるまで他方をデクリメントし続けます。あなたのサインアルゴリズムがあります。
一般的な質問です。 「チューリングコンプリートマシンはすべての関数を計算できる」というのは、「関数」が曖昧すぎるため、最初に定義するのは適切ではありません。これにより、WebサーバーやWebブラウザーを記述できないためBrainfuckが完全なTuringではない、またはマルチスレッドプログラムを記述できない(非標準拡張)。
チューリングの完全性を正式に証明する方法を学ぶことは、計算理論の教科書から最もよく学んだことです。ただし、実際に使用できるヒューリスティックには、次のようなものがあります。
Brainfuckはこれらの基準をすべて満たしています。ほとんどのBrainfuckの実装は間違いなくメモリの基準を満たしていませんが、現実の世界ではコンピュータのメモリは常に有限であるため、この議論はすべてのプログラミング言語に当てはまります。
*技術的には、 非公式のBrainfuck標準 は「bignum」実装を可能にし、bignum以外の実装の1つのメモリセルに収まらない数値を入力する可能性も無視しています。しかし、私は今のところ、それらの問題を自分でオタクスナイプしないことに決めました。私たちが本当に望めば、それらは解決できると確信しています。