Wie funktioniert die Taktik bei Proofassistenten?

44

Frage: Wie funktioniert die Taktik bei Proofassistenten? Sie scheinen eine Möglichkeit zu sein, anzugeben, wie ein Begriff in einen äquivalenten Begriff umgeschrieben werden soll (für eine Definition von "äquivalent"). Vermutlich gibt es dafür formale Regeln, wie kann ich lernen, was sie sind und wie sie funktionieren? Umfassen sie mehr als nur die Auswahl der Reihenfolge für die Beta-Reduzierung?

Hintergrund zu meinem Interesse: Vor einigen Monaten habe ich beschlossen, formale Mathematik zu lernen. Ich habe mich für die Typentheorie entschieden, weil sie nach vorläufigen Untersuchungen wie der richtige Weg zu sein scheint und weil sie Programmierung und Mathematik zu vereinen scheint, was faszinierend ist . Ich denke, mein letztes Ziel ist es, einen Proof-Assistenten wie Coq verwenden und verstehen zu können (ich denke, dass ich abhängige Typen besonders verwenden kann, da ich neugierig auf Dinge wie die Darstellung von Matrizentypen bin). Anfangs wusste ich sehr wenig, nicht einmal ansatzweise funktionale Programmierung, aber ich mache nur langsame Fortschritte. Ich habe große Teile von Types und Programming Languages ​​(Pierce) gelesen und verstanden und einige Haskell und ML gelernt.

John Salvatier
quelle
1
Dies ist eine schamlose Werbung für meine Coq-Video-Tutorials, math.andrej.com/2011/02/22/…
Andrej Bauer

Antworten:

36

Die grundlegende Taktik entweder läuft eine Inferenzregel vorwärts oder rückwärts (zum Beispiel convert Hypothesen und in oder convert Ziel in zwei Tore undABABABABmit den gleichen Hypothesen), wenden Sie ein Lemma (~ function application) an, teilen Sie ein Lemma über einen induktiven Typ in einen Fall für jeden Konstruktor auf und so weiter. Grundlegende Taktiken können je nach Kontext, in dem sie angewendet werden, erfolgreich sein oder scheitern. Fortgeschrittenere Taktiken sind wie kleine funktionale Programme, die die Grundtaktiken ausführen, Mustervergleiche über die Begriffe im Ziel und / oder in den Annahmen durchführen, Entscheidungen basierend auf dem Erfolg oder Misserfolg der Taktik treffen und so weiter. Fortgeschrittenere Taktiken befassen sich mit Arithmetik und anderen spezifischen Arten von Theorien. Das Schlüsselpapier zu Coqs Taktiksprache lautet wie folgt:

  • D. Delahaye. Eine Taktiksprache für das System Coq . In Proceedings of Logic for Programming und Automated Reasoning (LPAR), Reunion Island, Band 1955, Lecture Notes in Computer Science, S. 85–95. Springer-Verlag, November 2000.

Die formalen Regeln, die den Kern der grundlegenden Taktik ausmachen, sind im Coq-Benutzerhandbuch hier oder in Kapitel 4 des PDF-Dokuments definiert .

Ein ziemlich lehrreiches Dokument zur Implementierung von Taktiken und Taktiken (im Wesentlichen Taktiken, die andere Taktiken als Argumente verwenden) ist:

Die taktische Sprache von Coq hat die Einschränkung, dass die mit ihr geschriebenen Beweise kaum Beweisen ähneln, die man von Hand macht. Es wurden mehrere Versuche unternommen, klarere Beweise zu ermöglichen. Dazu gehören Isar (für Isabelle / HOL) und Mizars Beweissprache .

Übrigens: Wussten Sie auch, dass die Programmiersprache ML ursprünglich dazu gedacht war, Taktiken für den LCF- Theorembeweiser umzusetzen ? Viele Ideen, die für ML entwickelt wurden, wie zum Beispiel die Typinferenz, haben die modernen Programmiersprachen beeinflusst.

