Entwicklung korrekter Programme in Coq. Thomas Strathmann

Ähnliche Dokumente
Entwicklung eines korrekten Übersetzers

Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen

Grundlagen der Programmierung 2. Operationale Semantik

Intuitionistische Lineare Logik

1. Typen 1.1 Typsicherheit 1.2 Typprüfung

Abschnitt 11: Korrektheit von imperativen Programmen

Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten.

Was bisher geschah Modellierung von Daten durch Mengen Beziehungen (Zusammenhänge und Eigenschaften) durch Relationen, Graphen und Funktionen

Theorembeweiser und ihre Anwendungen

Mehrsortige Strukturen

Induktion und Rekursion

Der einfach getypter Lambda-Kalkül

Funktionale Programmierung Teil 2 Methodik: Spezifikation, Implementierung, Verifikation

THEORETISCHE INFORMATIK UND LOGIK

n 1. Der Begriff Informatik n 2. Syntax und Semantik von Programmiersprachen - 1 -

Funktionale Programmierung ALP I. λ Kalkül WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

GTI. Hannes Diener. 18. Juni. ENC B-0123,

Was ist mathematische Logik?

Unentscheidbarkeitssätze der Logik

Funktionale Programmiersprachen

Philosophie des Intuitionismus und sein Einfluß auf die Informatik

Übersicht Formale Semantik. Übersicht Axiomatische Semantik. Inhaltsübersicht HPS WS 2003/04. Vorlesung Höhere Programmiersprachen,

mathematik und informatik

3. Klausur Einführung in die Theoretische Informatik Seite 1 von Welches der folgenden klassischen Probleme der Informatik ist entscheidbar?

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

Inferenzmethoden. Einheit 18. Logik höherer Stufe

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

{P} S {Q} {P} S {Q} {P} S {Q} Inhalt. Hoare-Kalkül. Hoare-Kalkül. Hoare-Tripel. Hoare-Tripel. Hoare-Tripel

Funktionale Programmierung ALP I. µ-rekursive Funktionen WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Funktionale Programmierung Einführung

III.1 Prinzipien der funktionalen Programmierung - 1 -

Diskrete Strukturen Kapitel 2: Grundlagen (Beweise)

Vorsemesterkurs Informatik

Einführung in die Programmierung

Einführung in die Programmierung

Workshop Einführung in die Sprache Haskell

Einführung in die Programmierung Wintersemester 2016/17

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell

Mathematische Logik, Grundlagen der Mathematik. Helmut Schwichtenberg Mathematisches Institut, Ludwig-Maximilians-Universität

Sudoku. Warum 6? Warum 6?

Einführung in die mathematische Logik

Logik I. Symbole, Terme, Formeln

Was bisher geschah Modellierung in Logiken: klassische Prädikatenlogik FOL(Σ, X) Spezialfall klassische Aussagenlogik AL(P)

Logik für Informatiker

Grundlagen der Programmierung 3 A

Godehard Link COLLEGIUM LOGICUM. Logische Grundlagen der Philosophie und der Wissenschaften. Band 1. mentis PADERBORN

Theoretische Informatik II

Programmiersprachen: Klassifizierung und Methoden. Programmier-Paradigmen. Grundlagen der Programmierung 2 (1.C) - 1 -

Logik für Informatiker

Einführung in die Theoretische Informatik

Programmierung Paradigmen und Konzepte

Automatische induktive Beweise und ein System dazu

Kapitel 1: Einleitung. Gliederung. Zum Begriff Informatik Zum Begriff Algorithmus Zum Begriff Programmieren

Theoretische Informatik I

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

Strukturelle Rekursion und Induktion

ALP I Turing-Maschine

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom : Rekursive Datentypen

Collegium Logicum - Logische Grundlagen der Philosophie und der Wissenschaften Link

Programmieren für Fortgeschrittene

Kapitel 4: Formale Verifikation

Programmiersprachen. Organisation und Einführung. Berthold Hoffmann. Studiengang Informatik Universität Bremen

Programmieren in Haskell Programmiermethodik

Gert Smolka Universität des Saarlandes

Transkript:

