DAP2 Heimübung 3

Transcription

DAP2 Heimübung 3
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