• Keine Ergebnisse gefunden

237 Stop Start

N/A
N/A
Protected

Academic year: 2022

Aktie "237 Stop Start"

Copied!
30
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Start

a = read();

y = b; y = −b;

write(x);

write(y);

r=x+y;

b = read();

x = a; x = −a;

a < 0 yes no

x=x−y; y=y−x;

r=x+y;

Stop

write(x);

b < 0 yes

y == 0 yes no

x == 0 yes no

no

yes no x < y

no yes

x != y

2

3 1

r > x+y

r > 0

(2)

An den Programmpunkten 1, 2 und 3 machen wir die Zusicherungen:

(1) A

x

6=

y

x

>

0

y

>

0

r

=

x

+

y (2) B

x

>

0

y

>

0

r

>

x

+

y (3) true

Dann gilt:

A

r

>

0 und B

r

>

x

+

y

(3)

Wir überprüfen:

WP

[[

]](

true, A

) ≡

x

=

y

A

x

>

0

y

>

0

r

=

x

+

y

C

(4)

Wir überprüfen:

WP

[[

]](

true, A

) ≡

x

=

y

A

x

>

0

y

>

0

r

=

x

+

y

C

WP

[[

]](

C

) ≡

x

>

0

y

>

0

B

(5)

Wir überprüfen:

WP

[[

]](

true, A

) ≡

x

=

y

A

x

>

0

y

>

0

r

=

x

+

y

C

WP

[[

]](

C

) ≡

x

>

0

y

>

0

B

WP

[[

]](

B

) ≡

x

>

y

y

>

0

r

>

x WP

[[

]](

B

) ≡

x

>

0

y

>

x

r

>

y

(6)

Wir überprüfen:

WP

[[

]](

true, A

) ≡

x

=

y

A

x

>

0

y

>

0

r

=

x

+

y

C

WP

[[

]](

C

) ≡

x

>

0

y

>

0

B

WP

[[

]](

B

) ≡

x

>

y

y

>

0

r

>

x WP

[[

]](

B

) ≡

x

>

0

y

>

x

r

>

y

WP

[[

]](

. . . , . . .

) ≡ (

x

>

y

y

>

0

r

>

x

) ∨ (

x

>

0

y

>

x

r

>

y

)

x

6=

y

x

>

0

y

>

0

r

=

x

+

y

(7)

Orientierung:

Start

a = read();

y = b; y = −b;

write(x);

write(y);

r=x+y;

b = read();

x = a; x = −a;

a < 0 yes no

x=x−y; y=y−x;

r=x+y;

Stop

write(x);

yes b < 0

y == 0 yes no

x == 0 yes no

no

yes no x < y

no yes

x != y

2

3 1

r > x+y

r > 0

(8)

Weitere Propagation von C durch den Kontrollfluss-Graphen komplettiert die lokal konsistente Annotation mit Zusicherungen :-)

Wir schließen:

• An den Programmpunkten 1 und 2 gelten die Zusicherungen r > 0 bzw. r > x + y.

• In jeder Iteration wird r kleiner, bleibt aber stets positiv.

• Folglich wird die Schleife nur endlich oft durchlaufen

==⇒ das Programm terminiert :-))

(9)

Weitere Propagation von C durch den Kontrollfluss-Graphen komplettiert die lokal konsistente Annotation mit Zusicherungen :-)

Wir schließen:

• An den Programmpunkten 1 und 2 gelten die Zusicherungen r

>

0 bzw. r

>

x

+

y.

• In jeder Iteration wird r kleiner, bleibt aber stets positiv.

• Folglich wird die Schleife nur endlich oft durchlaufen

==⇒ das Programm terminiert :-))

(10)

Allgemeines Vorgehen:

• Für jede vorkommende Schleife erfinden wir eine neue Variable .

• Dann transformieren wir die Schleife in:

für geeignete Ausdrücke , :-)

(11)

3.5 Der Hoare-Kalkül

Tony Hoare, Microsoft Research, Cambridge

(12)

Idee (1):

• Organisiere den Korrektheitsbeweis entsprechend der Struktur des Programms !

• Modularisiere ihn so, dass Beweise für Teilprogramme zu einem Beweis für das gesamte Programm zusammen gesetzt werden können !

(13)

Idee (2):

Betrachte Aussagen der Form:

{

A

}

p

{

B

}

... das heißt:

Gilt vor der Ausführung des Programmstücks p Eigenschaft A und terminiert die Programm-Ausführung, dann

gilt nach der Ausführung von p Eigenschaft B.

A : Vorbedingung B : Nachbedingung

(14)

Idee (2):

Betrachte Aussagen der Form:

{

A

}

p

{

B

}

... das heißt:

Gilt vor der Ausführung des Programmstücks p Eigenschaft A und terminiert die Programm-Ausführung, dann

gilt nach der Ausführung von p Eigenschaft B.

A : Vorbedingung B : Nachbedingung

(15)

Beispiele:

{

x > y

}

{

z > 0

}

(16)

Beispiele:

{

x > y

}

{

z > 0

}

{

true

}

{

x ≥ 0

}

(17)

Beispiele:

{

x > y

}

{

z > 0

}

{

true

}

{

x ≥ 0

}

{

x > 7

}

{

x = 0

}

(18)

Beispiele:

{

x > y

}

{

z > 0

}

{

true

}

{

x ≥ 0

}

{

x > 7

}

{

x = 0

}

{

true

}

{

false

}

(19)

Ableitung korrekter Aussagen:

• Bestimme eine Menge von Grundaussagen oder Axiome, die gültige Tripel für einfache Anweisungen beschreiben.

