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