Dave Clarke
quelle
3
Gute Antwort. Adam Chlipala Certified Programming with Dependent Types ( adam.chlipala.net/cpdt ) ist eine weitere gute Ressource für die Verwendung von Taktiken in Coq.
Jbapple
16

LCF ist in der Tat der Urvater aller dieser Systeme: Coq, Isabelle, HOLs, einschließlich der ML-Programmiersprache (die wir heute als OCaml, SML, auch F # sehen). Ja, ich beziehe Coq als Mitglied der größeren LCF-Familie ein. Verglichen mit den US-amerikanischen Proofassistenten (insbesondere ACL2) oder dem völlig verwandten Mizar ist Coq kulturell ziemlich nah an Isabelle und den HOLs, hauptsächlich aufgrund der gemeinsamen Vorstellung von Taktik .

Was ist also überhaupt eine Taktik, die von unbeabsichtigten Beobachtungen über das Umschreiben, Konvertieren, Einführen oder Eliminieren von Konnektiven befreit ist?

Das Hauptprinzip der Schichtung stammt von Milners LCF:

  • Kernschlussfolgerungen (Forward Reasoning), entweder als abstrakter Datentyp thmim ursprünglichen LCF-Ansatz oder mit separater Überprüfung der Beweisbegriffe im Zweig Typentheorie der Familie (Coq, Matita). Dies gibt Ihnen eine gewisse logische Grundlage für Ergebnisse, die der Prüfer als Theoreme betrachtet. Sie könnten also eine primitive Inferenz haben, die ⊢ A und ⊢ B nimmt und Ihnen ⊢ A ∧ B gibt. Eine andere primitive Inferenz könnte Ihnen ⊢ t = u geben, wobei u die Beta-Normalform von t ist. Keiner dieser Mechanismen ist eine Taktik, es handelt sich jedoch um Inferenzregeln wie in der Standardlogik.

  • Zielgerichteter Beweis (Rückwärtsdenken). Die Idee ist, dass Sie einen Begriff des "Zielzustands" bearbeiten, indem Sie ihn verfeinern, in immer mehr Unterziele aufteilen, Unterziele schließen, bis alles gelöst ist. Das Beenden des Zielzustands lässt einen bestimmten Satz aus dem Prozess herausspringen. LCF hat eine bestimmte extra-logische Infrastruktur für Ziele eingeführt, die es in den HOLs noch gibt: Eine Taktik ist eine ML-Funktion, die ein Ziel verfeinert und eine Begründung für die Verfeinerung liefert. Am Ende des Beweises werden die Begründungen in umgekehrter Reihenfolge wiedergegeben, um einen Beweis in Vorwärtsrichtung gemäß den oben skizzierten primitiven Folgerungen zu erzeugen.

Coq und Matita stehen diesem LCF-Prinzip noch ziemlich nahe. Isabelle ist hier anders: Bereits 1989 reformierte Larry Paulson die Begriffe Ziel und Taktik, um sie näher an die Logik heranzuführen, die den "reinen" logischen Rahmen von Isabelle darstellt. Isabelle / Pure liefert minimale Logik höherer Ordnung mit Implikation ==> und Quantifikator !! die sowohl die Struktur der natürlichen Abzugsregeln als auch die Zielzustände anzeigen.

Zum Beispiel ist ⊢ A ==> B ==> A ∧ B die Konjunktionseinführungsregel (der Objektlogik) als Satz des logischen Rahmens.

Zielzustände sind ebenfalls nur Theoreme, beginnend mit ⊢ C ==> C für Ihre ursprüngliche Behauptung C, die in Zwischenzuständen mit X, Y, Z zu Z X ==> Y ==> Z ==> C verfeinert wird sind die aktuellen Unterziele, und der Prozess endet mit ⊢ C (keine Unterziele).

Zurück zu den Taktiken, die für alle diese Prüfer einheitlicher sind: Unter Berücksichtigung des Zielzustands (z. B. der obigen Isabelle) ist eine Taktik eine Funktion, die einen Zielzustand der Nachverfolgung (0, 1 oder mehr) zuordnet Zielzustände. Darüber hinaus ist eine Taktik ein Kombinator solcher taktischer Funktionen, z. B. um sequentielle Komposition, Auswahl, Wiederholung usw. auszudrücken. Tatsächlich hängt die Sprache der Taktik und Taktik mit dem "Liste der Erfolge" -Ansatz von Parser-Kombinatoren zusammen.

Taktiken erlauben es, bestimmte Strategien der Zielverfeinerung systematisch zu beschreiben. Sie erwiesen sich seit ihrer Erfindung in LCF in den 1970/80-er Jahren als recht erfolgreich, aber sie produzieren notorisch unlesbare Proof-Skripte.

Ein aktueller Überblick über einige Aspekte von Taktiksprachen wird in dem Artikel von A. Asperti et al., PLMMS 2009, gegeben, siehe Workshop-Verfahren Seite 22.

Mizar und Isabelle / Isar wurden als alternative Herangehensweisen an vom Menschen lesbares strukturiertes Denken erwähnt und basieren nicht auf Taktiken in diesem Sinne. Mizar ist nicht mit der LCF-Familie verwandt, daher kennt er diese taktische Terminologie nicht. Isabelle / Isar übernimmt in gewissem Maße die taktische Tradition, aber der Begriff der Beweismethode ist etwas strukturierter (mit explizitem Isar-Beweiskontext, explizitem Hinweis auf verkettete Tatsachen und Vermeidung von internen Zielhacken während des Denkens).

In den letzten Jahrzehnten wurden viele weitere Reformen und Überlegungen zu Taktiksprachen durchgeführt. Ein neuerer Zweig der Coq-Community bevorzugt beispielsweise SSReflect (von G. Gonthier) anstelle des traditionellen Ltac.

Makarius
quelle
12

Wie funktioniert die Taktik bei Proofassistenten?

Ich vermute, dass diese Antwort ein bisschen verwirrend sein wird.

Erstens ist es nicht genug zu fragen, "wie Taktiken in Proof-Assistenten funktionieren", weil sie in verschiedenen Proof-Assistenten unterschiedlich funktionieren. Heutzutage werden zwei Hauptklassen von Assistenten verwendet: die vom ursprünglichen LCF abgeleiteten wie Isabelle, HOL und HOL light und typentheoretische Proof-Assistenten wie Coq und Matita. In diesen zwei verschiedenen Klassen von Proof-Assistenten funktioniert die Taktik auf unterschiedliche Art und Weise. Ein Spiegelbild dessen, was unter der Motorhaube in z. B. Isabelle vor sich geht, unterscheidet sich erheblich von dem, was unter der Motorhaube in z. B. Matita vor sich geht.

Fragen Sie sich: Was ist los, wenn wir versuchen, einen Satz P in Matita zu beweisen? Wir führen ein metavariables X mit Typ P ein. Wir spielen dann sozusagen ein Spiel, in dem wir X verfeinern und dem unvollständigen Term mehr und mehr Struktur hinzufügen, bis wir einen vollständigen Lambda-Term erhalten (dh der keine Metavariablen mehr enthält). Sobald wir im Besitz eines vollständigen Lambda-Terms sind, überprüfen wir diesen in Bezug auf P und stellen sicher, dass er den erforderlichen Typ aufweist. Wir sehen dann, dass in Coq und Matita eine Taktik lediglich eine Funktion von unvollständigen Beweisbegriffen zu unvollständigen Beweisbegriffen ist, was dem Begriff nach der Anwendung hoffentlich eine gewisse Struktur hinzufügt (diese Beobachtung hat einige der jüngsten Arbeiten von z. B. Jojgov motiviert) , Pientka und andere).

