プログラミング言語の基礎として一般的な再帰関数を使用していますか?


23

これはナイーブであり、したがって、おそらく不正な形式の質問なので、事前に謝罪します!

私の見解では、チューリングマシンは手続き型/命令型プログラミング言語の計算基盤と見なすことができます。同様に、ラムダ計算は関数型プログラミング言語の基盤です。

私は最近、チャーチ・チューリング・テーゼが計算の第3のモデルである一般的な再帰関数と相互等価性を示していることを学びました。これを計算のモデルとして使用するプログラミング言語はありますか?そうでない場合、技術的な理由があります。すなわち、「誰もまだ試していません」以外に?


1
チューリングマシンまたは汎用レジスタマシンは、プロセッサPL(アセンブリPL)の基礎と言えます。機能はありません。再帰関数は命令型PLの基礎です。高階関数はありません。μ
ベロア

1
また、1次論理とPrologを調べることをお勧めします。
ベロア

1
C ++ 11より前constexprは、コンパイラーがコンパイル時に計算を実行するために「テンプレート」を使用できました。テンプレートの制限によりループは許可されませんが、再帰を使用して任意のループをエミュレートできます。そのため、C ++言語標準の一部としてチューリング完全(メタプログラミング)機能になります。例:stackoverflow.com/questions / 189172 / c-templates-turing-complete
JimmyB

回答:


45

質問への直接的な答え:はい、再帰関数に基づく難解で非実用的なPLがありますが(ホワイトスペースを考えてください)、有効な理由によりμ-再帰関数に基づく実用的なプログラミング言語はありません。μμ

一般的な再帰(すなわち再帰)関数は、ラムダ計算よりも表現力が著しく劣ります。このように、彼らは、プログラミング言語のための貧弱な基盤を作ります。また、TMが命令型PLの基礎であるということも正しくありません。実際、優れた命令型プログラミング言語は、チューリングマシンよりもλ計算にはるかに近いです。μλ

計算可能性に関しては、再帰関数、チューリングマシン、および型なしλ-計算はすべて同等です。ただし、型なしLCには、他の2つのLCにはない優れた特性があります。非常にシンプルで(3つの構文形式と2つの計算ルールのみ)、構成が非常によく、プログラミングの構成要素を比較的簡単に表現できます。また、(例えば、システムの単純型システムを搭載したFがωで拡張fはiはxは)、λが正しくと組成、容易に多くの複雑なプログラミングコンストラクトを発現することができるという点で-calculusは非常に表現することができます。また、拡張することができλをμλFωfixλλ-ラムダではない構造を簡単に含めるための計算。上記の他の計算モデルでは、これらの優れた特性は提供されていません。

チューリングマシンは構成的でも汎用的でもありません(問題ごとにTMが必要です)。「関数」、「変数」、または「構成」の概念はありません。また、TMが命令型PLの基礎であることも正確ではありません。FWIW、命令型PLは、チューリングマシンよりも制御演算子を使用したラムダ計算にはるかに近いです。詳細な説明については、ピーターJ.ランディンの「ALGOL 60と教会のラムダ表記の対応」を参照してください。Brainf ** k(実際にはかなり単純なチューリングマシンを実装しています)でプログラミングしている場合、チューリングマシンはプログラミングには適していません。

再帰関数は、この点でTMに似ています。それらは組成的ですが、LCほど組成的ではありません。また、 μ再帰関数で有用なプログラミング構造をエンコードすることもできません。さらに、 μ再帰関数は Nに対してのみ計算し、他のすべてに対して計算するには、何らかのゲーデル番号付けを使用してデータを自然数にエンコードする必要がありますが、これは苦痛です。μμμN

したがって、ほとんどのプログラミング言語が計算に基づいているのは偶然ではありません!λ表現、compositionalityや拡張性、他のシステムが欠けていること:-calculusは、良好な特性を持っています。しかし、チューリングマシンは計算の複雑さを研究するための優れている、とμ -recursive機能は、計算可能性の論理的な概念を学ぶのに適しています。どちらもλ -calculusにはない優れた特性を持っていますが、プログラミングの分野ではλ -calculusが明らかに勝っています。λλμλλ

実際、チューリングの完全なシステムは数多くありますが、優れた特性はまったくありません。ConwayのGame of Life、LaTeXマクロ、さらには(一部の主張)DNAはすべてチューリング完全ですが、Conwayを使用したプログラム(つまり、本格的なプログラミングを行う)はありません。それらは単に良い特性を欠いています。チューリング自体は、プログラミングに関してはほとんど無意味です。

また、多くの非チューリング完全計算システムは、プログラミングに関して非常に役立ちます。正規表現とyaccはチューリング完全ではありませんが、特定のクラスの問題を解決する上で非常に強力です。Coqもチューリング完全ではありませんが、信じられないほど強力です(実際、チューリング完全な従兄弟であるOCamlよりもはるかに表現力があると考えられています)。プログラミングに関しては、多くの(近くの)役に立たないシステムが面白くチューリング完全であるため、チューリング完全性は重要ではありません。Brainf ** kやWhitespaceがCoqよりも強力なプログラミング言語であると主張するつもりはありませんか?表現力の基盤は強力なプログラミング言語の鍵である、と現代のプログラミング言語は、ほとんど常に基づいている理由ですλ-計算。


7
「コンウェイと誰もプログラムは」...いくつかは行わないライフゲームでテトリスの作業ゲームを構築するも、確かにそれは:)空白のように実用的です...
アレクセイLevenkov

これを見るための一つの方法は、そのマシンをチューリングシミュレートはおそらくシミュレートチューリングマシンよりもはるかに短いであろうと-calculus機能λ -calculus(私はどちらか見てきていないということ)。λλ
非コンテキストスペル

@AlexeiLevenkovそれは全く真実ではありません。空白は、奇妙な構文ではありますが、本質的に(単純な)命令型言語です。それはのための施設がある算術、基本的な制御フロー、スタックとヒープの操作、およびI / Oを。一方、QFTプロジェクトでは、OTCA Metapixelsを使用してエミュレートされたWireworldのようなセルラーオートマトン内に構築されたCPU用に作成されたRISCアセンブリに至るまで、非常に単純な言語からコンパイラを設計する必要がありました。
非コンテキストスペル

@AlexeiLevenkov究極のCogol→CGoLコンパイラーは4年以上にわたって多くの人々の作業を必要としましたが、HaPyLiと呼ばれるプロジェクトが存在します。
非コンテキストスペル

4

µ-recursive function programming languageGoogleで入力すると、このGitHubリポジトリに移動したので、質問に対する答えは次のとおりです。

はい、近視と呼ばれています

ちなみに、Haskellで書かれています。


μ

2
もちろん。私はOPが理論や何かを研究するためにそのような言語を見つけたいと思っただけで、実際に世界を征服するのではなく;-)
Kapol
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.