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