Curry-Howard und Programme aus nicht konstruktiven Beweisen


29

Dies ist eine Folgefrage zu

Was ist der Unterschied zwischen Beweisen und Programmen (oder zwischen Aussagen und Typen)?

Welches Programm würde einem nicht konstruktiven (klassischen) Beweis der Form k T(e,k)¬k T(e,k) ? (Angenommen, T ist eine interessante entscheidbare Beziehung, z. B. e th TM bleibt nicht in k Schritten stehen.)

(ps: Ich poste diese Frage zum Teil, weil ich mehr darüber erfahren möchte, was Neel in seinem Kommentar unter " Die Godel-Gentzen-Übersetzung ist eine vorübergehende Transformation" versteht .)


2
Teilantwort auf Seite 2 dieser Vorlesung . Es ist ein bisschen kryptisch; Ich werde versuchen, etwas vollständigeres auszugraben.
Dave Clarke

Ich brauche etwas länger als geplant, um meine Antwort zu schreiben, da ich den Fehler gemacht habe, die Dinge zu beweisen, die ich wusste, anstatt sie nur zu behaupten. :)
Neel Krishnaswami

1
Die neueste JSL hatte diesen Artikel . Das Wesentliche ist, dass der Recheninhalt klassischer Beweise stark davon abhängt, wie Sie sie extrahieren. Ich habe es noch nicht wirklich verdaut, aber ich dachte, ich würde es dort rausschmeißen.
Mark Reitblatt

Aber Sie haben angegeben, dass T eine entscheidbare Beziehung ist, daher gibt es konstruktive Beweise für Ihren Satz. Die klassische Logik ist eine Teilmenge der intuitionistischen Logik, und Sie haben angegeben, dass T zu dieser Teilmenge gehört, indem Sie sie als entscheidbar bezeichnet haben.
Wren Romano

wren, dachte ich zuerst auch! Aber der Satz P in dem P \ / ~ P-Beispiel in der Frage ist tatsächlich über alles k quantifiziert, und diese Quantifizierung von T ist nicht notwendigerweise entscheidbar.
Jbapple

Antworten:


25

Das ist eine interessante Frage. Offensichtlich kann man nicht erwarten, dass es ein Programm gibt, das für jedes ob k T ( e , k ) gilt oder nicht, da dies das Halteproblem entscheiden würde. Wie bereits erwähnt, gibt es verschiedene Möglichkeiten, Beweise rechnerisch zu interpretieren: Erweiterungen von Curry-Howard, Realisierbarkeit, Dialektik und so weiter. Aber sie alle würden den Satz, den Sie mehr oder weniger erwähnt haben, wie folgt rechnerisch interpretieren.ekT(e,k)

Der Einfachheit halber sei der äquivalente klassische Satz betrachtet

(1) ij(¬T(e,j)¬T(e,i))

Dies ist (konstruktiv) äquivalent zu dem genannten, weil wir bei gegebenem entscheiden können, ob k T ( e , k ) gilt oder nicht, indem wir einfach den Wert von ¬ T ( e , i ) überprüfen . Wenn ¬ T ( e , i ) hält dann i ¬ T ( e , i ) und damit ¬ i T ( e , i ) . Wenn andererseitsikT(e,k)¬T(e,i)¬T(e,i)i¬T(e,i)¬iT(e,i) gilt dann nicht zu (1) wir habenj ( ¬ T ( e , j ) ) was impl j T ( e , j ) impliziert.¬T(e,i)j(¬T(e,j))jT(e,j)

Nun können wir wieder in (1) nicht für jedes gegebene e berechnen, weil wir das Halteproblem erneut lösen würden. Was alle oben erwähnten Interpretationen tun würden, wäre, den äquivalenten Satz zu betrachtenie

(2) fich(¬T(e,f(ich))¬T(e,ich))

Die Funktion heißt Herbrand-Funktion. Es wird versucht, ein Gegenbeispiel j für jeden gegebenen potentiellen Zeugen i zu berechnen . Es ist klar, dass (1) und (2) äquivalent sind. Von links nach rechts ist dies konstruktiv. Nehmen Sie einfach i ' = i in (2), wobei i der angenommene Zeuge von (1) ist. Von rechts nach links muss man klassisch argumentieren. Angenommen, (1) war nicht wahr. Dann,fjichich=ichich

