効率的な計算のためのプログラミング言語


32

すべての入力で停止し、他の入力で停止するすべてのマシンを許可するプログラミング言語を記述することは不可能です。ただし、このようなプログラミング言語を標準の複雑度クラスに簡単に定義できるようです。特に、すべての効率的な計算と効率的な計算のみを表現できる言語を定義できます。

たとえば、ようなものの場合、お気に入りのプログラミング言語を使用し、プログラムを記述した後(Turing Machine対応)、ヘッダーに3つの値を追加します:整数、整数、およびデフォルト出力。プログラムがコンパイルされると、出力チューリングマシン入力与えられたのサイズの実行上のためのステップ。ステップが開始する前にが停止しない場合、デフォルトの出力出力しますM c k d M x n M x c n k M c n k d PPMckdMxnMxcnkMcnkd。誤解がない限り、このプログラミング言語を使用すると、すべての計算を表現できます。ただし、この提案された言語は本質的に興味のないものです。P

私の質問:計算可能な関数(すべての効率的に計算可能な関数など)のサブセットを非自明な方法でキャプチャするプログラミング言語はありますか?ない場合、これには理由がありますか?


7
計算可能な関数のサブセットをキャプチャするプログラミング言語のいくつかの簡単な例:正規表現と文脈自由文法。
ユッカスオメラ

2
実際、ような複雑度クラスをキャプチャする言語(再帰を有界再帰で置き換えたプリミティブな再帰関数と同様の方法で定義されます)は、非常に興味深いものです(少なくとも理論的な観点から)。:)P VPPV
カベ

線形および整数プログラミングは、計算可能な関数の興味深いサブセットをキャプチャします。
ディエゴデエストラダ

データログは多項式時間アルゴリズムのみを表現できますが、すべての多項式時間アルゴリズムを表現できるかどうかはわかりません。
ジュール

よく知られている論文「Total functional programming」は、決定不可能な停止問題を持たないプログラミング言語が実際に実用的で有用であると主張しています。jucs.org/jucs_10_7/total_functional_programming
なし

回答:


32

多項式時間の計算のみを表現しようとする1つの言語は、ソフトラムダ計算です。型システムは線形論理に根ざしています。最近の論文では、多項式時間計算に取り組んでおり、このアプローチに基づいた最近の開発の概要を示しています。マーティン・ホフマンはかなり長い間このテーマに取り組んできました。関連する論文の古いリストはこちらにあります。彼の論文の多くはこの方向に続いています。

他の作業では、依存型または型付きアセンブリ言語を使用して、プログラムが特定の量のリソースを使用していることを確認するアプローチを取ります。

さらに他のアプローチは、アンビエント計算の変形など、リソースに制限された形式計算に基づいています。

これらのアプローチには、適切に型付けされたプログラムが事前に指定されたリソースの境界を満たすという特性があります。リソースバウンドは時間またはスペースであり、通常は入力のサイズに依存します。

この分野での初期の仕事は、計算を強く正規化することです。つまり、すべての適切に型付けされたプログラムは停止します。システムF(別名多相ラムダ計算)は強く正規化されています。固定小数点演算子はありませんが、それでも非常に表現力がありますが、どの複雑度クラスに対応するかはわからないと思います。定義上、強く正規化された計算は、何らかの終了計算のクラスを表します。

プログラミング言語チャリティは、すべての入力で停止する非常に表現力豊かな関数型言語です。どの複雑なクラスを表現できるかわかりませんが、Ackermann関数はCharityで記述できます。


ここで「少なくとも」とはどういう意味ですか?
nponeccop

ここでの「少なくとも」とは「一部」を意味します。答えをもう少し正確にするために変更します。
デイブクラーク

システムFで定義可能な関数の複雑さは、入力の「証明可能な2次算術の全関数」で時間内に終了する関数のクラスであると確信しています。あまり従来の複雑性クラスが、それでも...
コーディ

cody:ワドラーの「無料の定理」によれば、システムFは「2次のペアノ算術で合計で証明できるすべての再帰関数」と「[...]アッカーマン関数を含む」を表現できます。それがあなたが説明しているのと同じかどうかはわかりません。チャリティの主な機能はcodataのサポートです。一方、Agdaの終了チェックでは、終了を保証しながらCoqとSystem Fの両方よりも表現力が高いと思います。
ブレイザーブレード


8

また、暗示的な複雑性理論をこれへのアプローチとして言及したいと思います。それは、いくつかのやや関連する質問で出てくるのを見たからです。Neel Krishnaswamiによるこの回答を引用するには:

基本的な手法は、複雑度クラスを線形論理のサブシステム(いわゆる「軽い線形論理」)に関連付け、論理システムのカット除去を特定の複雑度クラス(LOGSPACE、 PTIMEなど)。次に、Curry-Howardを介して、指定されたクラスのプログラムを正確に表現できるプログラミング言語を取得します。


5

誰も原始再帰について言及していないことに驚いています。制限されたループに制限することにより(つまり、ループを開始する前に各ループの反復回数を計算する必要があります)、結果のプログラムはプリミティブな再帰的であり、したがって合計です。Douglas Hofstadterは、すべてのプリミティブな再帰関数のみを許可するプログラミング言語BLOOPを提案しました。


1
それはすべての関数の適切なサブクラスですが、それを「効率的な」関数のクラスと呼ぶのは少しストレッチかもしれません。
ラファエル

PP

他の人は、ある意味で「原始再帰」のみをサポートするSystem Fおよび他の強く正規化する言語に言及しました。ただし、ファーストクラスの関数をサポートしているため、より多くのプログラム(アッカーマン関数など)を作成できます。
ブレイザーブレード

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.