Entwicklung korrekter Programme in Coq Thomas Strathmann <thomas.strathmann@informatik.uni-oldenburg.de>

Überblick Teil 1 Was ist Coq? Theoretische Grundlagen Programmierung, Spezifikation, Beweise in Coq Teil 2 Vorstellung der Arbeit Entwicklung eines korrekten Übersetzers für eine funktionale Programmiersprache in Coq 2

Coq interaktiver, taktischer, typtheoretischer Theorembeweiser Basis: Kalkül der induktiven Konstruktionen abhängig getypter Lambda-Kalkül konstruktive Typtheorie + induktive Definitionen Programmextraktion 3

Getypter Lambda-Kalkül Formalismus zur Beschreibung berechenbarer Funktionen Grundlage vieler funktionaler Sprachen Terme: jeder Term hat einen Typ: x : T Konstanten und Variablen Funktionsanwendung: (F G) T 1 T 2 Abstraktion: λx : T 1.M: T 2 4

Konstruktive Typtheorie Konstruktive Semantik von Beweisen (Brouwer, Heyting, Kolmogorow) Aussage ist eine Aufgabe; Beweis ist ein Verfahren zum Lösen der Aufgabe Typtheorie: Aussage ist Typ ihres Beweises P ist wahr, gdw. man einen Term t : P konstruieren kann t heißt Beweisterm für P 5

Curry-Howard Korrespondenz Beweisbarkeit der Aussage P Ableitbarkeit von P in einem Kalkül Existenz eines Terms vom Typ P Ableitungen in einem Kalkül natürlichen Schließens für konstruktive Logik entsprechen Termen des einfach getypten Lambda-Kalküls (Howard 1969) Beispiel: Beweis für P Q ist ein Verfahren, das P einen Beweis für Q zu einem Beweis für liefert. Entspricht (λx : P.t: Q) 6

Typhierarchie von Coq... Type1 Type0 Set Prop... nat Z... Jedes Objekt in einer Typtheorie muss einen Typ haben. Deshalb müssen Typen selbst auch einen Typ besitzen. (Typen von Typen werden Sorten genannt.) Folglich gibt es in Coq eine unendliche Hierarchie von Typen. 7

Set und Prop Entsprechung zwischen Mengen (Set) und Propositionen (Prop) Terme in Set sind Spezifikationen für Programme (d.h. als Funktion realisierbar) Terme, deren Typ in Set ist, werden extrahiert Terme in Prop sind logische Aussagen Terme, deren Typ in Prop ist (= Beweise), werden bei Extraktion entfernt 8

Induktive Definitionen Induktive Definitionen modellieren (generalisierte) algebraische Datentypen und Relationen Beispiel: Natürliche Zahlen (Peano) Inductive nat : Set := O : nat succ : nat -> nat. 9

Rekursive Funktionen keine partiellen Funktionen vollständiges Pattern Matching auf Konstruktoren induktiver Datentypen nur terminierende Funktionen (syntaktische Terminierungsprüfung) Strukturelle Rekursion: ein Funktionsargument muss bei jedem rekursiven Aufruf strukturell kleiner werden; Aufruf nur mit Teilterm erlaubt 10 Strukturelle Induktion ist ein Spezialfall der fundierten Induktion (auch Noethersche Induktion genannt). Coq unterstützt auch fundierte Induktion/Rekursion für Fälle, in denen sich eine Funktion nicht strukturell rekursive ausdrücken kann. Die wesentliche Idee hierbei ist, Terminierung dadurch zu zeigen, dass ein Maß (im mathematischen Sinne eine Norm) der Argumente bei jedem rekursiven Aufruf streng monoton fallend ist, also eine absteigende Kette bildet.

Funktion: Beispiel Fixpoint add (n m:nat) : nat := match n with O => m succ n => add n (succ m) end. Terminierung: Rekursiver Aufruf mit strukturell kleinerem Argument n 11

Beweise: Grundlagen Beweisvorgang eingeleitet durch Angabe eines Beweisziels (Goal) Beispiel: Goal forall n m:nat, n+m = m+n. Kontext mit Hypothesen H 1,...,H n Ziel G werden soll, aus denen das durch Anwendung von Taktiken hergeleitet H 1 : P 1 H 2 : P 2... H n : P n G : P Die interaktiven Beweise sind insofern imperativ als sie einen Zustand, den Kontext, verändern. 12

