04.01.2015 Aufrufe

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

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!