証明とプログラムの違い(または命題と型の違い)は何ですか?


26

Curry-Howard Correspondenceが非常に広く普及していることを考えると、証明とプログラムの間(または命題とタイプの間)に違いはありますか?それらを本当に識別できますか?



opが希望する場合は、コメントで@ meを入力し、移行します。

2
ジョン・クロスリーはこのことについて論文を書き、最近どこかに投稿されたのを偶然見つけました。それは...推奨来た
TJエリス

1
@TJ Ellis、リンクに感謝しますが、短いスキムの後、論文はそのタイトルで提起された質問に答えていないようです(または答えは「同じです」)。
最大タルディキン

@TJエリス、reddid / r / compsciに投稿されましたか?;)@max、そう感じたので、この質問を投稿します。

回答:


20

人々が日々使用しているプログラミング言語は、カリー-ハワード通信にはあまり適していません。なぜなら、それらの型システムはあまりにも弱いからです。命令型プログラムにCurry-Howardを使用して面白いことを言うには、より洗練された型システムが必要です。本「Proofs-as-programs」は、命令型プログラムの合成を目的としてこの角度を押し進めています。確かに研究機能言語(AgdaEpigram)で依存型がますます普及するにつれて、区別は曖昧になりつつあります。もちろん、Cory -Howardに基づいているCoq定理証明器(およびおそらく他のもの)内でプログラム合成/抽出を行うことができます。

Curry-Howardの通信は、プルーフがプログラムにそれほど明確に対応していない(または、誰も実行しないプログラムではない)状況でも使用できます。この一例は、Proof-carrying authorizationにあります。命題は、誰が何をする権限を与えられているかについての声明に対応しています。証明は、命題が保持されているという必要な証拠を提供するため、承認要求が許可されます。証明をエンコードするために、証明用語が導入されます(Curry-Howard経由)。証明要求は、承認要求の有効性の証明として当事者間で送信されますが、プログラムとは見なされません。


1
依存型付けされた言語に言及する必要があります。これらの言語では、証明と命題の間の線があいまいになります。
オハドカンマー

1
確かに。Coqのプログラム合成/抽出を忘れないでください。
デイブクラーク

どのようなプログラムは、フォームの非建設的(古典的)証明に対応する?(と仮定Tは、例えば、いくつかの興味深い決定可能関係である電子内番目のTMの停止k個の手順を実行します。)(答えは非常に短くない場合、私は新しい質問として、それを求めることができます。)k Tek¬k TekTek
Kaveh

1
@Kaveh:別の質問としてこれを聞いてください。コメントの中で、「Godel-Gentzenの翻訳は継続を通過する変換です」と言うことができますが、それよりもわかりにくいものは収まりません。:)
ニールクリシュナスワミ


10

Coqには2つのタイプ(PropとSet)があり、プログラマーは実際のコードを生成しない証明と、実行中のコード(プログラム)を抽出するために使用される証明の一部を分離するために使用します。

それは、あなたが尋ねる問題、マシンコード(プログラム)を生成することを意味するもの、命題(または型)の証明を完成させるために存在するものを識別する方法に対する素晴らしい解決策です。

知る限り、両方を自動的に区別する方法はありません。これは研究にとって興味深いものでしょうか?それとも、誰かがそれが明らかに不可能であることを指摘することができますか?

依存型では、証明とプログラムが明確に区別されないだけでなく、プログラムと型が区別されません!唯一の違いは、タイプ(またはプログラム)が表示される場所であり、特定の用語の「プログラム」の場所または「タイプ」の場所の一部になります。

例はそれをより明確にすることを願っています:

依存型でアイデンティティ関数を使用する場合、関数で使用する型を渡す必要があります!タイプは、「プログラム」の値として使用されています!

型なしラムダ計算:

λバツバツ

依存型の場合:

id:(A:セット)-> A-> A

λAλバツバツ

この関数を使用している場合は、次の例のように実行します。

id Naturals 1

