動機: 関数の代わりに自然数を使用することで、一次関数のない言語でおもちゃの関数型プログラミングを使用できるようにしたいと考えています。
ユニバーサル関数は関数 f : N -> (N -> N) であり、同等に f : N * N -> N であり、可能なすべての計算可能な関数を列挙します。つまり、f(k) が 2 乗関数であるような数 k があり、f(j) が n 番目の素数関数であるような数 j があるということです。
このような関数を作成するには、任意のチューリング完全言語 (プログラミング言語コンパイラ、ラムダ計算、チューリング マシンなど) を使用して、すべてのプログラムを列挙します。評価だけでなく、足し算、合成、カリー化などの関数の操作もできるようにしたいです。たとえば、2 つの関数 f,g のインデックスが与えられた場合、関数 f+g、または g で合成された f のインデックスは何かを知りたいです。これにより、「おもちゃの関数型プログラミング」が可能になります。
そのようなコード ライブラリを作成する良い方法は何ですか? 私は、10 の階乗を計算するのに苦労する最小限のチューリング ターピットを探しているわけでも、高度なコンパイラを書きたいわけでもありません。追加やループを書く可能性など、いくつかの基本的な機能が必要ですが、それ以上ではありません。
すべての高級言語でのソリューションを歓迎します。疑似コード、Haskell、および Python が推奨されます。任意精度の演算を想定できます。使用eval
または類似のものは許可されていません。
明確化: 列挙型関数は、すべての部分再帰 (計算可能な)関数で構成されます。これには、一部の入力で停止しない関数が含まれます。その場合、ユニバーサル関数はハングします。もちろんこれは避けられません。参照: m-再帰関数 - http://en.wikipedia.org/wiki/Μ-recursive_function。