Fahrplan Praktische Informatik 3: Funktionale Programmierung Vorlesung 9 vom 13.12.2016: Spezifikation und Beweis I Teil I: Funktionale Programmierung im Kleinen I Teil II: Funktionale Programmierung im Großen I Abstrakte Datentypen I Signaturen und Eigenschaften I Spezifikation und Beweis Christoph Lüth Universität Bremen Wintersemester 2016/17 I 16:02:31 2017-01-17 1 [11] Formaler Beweis I PI3 WS 16/17 Eigenschaften I I Prädikate: Formaler Beweis zeigt Korrektheit I Haskell-Ausdrücke vom Typ Bool I Quantifizierte Aussagen: Wenn P :: α→ Bool, dann ist ALL x. P x :: Bool ein Prädikat und EX x. P x :: Bool ein Prädikat Wie? I Formale Notation I Beweisformen (Schließregeln) Wozu? I Formaler Beweis zur Analyse des Algorithmus I Haskell als Modellierungssprache PI3 WS 16/17 3 [11] Wie beweisen? Beweis I I Sonderfall Gleichungen s == t und transitive Relationen I Prädikate müssen nicht ausführbar sein PI3 WS 16/17 4 [11] Notation ←→ Gleichungsumformung Fallunterscheidung Induktion I 2 [11] Warum? I I Teil III: Funktionale Programmierung im richtigen Leben Programmdefinition Funktionsdefinition Fallunterscheidung (Guards) Allgemeine Form: Lemma (1) ⇔ ⇔ ⇔ ⇔ Sonderfall Gleichungen: P P1 P2 ... True Rekursive Funktionsdefinition Lemma (2) — Begründung — Begründung = = = = a= b a x1 — Begründung x2 — Begründung ... b Wichtig: formale Notation PI3 WS 16/17 5 [11] Beweis durch vollständige Induktion PI3 WS 16/17 Beweis durch strukturelle Induktion (Listen) Zu zeigen: Zu zeigen: Für alle natürlichen Zahlen x gilt P(x ). Beweis: I Induktionsbasis: P(0) I Induktionsschritt: I Induktionsvoraussetzung P(x ) I zu zeigen P(x + 1) PI3 WS 16/17 6 [11] Für alle endlichen Listen xs gilt P xs Beweis: 7 [11] I Induktionsbasis: P [ ] I Induktionsschritt: I Induktionsvoraussetzung P xs I zu zeigen P (x: xs) PI3 WS 16/17 8 [11] Beweis durch strukturelle Induktion (Allgemein) Beweisstrategien I Fold-Unfold: Zu zeigen: Für alle x in T gilt P(x ) Beweis: I Für jeden Konstruktor Ci : I Voraussetzung: für alle ti,j gilt P(ti,j ) I zu zeigen P(Ci ti,1 . . . ti,ki ) I I Im Induktionsschritt Funktionsdefinition auffalten I Ausdruck umformen, bis Induktionsvoraussetzung anwendbar I Funktionsdefinitionen zusammenfalten Induktionsvoraussetzung stärken: I I PI3 WS 16/17 9 [11] Zusammenfassung I I I Beweise beruhen auf: I Gleichungs- und Äquivalenzumformung I Fallunterscheidung I Induktion Beweisstrategien: I Sinnvolle Lemmata I Fold/Unfold I Induktionsvoraussetzung stärken Warum Beweisen? I Korrektheit von Haskell-Programmen I Haskell als Modellierungssprache PI3 WS 16/17 11 [11] Stärkere Behautung =⇒ stärkere Induktionsvoraussetzung, daher: um Behauptung P zu zeigen, stärkere Behauptung P 0 zeigen, dann P als Korollar PI3 WS 16/17 10 [11]