Programmierparadigmen - Beweise von Programmeigenschaften

Werbung
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
Herunterladen