(3) ichj¬(¬T(e,j)¬T(e,ich))

Sei eine Funktion, die dies bezeugt, df

(4) ich¬(¬T(e,f(ich))¬T(e,ich))

Nehmen wir nun in (2) und wir haben ( ¬ T ( e , f ' ( i ' ) ) ¬ T ( e , i ' ) ) für einige i ' . Aber wenn wir in (4) i = i 'nehmen, erhalten wir die Negation dieses Widerspruchs. Daher impliziert (2) (1).f=f(¬T(e,f(i))¬T(e,i))ii=i

Wir haben also, dass (1) und (2) klassisch äquivalent sind. Aber das Interessante ist, dass (2) jetzt ein sehr einfaches konstruktives Zeugnis hat. Nehmen Sie einfach wenn T ( e , f ( 0 ) ) nicht gilt, weil dann die Schlussfolgerung von (2) wahr ist; oder sonst nehme i = 0 wenn T ( e , f ( 0 ) ) gilt, weil dann ¬ T ( e , f ( 0 )i=f(0)T(e,f(0))i=0T(e,f(0)) gilt nicht und die Prämisse von (2) ist falsch, was es wieder wahr macht.¬T(e,f(0))

Die Möglichkeit, einen klassischen Satz wie (1) rechnerisch zu interpretieren, besteht daher darin, eine (klassisch) äquivalente Formulierung zu betrachten, die in unserem Fall (2) konstruktiv bewiesen werden kann.

Die oben genannten unterschiedlichen Interpretationen unterscheiden sich nur in der Art und Weise, in der die Funktion aufgerufen wird. Im Falle der Realisierbarkeit und der dialektischen Interpretation wird dies durch die Interpretation in Kombination mit irgendeiner Form von negativer Übersetzung (wie bei Goedel-Gentzen) ausdrücklich angegeben. Bei Curry-Howard-Erweiterungen mit call-cc- und continuation-Operatoren ergibt sich die Funktion f aus der Tatsache, dass das Programm "wissen" darf, wie ein bestimmter Wert (in unserem Fall i ) verwendet wird, also f die Fortsetzung des Programms um den Punkt, an dem ich berechnet wird.ffifi

Ein weiterer wichtiger Punkt ist, dass die Passage von (1) zu (2) "modular" sein soll, dh wenn (1) zum Beweisen von (1 ') verwendet wird, sollte dessen Interpretation (2) auf ähnliche Weise verwendet werden um die Interpretation von (1 ') zu beweisen, sagen wir (2'). Dies gilt für alle oben genannten Auslegungen, einschließlich der negativen Übersetzung von Goedel-Gentzen.


8
Herzlich willkommen! Es ist toll, hier einen Experten für Beweistheorie zu sehen.
Neel Krishnaswami

1
Danke Paulo, deine Antwort hat einen Teil des Bildes in einem verwandten Problem geklärt, an dem ich arbeite.
Kaveh

17

Es ist allgemein bekannt, dass klassische und intuitionistische Arithmetik gleich konsistent sind.

Ein Weg, dies zu zeigen, führt über die "negativen Einbettungen" der klassischen Logik in die intuitionistische Logik. Nehmen wir also an, sind Formeln der klassischen Arithmetik erster Ordnung. Nun können wir eine Formel der intuitionistischen Logik wie folgt definieren:ϕ

G()=¬¬G(ϕψ)=¬¬(G(ϕ)G(ψ))G()=¬G(¬ϕ)=¬G(ϕ)G(ϕψ)=¬(¬G(ϕ)¬G(ψ))G(x.ϕ)=x.¬¬G(ϕ)G(x.ϕ)=¬x.¬(G(ϕ))G(P)=¬¬P

Beachten Sie, dass im Grunde genommen ein Homomorphismus ist, der in zusätzlichen Nicht-Nicht-Verhältnissen steckt, mit der Ausnahme, dass bei Disjunktionen und Existentialen die De-Morgan-Dualität verwendet wird, um sie in Konjunktionen und Universalien umzuwandeln. (Ich bin ziemlich zuversichtlich, dass dies nicht die exakte Godel-Gentzen-Übersetzung ist, da ich sie für diese Antwort ausgedacht habe. Grundsätzlich funktioniert alles, was Sie mit der Doppelverneinung + der Morgan-Dualität schreiben. Diese Variante erweist sich tatsächlich als wichtig für Computerinterpretationen der klassischen Logik; siehe unten.)G(ϕ)

Erstens: Es ist offensichtlich, dass diese Übersetzung die klassische Wahrheit bewahrt, so dass genau dann wahr ist, wenn ϕ klassisch ist.G(ϕ)ϕ

Zweitens: Es ist weniger offensichtlich, aber immer noch der Fall, dass für Formeln in der Fragment, Beweisbarkeit in intuitionistischer und klassischer Logik fallen zusammen. Der Weg, dies zu beweisen, besteht darin, zuerst die aus dieser Grammatik gezogenen Formeln zu betrachten:,,,¬

A,B::=x.A(x)|AB|AB|¬A|¬¬P

Und dann können wir als Lemma (durch Induktion auf ) beweisen, dass G ( A )A ist intuitiv ableitbar. Wir können also jetzt die Äquidierbarkeit negativer Formeln zeigen, indem wir eine Induktion über die Struktur des Beweises (etwa in der Folgerechnung) durchführen und das Gesetz der ausgeschlossenen Mitte mit dem vorherigen Lemma simulieren.G(A)A

Also, wie solltest du dir das intuitiv überlegen?

  • Erstens die beweistheoretische Sichtweise. Wenn Sie sich die Regeln der Folgerechnung ansehen, können Sie sehen, dass der einzige Unterschied zwischen klassischer und intuitionistischer Logik in den Regeln für Disjunktion und Existenzialität besteht. Wir verwenden diese Tatsache also, um zu zeigen, dass Beweise in einer Logik dieser Formeln in Beweise in der anderen übersetzt werden können. Dies zeigt, wie man sich konstruktive Logik als eine Erweiterung der klassischen Logik mit den beiden neuen Konnektiven und . Was wir "klassische Existenz" und "klassische Disjunktion" nennen, waren nur Abkürzungen, die , Konjunktion und Negation beinhalten. Um über die tatsächliche Existenz zu sprechen, mussten wir neue Konnektiva einführen.

  • Zweitens gibt es eine topologische Ansicht. Nun ist das Modell einer klassischen Logik (als Familie von Mengen) eine Boolesche Algebra (dh eine Familie von Teilmengen, die unter willkürlichen Vereinigungen, Schnittmengen und Ergänzungen geschlossen sind). Es stellt sich heraus, dass das Modell der intuitionsitischen Logik ein topologischer Raum ist , wobei die Sätze als offene Mengen interpretiert werden. Ihnen ist die Interpretation der Negation das Innere der Ergänzung, und dann ist es einfach, das zu zeigen , was bedeutetdass Doppel Negation uns in die kleinsten clopen sendet Abdeckung jeden offenen --- und die clopens a bilden Boolsche Algebra.¬¬¬P=¬P

Dank Curry-Howard können wir nun Beweise in der intuitiven Logik als funktionale Programme interpretieren. Eine mögliche Antwort (aber nicht die einzige) auf die Frage: "Was ist der konstruktive Inhalt eines klassischen Beweises?" ist das Folgende:

Der rechnerische Inhalt eines klassischen Beweises ist der rechnerische Inhalt der Übersetzung seines Beweises (gemäß der negativen Übersetzung).

Lassen Sie uns also einen Blick auf die Übersetzung von . Dies besagt also, dass der konstruktive Inhalt der ausgeschlossenen Mitte der gleiche ist wie der, dass es nicht der Fall ist, dass ¬ P und und ¬ ¬ P gelten - dh, dass es keinen Widerspruch gibt. In diesem Sinne enthält das Gesetz der ausgeschlossenen Mitte nicht viel Recheninhalt.G(EIN¬EIN)=¬(¬G(EIN)¬¬G(EIN))¬P¬¬P

Um zu sehen, was es konkret ist, sei daran erinnert, dass Negation konstruktiv als . Also ist diese Formel ( ( G ( A )¬EIN==EIN . Das folgende Ocaml-Code-Bit veranschaulicht Folgendes:((G(EIN))((G(EIN))))

type bot = Void of bot
type 'a not = 'a -> bot

let excluded_middle : ('a not * 'a not not) not = fun (u, k) -> k u 

Das heißt, wenn Sie nicht-A und nicht-nicht-A erhalten, können Sie einfach die erste Negation an die zweite übergeben, um den gewünschten Widerspruch abzuleiten.

Was ist nun eine Fortsetzung von Transformationen im vorübergehenden Stil?

  • Eine Fortsetzung vom Typ ist etwas, das einen Wert vom Typ τ annimmt und daraus eine endgültige Antwort berechnet.ττ
  • Fortsetzungen dienen zur Modellierung von Programmkontexten. Das heißt, wir könnten einen Term , der als Teil eines viel größeren Programms C [ 3 + 5 ] ausgewertet wird . All das Zeug um ihn herum wird das Ergebnis der Berechnung von 3 + 5 sein3+5C[3+5]3+5 und berechnet die endgültige Antwort.
  • Man kann sich also eine Fortsetzung vom Typ als eine Funktion τ α vorstellen , wobei ατταα für jeden Antworttyp steht.
  • Wenn Sie also ein Programm vom Typ τ haben , können wir es "CPS-konvertieren", indem wir einen Term vom Typ ( τ α ) α finden , der am Ende alles übergibt, was e isteτ(τα)αe für seine Fortsetzung berechnet hätte. (Grundsätzlich wird der Kontrollfluss dadurch nur explizit.)
  • Das müssen wir aber erblich tun, damit jeder Teil des Programms seine Fortsetzung explizit macht.

Jetzt,

  • ϕ¬¬ϕ .
  • Unsere Übersetzung verwendet zwar Negation, beseitigt jedoch nie den falschen Satz - daher funktioniert die Übersetzung in diesem Satz parametrisch.
  • Insbesondere können wir ersetzenα .
  • ϕ(ϕα)α
  • Dies ist eine CPS-Transformation.

Ich habe "eine" CPS-Transformation gesehen, da es, wie ich bereits erwähnte, viele negative Übersetzungen gibt, mit denen Sie diesen Satz beweisen können, und jede entspricht einer anderen CPS-Transformation. Operativ entspricht jede Transformation einer anderen Auswertungsreihenfolge . Es gibt also keine eindeutige rechnerische Interpretation der klassischen Logik, da Entscheidungen zu treffen sind und die unterschiedlichen Entscheidungen sehr unterschiedliche Betriebseigenschaften haben.


3
Das ist eine großartige Antwort. Es erinnerte mich an Wadlers Artikel "Call-by-Value ist doppelt so hoch wie Call-by-Name": homepages.inf.ed.ac.uk/wadler/topics/call-by-need.html , der eine sehr einprägsame Anekdote enthält in Abschnitt 4, um die Beziehung zwischen callCC und der ausgeschlossenen Mitte zu erläutern.
sclv

8

Es gibt ganze Konferenzen zum Thema nichtkonstruktive Beweise als Programme , und ich bin kein Experte auf diesem Gebiet. Oben spielte Neel Krishnaswami auf eine längere Antwort an, die er vorbereitet, was nach seiner Arbeit hier ausgezeichnet sein wird. Dies ist nur ein Vorgeschmack auf eine Antwort.

P,P¬P

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.

gibt den O'Caml-Code an:

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)))

Die sauberste Einführung dazu, die ich gesehen habe, ist in Tim Griffins "A formulas-as-types-Begriff der Kontrolle" .


3
Sie sollten versuchen, in das Schema zu extrahieren, und angeben, dass die Extraktionsprozedur Ihre callccin das Schema extrahieren soll callcc. Dann können Sie es tatsächlich ausprobieren.
Andrej Bauer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.