正規関数を使用したプログラミング言語


29

すべての関数が標準的な形式を持つ(関数型の)プログラミング言語はありますか?つまり、すべての入力セットに対して同じ値を返す2つの関数はすべて同じ方法で表されます。たとえば、f(x)がx + 1を返し、g(x)がx + 2を返した場合、f(f(x ))およびg(x)は、プログラムのコンパイル時に区別できない実行可能ファイルを生成します。

おそらくもっと重要なのは、プログラムの正規表現に関する詳細情報をどこで/どのように見つけることができるかということです(グーグルの「正規表現プログラム」は実りが少ないです)質問するのは自然な質問のように思えますが、探しているものの適切な用語がわからないのではないかと心配しています。そのような言語をチューリング完全にすることが可能かどうか、そうでなければ、そのような特性を保持しながらプログラミング言語をどれだけ表現できるかについて興味があります。

私の背景はかなり限られているため、前提条件の少ないソースを好むでしょうが、より高度なソースへの参照もクールかもしれません。

回答:


38

これが可能な範囲は、実際にはラムダ計算の理論における主要な未解決の問題です。既知のものの簡単な要約を以下に示します。

  • ユニット、製品、および関数空間を備えた単純に型付けされたラムダ計算には、単純な標準形式プロパティがあります。2つの項が等しいのは、それらが同じベータ正規、イータ長​​形式である場合のみです。これらの標準形の計算も非常に簡単です。

  • 合計タイプを追加すると、問題が大幅に複雑になります。等式の問題は依然として決定可能です(検索するキーワードは「共積等式」です)が、既知のアルゴリズムは非常に扱いにくい理由で機能し、私の知る限り、完全に満足できる正規形定理はありません。私が知っている4つのアプローチは次のとおりです。

  • 自然数などの無制限の型を追加すると、問題を決定できなくなります。基本的に、ヒルベルトの10番目の問題をエンコードできるようになりました。

  • 再帰を追加すると、問題が決定不能になります。通常の形式を使用すると、平等が決定可能になり、停止問題を解決できるためです。


このホワイトペーパーでは、余積との等価性を和との等価性に拡張しますが、「単一」の正規形式構文はありません。比較する2つの用語に偽と証明されるサブタームがある場合に検出するのに十分な「飽和関数」を選択します。Ahmed-Licata-Harperに最も似ているのは、どちらもフォーカシングを使用していることです。
マックスニュー

ユニット、製品、および関数のみで、書き留めることができるもののカーディナリティは1です。一方、合計を追加すると、突然多くの異なるカーディナリティが得られます(そして「有用な計算」ができます)。これらの事実は関係していますか?
glaebhoerl

1
@glaebhoerl:事実が関連していないとは言いたくないのですが、この場合、明らかなつながりは見られません。基本型を(イントロまたはelim-formsなしで)言語に追加した場合、私が述べた結果のほとんどは保持されますが、(a)であるため、注意するカーディナリティの事実を壊しますおよびは異なる正規形ですが、(b)は私が知っているどのアルゴリズムにも影響しません。bλx:b.λy:b.xλx:b.λy:b.y
ニール・クリシュナスワミ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.