Beweise von Programmeigenschaften Beweise von Programmeigenschaften Gliederung Programmierparadigmen Beweise von Programmeigenschaften 1 D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele c Sommer 2011, 11. April 2011, 2011 D.Rösner D. Rösner PGP 2011 . . . Beweise von Programmeigenschaften 1 Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweise von Programmeigenschaften Beweis von Programmeigenschaften 2 Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweis von Programmeigenschaften wir betrachten meist universelle, d.h. allquantifizierte Aussagen über Eigenschaften von Programmen Wie kann man sich über Eigenschaften von Programmen Klarheit verschaffen? Beispiel: für alle endlichen Listen xs gilt: ein Weg sind formale Beweise rev (rev xs) == xs funktionale Sprachen wie Haskell sind hierfür besonders geeignet wichtige Unterscheidung: die definierenden Gleichungen können beim Schlussfolgern über Programme genutzt werden D. Rösner PGP 2011 . . . D. Rösner PGP 2011 . . . um solche allquantifizierten Aussagen zu widerlegen, reicht ein Gegenbeispiel um solche allquantifizierten Aussagen zu belegen, benötigen wir einen Beweis 4 D. Rösner PGP 2011 . . . 5 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweise von Programmeigenschaften Beweis von Programmeigenschaften Prinzip der strukturellen Induktion für Listen: Beachte: Beispiele können Beweise nicht ersetzen Beispiel einer (unzutreffenden) Behauptung: um zu beweisen, dass eine logische Eigenschaft P(xs) für alle endlichen Listen xs gilt, sind zwei Dinge zu tun für alle endlichen Listen xs gilt: rev xs == xs für manche Listen trifft die Behauptung zwar zu: rev rev rev rev rev ... Induktionsanfang oder -basis: Beweise P([]) direkt Induktionsschritt: [] == [] [1] == [1] [x] == [x] -- x beliebig [x,x] = [x,x] -- x beliebig [x,y,x] = [x,y,x] -- x,y beliebig Beweise P(x:xs) unter der Annahme, dass P(xs) gilt m.a.W.: es ist zu zeigen, dass P(xs) ⇒ P(x:xs) dabei: P(xs) . . . Induktionshypothese oder Induktionsannahme die Behauptung gilt aber nicht für alle endlichen Listen xs ein Gegenbeispiel reicht aus, z.B.: rev [1,2] == [2,1] /= [1,2] D. Rösner PGP 2011 . . . Beweise von Programmeigenschaften s.a. [Tho99] D. Rösner PGP 2011 . . . 6 Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweise von Programmeigenschaften Beispiel für Beweis einer Programmeigenschaft 7 Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweis einer Programmeigenschaft cont. Gegeben seien die folgenden Definitionen: sum :: [Int] -> Int sum [] = 0 sum (x:xs) = x + sum xs Einleitung Beispiele auf Funktionsebene Gegenbeispiele Struktur des Beweises: Induktionsbasis: Beweise, dass sum (doubleAll []) -- sum.1 -- sum.2 doubleAll :: [Int] -> [Int] doubleAll [] = [] -- doubleAll.1 doubleAll (z:zs) = 2*z : doubleAll zs -- doubleAll.2 Behauptung: für alle endlichen Listen xs ganzer Zahlen gilt: = 2 * sum[] --(base) Induktionsschritt: Beweise, dass sum (doubleAll (x:xs)) = 2 * sum (x:xs) --(ind) unter der Induktionshypothese sum (doubleAll xs) = 2 * sum xs --(hyp) sum (doubleAll xs) = 2*sum xs D. Rösner PGP 2011 . . . 9 D. Rösner PGP 2011 . . . 10 Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweise von Programmeigenschaften Beweise von Programmeigenschaften Beweis einer Programmeigenschaft cont. Beweis einer Programmeigenschaft cont. Induktionsbasis: Induktionsschritt: Linke Seite: sum (doubleAll (x:xs)) sum(doubleAll []) = sum [] = 0 ... (doubleAll.1) ... (sum.1) Rechte Seite: 2*sum [] = 2 * 0 = 0 Damit: Induktionsbasis bestätigt ... (sum.1) Einleitung Beispiele auf Funktionsebene Gegenbeispiele ... (hyp) = 2* sum (x:xs) ... (sum.2) ... (sum.2) ... Arithmetik D. Rösner PGP 2011 . . . Beweise von Programmeigenschaften 12 Einleitung Beispiele auf Funktionsebene Gegenbeispiele weitere Induktionsbeweise cont. Struktur des Beweises: Behauptung: für alle endlichen Listen xs und ys gilt = = 2*x + sum(doubleAll xs) = 2*x + 2*sum xs = 2*(x + sum xs) 11 weitere Beispiele für Induktionsbeweise length (xs ++ ys) = sum (2*x : doubleAll xs) ... (doubleAll.2) q.e.d. D. Rösner PGP 2011 . . . Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Induktionsbasis: Beweise, dass length xs + length ys length ([] ++ ys) = length [] + length ys --(base) Dabei gelten die folgenden Definitionen: length [] length (z:zs) = 0 = 1 + length zs Induktionsschritt: Beweise, dass -- length.1 -- length.2 length ((x:xs) ++ ys) = length (x:xs) + length ys --(ind) unter der Induktionshypothese [] ++ zs = zs (w:ws) ++ zs = w : (ws ++ zs) D. Rösner PGP 2011 . . . -- ++.1 -- ++.2 length (xs ++ ys) = length xs + length ys --(hyp) 13 D. Rösner PGP 2011 . . . 14 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweise von Programmeigenschaften weitere Induktionsbeweise cont. weitere Induktionsbeweise cont. Struktur des Beweises für Beziehung (reverse++): Sei reverse definiert durch: reverse [] = [] reverse (z:zs) = reverse zs ++ [z] Induktionsbasis: Beweise, dass .................................. .................................. Induktionsschritt: Beweise, dass .................................. .................................. unter der Induktionshypothese .................................. .................................. (reverse.1) (reverse.2) Behauptung: für alle endlichen Listen xs und ys gilt (reverse++), d.h. reverse (xs ++ ys) = reverse ys ++ reverse xs D. Rösner PGP 2011 . . . Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele 15 Einleitung Beispiele auf Funktionsebene Gegenbeispiele D. Rösner PGP 2011 . . . Beweise von Programmeigenschaften Ausführung des Beweises 16 Einleitung Beispiele auf Funktionsebene Gegenbeispiele Schlussfolgern über Programme: Beweise auf Funktionsebene (vgl. [Tho99],10.9) Beispiel: f . id = f (compId) Beweis: für bel. Argument x gilt s. Übungen (f . id) x = f (id x) (Def. . ) = f x (Def. id) m.a.W. von ihrer Wirkung her sind die Funktionen f . id und f für alle x identisch D. Rösner PGP 2011 . . . 17 D. Rösner PGP 2011 . . . 19 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweise von Programmeigenschaften Schlussfolgern über Programme Einleitung Beispiele auf Funktionsebene Gegenbeispiele Schlussfolgern über Programme Beispiel: Verküpfung zwischen map und Funktionskomposition Behauptung: für alle endlichen Listen xs gilt: Prinzip der Extensionalität: zwei Funktionen f und g sind gleich, wenn sie für jedes Argument jeweils den selben Wert haben map (f.g) xs = (map f . map g) xs -- map.3 Beweis: strukturelle Induktion verfügbare Gleichungen: Kontrast: Prinzip der Intensionalität: zwei Funktionen f und g sind nur gleich, wenn sie die selben Definitionen haben map f [] = [] -- map.1 map f (x:xs) = f x : map f xs -- map.2 (f.g) x -- comp.1 = f (g x) ... D. Rösner PGP 2011 . . . Beweise von Programmeigenschaften 20 Einleitung Beispiele auf Funktionsebene Gegenbeispiele D. Rösner PGP 2011 . . . Beweise von Programmeigenschaften Beispiel cont. 21 Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweistechnik: Gegenbeispiel Induktionsbasis: Beweise, dass map (f.g) [] = (map f . map g) [] (base) Induktionsschritt: Beweise, dass map (f.g) (x:xs) = (map f . map g) (x:xs) foldr1 f (x:xs) = foldr f x xs (ind) unter der Induktionshypothese map (f.g) xs = (map f . map g) xs (hyp) Durchführung des Beweises: .............................................. .............................................. .............................................. D. Rösner PGP 2011 . . . in [Tho99], p. 162 findet sich – ohne Bedingungen an die Funktion f zu formulieren – die folgende Behauptung: . . . We can also define foldr1 from foldr, thus 22 (foldr1.0) Diese Behauptung erscheint zunächst plausibel, denn es gilt u.a.: Prelude> 6 Prelude> 6 Prelude> 120 Prelude> 120 foldr1 (+) [1,2,3] foldr (+) 1 [2,3] foldr1 (*) [1 .. 5] foldr (*) 1 [2 .. 5] D. Rösner PGP 2011 . . . 24 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweise von Programmeigenschaften Beweistechnik: Gegenbeispiel Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beispiel: foldr1 und foldr Gegenbeispiele machen deutlich, dass (foldr1.0) zumindest nicht für alle (beliebigen) Funktionen f gilt: Prelude> "abcd" Prelude> "bcda" Prelude> 8 Prelude> 9 foldr1 (++) ["a","b","c","d"] Behauptung: für alle endlichen Listen xs und assoziative und kommutative Funktionen f gilt: foldr (++) "a" ["b","c","d"] foldr1 (^) [2,3] foldr1 f (x:xs) foldr = foldr f x xs (^) 2 [3] Frage: Welche Forderungen muss f erfüllen, damit (foldr1.0) gilt? D. Rösner PGP 2011 . . . Beweise von Programmeigenschaften 25 Einleitung Beispiele auf Funktionsebene Gegenbeispiele D. Rösner PGP 2011 . . . Beweise von Programmeigenschaften Beispiel: foldr1 und foldr 26 Einleitung Beispiele auf Funktionsebene Gegenbeispiele Literatur: I Struktur des Beweises: Induktionsbasis: Beweise, dass Graham Hutton. Programming in Haskell. Cambridge University Press, 2006. ISBN 0521692695. .................................. Induktionsschritt: Beweise, dass Simon Thompson. Haskell - The Craft of Functional Programming. Addison Wesley Longman Ltd., Essex, 1999. 2nd edition, ISBN 0-201-34275-8; Accompanying Web site: http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e. .................................. unter der Induktionshypothese .................................. D. Rösner PGP 2011 . . . 27 D. Rösner PGP 2011 . . . 28