Advanced Mechanized Reasoning in Coq - Cheatsheet
Gallina: Grundlagen und Syntax
Definition:
Gallina ist die eingebaute funktionale Programmiersprache von Coq zur formalen Spezifikation und Verifikation mathematischer Theorien und Software. Sie verwendet eine stark typisierte, funktionale Syntax.
Details:
- Funktionen werden mit Schlüsselwort
fun definiert: fun x : T => e - Lokale Definitionen mit
let: let x := e1 in e2 - Induktive Definitionen:
Inductive t : Type := c1 | c2 | ... - Beweise werden interaktiv mittels Taktiken aufgebaut.
- Typenüberprüfung und Inferenz sind automtisiert.
- Pattern-Matching wird verwendet für Fallunterscheidungen:
match e with | c1 => e1 | ... end - Das Universum von Typen:
Type, Prop, Set
Coq's Taktiksprache und interaktive Beweisführung
Definition:
Taktiksprache in Coq nutzt spezifische Befehle zur schrittweisen Entwicklung formaler Beweise; interaktive Beweisführung erlaubt dabei die schrittweise Verifikation und Korrektur durch den Benutzer.
Details:
- Einfache Taktiken:
intro, apply, assumption - Komplexere Taktiken:
case, induction, rewrite - Automatisierung:
auto, eauto, trivial - Interaktives Vorgehen: Benutzer gibt inkrementell Taktiken ein, prüft Zwischenschritte und korrigiert bei Bedarf
- Ziel: Formale und verifizierbare Konstruktion mathematischer Beweise
- \textit{Proof scripts} zur Wiederholbarkeit und Nachvollziehbarkeit von Beweisen
Strategien zur Fehlerbehebung in Coq
Definition:
Strategien zur Fehlerbehebung in Coq: Ansätze zur Identifikation und Korrektur von Fehlern in Beweisen und Programmen in Coq.
Details:
- Typfehler: Angezeigte Typfehlermeldungen genau lesen und verstehen. Oft hilft die Verwendung von 'Check' und 'Print'.
- Taktiken: Verwendung von 'Abort' zur Rückkehr zum letzten konsistenten Zustand. 'Restart' hilft, den Beweis von einem Zwischenschritt aus neu zu beginnen.
- Interaktives Debugging: Schrittweise Anwendung von Taktiken mit 'Refine' und 'auto' um Probleme zu isolieren.
- Modularität: Beweis in modularen Teilen entwickeln und testen, um Fehlerquellen zu minimieren.
- Dokumentation: Nutzung der Coq-Dokumentation und Community-Ressourcen bei der Fehlersuche.
Korrektheitsbeweise für Algorithmen und Datenstrukturen
Definition:
Formalbeweise, die zeigen, dass Algorithmen und Datenstrukturen korrekt funktionieren. In Coq bedeutet das, dass die Implementierung den Spezifikationen entspricht.
Details:
- Korrektheitsbeweise bestehen aus partieller Korrektheit (\textit{partielle Korrektheit}) und Terminierung.
- \textit{partielle Korrektheit}: Der Algorithmus liefert das richtige Ergebnis, wenn er terminiert.
- Terminierung: Der Algorithmus endet nach einer endlichen Anzahl von Schritten.
- Coq verwendet induktive Beweise und rekursive Definitionen.
- Nutzer beweisen die Invarianz von Schleifen und rekursiven Aufrufen.
- Beispiel: Sortieralgorithmus (Insertion Sort) korrekt in Coq verifizieren.
- Datenstrukturen: z.B. Bäume, Listen werden auf ihre strukturelle Invarianz geprüft.
Definition und Verwendung induktiver Typen
Definition:
Induktive Typen sind Benutzerdefinierte Datentypen, die durch Angabe von Konstruktoren erstellt werden.
Details:
- Definiert mit
Inductive Schlüsselwort - Ermöglichen rekursive Datenstrukturen wie Listen und Bäume
- Konstruktoren spezifizieren mögliche Werte
- Beispiel: \texttt{Inductive nat : Type := | O : nat | S : nat -> nat.}
- Verwended in Mustermatching und rekursiven Funktionen
Integration und Nutzung automatisierter Theorembeweiser in Coq
Definition:
Integration und Nutzung automatisierter Theorembeweiser in Coq
Details:
- Automatische Theorembeweiser (ATPs) wie
Alt-Ergo, E und Vampire können in Coq verwendet werden, um Beweise zu automatisieren. - Benutze das Coq-Plug-in
coq-auto, um ATPs zu integrieren. - Unterschiedliche Taktiken wie
smt und lia stehen zur Verfügung, um Standardbeweismethoden zu automatisieren. - Integration verbessert die Effizienz und reduziert menschliche Fehler in der Beweiskonstruktion.
- Beispiel für SMT-Lib-Format zur Interaktion:
(declare-fun f (Int Int) Int).
Verwendung von Coq's Induktionsprinzipien in Beweisen
Definition:
Verwendung des Induktionsprinzips von Coq zur formalen Verifikation und Beweisführung von Eigenschaften rekursiver Funktionen und Datentypen.
Details:
- Induktionsprinzip: Basis- und Induktionsannahme nutzen.
- Induktion über natürliche Zahlen: \texttt{induction n} für natürliche Zahl n.
- Induktion über Listen: \texttt{induction l} für Liste l.
- Induktionsannahme formalisiert in Coq's Taktik-System.
- Eigene Induktionsprinzipien für benutzerdefinierte Datentypen ableitbar.
Praxisnahe Anwendungen und Übungen in Coq
Definition:
Anwendung und Übungen zur Vertiefung der Konzepte und Techniken von Coq, oft in Form von formalen Beweisen und Implementierungsaufgaben
Details:
- Implementierung formaler Beweise
- Verwendung von Standardbibliotheken
- Praktische Beispiele aus der Informatik
- Einsatz von Tactics:
intros, apply, rewrite, induction - Projektarbeiten und Fallstudien
- Proof-Entwicklung und Optimierung