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