値として渡される「タイプ」(この場合は自然のセット)は破棄されるため、計算されることはありませんが、用語の「プログラム」部分に含まれていることに注意してください。それは、「証明」部分でも起こることです。それらは、用語を型チェックするために存在する必要がありますが、計算中に捨てられます。


6

私はここで手足を外に出して、少し目を細めたいなら、証拠とプログラムの終了を特定できると言います。

終了プログラムは、入力を取得して出力を生成できることの証明です。これは、非常に基本的な含意の証明です。

もちろん、この含意に自明なことを述べるよりも意味のある情報を伝えるには、論理的な意味を持つクラスから描画された入力のすべてのインスタンスに対してプログラムが機能することを示すことができる必要があります。(出力についても同様です。)

他の方向から見ると、有限の推論ステップを持つ証明は、何らかの論理システム内のオブジェクトを操作する記号プログラムです。(論理記号と規則が計算上意味することについてあまり心配しない場合。)

バツバツT

これはかなり単純ですが、アイデアの堅牢性を示唆していると思います。(たとえ一部の人がそれを好きにならないとしても;;)


非常に良い答え。
トト

もちろん、有限の証明とプログラムの終了を意味すると仮定する必要があります。終了しないプログラムの一部のクラスは、無限の証明として問題なく動作します。注意が必要な非生産的で終了しないプログラムです。
ミソサザイロマーノ

証明に関して有限と無限をどのように定義するかに応じて、これは少し難しいと思います。一般に、私たちが受け入れるすべての証拠は有限です。なぜなら、それらは短い有限時間で人間を説得しなければならないからです。帰納法に依存する証明(つまり、ほとんどの「無限」証明)は、この測定ではまだ有限であり、無限ではあるが通常の計算を表す記号的なステップを持っています。私たちのほとんどが有効な証明として拒否すると思う真に無限の証明は、文字通り検証するために無限の数の異なる事実を考慮しなければならないものです。
マークハーマン

5

関係ない証拠?

プログラムを作成するとき、そのパフォーマンス、メモリ消費などに興味があります。
たとえば、バブルソートではなく、実装が同じタイプである場合でも(依存するタイプの設定であっても)賢いソートアルゴリズムを使用する方がよいでしょう。

しかし、ある定理を証明するとき、それはあなたが興味を持っている証拠の存在にすぎません。

もちろん、審美的な観点から、いくつかの証明は、よりシンプル/美しい/感動的です/など(The Bookの証明など)。


4

カリーとハワードのやり取りを受け入れた場合、その質問は主に哲学的なものです。「証明とプログラムは違いますか?もちろんです。どうしますか?さて、証明を「証明」と呼び、プログラムを「プログラム」と呼びます。」

簡単に言うと、証明とプログラムの間に同型性がある場合(明らかにそうであるように見えます)、あなたの質問は、2つを区別できるオラクルがあるかどうかを尋ねることです。人間はそれらを(大部分が)異なるものとして分類するので、そのような神託が存在することは確かに議論の余地があります。重要な問題は、それらの間に意味のある違いがあるかどうかになります。それは哲学的な議論に任されています。「証明」とは何ですか?証拠を構成するものの正式な定義はありません。これは芸術の用語であり、教会とチューリングの論文で「効果的に計算可能」という概念によく似ています。さらに言えば、「プログラム」にも正式な定義はありません。

これらは、数学的調査のさまざまな分野を分類するために使用される自然言語の単語です。カリーとハワードが観察したのは、実際には同じことを研究しているこれらの2つの異なる分野です。これらの異なる研究者が互いに話し合うべきだと言っているため、この接続に気付くことが重要です。しかし、別のレベルでは、接続に気付くのはそれらの違いを信じることです。問題に取り組む場合、プログラミングの問題と考える方が有益な場合もあれば、論理的な問題と考える方が有益な場合もあります。視点のこの違いは、それらの間の重要な違いだと思います。しかし、遠近法の違いがアイデンティティの違いを構成するかどうかは、少なくともフレーゲのものと同じくらい深く探求されてきた深い哲学的問題ですユーバーシンウンベデトゥング

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