SoSe 2015 C. Sohler J. Flake, A. Krivo²ija R. Penninger, B. Rudak, V.Volz DAP2 Heimübung 3 Ausgabedatum: 17.4.15 Abgabedatum: Fr. 24.4.15 (Mo. 27.4. für Gruppen 26-31) 12 Uhr (Schleifeninvariante und Korrektheitsbeweis) Betrachten Sie das folgende Programm. Das Programm erhält als Eingabe ein Array mit n Zahlen aus N. EinfachesProgramm(Array A[1..n]): 1 n ← length[A] 2 v←0 3 for i ← 1 to n do 4 if A[i] mod 2 = 1 then 5 A[i] ← A[i]+1 6 v ← v+A[i] Aufgabe 3.1 (5 Punkte): 7 return v Beweisen Sie, dass das Programm eine gerade Zahl ausgibt. Gehen Sie folgendermaÿen vor: a) Formulieren Sie eine Schleifeninvariante, die nach jedem Durchlauf der obigen Schleife gilt, und beweisen Sie sie mittels vollständiger Induktion. b) Verwenden Sie dann die Schleifeninvariante, um zu zeigen, dass das Programm eine gerade Zahl ausgibt. Lösung: a) Die Invariante ist: Die Variable v enthält eine gerade Zahl. Wir beweisen sie mittels vollständiger Induktion. (I.A.) Wenn i = 1 ist, sollten wir den Schleifenrumpf einmal durchlaufen, um die Invariante zu verizieren. In der Zeile 2 wird v ← 0 initialisiert. Wenn A[1] ungerade ist, ist die Bedingung in der Zeile 4 wahr. Aber dann ist A[1] + 1 eine gerade Zahl, und in der Zeile 5 wird A[1] gerade. In der Zeile 6 kriegt v den Wert 0 + A[i], was eine gerade Zahl ist. Somit ist die Invariante korrekt für i = 1. (I.V.) Die Variable v enthält eine gerade Zahl nach der i -ten Schleifeniteration, wenn i beliebig ausgewählt, aber fest ist. 0 0 1 Sei i = i + 1. Wenn A[i] mod 2 = 1 in der Zeile 4 ist, ist A[i] + 1 mod 2 = 0, und der neue Wert von A[i] ← A[i]+1 ist auch gerade. Nach der Induktionsvoraussetzung ist v nach der i -ten Schleifeniteration gerade. Somit ist die Summe v + A[i] auch gerade (Zeile 6) und diese Wert wird zur Variable v (in der Zeile 6) zugewiesen. Die Invariante gilt somit auch wenn i = i + 1 ist. Nach dem Prinzip der vollständigen Induktion gilt die Behauptung der Schleifeninvariante für alle natürlichen Zahlen i ∈ N. b) Die Invariante gilt für alle natürlichen Zahlen i, somit gilt auch für i = n + 1 am Ende der Schleife. Dieser geraden Wert der Variable v wird in der Zeile 7 des Programms zurückgegeben. Damit haben wir bewiesen, dass das Programm eine gerade Zahl ausgibt. (I.S.) 0 0 0 (Korrektheitsbeweis mit Rekursion) Betrachten Sie das folgende rekursive Programm, das eine natürliche Zahl n erhält. BerechneWas(n): 1 if n=1 then 2 return 1 3 else 4 return 2n − 1 + BerechneWas(n − 1) Stellen Sie eine Behauptung auf, was dieses Programm für eine eingegebene natürliche Zahl n berechnet, und beweisen Sie die Korrektheit Ihrer Behauptung mittels vollständiger Induktion. Aufgabe 3.2 (5 Punkte): Lösung: Das Programm BerechneWas berechnet den Wert n , wenn eine natürliche Zahl n eingegeben wird. Wir beweisen die Behauptung mittels vollständiger Induktion. (I.A.) Wenn n = 1 ist, wird die Bedingung in der Zeile 1 erfüllt. Der Wert 1 wird in der Zeile 2 zurückgegeben. Da 1 = 1 ist, gilt die Behauptung für n = 1. (I.V.) Es gelte dass das Programm BerechneWas den Wert n berechnet, wenn eine beliebige aber feste natürliche Zahl n eingegeben ist. (I.S.) Sei n = n + 1 > 1. Die Behauptung in der Zeile 1 ist falsch. Nach der Induktionsvoraussetzung gilt es dass BerechneWas(n − 1) = BerechneWas(n ) = n ist. Es wird der Wert 2n − 1 + BerechneWas(n − 1) in der Zeile 4 zurückgegeben. D.h. 2n − 1 + BerechneWas(n − 1) = 2 (n + 1) − 1 + n = n + 2n + 1 = (n + 1) = n wird zurückgegeben, d.h. die Behauptung gilt auch für n. Nach dem Prinzip der vollständigen Induktion gilt die Behauptung für alle natürliche Zahlen n ∈ N. Behauptung: 2 2 2 0 0 0 0 2 0 0 2 0 2 0 2 0 0 2 2
© Copyright 2024