Beweise von Programmeigenschaften Programmierparadigmen Beweise von Programmeigenschaften D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg c Sommer 2014, 15. April 2014, 2011-14 D.Rösner D. Rösner PGP 2014 . . . 1 Beweise von Programmeigenschaften Gliederung 1 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele D. Rösner PGP 2014 . . . 2 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweis von Programmeigenschaften Wie kann man sich über Eigenschaften von Programmen Klarheit verschaffen? ein Weg sind formale Beweise funktionale Sprachen wie Haskell sind hierfür besonders geeignet die definierenden Gleichungen können beim Schlussfolgern über Programme genutzt werden D. Rösner PGP 2014 . . . 4 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweis von Programmeigenschaften wir betrachten meist universelle, d.h. allquantifizierte Aussagen über Eigenschaften von Programmen Beispiel: für alle endlichen Listen xs gilt: rev (rev xs) == xs wichtige Unterscheidung: um solche allquantifizierten Aussagen zu widerlegen, reicht ein Gegenbeispiel um solche allquantifizierten Aussagen zu belegen, benötigen wir einen Beweis D. Rösner PGP 2014 . . . 5 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweis von Programmeigenschaften Beachte: Beispiele können Beweise nicht ersetzen Beispiel einer (unzutreffenden) Behauptung: für alle endlichen Listen xs gilt: rev xs == xs für manche Listen trifft die Behauptung zwar zu: rev rev rev rev rev ... [] == [] [1] == [1] [x] == [x] -- x beliebig [x,x] = [x,x] -- x beliebig [x,y,x] = [x,y,x] -- x,y beliebig 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 2014 . . . 6 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Prinzip der strukturellen Induktion für Listen: um zu beweisen, dass eine logische Eigenschaft P(xs) für alle endlichen Listen xs gilt, sind zwei Dinge zu tun Induktionsanfang oder -basis: Beweise P([]) direkt Induktionsschritt: 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 s.a. [Tho99] D. Rösner PGP 2014 . . . 7 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beispiel für Beweis einer Programmeigenschaft Gegeben seien die folgenden Definitionen: sum :: [Int] -> Int sum [] = 0 sum (x:xs) = x + sum xs -- 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: sum (doubleAll xs) = 2*sum xs D. Rösner PGP 2014 . . . 9 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweis einer Programmeigenschaft cont. Struktur des Beweises: Induktionsbasis: Beweise, dass sum (doubleAll []) = 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) D. Rösner PGP 2014 . . . 10 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweis einer Programmeigenschaft cont. Induktionsbasis: Linke Seite: sum(doubleAll []) = sum [] = 0 ... (doubleAll.1) ... (sum.1) Rechte Seite: 2*sum [] = 2 * 0 = 0 Damit: Induktionsbasis bestätigt D. Rösner PGP 2014 . . . ... (sum.1) 11 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweis einer Programmeigenschaft cont. Induktionsschritt: sum (doubleAll (x:xs)) = sum (2*x : doubleAll xs) ... (doubleAll.2) = 2*x + sum(doubleAll xs) = 2*x + 2*sum xs ... (sum.2) ... (hyp) = 2*(x + sum xs) ... Arithmetik = 2* sum (x:xs) ... (sum.2) q.e.d. D. Rösner PGP 2014 . . . 12 Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweise von Programmeigenschaften weitere Beispiele für Induktionsbeweise Behauptung: für alle endlichen Listen xs und ys gilt length (xs ++ ys) = length xs + length ys Dabei gelten die folgenden Definitionen: length [] length (z:zs) = 0 = 1 + length zs [] ++ zs = zs (w:ws) ++ zs = w : (ws ++ zs) D. Rösner PGP 2014 . . . -- length.1 -- length.2 -- ++.1 -- ++.2 13 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele weitere Induktionsbeweise cont. Struktur des Beweises: Induktionsbasis: Beweise, dass length ([] ++ ys) = length [] + length ys --(base) Induktionsschritt: Beweise, dass length ((x:xs) ++ ys) = length (x:xs) + length ys --(ind) unter der Induktionshypothese length (xs ++ ys) = length xs + length ys --(hyp) D. Rösner PGP 2014 . . . 14 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele weitere Induktionsbeweise cont. Sei reverse definiert durch: reverse [] = [] reverse (z:zs) = reverse zs ++ [z] (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 2014 . . . 15 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele weitere Induktionsbeweise cont. Struktur des Beweises für Beziehung (reverse++): Induktionsbasis: Beweise, dass .................................. .................................. Induktionsschritt: Beweise, dass .................................. .................................. unter der Induktionshypothese .................................. .................................. D. Rösner PGP 2014 . . . 16 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Ausführung des Beweises s. Übungen D. Rösner PGP 2014 . . . 17 Beweise von Programmeigenschaften 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 (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 2014 . . . 19 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Schlussfolgern über Programme Prinzip der Extensionalität: zwei Funktionen f und g sind gleich, wenn sie für jedes Argument jeweils den selben Wert haben Kontrast: Prinzip der Intensionalität: zwei Funktionen f und g sind nur gleich, wenn sie die selben Definitionen haben D. Rösner PGP 2014 . . . 20 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Schlussfolgern über Programme Beispiel: Verküpfung zwischen map und Funktionskomposition Behauptung: für alle endlichen Listen xs gilt: map (f.g) xs = (map f . map g) xs -- map.3 Beweis: strukturelle Induktion verfügbare Gleichungen: 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 2014 . . . 21 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beispiel cont. 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) (ind) unter der Induktionshypothese map (f.g) xs = (map f . map g) xs (hyp) Durchführung des Beweises: .............................................. .............................................. .............................................. D. Rösner PGP 2014 . . . 22 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweistechnik: Gegenbeispiel 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 foldr1 f (x:xs) = foldr f x xs (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 2014 . . . 24 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweistechnik: Gegenbeispiel 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"] foldr (++) "a" ["b","c","d"] foldr1 (^) [2,3] foldr (^) 2 [3] Frage: Welche Forderungen muss f erfüllen, damit (foldr1.0) gilt? D. Rösner PGP 2014 . . . 25 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beispiel: foldr1 und foldr Behauptung: für alle endlichen Listen xs und assoziative und kommutative Funktionen f gilt: foldr1 f (x:xs) = foldr f x xs D. Rösner PGP 2014 . . . 26 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beispiel: foldr1 und foldr Struktur des Beweises: Induktionsbasis: Beweise, dass .................................. Induktionsschritt: Beweise, dass .................................. unter der Induktionshypothese .................................. D. Rösner PGP 2014 . . . 27 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Beweistechnik: Gegenbeispiel Nachtrag: in [Tho11], p. 223 findet sich – ohne Bedingungen an die Funktion f zu formulieren – die folgende Behauptung: . . . We can also define foldr1 from foldr, like this foldr1 f xs = foldr f (last xs) (init xs) (fold where last gives the last element of a list and init removes that element. Können Sie diese Behauptung beweisen? D. Rösner PGP 2014 . . . 28 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Literatur: I Graham Hutton. Programming in Haskell. Cambridge University Press, 2006. ISBN 0521692695. 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. D. Rösner PGP 2014 . . . 29 Beweise von Programmeigenschaften Einleitung Beispiele auf Funktionsebene Gegenbeispiele Literatur: II Simon Thompson. Haskell - the craft of functional programming. Pearson Education Ltd., Essex, 2011. 3rd edition, ISBN 978-0-201-88295-7; Accompanying Web site: http://www.haskellcraft.com. D. Rösner PGP 2014 . . . 30