Zum Beispiel führt die Matita-Taktik "Intro" eine Lambda-Abstraktion über den vorhandenen Begriff ein, "Cases" führt einen Übereinstimmungsausdruck in den Begriff ein und "Apply" führt eine Anwendung eines Begriffs auf den anderen ein. Diese grundlegenden Taktiken können mithilfe von Funktionen höherer Ordnung zu komplexeren zusammengefügt werden. Die Grundidee ist jedoch immer dieselbe: Eine Taktik zielt immer darauf ab, einem unvollständigen Beweisbegriff ein wenig Struktur zu verleihen.

Beachten Sie, dass Implementierer versuchen, einen Begriff zurückzugeben, der nach jeder taktischen Anwendung erneut überprüft wird. Genau genommen müssen sie dies nicht tun, da für typentheoretische Beweisassistenten nur gilt, dass wir, wenn der Benutzer den Beweis vorlegt, über einen Beweisbegriff verfügen, der den Satz P erfüllt. Wie wir bei diesem Beweis Begriff angekommen ist weitgehend unerheblich. Sowohl Coq als auch Matita sind jedoch bestrebt, dem Benutzer einen (möglicherweise unvollständigen) Beweisbegriff zurückzugeben, der nach jeder taktischen Anwendung überprüft wird. Diese Invariante kann (und tut es oft) jedoch scheitern, insbesondere im Hinblick auf die beiden syntaktischen Prüfungen, die CIC-basierte Proof-Assistenten durchführen müssen.

