Der Umgang mit dem Hoare-Kalkül zur Programmverifikation
Der Umgang mit dem Hoare-Kalkül zur Programmverifikation
Der Umgang mit dem Hoare-Kalkül zur Programmverifikation
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Michael Gellner<br />
Einführung in die Verifikation<br />
Michael Gellner<br />
Einführung in die Verifikation<br />
Mit der Zuweisung in der Schleife wird gemäß <strong>dem</strong> Zuweisungsaxoim verfahren:<br />
{ I} x a[i..n]<br />
while elems[i] x do<br />
begin<br />
{ IB } x elems[i..n] elems[i] x<br />
r := x;<br />
x elems[i + 1..n]<br />
end;<br />
i := i + 1;<br />
{ I} x elems[i..n]<br />
{ IB } x elems[i..n] (elems[i] x)<br />
Hier stellt sich die Frage ob<br />
x elems[i .. n] elem[i] x x elems[i + 1 .. n]<br />
gilt. Dies läßt sich nur über eine durchaus anschauliche Logik erschließen.<br />
x elems[i + 1 .. n] = x elems[1 .. i]<br />
Also: Wenn x element einer Menge [i + 1 .. n] ist, kann es nicht mehr Element<br />
einer (durchsuchten) Menge [1 .. i] sein, also auch nicht elems[i]. Tatsächlich<br />
folgt hierraus die rechte Teilaussage, daß<br />
elem[i] x<br />
muß. <strong>Der</strong> linke Teil stellt ebenfalls keinen Widerspruch dar, wenn<br />
x elems[i + 1 .. n]<br />
gilt, dann gilt natürlich auch<br />
x elems[i .. n]<br />
Hier ist lediglich ein Element zuviel in der Menge, enthalten bleibt das gesuchte<br />
Element natürlich dennoch.<br />
Zuletzt bleibt noch die Zuweisung oberhalb der While-Schleife, die wiederum<br />
<strong>mit</strong> <strong>dem</strong> Zuweisungsaxoim bearbeitet wird. Die Nachbedingung der<br />
Zuweisung wird von der While-Schleife übernommen (die letzte Klausel unter<br />
der zu bearbeitenden Zuweisung ist die Schleifeninvariante). Eine einfache<br />
Anwendung führt auf folgende Spezifikation:<br />
x elems [1..n]<br />
i := 1;<br />
{ I} x elems [i..n]<br />
R 1<br />
R 1<br />
Abgleichen der<br />
Zwischenergebnisse<br />
Dies entspricht der Vorbedingung, die Verifikation ist da<strong>mit</strong> abgeschlossen.<br />
Die gesamte Beweisskizze:<br />
3.6.6 Verifikation einer Multiplikation durch Aufsummierung<br />
Die hier durchgeführte Multiplikation für z = x y ist nichts anderes als die x-<br />
malige Aufsummierung von y, also z = y + y + y + ... (x-mal)<br />
function mult(x, y : integer): integer;<br />
begin<br />
z := 0;<br />
u := 0;<br />
while u x do<br />
begin<br />
z := z + y;<br />
u := u + 1;<br />
end;<br />
mult := z;<br />
end;<br />
{ P } x elem[1..n]<br />
x elems [1..n]<br />
i := 1;<br />
{ I } x elems [i..n]<br />
while elems[i] x do<br />
begin<br />
{ I B } x elems[i..n] elems[i] x<br />
r := x;<br />
x elems[i + 1..n]<br />
end;<br />
i := i + 1;<br />
{ I } x elems[i..n]<br />
{ I B } x elems[i..n] (elems[i] x)<br />
{ Q } elems[i] = x<br />
Anweisungen, die zu<br />
verifizieren sind<br />
1. Vor- und Nachbedingungen des gesamten Programmteils festlegen. z.B.:<br />
R 1<br />
R 1<br />
R 4a<br />
41<br />
42