普遍的な再帰関数の短い明示的な構成はありますか?私が見たすべての定義は、何らかの方法でチューリングマシンの番号付けを含んでいます。これは可能ですが、より高いレベルのプログラミング言語(Python、Haskellなど)で書くことは困難で管理しにくいようです。
普遍的な再帰関数の短い明示的な構成はありますか?私が見たすべての定義は、何らかの方法でチューリングマシンの番号付けを含んでいます。これは可能ですが、より高いレベルのプログラミング言語(Python、Haskellなど)で書くことは困難で管理しにくいようです。
回答:
どの程度マッカーシーのオリジナルのLispインタプリタ(元々ここ)?それは普遍的で、自然なエンコーディング(Lisp AST)で動作し、外部インタープリターに依存せず、約20行です。
承知しました。Godelのプリミティブな再帰関数をそれぞれ計算するルーチンを記述し、無制限の検索演算子のルーチンを記述します。この方法で計算できる関数のセットは、チューリングマシンが計算できる関数のセットと同等です。詳細はこちら。
不利な点は、これらの単純な操作の観点から、ユニバーサルプログラムへの入力をフレーム化する必要があることです。もちろん、それがコンパイラーの目的です。
ユニバーサル関数u
は、Haskellのような言語(副作用なし、高次関数)で非常に簡単に記述できます。
u f x = f x
この関数はu
、プログラム(の説明)受け入れるため普遍的でありf
、入力テープをx
、そしてあなたに実行した結果告げるf
のをx
。
この答えは完全に深刻なわけではありませんが、Haskellのような言語のコンパイラまたはインタープリタには、ユニバーサル関数に必要なすべての構築部分がすでに含まれていることを示しています。この話の教訓は、チューリングマシンの観点からユニバーサル関数を実装することを心配するよりも、コンパイラーとインタープリターがどのように機能するかを研究することに時間を費やすほうがよいということです。
u
関数を取ります-私はそれを高階関数と呼びます。私が欲しいu
の整数、または定期的な代数的データ型を取ります。への引数が具体的である限り、私は特定の計算モデルを強制しません。u
たとえば、文字列との間でシリアル化できます。
u
、有限のバイトシーケンスであるクロージャーを受け取ります。通常のutmの定理でさえ、u
取る整数は関数を表します。