Insbesondere können wir einen scheinbar gültigen Beweis erbringen, indem wir eine Reihe von Taktiken anwenden, bis keine offenen Ziele mehr übrig sind. Wir kommen dann zu Qed, dem vermeintlichen Beweis, nur um herauszufinden, dass sich Matitas Termination Checker oder sein strenger Positivitätsprüfer beschwert, da der durch die Taktik erzeugte Beweisbegriff eine dieser syntaktischen Prüfungen ungültig gemacht hat (dh eine Metavariable in der Argumentposition zu Ein rekursiver Aufruf wurde mit einem Ausdruck instanziiert, der syntaktisch nicht kleiner als das ursprüngliche Argument ist. Dies ist ein Hinweis darauf, dass die CIC-Typentheorie in gewissem Sinne nicht "stark genug" ist und die syntaktischen Anforderungen an die Positivität oder Größe in ihren Typen nicht widerspiegelt (eine Beobachtung, die Abels Größentypen motiviert, und einige neuere Arbeiten zu Positivitätstypen ).

Auf der anderen Seite sind Proof-Assistenten im LCF-Stil ganz anders. Hier besteht der Kernel aus einem Modul (normalerweise in einer Variante von ML implementiert), das einen abstrakten Typ "thm" enthält, und Funktionen, die die Inferenzregeln der Logik des Proofassistenten implementieren, "thm" auf "thm" abbilden und so her. Wir verlassen uns auf die Typisierungsdisziplin von ML, um sicherzustellen, dass die einzige Möglichkeit, einen Wert vom Typ "thm" zu konstruieren, über diese Inferenzregeln (grundlegende Taktik) besteht. Isabelles Kernel ist da .

Beweise bestehen dann aus einer Reihe von Anwendungen dieser Basistaktiken (oder komplexeren, größeren Taktiken, die wiederum durch Aneinanderreihen einfacherer Taktiken mit Funktionen höherer Ordnung hergestellt werden - in Isabelle können die Funktionen höherer Ordnung, die Taktiken genannt werden) hier gesehen werden ). Im Gegensatz zu typentheoretischen Beweisassistenten muss ein Assistent im LCF-Stil keinen expliziten Zeugenausdruck behalten. Die Korrektheit des Beweises wird durch die Konstruktion und unser Vertrauen in die Schreibdisziplin von ML garantiert (viele Assistenten, z. B. Isabelle, generieren jedoch Beweisbedingungen für ihre Beweise).

Dominic Mulligan
quelle