ALP I Induktion und Rekursion WS 2012/2013
Vollständige Induktion (Mafi I) Die Vollständige Induktion ist eine mathematische Beweistechnik, die auf die Menge der natürlichen Zahlen spezialisiert ist. Vorgehensweise: 1. Induktionsanfang Text Text Man zeigt die Behauptung für k = 1 bzw. k = 0 2. Induktionsschritt Man nimmt an, die Aussage sei für dass die Aussage für k+1 wahr ist. wahr und zeigt damit, Wenn beide Schritte erfolgreich durchgeführt wurden, ist die Behauptung für alle natürlichen Zahlen gezeigt.
Beispiel: Vollständige Induktion Vermutung: Die Summe der ersten n ungeraden Zahlen ist gleich n 2 n i=1 Motivation: 2(i 1) + 1 = n 2 n i=1 2i 1 = n 2 1 = 1 + 3 = 1 + 3 + 5 = 1 + 3 + 5 + 7 =... 1 2 2 2 3 2 4 2
Vollständige Induktion (Mafi I) Beweis per vollständiger Induktion: Induktionsanfang: für n = 1 Induktionsschritt: wir nehmen an, dass für n = k dann für n = k+1: k +1 i=1 1 i=1 2i 1 = 2 i 1 = 2 1 1 = 1 = 1 2 k i=1 k i=1 2i 1 = k 2 = k 2 + 2 k + 2 1 = k 2 + 2 k + 1 = (k + 1) 2 2i 1 + 2 (k + 1) 1 daraus folgt, dass die Vermutung für alle n gilt.
Baumeigenschaften und Vollständige Induktion Definition: a) Ein einzelner Blatt-Knoten ist ein Baum o b) Falls t 1, t 2,,t m Bäume sind, dann ist ihre Verknüpfung unter einem Knoten o auch ein Baum ( o t 1, t 2,,t m ) o t 1 t 2... t m Ein Baum ist balanciert, falls er ein Blatt oder von der Form ( o t 1, t 2,,t m ) ist, wobei t 1, t 2,,t m balanciert und von derselben Tiefe sind.
Behauptung: Induktion über Bäume Ein balancierter m-baum (Baum mit maximal m Kindern pro Knoten) mit m>1 und Tiefe n hat Motivation: Tiefe 0 o Tiefe 1 o o o Tiefe 2 Tiefe n t 1 t 2...t m... t 1 t 2... t m.
Induktion über Bäume 1. Induktionsanfang mit Tiefe n = 0 K = Knoten = 2. Induktionsannahme mit Tiefe n = k, K = mk +1 1 m 1 3. Induktionsschritt Tiefe n = k+1 K = mk +1 1 m 1 +m k m = mk +1 1+ (m k +1 ) (m 1) m 1 = mk +2 1 m 1 = m(k +1)+1 1 m 1 = mk +1 1 m 1 + mk +1 = mk +1 1+ m k +2 m k +1 m 1 K = mn+1 1 m 1
Vollständige Induktion Weitere Beispiele an der Tafel!
Vollständige Induktion factorial 0 = 1 factorial n = n * factorial (n-1) endrecfactorial n = fact_helper 1 n where fact_helper a 0 = a fact_helper a n = fact_helper (a*n) (n-1)? factorial = endrecfactorial
Zu beweisen ist: factorial = endrecfactorial Für unseren Beweis müssen wir folgende Eigenschaft der fact_helper-funktion per Induktion über n zeigen. fact_helper c n = c * factorial n e.1 Induktionsanfang: für n = 0 fact_helper c 0 = c = c * 1 = c * factorial 0 fact_helper.1 factorial.1 Induktionsannahme: fact_helper c k = c * factorial k Induktionsschritt: für n = k+1 fact_helper c (k+1) = fact_helper (c*(k+1)) k = c* (k+1) * factorial k = c * factorial (k+1)
fact_helper c n = c * factorial n e.1 factorial 0 = 1 factorial n = n * factorial (n-1). factorial.1. factorial.2 endrecfactorial n = fact_helper 1 n where fact_helper a 0 = a endrecfactorial.1 fact_helper a n = fact_helper (a*n) (n-1) fact_helper.1.. fact_helper.2 1. Induktionsanfang n = 0? factorial 0 = endrecfactorial 0 factorial 0 = 1 factorial.1 = factorial_helper 1 0 factorial_helper.1 = endrecfactorial 0 endrecfactorial.1
fact_helper c n = c * factorial n e.1 factorial 0 = 1 factorial n = n * factorial (n-1). factorial.1. factorial.2 endrecfactorial n = fact_helper 1 n where fact_helper a 0 = a endrecfactorial.1 fact_helper a n = fact_helper (a*n) (n-1) fact_helper.1.. fact_helper.2 Induktions-Annahme factorial k = endrecfactorial k 2. Induktionsschritt factorial (k+1) für n = k+1 = (k+1) * factorial k factorial.2 = fact_helper (1*(k+1)) k e.1 = fact_helper 1 (k+1) fact_helper.2 = endrecfactorial (k+1) endrecfactorial.1 factorial = endrecfactorial
Berechnung der Fibonacci-Zahlen 1. Lösung fib 0 = 0 fib.0 fib 1 = 1 fib.1 fib n = fib (n-2) + fib (n-1) fib.2 2. Lösung Endrekursive Funktion fib' n = quickfib 0 1 n where quickfib.1 quickfib a b 0 = a quickfib a b n = quickfib b (a+b) (n-1) quickfib.2
Zu beweisen ist: Vollständige Induktion? fib = fib' fib' n = quickfib 0 1 n fib.1 where quickfib.1 quickfib a b 0 = a quickfib a b n = quickfib b (a+b) (n-1) quickfib.2 Für unseren Beweis müssen wir folgende Eigenschaft der quickfib- Funktion per Induktion über n zeigen. quickfib (fib i) (fib (i+1)) n = fib (i+n) ze.1 Induktionsanfang: für n = 0 quickfib (fib i) (fib (i+1)) 0 = fib i quickfib.1 = fib (i+0)
Induktions-Annahme: n = k quickfib (fib i) (fib (i+1)) k = fib (i+k) Induktionsschritt: quickfib (fib i) (fib (i+1)) (k+1) = fib (i+(k+1)) quickfib (fib i) (fib (i+1)) (k+1)? quickfib.2 fib.2 = quickfib fib (i+1) (fib (i) + fib (i+1)) k = quickfib fib (i+1) (fib ((i+1)+1) k = fib ((i+1) + k) Induktions-Annahme = fib (i + (k+1)) quickfib (fib i) (fib (i+1)) n = fib (i+n) ze.1
Sind fib und fib' äquivalent? Behauptung:? fib = fib' fib' n = quickfib 0 1 n fib.1 where quickfib.1 quickfib a b 0 = a quickfib a b n = quickfib b (a+b) (n-1) quickfib.2 1. Induktionsanfang: n = 0 fib 0 = 0 fib.0 2. Induktionsanfang: n = 1 fib 1 = 1 fib' 0 = quickfib 0 1 0 fib.1 quickfib.2 fib' 1 = quickfib 0 1 1 fib'.1 = 0 quickfib.1 = quickfib 1 1 0 = 1 quickfib.1
Induktionsannahme: ze.1 quickfib (fib i) (fib (i+1)) n = fib (i+n) fib k = fib' k 3. Induktionsschritt:? fib (k+1) = fib' (k+1) fib' (k+1) = quickfib 0 1 (k+1) fib'.1 = quickfib (fib 0) (fib 1) (k+1) fib.0 und fib.1 = fib (0+(k+1)) aus ze.1 = fib (k+1) fib n = fib' n
Strukturelle Induktion Die Strukturelle Induktion ist eine allgemeinere Form der Vollständigen Induktion. Mit diesem mathematischen Beweisverfahren lassen sich Aussagen über die Elemente von rekursiv aufgebauten Datenmengen wie zum Beispiel Listen, Bäumen oder Graphen beweisen. Die Datenmengen, die damit behandelt werden, müssen aus einer endlichen Anzahl von Konstruktionsschritten aus Grundelementen entstehen.
Induktion über Listen Vorgehensweise: 1. Induktionsanfang Man zeigt eine bestimmte Eigenschaft P für die leere Liste [] 2. Induktionsschritt Man zeigt die Eigenschaft P(x:xs) unter der Annahme, dass P(xs) gilt.
Beispiel: Induktion über Listen Nehmen wir an, wir möchten zeigen, dass die Verkettung über Listen assoziativ ist. Definition von (++): (++) :: [a] -> [a] -> [a] (++) [] ys = ys (++) (x:xs) ys = x : (++) xs ys
Behauptung: Induktion über Listen Für alle Listen xs, zs und ys über den Datentyp a gilt die Assoziativität-Eigenschaft: (++) ((++) xs ys) zs = (++) xs ((++) ys zs) oder (xs ++ ys) ++ zs = xs ++ (ys ++ zs)
Definition von (++): Induktion über Listen (++) :: [a] -> [a] -> [a] (++) [] ys = ys (++).1 (++) (x:xs) ys = x : (++) xs ys (++).2 Behauptung: (++) ((++) xs ys) zs = (++) xs ((++) ys zs) Beweis: (Induktion über xs) Induktionsanfang: xs = [] (++) ((++) [] ys) zs = (++) ys zs (++).1 = (++) [] ((++) ys zs) (++).1
Induktionsschritt: Induktion über Listen (++) :: [a] -> [a] -> [a] (++) [] ys = ys (++).1 (++) (x:xs) ys = x : (++) xs ys (++).2? (++) (x:xs) ((++) ys zs) = (++) ((++) (x:xs) ys) zs (++) (x:xs) ((++) ys zs) = x : (++) xs ((++) ys zs) (++).2 = x : (++) ((++) xs ys) zs i.a. = (++) (x:((++) xs ys)) zs (++).2 = (++) ((++) (x:xs) ys) zs (++).2
Vollständige Induktion Weitere Beispiele an der Tafel!
Beispiele endrekursiver Funktionen Klassisches Beispiel einer nicht endrekursiven Definition ist: Die Standarddefinition der reverse-funktion rev :: [a] -> [a] rev [] = [] rev (x:xs) = rev xs ++ [x] (++) :: [a] -> [a] -> [a] (++) [] ys = ys (++) (x:xs) ys = x:(xs ++ ys) Eine effizientere Version von rev: quickrev xs = rev_helper xs [] where rev_helper [] ys = ys rev_helper (x:xs) ys = rev_helper xs (x:ys)
Sind rev und quickrev äquivalent? Zu beweisen ist: Für alle endlichen Listen xs :: [a] gilt: rev = quickrev
Beispiel: Strukturelle Induktion über Bäume data Tree a = Nil Leaf a Node (Tree a) (Tree a) Vorgehensweise: 1. Induktionsanfang 1.1 Wir zeigen eine bestimmte Eigenschaft P für den leeren Baum Nil 1.2 Wir zeigen die Eigenschaft P für ein Blatt (Leaf a) 2. Induktionsschritt Wir zeigen die Eigenschaft P für ( Node l r ) unter der Annahme, dass P für den Teilbaum l und für den Teilbaum r gilt.
Das allgemeine Induktionsschema data T a 1 a 2... a m = C 1 t 11 t 1n1 C 2 t 21 t 2n2... Vorgehensweise: C k t k1 t knk 1. Induktionsanfang 1.1 Wir zeigen eine bestimmte Eigenschaft P für alle Basis-Daten (alle C i ohne Rekursion) 2. Induktionsschritt Wir zeigen die Eigenschaft P für jede rekursive Definition (C i t i1 t ini ) unter der Annahme, dass P für t i1 t ini gilt.