Curry-Howard Correspondenceが非常に広く普及していることを考えると、証明とプログラムの間(または命題とタイプの間)に違いはありますか?それらを本当に識別できますか?
Curry-Howard Correspondenceが非常に広く普及していることを考えると、証明とプログラムの間(または命題とタイプの間)に違いはありますか?それらを本当に識別できますか?
回答:
人々が日々使用しているプログラミング言語は、カリー-ハワード通信にはあまり適していません。なぜなら、それらの型システムはあまりにも弱いからです。命令型プログラムにCurry-Howardを使用して面白いことを言うには、より洗練された型システムが必要です。本「Proofs-as-programs」は、命令型プログラムの合成を目的としてこの角度を押し進めています。確かに研究機能言語(Agda、Epigram)で依存型がますます普及するにつれて、区別は曖昧になりつつあります。もちろん、Cory -Howardに基づいているCoq定理証明器(およびおそらく他のもの)内でプログラム合成/抽出を行うことができます。
Curry-Howardの通信は、プルーフがプログラムにそれほど明確に対応していない(または、誰も実行しないプログラムではない)状況でも使用できます。この一例は、Proof-carrying authorizationにあります。命題は、誰が何をする権限を与えられているかについての声明に対応しています。証明は、命題が保持されているという必要な証拠を提供するため、承認要求が許可されます。証明をエンコードするために、証明用語が導入されます(Curry-Howard経由)。証明要求は、承認要求の有効性の証明として当事者間で送信されますが、プログラムとは見なされません。
Coqには2つのタイプ(PropとSet)があり、プログラマーは実際のコードを生成しない証明と、実行中のコード(プログラム)を抽出するために使用される証明の一部を分離するために使用します。
それは、あなたが尋ねる問題、マシンコード(プログラム)を生成することを意味するもの、命題(または型)の証明を完成させるために存在するものを識別する方法に対する素晴らしい解決策です。
知る限り、両方を自動的に区別する方法はありません。これは研究にとって興味深いものでしょうか?それとも、誰かがそれが明らかに不可能であることを指摘することができますか?
依存型では、証明とプログラムが明確に区別されないだけでなく、プログラムと型が区別されません!唯一の違いは、タイプ(またはプログラム)が表示される場所であり、特定の用語の「プログラム」の場所または「タイプ」の場所の一部になります。
例はそれをより明確にすることを願っています:
依存型でアイデンティティ関数を使用する場合、関数で使用する型を渡す必要があります!タイプは、「プログラム」の値として使用されています!
型なしラムダ計算:
依存型の場合:
id:(A:セット)-> A-> A
この関数を使用している場合は、次の例のように実行します。
id Naturals 1
値として渡される「タイプ」(この場合は自然のセット)は破棄されるため、計算されることはありませんが、用語の「プログラム」部分に含まれていることに注意してください。それは、「証明」部分でも起こることです。それらは、用語を型チェックするために存在する必要がありますが、計算中に捨てられます。
私はここで手足を外に出して、少し目を細めたいなら、証拠とプログラムの終了を特定できると言います。
終了プログラムは、入力を取得して出力を生成できることの証明です。これは、非常に基本的な含意の証明です。
もちろん、この含意に自明なことを述べるよりも意味のある情報を伝えるには、論理的な意味を持つクラスから描画された入力のすべてのインスタンスに対してプログラムが機能することを示すことができる必要があります。(出力についても同様です。)
他の方向から見ると、有限の推論ステップを持つ証明は、何らかの論理システム内のオブジェクトを操作する記号プログラムです。(論理記号と規則が計算上意味することについてあまり心配しない場合。)
これはかなり単純ですが、アイデアの堅牢性を示唆していると思います。(たとえ一部の人がそれを好きにならないとしても;;)
関係ない証拠?
プログラムを作成するとき、そのパフォーマンス、メモリ消費などに興味があります。
たとえば、バブルソートではなく、実装が同じタイプである場合でも(依存するタイプの設定であっても)賢いソートアルゴリズムを使用する方がよいでしょう。
しかし、ある定理を証明するとき、それはあなたが興味を持っている証拠の存在にすぎません。
もちろん、審美的な観点から、いくつかの証明は、よりシンプル/美しい/感動的です/など(The Bookの証明など)。
カリーとハワードのやり取りを受け入れた場合、その質問は主に哲学的なものです。「証明とプログラムは違いますか?もちろんです。どうしますか?さて、証明を「証明」と呼び、プログラムを「プログラム」と呼びます。」
簡単に言うと、証明とプログラムの間に同型性がある場合(明らかにそうであるように見えます)、あなたの質問は、2つを区別できるオラクルがあるかどうかを尋ねることです。人間はそれらを(大部分が)異なるものとして分類するので、そのような神託が存在することは確かに議論の余地があります。重要な問題は、それらの間に意味のある違いがあるかどうかになります。それは哲学的な議論に任されています。「証明」とは何ですか?証拠を構成するものの正式な定義はありません。これは芸術の用語であり、教会とチューリングの論文で「効果的に計算可能」という概念によく似ています。さらに言えば、「プログラム」にも正式な定義はありません。
これらは、数学的調査のさまざまな分野を分類するために使用される自然言語の単語です。カリーとハワードが観察したのは、実際には同じことを研究しているこれらの2つの異なる分野です。これらの異なる研究者が互いに話し合うべきだと言っているため、この接続に気付くことが重要です。しかし、別のレベルでは、接続に気付くのはそれらの違いを信じることです。問題に取り組む場合、プログラミングの問題と考える方が有益な場合もあれば、論理的な問題と考える方が有益な場合もあります。視点のこの違いは、それらの間の重要な違いだと思います。しかし、遠近法の違いがアイデンティティの違いを構成するかどうかは、少なくともフレーゲのものと同じくらい深く探求されてきた深い哲学的問題ですユーバーシンウンベデトゥング。