特定の計算可能な関数を型付きの用語で表すことができない理由に関する簡単な説明?


8

「Lambda Calculusの紹介」という論文を読んで、34ページ(私の斜体)で、あまり理解していない段落に出くわしました。

2つのパラダイムのそれぞれの中に、型付きラムダ計算のいくつかのバージョンがあります。多くの重要なシステム、特に教会のシステムでは、タイプを持つ用語が常に正規形を持っている場合がそうです。停止の問題が解決できないことから、これはすべての計算可能な関数が型付きの用語で表現できるわけではないことを意味します。Barendregt(1990)、定理4.2.15を参照してください。表現できない計算可能な関数を見つけるためには、頭の上に立つ必要があるため、これは見かけほど悪くはありません。たとえば、2では、2次の型付きラムダ計算では、たまたま合計である部分的な再帰関数しか表現できませんが、数学的分析(2次の算術)ではそうではありません。

私はこれらの概念のほとんどに精通していますが、部分的な再帰関数の概念や、証明可能な完全な関数の概念には精通していません。しかし、これは私が学習に興味があるものではありません。

特定の計算可能な関数を型付きの用語で表すことができない理由、およびそのような関数が「頭の上に立って」しか見つからない理由についての簡単な説明を探しています。

回答:


9

正確な概念を学びたくない場合、ここに直感的な説明があります。以下の説明では、「関数」は常に自然数を自然数にマッピングする関数を指します(一部の引数では定義されていない可能性があります)。

あるプログラミング言語

  1. 計算可能な構文と評価のルール、および
  2. すべての実装合計計算機能を

必ず一部の部分関数を実装します。

これを確認するために、この言語で定義可能なすべての関数が合計であると仮定します。言語には計算可能な構文があるため、関数のすべての定義を列挙できます(すべての文字列を列挙し、構文エラーを引き起こすものを除外します)。評価のルールは計算可能であるため、2番目の仮定により、私たちの言語では-番目の定義可能な関数eval(n,m)を評価する合計関数を定義できると結論付けることができます(基本的に、これは言語自体で記述されたミニインタープリターです)。しかし、その後関数nm

λ k . (1 + eval(k,k))

定義可能なすべての関数とは異なる、定義可能な関数全体であり、矛盾します。

単純に型指定された -calculusは最初の条件を満たし、合計関数のみを定義します。したがって、2番目の条件を満たしていません。λ

「頭の上に立つ」ことに関しては、強く正規化する lambda-微積分の場合、微積分で定義できない合計関数、つまり正規化手順自体を提供するのはかなり簡単です。強く正規化する微積分がどれほど派手であるかはそれほど重要ではありません。多相 lambda-微積分、またはMartin-Lof型理論、または構造微積分が考えられます。(演習:正規化手順を実装できれば、上記を実装できます。)λλeval


2番目の説明文を解析できません。1と2のプログラミング言語は何を検証しますか?私はあなたがそのような言語は存在できないと言いたかったと思います...
cody

テキストをめちゃくちゃにしてしまいました。これで問題なく読めるはずです。
Andrej Bauer

かっこいい、これは考えなかった。この回答の背景については、こちらをご覧ください。
ラファエル

4

Merijnの回答は、質問の最初の部分を非常にうまく処理していることがわかりました。私は2番目の部分に答えようとします。なぜ、多形 -calculus で計算可能であるが表現できない関数を見つけるには、「1に立つ」必要があるのです。λ

興味のない概念の説明が必要だと思います。部分的な再帰関数はからまでの関数を表す -termです。A -term自然数の代表に適用に送られる場合にのみないではない通常の形態を有します。番号が送信されない場合、関数は合計であると言います。今の考え方は、論理理論が項λNN{}λtt Tt各合計関数の合計機能を表す、「盲点」が常に存在しているすべての入力に終わるが、文は、tt

t  終了する

