基本機能を取り込む命令型プログラミング言語に対する簡単な制限はありますか?


8

whileプログラムの言語は、計算可能に列挙可能な関数を表現できます。(これは、変数に対する算術演算が、たとえば、インクリメントとデクリメントだけであっても当てはまります。)

場合whileによって交換されfor、常に囲まれたループを作り、言語は、唯一の原始再帰関数を表現することができます。

私は最近、基本関数のクラスに気づきました。これは、プリミティブな再帰関数の下に厳密にありますが、厳密には指数階層の上にあります。

明らかに、基本的な関数を正確にキャプチャする命令型プログラミング言語を定義することは可能です。しかし、私の質問は、

基本的な関数に限定しwhile、単純な(while-> for)プリミティブな再帰関数への制約として説明できるプログラムの言語に構文上の変更はありますか?

forもちろん、プログラムの制限でも十分です。おそらく、私が絶対に単純に述べたもの、余分な演算子の追加などを必要としない同等の単純さを持つものを探しているのではないことを明確にする必要があります。

編集:代表的なfor言語の例は、Brainerd and Landweberの "Theory of Computation"(1974)のPL- {GOTO}です。この場合、各プログラムには有限数の無制限の変数があり、それぞれに自然数を含めることができます。これは基本的に次のコマンドで構成されています。

  • X <- 0 (変数に0を割り当てます)
  • X <- Y(の値をYに割り当てますX
  • X <- Y + 1(の値の後続をYtoに割り当てますX
  • LOOP X; ... END;(含まれているコードブロックを繰り返しXます。変更しませんX

著者は、これが原始的な再帰関数を正確に表現できるという証拠を示しています。PL はのGOTO代わりに使用するため、言語PLは質問と完全には一致しませんwhile。PL-{GOTO}はPLから削除GOTOすることによりPLから派生します。ただし、PLプログラムはプログラムと同じくらい強力whileであり、このGOTO除去変換は単にで置き換えるのwhileと同じくらい簡単に述べられていforます。(おそらく、おそらくさらに簡単です。)

編集2http : //en.wikipedia.org/wiki/Total_Turing_machineは、この結果が「マイヤー、AR、リッチー、DM(1967)、ループプログラムの複雑さ、Proc。ACM全国会議の465、


あなたの言語には配列がありますか?おそらく自然数を保持する変数とブール値のみです。とにかく、原始的な再帰関数はforループに対応しているといつも思っていましたが、その証拠は見たことがありません。ありますか?
Andrej Bauer

@AndrejBauer:コピーは今のところありませんが、BrainerdとLandweberが彼らの教科書Theory of Computation(1974)で証拠を示していると思います。彼らはおもちゃの言語であるPLを示しています。PLはLOOP(私が呼んだものfor)との両方を持ち、GOTOチューリング完全ですが、GOTOそれがないとpr関数しか表現できません。質問を編集して、この言語の簡単な説明を含めます。
Chris Pressey

Janの回答に続き、これは役に立ちます:en.wikipedia.org/wiki/Grzegorczyk_hierarchy
usul

回答:


8

Meyer and Ritchie(質問で引用した論文で言及)の古典的な結果によると、基本関数はforループの入れ子の深さが最大2に制限されているLOOPプログラムによって特徴付けられます。


3
ありがとうございました。usulのフォローアップのフォローアップ、n > = 2の場合、ネストの深さがnの LOOPプログラムは、Grzegorczyk階層の_n_ + 1番目のセットに対応します。
Chris Pressey

1

純粋に定義に基づいて私の推測:1つの答えは「恥ずかしいほど並列な forループへのループの制限」かもしれません。

私の「厄介な並列forループ」の実際の定義は、反復が他の反復にデータ依存性がなく、出力を(基本ケースとともに)集約するためのバイナリレデューサー関数がある定義です。レデューサー関数が結合的である場合、ボーナスの当惑はポイントになりますが、その区別が言語の能力を制限するかどうかはわかりません。

許容されるレデューサーを加算と乗算に制限すると、これらの制限の下で実装されたプログラムはすべて、基本的な再帰関数として記述できます(逆も同様)。より一般的なレジューサーについてはよくわかりません。

つまり、おもしろい方法は、あなたの言語の唯一のループ構造はMapReduceであるということです。

私はその分野の専門家ではありませんが、これを仮説として提案し、人々の意見を見てみたいと思います。

O22k

これはfor、レデューサー関数が加算または乗算に制限されている場合、並列プログラムには明らかに当てはまりますが、より幅広いレデューサーの選択には当てはまらないようです。多項式時間で実行するようにレデューサーを制限するときはいつでも基本関数を取得できることを見つけたいと思います(このモデルでは乗算は線形です)が、それを試してみる必要があります。

編集2。そうです、基本的な再帰関数を回復するために、多項式時間で実行されるレデューサー関数を正確に許可する必要があるようです。[1] 次に、この制限はそれほど興味深いものではないことに気づきます。このモデルの多項式関数は、単一forループまたはfor非ループのレデューサー関数を持つ並列ループを持つプログラムで表現できるものに過ぎないからです。したがって、基本的にはプログラムに2つまでのネストされたforループがあるという制限を回復しましたが、その制限をreducer関数に移動しました。

概要:多項式時間で実行されるレデューサーの特性評価は正しいようです。これがまったく興味深いかどうかは不明です。

Okkfor22

forffO22

pforpfpfpfバツバツkOfkf22f2

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