Algorithmen und Programmierung II Aufgabe 11.1

Werbung
Algorithmen und Programmierung II
Musterlösung Übung 11
Prof. Dr. H. Schweppe, Ingo Dageförde, Maurice Wolter
SS 2008
Aufgabe 11.1
{P }(S){Q}
a)
{P }(x = 2 ∗ y + 3; , {x = 13})
Substitution:
13 = 2 ∗ y + 3 ⇔ y = 5
⇒ P := y = 5
b)
{P }(x = x ∗ y; , {x ∗ y = const})
Substitution:
const
y
= x ∗ y ⇔ x ∗ y 2 = const
⇒ P := x ∗ y 2 = const.
c)
{P }(t = x; x = y; y = x; , {x = 5; y = 13})
Substitution:
t = 5; 5 = 13; 13 = 5
⇒ P =: f alse
d)
{P }(if (x ≥ y) z = x; else z = y; , {z = max(x, y)})
Substitution:
(x ≥ y): max(x, y) = x
(x < y): max(x, y) = y
⇒Beide Aussagen sind wahr, eine explizite Vorbedingung wird nicht benötigt, da keine
expliziten Werte auftreten
⇒ P := true
1
e)
{P }(if (x ≥ y) z = x; else z = y; , {z = y})
Substitution:
(x ≥ y): y = x → P 1 = x = y
(x < y): y = y → P 2 = x < y
Verknüpft man Aussagen P 1 und P 2
⇒ P := x ≤ y
f)
Spezifikation
Q(x, m) ≡ m = max{i | i ∈ x}
Verifikation
{m = x[0]; i = 1}
1
2
3
4
5
6
while ( i < n ) {
if ( x [ i ] > m ) {
m = x [ i ];
}
i = i + 1;
}
{m = max{i | i ∈ x}}
Schleifeninvariante
I = (m = max{x[0], . . . , x[i − 1]})
Vorbedingung (m = x[0]; i = 1)
dies impliziert offensichtlich m = max{x[0], x[1], . . . , x[i − 1]}
Erhalt der Invariante
(m = max{x[0], . . . , x[i − 1]} ∧ i < n)
{if (x[i] > m){m = x[i]; }i = i + 1; }
(m = max{x[0], . . . , x[i − 1]})
Anwenden der Zuweisungsregel:
(m = max{x[0], . . . , x[i − 1]} ∧ i < n){if (x[i] > m){m = x[i]; }}(m = max{x[0], . . . , x[i]})
2
Beweise den true- Zweig:
(m = max{x[0], . . . , x[i − 1]} ∧ x[i] > m){m = x[i]; }(m = max{x[0], . . . , x[i]})
(m = max{x[0], . . . , x[i − 1]} ∧ x[i] > m) ⇒ (x[i] = max{x[0], x[1], . . . , x[i]})
Ein Beweis des f alse-Zweiges ist nicht nötig, da keine explizite else-Anweisung gegeben ist.
Nachweis der Nachbedingung
(m = max{x[0], . . . , x[i − 1]} ∧ i == n)
(m = max{x[0], . . . , x[i − n]}) ⇒ {m = max{i | i ∈ x}}
Aufgabe 11.2
a)
Zu Beginn befindet sich eine endliche Anzahl an Bohnen im Glas. In jedem Schritt verringert
sich Anzahl der Bohnen im Glas um 1 (Weisse zurück oder eine vom Tisch hinein). Offensichtlich
terminiert der Algorithmus nach endlich vielen Schritten.
b)
Die Bohnen lassen sich wie folgt mit 0 und 1 codieren.
(
1, falls weiss
Bohne :=
0, falls schwarz
Der beschriebene Prozess des Ziehens und Zurücklegens entspricht nun der Addition zweier Zahlen,
Modulo 2.
0+0 = 0
1+1 = 0
0+1 = 1
Am Ende des Prozesses steht fest, ob eine gerade oder ungerade Anzahl an weissen Bohnen im Glas
war. Bleibt eine schwarze Bohne übrig, war die Anzahl gerade, sonst ungerade.
Aufgabe 11.3
a)
Q(b, p) ≡ p = max{d ≥ 1 | 0 ≤ i ≤ n − d, j = i + d − 1, b[i] = b[j]}
b)
Die Terminationsfunktion t muss abnehmen und dabei stets nicht-negativ bleiben.
Für das Array b der Länge n und die Iterationsvariable i:
t=n−i
3
c)
1
int d = 1 , p = 1;
2
for ( int i =1; i < n ; i ++) {
if ( b [ i ] == b [i -1]){
d ++;
}
else {
if ( d > p ) {
p = d;
d = 1;
}
}
}
3
4
5
6
7
8
9
10
11
12
13
14
15
return p ;
Beweis der Korrektheit
Partielle Korrektheit: Wenn das Programm terminiert, dann liefert es ein korrektes Ergebnis.
Die Initialisierung in Zeile 1 ist korrekt laut Spezifikation.
Solange aufeinanderfolgende Zeichen gleich sind, muss d erhöht werden, was in den Zeilen 4 − 5
geschieht.
Sobald diese Bedingung nicht mehr erfüllt ist, wird das lokale maximum d gleich 1 gesetzt und das
globale Maximum muss ggf. angepasst werden (Zeilen 7 − 9).
p wird nicht verringert und enthält somit bei Termination den maximalen Wert, den d im Laufe
des Programms angenommen hat. p wird in Zeile 14 zurück gegeben.
Dies ist korrekt laut Spezifikation.
Totale Korrektheit: Das Programm terminiert auf jedenfall und liefert ein korrektes Ergebnis.
Partielle Korrektheit wurde gezeigt, zu zeigen ist also die Termination des Programmes.
Die Terminationsfunktion t = n−i wird offensichtlich in jeder Iteration verringert und wird niemals
negativ. ⇒ Das Programm terminiert.
4
Herunterladen