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 />

3. Mit der äußersten umfassenden Anweisung von unten beginnen. Dies ist<br />

hier die äußere While-Schleife, daher wird hier nach Regel R 4a vorgegangen:<br />

Hierzu muß wieder eine Invariante gefunden werden. Hier folgt die Invariante<br />

aus einer Überlegung: ein Teiler kann nicht 0 sein, da die Division durch 0<br />

nicht definiert ist (liegen etwa zwei Primzahlen vor, ist der größte gemeinsame<br />

Teiler 1). Des Weiteren entspricht der gesuchte Teiler ggT(x, y) immer<br />

ggT(a,b). Hieraus wird die Invariante gebildet (die Schleifenbedingung B und<br />

deren Verneinung B):<br />

IB: a > 0 b > 0 ggT(x, y) = ggT(a ,b) a b<br />

while b > a do<br />

begin<br />

{ I } a > 0 b > 0 ggT(x, y) = ggT(a, b))<br />

{ IB } a>0 b>0 ggT(x, y) = ggT(a, b)) b > a<br />

a > 0 b – a > 0 ggT(x, y) = ggT(a, b – a )) R 1<br />

r :=<br />

b := b - a;<br />

x;<br />

2<br />

end<br />

{ I } a > 0 b > 0 ggT(x, y) = ggT(a, b))<br />

R 4a<br />

1<br />

IB: a > 0 b > 0 ggT(x, y) = ggT(a ,b) a b)<br />

{ IB } a > 0 b > 0 ggT(x, y) = ggT(a, b) ) (b > a)<br />

while a b do<br />

begin<br />

{ I} a > 0 b> 0 ggT(x, y) = ggT(a, b)<br />

{ IB } a>0b>0 ggT(x,y)=ggT(a,b)a b<br />

r<br />

while a > b do<br />

:= x;<br />

begin<br />

end;<br />

a := a - b;<br />

end<br />

while b > a do<br />

begin<br />

end;<br />

b := b - a;<br />

{ I} a > 0 b> 0 ggT(x, y) = ggT(a, b)<br />

{ IB } a > 0 b> 0 ggT(x, y) = ggT(a, b)(a b)<br />

R 4a<br />

Iterationsregel:<br />

{ I },<br />

{ I B },<br />

{ I B }<br />

müssen gefunden<br />

werden<br />

Die letzte innere While-Schleife (<strong>mit</strong> derselben Invariante):<br />

while a > b do<br />

begin<br />

{ I } a > 0 b > 0 ggT(x, y) = ggT(a, b))<br />

{ IB } a>0 b>0 ggT(x, y) = ggT(a, b))a > b<br />

a – b > 0 b > 0 ggT(x, y) = ggT(a – b, b)) 2<br />

r := x;<br />

a := a - b;<br />

R 1<br />

end<br />

{ I } a > 0 b > 0 ggT(x, y) = ggT(a, b))<br />

{ IB } a > 0 b > 0 ggT(x, y) = ggT(a, b) )(a > b)<br />

R 4a<br />

4. Von unten nach oben werden nun die weiteren Anweisungen <strong>mit</strong> <strong>Hoare</strong>-<br />

Klauseln versehen. Die Überlegungen, die auch schon bei der ersten While-<br />

Schleife getroffen wurden, erweisen sich auch bei der zweiten Schleife als<br />

gültig. Im folgenden sind sowohl die Schleifen als auch die enthaltenen<br />

Zuweisungen verifiziert.<br />

Die oberen Zuweisungen:<br />

x > 0 y > 0 ggT(x, y) = ggT(x, y))<br />

a := x;<br />

a > 0 y > 0 ggT(x, y) = ggT(a, y))<br />

R 1<br />

1<br />

b := y;<br />

R 1<br />

a > 0 b > 0 ggT(x, y) = ggT(a, b))<br />

47<br />

48

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!