Praktische Informatik 3: Funktionale Programmierung Vorlesung 9 vom 13.12.2016: Spezifikation und Beweis Christoph Lüth Universität Bremen Wintersemester 2016/17 16:02:14 2017-01-17 1 [11] Fahrplan I Teil I: Funktionale Programmierung im Kleinen I Teil II: Funktionale Programmierung im Großen I I Abstrakte Datentypen I Signaturen und Eigenschaften I Spezifikation und Beweis Teil III: Funktionale Programmierung im richtigen Leben PI3 WS 16/17 2 [11] Formaler Beweis I Warum? I I I Formaler Beweis zeigt Korrektheit 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] Eigenschaften I Prädikate: 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 I Sonderfall Gleichungen s == t und transitive Relationen I Prädikate müssen nicht ausführbar sein PI3 WS 16/17 4 [11] Wie beweisen? Beweis I ←→ Gleichungsumformung Fallunterscheidung Induktion I Programmdefinition Funktionsdefinition Fallunterscheidung (Guards) Rekursive Funktionsdefinition Wichtig: formale Notation PI3 WS 16/17 5 [11] Notation Allgemeine Form: Lemma (1) ⇔ ⇔ ⇔ ⇔ PI3 WS 16/17 P P1 P2 ... True Sonderfall Gleichungen: Lemma (2) — Begründung — Begründung = = = = 6 [11] a= b a x1 — Begründung x2 — Begründung ... b Beweis durch vollständige Induktion 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 7 [11] Beweis durch strukturelle Induktion (Listen) Zu zeigen: Für alle endlichen Listen xs gilt P xs Beweis: 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) 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 ) PI3 WS 16/17 9 [11] Beweisstrategien I I Fold-Unfold: I Im Induktionsschritt Funktionsdefinition auffalten I Ausdruck umformen, bis Induktionsvoraussetzung anwendbar I Funktionsdefinitionen zusammenfalten Induktionsvoraussetzung stärken: I I 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] 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]