Programmierparadigmen - Beweise von Programmeigenschaften

Werbung
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 2011, 11. April 2011, 2011
D.Rösner
D. Rösner PGP 2011 . . .
1
Beweise von Programmeigenschaften
Gliederung
1
Beweise von Programmeigenschaften
Einleitung
Beispiele
auf Funktionsebene
Gegenbeispiele
D. Rösner PGP 2011 . . .
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 2011 . . .
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 2011 . . .
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 2011 . . .
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 2011 . . .
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 2011 . . .
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 2011 . . .
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 2011 . . .
... (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 2011 . . .
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 2011 . . .
-- 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 2011 . . .
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 2011 . . .
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 2011 . . .
16
Beweise von Programmeigenschaften
Einleitung
Beispiele
auf Funktionsebene
Gegenbeispiele
Ausführung des Beweises
s. Übungen
D. Rösner PGP 2011 . . .
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 2011 . . .
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 2011 . . .
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 2011 . . .
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 2011 . . .
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 2011 . . .
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 2011 . . .
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 2011 . . .
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 2011 . . .
27
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 2011 . . .
28
Herunterladen