Beweise: Taktiken führen Beweisschritte aus (imperativ) Programmiersprache L tac Kontrollfluss-Operationen: try, repeat, orelse, fail, idtac... Pattern Matching auf (Teiltermen von) Ziel und Hypothesen Verbesserte Wartung durch Taktiken, die robust gegenüber Änderungen der Formalisierung sind 13

Beweise: Beispiel Lemma add_unit_right: n:nat, add n O = n. Proof. induction n as [ n ]. Case n = O. reflexivity. Case n = succ n. simpl. rewrite IHn. reflexivity. Qed. 14

Relationen Relation ρ A B gdw. A ρ B als Aussage auffassen, die wahr ist Beispiel: Relation < auf natürlichen Zahlen Inductive less_than : nat nat Prop := lt_base : less_than O (succ O) lt_succ : n m : nat, less_than n m less_than (succ n)(succ m) lt_pred : n m : nat, less_than (succ n) m -> less_than n m. 15

Relationen (forts.) Example lt1_4: less_than (succ O) (succ (succ (succ (succ O)))). apply lt_pred. apply lt_pred. repeat apply lt_succ. apply lt_o. Qed. 16

Für die Haskellianer: Das Paper Faking It von Conor McBride beschreibt eine Codierung abhängiger Typen in Haskell. Abhängige Typen Mit Termen indizierte Typfamilien statische Typüberprüfung statt dynamischer Prüfung und Laufzeitfehlern Funktionstypen mit Vor- und Nachbedingungen Datentypen, deren Instanzen per constructionem Invariaten erfüllen Beispiel: längenindizierte Listen Inductive vector {A:Set} : nat! Set := Vnil : vector O Vcons : A! n : nat, vector n! vector (succ n). Abhängige Typen (dependent types) stammen aus der Typtheorie von Martin-Löf, die als Basis für die Formalisierung der gesamten konstruktiven Mathematik entwickelt wurde. Allerdings gab es die Idee der abhängigen Typen schon in der Untersuchung der Kombinatorlogik durch Curry. 17

Beispiel: Spezifikation Spezifkation der Funktion head: forall (A:Type) (l:list A) : Vorbedingung length l > 0 -> { l' : list A & { x : A l = x :: l' } }. Nachbedingung Eingabe: Liste l und Beweis für length l>0 Ausgabe: l und x sowie Beweis der Nachbedingung Es handelt sich um einen abhängigen Funktionstyp, da er von einem Beweis der Vorbedingung abhängt. Dieser Beweis wird (weil sein Typ in Prop ist) bei der Extraktion entfernt. Für die praktische Verwendung der Funktion schreibt man dann einen Wrapper, der nur das Head-Element x zurückliefert, nicht aber die Liste l. 18

Beispiel: Beweis Definition head (A:Type) (l:list A) : length l > 0 -> { l' : list A & { x : A l = x :: l' } }. intros. induction l. contradict H. compute. intros. inversion H. exists l. exists a. reflexivity. Qed. 19

Ende Teil 1 Fragen soweit? 20

Implementierung eines korrekten Übersetzers Formale Methoden wertlos, wenn Übersetzer fehlerhaft Compilerverifikation noch sehr aufwändig Beispiel: CompCert: 42.000 Zeilen Coq (14% Compiler, 10% Semantik, 76% Beweis) rein-funktionale Sprachen haben einfacherere Semantik => besser geeignet für eine Diplomarbeit 21

Entscheidungen Quellsprache: Syntax und Semantik Welche Sprache? Termrepräsentation in Coq? Zielarchitektur Maschinenmodell Übersetzung Welche Art Semantik? Wie formalisieren? 22

Vorgehen Formalisieren der Quellsprache interessante Punkte: Implementierung der Zielarchitektur Implementierung der Übersetzungsschritte Korrektheitsbeweis: Übersetzung erhält Semantik Automatisierung der Beweise Auswirkung von Semantik und Termrepräsentation 23

Vielen Dank für die Aufmerksamkeit! Fragen/Anregungen? 24