Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
{ pre} Anweisung1 { p} , { p} Anweisung2 { post}<br />
{ pre} Anweisung1 ; Anweisung2 { post}<br />
wp(Anweisung1;Anweisung2 , post) ≡ wp(Anweisung1 , wp(Anweisung2, post))<br />
Abbildung 4.6: Verifikationsregel und Prädikatentransformer für zusammengesetzte Anweisungen<br />
Beispiel 4.3.6 (Weakest Precondition zusammengesetzter Anweisungen)<br />
1. wp(n:=n+1;x:=x*n , x=n!) ≡<br />
wp(n:=n+1 , wp(x:=x*n, x=n!) ) ≡<br />
wp(n:=n+1 , x*n = n! ) ≡<br />
x=n! (Vergleiche Beispiel 4.3.2 auf Seite 146)<br />
Das bedeutet, die schwächste Vorbedingung von x=n! für n:=n+1; x:=x*n wie<strong>der</strong> die Bedingung x=n!<br />
ist. Diese Bedingung ist als invariant gegenüber <strong>der</strong> Ausführung <strong>der</strong> beiden Anweisungen. Diese Tatsache<br />
werden wir später bei <strong>der</strong> Verifikation einer Funktion zur Berechnung <strong>der</strong> Fakultätsfunktion (siehe<br />
Beispiel 4.3.9 auf Seite 161) ausnutzen.<br />
2. Es sei P ein beliebiges Prädikat mit zwei freien Variablen. Dann gilt:<br />
wp(hilf:=a; a:=b; b:=hilf , P(a,b)) ≡<br />
wp(hilf:=a, wp(a:=b; b:=hilf , P(a,b))) ≡<br />
wp(hilf:=a, wp(a:=b, wp(b:=hilf, P(a,b) ) ) ) ≡<br />
wp(hilf:=a, wp(a:=b, P(a,hilf) ) ) ≡<br />
wp(hilf:=a, P(b,hilf) ) ≡<br />
P(b,a)<br />
Da wir für P alles einsetzen dürfen, haben wir allgemein bewiesen, daß hilf:=a; a:=b; b:=hilf die<br />
Werte von a und b vertauscht.<br />
Zum Zweck <strong>der</strong> besseren Lesbarkeit werden wir in Beispielen ab jetzt immer die Zusicherungen direkt in unser<br />
Programm einfügen und dabei das auf Seite 140 vorgestellte Schema benutzen.<br />
{ pre}<br />
Anweisung1; { p1}<br />
Anweisung2; { p2}<br />
.<br />
Anweisungn<br />
{ post}<br />
Diese Notation hat folgende Bedeutung: stehen zwei Zusicherungen { p} und { q} untereinan<strong>der</strong>, so sind<br />
sie nach den Regeln <strong>der</strong> Prädikatenlogik o<strong>der</strong> nach anwendungsspezifischen Regeln (z.B. <strong>der</strong> Arithmetik)<br />
ableitbar. Steht zwischen zwei Zusicherungen { p} und { q} eine Anweisung Anweisung, so bedeutet dies,<br />
daß { p} Anweisung { q} aufgrund <strong>der</strong> entsprechenden Ableitungsregel des Hoare-Kalküls gilt. Wir haben<br />
diese Notation bereits in füheren Beispielen verwendet, um Sätze des Hoare-Kalküls mit logischen Regeln<br />
zu modifizieren. Erst die Verifikationsregel für zusammengesetzte Anweisungen jedoch rechtfertigt es, auch<br />
mehrere Anweisungen hintereinan<strong>der</strong> zu verwenden.<br />
Beispiel 4.3.7 (Verifikation zusammengesetzter Anweisungen)<br />
Programm Zusicherungen Prämissen<br />
{ P(b,a)}<br />
hilf:=a; { P(b,hilf)}<br />
a:=b; { P(a,hilf)}<br />
b:=hilf { P(a,b)}