これは次の質問です
の形式の非構成的(古典的)証明に対応するプログラムは何ですか?(は興味深い決定可能な関係であると仮定します。たとえば、 -th TMはステップで停止しません。)
(ps:この質問を投稿している理由の1つは、彼のコメントで「Godel-Gentzenの翻訳は継続渡しの変換です」というNeelの意味をもっと知りたいからです。)
これは次の質問です
の形式の非構成的(古典的)証明に対応するプログラムは何ですか?(は興味深い決定可能な関係であると仮定します。たとえば、 -th TMはステップで停止しません。)
(ps:この質問を投稿している理由の1つは、彼のコメントで「Godel-Gentzenの翻訳は継続渡しの変換です」というNeelの意味をもっと知りたいからです。)
回答:
これは興味深い質問です。明らかに、が成立するかどうかをごとに決定するプログラムは期待できません。これは停止問題を決定するからです。すでに述べたように、証明を計算的に解釈する方法はいくつかあります。カリー・ハワードの拡張、実現可能性、弁証法などです。しかし、それらはすべて、あなたが言及した定理を次のように多かれ少なかれ計算的に解釈します。∀ K T (E 、K )
簡単にするために、同等の古典的な定理を考えます
(1)
が与えられると、の値をチェックするだけでが成立するかどうかを判断できるため、これは(構造的に)同等です。場合、次いで保持、従って。一方、が成り立たない場合、(1)により、あり、これは。∀ kはT (E 、K )¬ Tを¬ T (E 、I )∃ I ¬ T (E 、I )¬ ∀ I T (E 、I )¬ T (E 、I )∀ jは(¬ T (E 、J )→ ⊥は)
ここで、再びHalting問題を解決するため、与えられたごとに(1)でを計算することはできません。上記のすべての解釈が行うことは、同等の定理を調べることですE
(2)
関数はHerbrand関数と呼ばれます。指定された潜在的な目撃者ごとに反例を計算しようとします。(1)と(2)が同等であることは明らかです。これは左から右へ建設的であり、(2)で取るだけです。ここで、は(1)の仮定された証人です。右から左へ古典的に推論する必要があります。(1)が真実ではないと仮定します。その後、j i i ′ = i i
(3)
してみましょう関数がこれを目撃すること、すなわち
(4)
ここで、(2)で取得すると、いくつかのに対してが得られます。しかし、(4)でをとると、その否定、矛盾が得られます。したがって、(2)は(1)を意味します。(¬ T (E 、F '(I '))→ ¬ T (E 、I '))I '
そのため、(1)と(2)は古典的に同等です。しかし興味深いのは、(2)が非常に単純で建設的な証人になったことです。単純に取る場合が成立しない場合、(2)の結論が真であるため、または、が成り立つ場合、取ります。これは、が成り立たず、(2)の前提が偽であり、再び真になるからです。T (E 、F (0 ))、I ' = 0 T (E 、F (0 ))¬ T (E 、F (0 ))
したがって、(1)のような古典的定理を計算的に解釈する方法は、(2)の場合に建設的に証明できる(古典的に)同等の定式化を調べることです。
上記の異なる解釈は、関数ポップアップする方法でのみ異なります。実現可能性および弁証法解釈の場合、これは、何らかの形の否定的な翻訳(Goedel-Gentzenのような)と組み合わせると、解釈によって明示的に与えられます。関数呼び出し-CCと継続事業者とカリー・ハワードの拡張機能の場合、プログラムが特定の値が(我々の場合にはどのように「知る」に許可されていることに起因するので)、使用されます継続ですが計算されるポイント周辺のプログラムの。f i f i
もう1つの重要な点は、(1)から(2)へのパッセージを「モジュラー」にすることです。つまり、(1)を使用して(1 ')を証明する場合、その解釈(2)を同様に使用する必要があります(1 ')の解釈を証明するには、(2')と言います。上記のすべての解釈は、Goedel-Gentzenの否定的な翻訳を含め、それを行います。
古典的な算術と直観主義的な算術が一致していることはかなりよく知られています。
これを示す1つの方法は、古典論理を直観主義論理に「否定的に埋め込む」ことです。したがって、が古典的な1次算術の式であると仮定します。これで、直観主義論理の式を次のように定義できます。
は基本的に準同型であることに注意してください。分離と実存では、de Morgan双対性を使用してそれらを論理積と普遍性に変えます。(私はこの答えのためにそれを作り上げたので、これは正確なGodel-Gentzen翻訳ではないことをかなり確信しています-基本的に二重否定+ de Morgan双対性を使用して書いたものはすべて動作します。古典的論理の計算上の解釈;以下を参照してください。)
まず、この翻訳が古典的な真実を保持することは明らかです。したがって、 は、古典的に言えば、場合にのみ真になります。ϕ
2番目:あまり明白ではありませんが、フラグメントの式については、直観主義的および古典的論理の証明可能性が一致ません。これを証明する方法は、最初にこの文法から得られた式を見ることです。
そして、帰納法により、が直観的に導出可能である補題として証明できます。したがって、証明の構造(たとえば、シーケント計算)の帰納法を行うことにより、負の公式の等微分可能性を示し、前の補題を使用して除外された中間の法則をシミュレートできます。
それでは、これについて直感的にどのように考えるべきですか?
まず、証明論的見解。シーケント計算の規則を見ると、古典的論理と直観主義的論理が大きく異なる唯一の場所は、選言と実存の規則にあることがわかります。したがって、この事実を使用して、これらの式の一方のロジックの証明をもう一方のロジックの証明に変換できることを示しています。これは、2つの新しいとを備えた古典的な論理の拡張として、建設的な論理をどのように考えるかを示しています。「古典的存在」および「古典的分離」と呼ぶものは、単に、接続詞、および否定を含む略語であるため、実際の存在について話すには、新しい接続詞を導入する必要がありました。∨ ∀
第二に、トポロジカルなビューがあります。現在、(セットのファミリーとしての)古典的な論理のモデルはブール代数(つまり、任意のユニオン、交差、および補数の下で閉じられたサブセットのファミリー)です。直観主義論理のモデルは位相空間としてのものであり、命題はオープンセットとして解釈されることがわかります。否定の解釈は補数の内部であり、それからを示すのは簡単です。つまり、二重否定は各オープンをカバーする最小のクローペンに送られます--- clopensはブール代数を形成します。
これで、Curry-Howardのおかげで、直観主義論理の証明を関数型プログラムとして解釈する方法がわかりました。それで、「古典的な証明の建設的な内容は何ですか?」という質問に対する1つの可能な答え(唯一のものではない)。次のとおりです。
古典的証明の計算内容は、その証明の翻訳の計算内容(負の翻訳による)は何でもです。
の翻訳を見てみましょう。したがって、これは、除外された中間の構成的内容は、および保持される場合ではない、つまりないということと同じであると言います。したがって、この意味では、除外された中間の法則には実際にはそれほど多くの計算内容はありません。
具体的には、否定的にはとして定義されていることを思い出してください。したがって、この式はです。Ocamlコードの次のビットは説明します:
type bot = Void of bot
type 'a not = 'a -> bot
let excluded_middle : ('a not * 'a not not) not = fun (u, k) -> k u
つまり、not-Aとnot-not-Aを取得した場合、最初の否定を2番目に否定して、必要な矛盾を導き出すことができます。
さて、継続的な受け渡しスタイルの変換とは何ですか?
さて、
先に述べたように、この定理を証明できる多くの否定的な翻訳があり、それぞれが異なるCPS変換に対応するため、「a」CPS変換を見ました。運用面では、各変換は異なる評価順序に対応しています。そのため、古典的なロジックのユニークな計算解釈はありません。選択する選択肢があり、選択の違いによって動作特性が大きく異なるためです。
プログラムとしての非建設的な証明のテーマに関する会議はすべてありますが、私はこのテーマの専門家ではありません。上記で、ニール・クリシュナスワミは、彼が準備しているより長い答えをほのめかしました。これは答えの味です。
call-with-current-continuationのタイプは、Peirceの法則として知られる命題に対応します。これは、除外された中間の法則()の証明に使用できます。LEMプログラムはcallccを使用して作成できます。Coqで:
Set Implicit Arguments.
Axiom callcc : forall (A B : Set), ((A -> B) -> A) -> A.
Lemma lem : forall (A B:Set), sum A (A -> B).
Proof.
intros.
eapply callcc.
intros H.
right.
intros.
apply H.
left.
assumption.
Defined.
Recursive Extraction lem.
O'Camlコードを与える:
type ('a, 'b) sum =
| Inl of 'a
| Inr of 'b
(** val callcc : (('a1 -> 'a2) -> 'a1) -> 'a1 **)
let callcc =
failwith "AXIOM TO BE REALIZED"
(** val lem : ('a1, 'a1 -> no) sum **)
let lem =
callcc (fun h -> Inr (fun h0 -> h (Inl h0)))
私がこれまでに見た最もきれいな紹介は、ティム・グリフィンの「コントロールのフォーミュラ・ア・タイプの概念」です。
callcc
Schemeのにしますcallcc
。その後、実際に試してみることができます。