で決定できません。上記のステートメントで証明可能な場合、で表される関数は証明可能な合計であると言えます。つまり、すべての合計の関数は、証明可能に合計されていないためゲーデル不完全性定理(の変形)の結果である。TTtTT

ここで重要なのは、私たちが具体的に書きたい大多数のプログラム(リストの並べ替え、グラフのトラバーサル、オペレーティングシステム)は、完全な関数であるだけでなく、Peano Arithmeticのような合理的な論理システムでは確かに完全であることです。

次に、多形性 -calculusについて説明します。この微積分でタイプできる項は、正確に二次ペアノ演算で合計であると思われる関数を表す項であることを示すことができます。2次ペアノ演算は、通常のペアノ演算よりもはるかに強力です。λ

これは、上記の説明から、完全ではあるが完全ではない用語があることを意味しますが、そのような関数はペアノ演算ではすでにまれであるため(そして2次理論では非常にまれであるため)、非常にまれです。したがって、「あなたの頭の上に立つ」声明。


2
理論条件、つまり一貫性が欠落しており、公理のセットが再帰的である場合、それ以外の場合、として、終了するすべてのについて、公理のセットに「終了」が含まれる理論をと見なすことができます。TTff
Andrej Bauer

Andrej、これらの精度に感謝します。より完全な説明は、おそらく私たちの理論に必要なこと、つまり理論が少なくとも終了することの意味を表現できることも詳述するでしょう(乗算を伴う算術で十分ですが、私はやや表現力豊かなシステムを好む傾向があります)。
cody

右、いくつかの技術的な条件が欠けていることを指摘するのは公平だと思うので、興味のある読者はそれらを調べてみることができます。
Andrej Bauer

3

簡潔に証明を書き留めるのは少し難しいと思いますが、この説明が、単純な型付きの用語がすべての型なしの用語を表すことができない理由を理解するのに十分な直感を提供することを願っています。

単純に型付けされたラムダ計算は強く正規化されています。毎β削減は私たちを通常の形に近づけます。機能f::αβγ タイプの値に適用されます α そうなる β型の関数に変換します。引数の数が有限であることを考えると、 -normal form に到達するために有限数の簡約ステップが必要であり、これ以上の簡約はありません。βγβ

これを、型指定されていないラムダ計算と対比します。より有名なUTLCコンビネーターの1つはコンビネーターです。Y

Y=λfλバツfバツバツλバツfバツバツ

コンビネータを削減しようとすると、次のことが起こります。Y

λfλバツfバツバツλバツfバツバツg
λバツgバツバツλバツgバツバツ
gλバツgバツバツλバツgバツバツ
ggλバツgバツバツλバツgバツバツ

渡す関数が何であれ、無限の削減のシーケンスで行き詰まります!STLCタイプをUTLCコンビネーターに固定しようとすると、STLC で必要とされるように関数アプリケーションがタイプを縮小しないため、これはすぐに不可能であることがわかります。 -combinator明確に(それが再帰、無限ループの概念を使用して、表す)、未だ全てSTLC項が強く正規化されているように、それは、STLCで表現できない計算可能です。YY


この議論は、すべての数論関数が -calculus 型で表現できるわけではないという事実とはほとんど関係がありません。これが問題です。コンビネーターは完全な関数とはどのような意味ですか?λY
Andrej Bauer

@AndrejBauer問題は、「特定の計算可能な関数を型付きの用語で表すことができない理由に関する簡単な説明を探しています」で終わります。私の答えはこれをカバーしないのですか? -combinatorは、単純に入力された用語で表現することができない計算機能の一例であり、私は私の説明は、それが単に入力された用語で表現することができない理由を説明するのに十分だったコヒーレント願っています。Y
Merijn、

さて、質問を単純に型付けされた -calculusで定義できない部分関数の例を要求するものとして解釈する場合、そのような関数はすべて実行されます(そして質問はナンセンスです)。たとえば、どこでも定義されていないもの。単純に型付けされた -calculusでも定義できません。質問は、私が読んだ総機能についてです。λλ
Andrej Bauer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.