• Gib Regeln an, wie aus bereits abgeleiteten gültigen Tripeln weitere gültige Tripel hergeleitet werden können ...

(20)

Axiome:

leere Anweisung:

{

B

}

{

B

}

Zuweisung:

{

B

[

e

/

x

]}

{

B

}

Eingabe:

{∀

x. B

}

{

B

}

Ausgabe:

{

B

}

{

B

}

(21)

Regeln:

Komposition:

{

A

} {

B

} {

B

}

{

C

} {

A

}

{

C

}

• Oberhalb des Strichs stehen die Voraussetzungen für die Regel-Anwendung.

• Unterhalb des Strichs steht die Schlussfolgerung :-)

==⇒

Den Beweis eines Tripels für das zusammengesetzte Programm setzen wir aus Beweisen für Aussagen über die

Programmbestandteile und zusammen :-)

(22)

Beispiel:

Für: konstruieren wir:

x=x+2;

x=x+2; z=z+x; i=i+1;

z=z+x; i=i+1;

z=z+x;

i=i+1;

{z = i2 x = 2i1} {z =i2 x =2i+1}

{z =i2x =2i+1}

{z =i2x =2i+1} {z =i2x =2i1} {z = (i+1)2 x = 2i+1}

{z = i2 x = 2i1} {z = (i+1)2x = 2i+1}

{z = i2 x = 2i1} {z =i2x= 2i1}

(23)

Regeln (Forts.):

Bedingung:

b

A

}

{

B

} {

b

A

}

{

B

} {

A

}

{

B

}

• Diese Regel entspricht unserer bisherigen Behandlung bedingter Verzweigungen ...

• Falls

{

A0

}

{

B

}

und

{

A1

}

{

B

}

gelten, können wir A auch wählen als

A

≡ (

b

A0

) ∧ (¬

b

A0

)

:-)

(24)

Beispiel:

Wir wollen

{

A

}

{

B

}

beweisen für:

A

x

>

0

y

>

0

x

6=

y B

x

>

0

y

>

0

Dazu konstruieren wir:

y=y−x;

x=x−y;

y=y−x;

x=x−y;

if (y>x) y=y−x;else x=x−y;

{Ay > x} {B}

{x > yy >0} {B} {x >0y> x} {B}

{Ay x} {B}

{A} {B}

(25)

Regeln (Forts.):

Schleife:

{

b

I

}

{

I

}

{

I

}

b

I

}

• Die Zusicherung I entspricht unserer Schleifen-Invariante :-)

• Bei Betreten des Rumpfs wissen wir zusätzlich, dass die Bedingung b gilt :-)

• Bei Verlassen der Schleife wissen wir zusätzlich, dass die Bedingung b nicht mehr gilt :-))

(26)

Regeln (Forts.):

• Gelegentlich passen die Vor- bzw. Nachbedingungen der

bereits als korrekt bewiesenen Tripel nicht genau zusammen ...

• Dann kann man die Vorbedingung verstärken oder die Nachbedingung abschwächen:

Abschwächung: A

A1

{

A1

}

{

B1

}

B1

B

{

A

}

{

B

}

(27)

3.6 Behandlung von Prozeduren

Modulare Verifikation können wir benutzen, um die Korrektheit auch von Programmen mit Funktionen nachzuweisen :-)

Vereinfachung:

Wir betrachten nur

• Prozeduren, d.h. statische Methoden ohne Rückgabewerte;

• nur globale Variablen, d.h. alle Variablen sind sind ebenfalls

.

// werden wir später verallgemeinern :-)

(28)

Beispiel:

(29)

Kommentar:

• Der Einfachkeit halber haben wir alle Vorkommen von

gestrichen :-)

• Die Prozedur-Definitionen sind nicht rekursiv.

• Das Programm liest zwei Zahlen ein.

• Die Prozedur speichert die größere in , die kleinere in

ab.

• Die Differenz von und wird ausgegeben.

• Wir wollen zeigen, dass gilt:

{

a

b

}

{

a

=

x

}

(30)

Vorgehen:

• Für jede Prozedur stellen wir ein Tripel bereit:

{

A

}

{

B

}

• Unter dieser globalen Hypothese H verifizieren wir, dass sich für jede Prozedurdefinition zeigen lässt:

{

A

}

{

B

}

• Wann immer im Programm ein Prozeduraufruf vorkommt, benutzen wir dabei die Tripel aus H ...

Referenzen

ÄHNLICHE DOKUMENTE

Beweisen Sie mit Hilfe der Rechengesetze f¨ ur komplexe Zahlen, dass die Innenwinkelsumme in einem Dreieck π betr¨

[r]

Verlängert man [AB] über A und B hinaus um jeweils x cm und verkürzt man gleichzeitig die Breite um x cm, so entstehen neue Rechtecke!. Bestimme den Flächeninhalt der neuen

 Für jedes Untersuchungsergebnis muss richtige Form der Darstellung gesucht werden (o.g. nicht ideal für alle potentiellen Resultate von

L¨ osen Sie das folgende ( bereits in Zeilenstufenform vorliegende ) Gleichungssystem ¨ uber IF 3 , d.h.. Laza: Lineare Algebra individuell Online-Version

dx n Man beweise, dass diese Menge konsistent und permutations-kovariant

Man gebe eine endliche Galoiserweiterung L=K und Elemente ; 2 L an, die folgenden Eigenschaften genugen.. (a) Die Korper K, K[], K[], K[; ] sind

Universit¨ at Konstanz Merlin Carl Fachbereich Mathematik und Statistik Markus Schweighofer Wintersemester 2017/2018.. Ubungsblatt 10 zur Linearen Algebra