• Keine Ergebnisse gefunden

Korrekte Software: Grundlagen und Methoden Vorlesung 8 vom 11.6.20 Verifikationsbedingungen

N/A
N/A
Protected

Academic year: 2022

Aktie "Korrekte Software: Grundlagen und Methoden Vorlesung 8 vom 11.6.20 Verifikationsbedingungen"

Copied!
88
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Korrekte Software: Grundlagen und Methoden Vorlesung 8 vom 11.6.20

Verifikationsbedingungen

Serge Autexier, Christoph Lüth

Universität Bremen

Sommersemester 2020

(2)

Fahrplan

I Einführung

I Operationale Semantik I Denotationale Semantik

I Äquivalenz der Operationalen und Denotationalen Semantik I Der Floyd-Hoare-Kalkül

I Invarianten und die Korrektheit des Floyd-Hoare-Kalküls I Strukturierte Datentypen

I Verifikationsbedingungen I Vorwärts mit Floyd und Hoare I Modellierung

I Spezifikation von Funktionen I Referenzen und Speichermodelle

(3)

Idee

I Hier ist ein einfaches Programm:

//{X =xY =y} z = y ;

//

y = x ; //

x = z ;

//{X =yY =x}

I Wir sehen:

1 Die Verifikation erfolgtrückwärts(von hinten nach vorne).

2 Die Verifikation kannberechnet werden. I Geht das immer?

(4)

Idee

I Hier ist ein einfaches Programm:

//{X =xY =y} z = y ;

//

y = x ;

//{X =yY =z} x = z ;

//{X =yY =x}

I Wir sehen:

1 Die Verifikation erfolgtrückwärts(von hinten nach vorne).

2 Die Verifikation kannberechnet werden. I Geht das immer?

(5)

Idee

I Hier ist ein einfaches Programm:

//{X =xY =y} z = y ;

//{X =xY =z} y = x ;

//{X =yY =z} x = z ;

//{X =yY =x}

I Wir sehen:

1 Die Verifikation erfolgtrückwärts(von hinten nach vorne).

2 Die Verifikation kannberechnet werden. I Geht das immer?

(6)

Idee

I Hier ist ein einfaches Programm:

//{X =xY =y} z = y ;

//{X =xY =z} y = x ;

//{X =yY =z} x = z ;

//{X =yY =x}

I Wir sehen:

1 Die Verifikation erfolgtrückwärts (von hinten nach vorne).

2 Die Verifikation kannberechnet werden.

I Geht das immer?

(7)

Idee

I Hier ist ein einfaches Programm:

//{X =xY =y} z = y ;

//{X =xY =z} y = x ;

//{X =yY =z} x = z ;

//{X =yY =x}

I Wir sehen:

1 Die Verifikation erfolgtrückwärts (von hinten nach vorne).

2 Die Verifikation kannberechnet werden.

I Geht das immer?

(8)

Rückwärtsanwendung der Regeln

I Zuweisungsregel kannrückwärts angewandt werden, weil die

Nachbedingung eine offene Variable ist —P passt auf jede beliebige Nachbedingung (siehe “Definition” Folie 24 der letzten Vorlesung)

` {P[e/l]}l =e{P}

I Was ist mit den anderen Regeln?

` {A} { } {A}

` {A∧b}c0{B} ` {A∧ ¬b}c1{B}

` {A} if(b) c0 else c1{B}

` {A}c1{B} ` {B}c2{C}

` {A}c1;c2{C}

` {A∧b}c{A}

` {A} while(b) c{A∧ ¬b} A0 =⇒A ` {A}c{B} B =⇒B0

` {A0}c{B0}

(9)

Rückwärtsanwendung der Regeln

I Zuweisungsregel kannrückwärts angewandt werden, weil die

Nachbedingung eine offene Variable ist —P passt auf jede beliebige Nachbedingung (siehe “Definition” Folie 24 der letzten Vorlesung)

` {P[e/l]}l =e{P} I Was ist mit den anderen Regeln?

` {A} { } {A}

` {A∧b}c0{B} ` {A∧ ¬b}c1{B}

` {A} if(b)c0 else c1{B}

` {A}c1{B} ` {B}c2{C}

` {A}c1;c2{C}

` {A∧b}c{A}

` {A} while(b) c{A∧ ¬b}

A0 =⇒A ` {A}c{B} B=⇒B0

0 0

(10)

Rückwärtsanwendung der Regeln

I Zuweisungsregel kannrückwärts angewandt werden, weil die

Nachbedingung eine offene Variable ist —P passt auf jede beliebige Nachbedingung (siehe “Definition” Folie 24 der letzten Vorlesung)

` {P[e/l]}l =e{P}

I Was ist mit den anderen Regeln? Nurwhile macht Probleme!

` {A} { } {A}

` {A∧b}c0{B} ` {A∧ ¬b}c1{B}

` {A} if(b)c0 else c1{B}

` {A}c1{B} ` {B}c2{C}

` {A}c1;c2{C}

` {A∧b}c{A}

` {A} while(b) c{A∧ ¬b}

A0 =⇒A ` {A}c{B} B=⇒B0

0 0

(11)

Berechnung von Vorbedingungen

I Die Rückwärtsrechnung von einer gegebenen Nachbedingung entspricht der Berechnung einer Vorbedingung.

I Gegeben C0-Programmc, Prädikat Q, dann ist

I wp(c,Q) dieschwächste VorbedingungP so dass|={P}c{Q};

I PrädikatPschwächer alsP0 wennP0=P

I Semantische Charakterisierung:

Schwächste Vorbedingung

Gegeben Zusicherung QAssnund ProgrammcStmt, dann

|={P}c{Q} ⇐⇒P =⇒wp(c,Q) I Wie können wir wp(c,Q) berechnen?

(12)

Berechnung von wp(c , Q)

I Einfach für Programme ohne Schleifen:

wp({ },P) =def P

wp(l =e,P) =def P[e/l] (Genauer: Folie 24 letzte VL) wp(c1;c2,P) =def wp(c1,wp(c2,P))

wp(if(b) c0 else c1,P) =def (b∧wp(c0,P))∨(¬b∧wp(c1,P))

I Für Schleifen: nicht entscheidbar.

I “Cannot in general compute afiniteformula” (Mike Gordon) I Wir können rekursive Formulierung angeben:

wp(while(b) c,P)= (¬bdefP)∨(b∧wp(c,wp(while (b) c,P)))

(13)

Lösung: Annotierte Programme

I Wir helfen dem Rechner weiter undannotierendie Schleifeninvariante am Programm.

I Damit berechnen wir:

I dieapproximativeschwächste Vorbedingung awp(c,Q)

I zusammen mit einer Menge vonVerifikationsbedingungenwvc(c,Q) I Die Verifikationsbedingungen treten dort auf, wo die Weakening-Regel

angewandt wird.

I Es gilt:

^wvc(c,Q) =⇒|={awp(c,Q)}c{Q}

(14)

Approximative schwächste Vorbedingung

I Für diewhile-Schleife:

awp(while(b) //∗∗ inv i ∗/ c,P) =def i

wvc(while(b) //∗∗ inv i ∗/ c,P) =def wvc(c,i)

∪ {i∧b −→awp(c,i)}

∪ {i∧ ¬b −→P}

I Entspricht derwhile-Regel (1) mit Weakening (2):

` {A∧b}c{A}

` {A} while (b) c{A∧ ¬b} (1) Ab =⇒C ` {C}c{A} A∧ ¬b =⇒B

` {A} while(b) c{B} (2)

(15)

Überblick: Approximative schwächste Vorbedingung

awp({ },P) def=P

awp(l =e,P) def=P[l/x] (Genauer: Folie 24 letzte VL) awp(c1;c2,P) def= awp(c1,awp(c2,P))

awp(if (b) c0 else c1,P) def=(b∧awp(c0,P))∨(¬b∧awp(c1,P)) awp(while(b) //∗∗ inv i ∗/ c,P) def=i

wvc({ },P) def=∅

wvc(l =e,P) def=∅

wvc(c1;c2,P) def= wvc(c1,awp(c2,P))∪wvc(c2,P) wvc(if (b) c0 else c1,P) def= wvc(c0,P)∪wvc(c1,P)

wvc(while(b) //∗∗ inv i ∗/ c,P) def= wvc(c,i)∪ {i∧b −→awp(c,i)}

∪ {i∧ ¬b−→P} WVC({P}c{Q}) def={P −→awp(c,Q)} ∪wvc(c,Q)

(16)

Beispiel: das Fakultätsprogramm

I In der Praxis sind Vorbedingung gegeben, und nur die Verifikationsbedingungen relevant.

I SeiF das annotierte Fakultätsprogramm:

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}*/

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

I Berechnung der Verifikationsbedingungen zur Nachbedingung.

(17)

Notation für Verifikationsbedingungen

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}; */

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

AWP 6

p= ((c + 1)−1)!∧((c + 1)−1)≤n 5 p×c = ((c+ 1)−1)!∧((c−1) + 1)≤n 4 p= (c−1)!∧c−1≤n

3 p= (1−1)!∧(1−1)≤n 2 1 = (1−1)!∧(1−1)≤n

(18)

Notation für Verifikationsbedingungen

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}; */

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

AWP 6 p= ((c + 1)−1)!∧((c+ 1)−1)≤n 5

p×c = ((c+ 1)−1)!∧((c−1) + 1)≤n 4 p= (c−1)!∧c−1≤n

3 p= (1−1)!∧(1−1)≤n 2 1 = (1−1)!∧(1−1)≤n

(19)

Notation für Verifikationsbedingungen

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}; */

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

AWP 6 p= ((c + 1)−1)!∧((c+ 1)−1)≤n 5 p×c = ((c+ 1)−1)!∧((c−1) + 1)≤n 4

p= (c−1)!∧c−1≤n 3 p= (1−1)!∧(1−1)≤n 2 1 = (1−1)!∧(1−1)≤n

(20)

Notation für Verifikationsbedingungen

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}; */

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

AWP 6 p= ((c + 1)−1)!∧((c+ 1)−1)≤n 5 p×c = ((c+ 1)−1)!∧((c−1) + 1)≤n 4 p= (c−1)!∧c−1≤n

3

p= (1−1)!∧(1−1)≤n 2 1 = (1−1)!∧(1−1)≤n

(21)

Notation für Verifikationsbedingungen

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}; */

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

AWP 6 p= ((c + 1)−1)!∧((c+ 1)−1)≤n 5 p×c = ((c+ 1)−1)!∧((c−1) + 1)≤n 4 p= (c−1)!∧c−1≤n

3 p= (1−1)!∧(1−1)≤n 2

1 = (1−1)!∧(1−1)≤n

(22)

Notation für Verifikationsbedingungen

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}; */

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

AWP 6 p= ((c + 1)−1)!∧((c+ 1)−1)≤n 5 p×c = ((c+ 1)−1)!∧((c−1) + 1)≤n 4 p= (c−1)!∧c−1≤n

3 p= (1−1)!∧(1−1)≤n 2 1 = (1−1)!∧(1−1)≤n

(23)

Notation für Verifikationsbedingungen

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}; */

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

WVC 6,5

4 (p= (c−1)!∧c −1≤ncn −→

p×n= (c−1)!∧c−1≤ncn)

∧(p = (c−1)!∧c −1≤n∧ ¬(c ≤n)−→ p =n!

3,2 ∅

1 0≤n−→1 = (1−1)!∧(1−1)≤n

(24)

Notation für Verifikationsbedingungen

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}; */

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

WVC 6,5 ∅ 4

(p= (c−1)!∧c −1≤ncn −→

p×n= (c−1)!∧c−1≤ncn)

∧(p = (c−1)!∧c −1≤n∧ ¬(c ≤n)−→ p =n!

3,2 ∅

1 0≤n−→1 = (1−1)!∧(1−1)≤n

(25)

Notation für Verifikationsbedingungen

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}; */

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

WVC 6,5 ∅

4 (p = (c−1)!∧c −1≤ncn −→

p×n= (c−1)!∧c−1≤ncn)

∧(p = (c−1)!∧c −1≤n∧ ¬(c ≤n)−→

p =n!

3,2

1 0≤n−→1 = (1−1)!∧(1−1)≤n

(26)

Notation für Verifikationsbedingungen

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}; */

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

WVC 6,5 ∅

4 (p = (c−1)!∧c −1≤ncn −→

p×n= (c−1)!∧c−1≤ncn)

∧(p = (c−1)!∧c −1≤n∧ ¬(c ≤n)−→

p =n!

3,2 ∅ 1

0≤n−→1 = (1−1)!∧(1−1)≤n

(27)

Notation für Verifikationsbedingungen

1 // {0n}

2 p= 1 ;

3 c= 1 ;

4 w h i l e ( c <= n ) //** inv{p= (c1)!c1n}; */

5 { p = p c ;

6 c = c + 1 ;

7 }

8 // {p=n!}

WVC 6,5 ∅

4 (p = (c−1)!∧c −1≤ncn −→

p×n= (c−1)!∧c−1≤ncn)

∧(p = (c−1)!∧c −1≤n∧ ¬(c ≤n)−→

p =n!

3,2 ∅

1 0≤n−→1 = (1−1)!∧(1−1)≤n

(28)

Vereinfachung von Verifikationsbedingungen

Wir nehmen folgende strukturellen Vereinfachungen an den generierten Verifikationsbedingungen vor:

1 Auswertung konstanter arithmetischer Ausdrücke, einfache arithmetische Gesetze

I Bsp. (x+ 1)1 x, 11 0

2 Normalisierung der Relationen (zu<,≤, =,6=) und Vereinfachung I Bsp:¬(x y) x >y y <x

3 Konjunktionen in der Konklusion werden zu einzelnen Verifikationsbedingungen

I Bsp:A1A2A3−→PQ A1A2A3−→P,A1A2A3−→Q

4 Alle Bedingungen mit einer Prämissefalse oder einer Konklusiontrue sind trivial erfüllt.

(29)

Arbeitsblatt 8.1: Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

I Wobei gilt: sum(i,j) =

( 0 falls i >j

i+ sum(i+ 1,j) sonst I Berechnet dieAWPfür die Zeilen 5,4,3,2

I Berechnet dieWVC für die Zeilen 5,4,3,2,1 I Seic obiges Programm: Berechnet

WVC({0nn=N}c{p = sum(1,N)})

(30)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP 5

p= sum((n−1) + 1,N) 4 p+n= sum((n−1) + 1,N) 3 p= sum(n+ 1,N)

2 0 = sum(n+ 1,N) WVC 5 ∅

4 ∅

3 {(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

2 ∅ ∪(3)

WVC({0nn=N}c{p = sum(1,N)})

={(0≤nn=N)−→0 = sum(n+ 1,N)} ∪(3)

={(0≤nn=N)−→0 = sum(n+ 1,N),

(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

(31)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP 5 p= sum((n−1) + 1,N) 4

p+n= sum((n−1) + 1,N) 3 p= sum(n+ 1,N)

2 0 = sum(n+ 1,N) WVC 5 ∅

4 ∅

3 {(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

2 ∅ ∪(3)

WVC({0nn=N}c{p = sum(1,N)})

={(0≤nn=N)−→0 = sum(n+ 1,N)} ∪(3)

={(0≤nn=N)−→0 = sum(n+ 1,N),

(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

(32)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP 5 p= sum((n−1) + 1,N) 4 p+n= sum((n−1) + 1,N) 3

p= sum(n+ 1,N) 2 0 = sum(n+ 1,N) WVC 5 ∅

4 ∅

3 {(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

2 ∅ ∪(3)

WVC({0nn=N}c{p = sum(1,N)})

={(0≤nn=N)−→0 = sum(n+ 1,N)} ∪(3)

={(0≤nn=N)−→0 = sum(n+ 1,N),

(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

(33)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP 5 p= sum((n−1) + 1,N) 4 p+n= sum((n−1) + 1,N) 3 p= sum(n+ 1,N)

2

0 = sum(n+ 1,N) WVC 5 ∅

4 ∅

3 {(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

2 ∅ ∪(3)

WVC({0nn=N}c{p = sum(1,N)})

={(0≤nn=N)−→0 = sum(n+ 1,N)} ∪(3)

={(0≤nn=N)−→0 = sum(n+ 1,N),

(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

(34)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP 5 p= sum((n−1) + 1,N) 4 p+n= sum((n−1) + 1,N) 3 p= sum(n+ 1,N)

2 0 = sum(n+ 1,N)

WVC 5 ∅ 4 ∅

3 {(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

2 ∅ ∪(3)

WVC({0nn=N}c{p = sum(1,N)})

={(0≤nn=N)−→0 = sum(n+ 1,N)} ∪(3)

={(0≤nn=N)−→0 = sum(n+ 1,N),

(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

(35)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP 5 p= sum((n−1) + 1,N) 4 p+n= sum((n−1) + 1,N) 3 p= sum(n+ 1,N)

2 0 = sum(n+ 1,N) WVC 5

∅ 4 ∅

3 {(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

2 ∅ ∪(3)

WVC({0nn=N}c{p = sum(1,N)})

={(0≤nn=N)−→0 = sum(n+ 1,N)} ∪(3)

={(0≤nn=N)−→0 = sum(n+ 1,N),

(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

(36)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP 5 p= sum((n−1) + 1,N) 4 p+n= sum((n−1) + 1,N) 3 p= sum(n+ 1,N)

2 0 = sum(n+ 1,N) WVC 5 ∅

4

3 {(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

2 ∅ ∪(3)

WVC({0nn=N}c{p = sum(1,N)})

={(0≤nn=N)−→0 = sum(n+ 1,N)} ∪(3)

={(0≤nn=N)−→0 = sum(n+ 1,N),

(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

(37)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP 5 p= sum((n−1) + 1,N) 4 p+n= sum((n−1) + 1,N) 3 p= sum(n+ 1,N)

2 0 = sum(n+ 1,N) WVC 5 ∅

4 ∅ 3

{(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

2 ∅ ∪(3)

WVC({0nn=N}c{p = sum(1,N)})

={(0≤nn=N)−→0 = sum(n+ 1,N)} ∪(3)

={(0≤nn=N)−→0 = sum(n+ 1,N),

(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

(38)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP 5 p= sum((n−1) + 1,N) 4 p+n= sum((n−1) + 1,N) 3 p= sum(n+ 1,N)

2 0 = sum(n+ 1,N) WVC 5 ∅

4 ∅

3 {(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

∅ ∪(3)

WVC({0nn=N}c{p = sum(1,N)})

={(0≤nn=N)−→0 = sum(n+ 1,N)} ∪(3)

={(0≤nn=N)−→0 = sum(n+ 1,N),

(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

(39)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP 5 p= sum((n−1) + 1,N) 4 p+n= sum((n−1) + 1,N) 3 p= sum(n+ 1,N)

2 0 = sum(n+ 1,N) WVC 5 ∅

4 ∅

3 {(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

WVC({0nn=N}c{p = sum(1,N)})

={(0≤nn=N)−→0 = sum(n+ 1,N)} ∪(3)

={(0≤nn=N)−→0 = sum(n+ 1,N),

(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

(40)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{p= sum(n+ 1,N);}*/

4 { p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

WVC({0nn=N}c{p = sum(1,N)})

={(0≤nn=N)−→0 = sum(n+ 1,N)} ∪(3)

={(0≤nn=N)−→0 = sum(n+ 1,N),

(p = sum(n+ 1,N)n>0)−→p+n= sum((n−1) + 1,N), (p = sum(n+ 1,N)∧ ¬(n>0))−→p = sum(1,N)}

(41)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{0nnNp= sum(n+ 1,N);}*/ {

4 p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP5

0(n1)(n1)Np= sum((n1) + 1,N) 4 0(n1)(n1)Np+n= sum((n1) + 1,N) 3 0nnNp= sum(n+ 1,N)

2 0nnN0 = sum(n+ 1,N) WVC 5,4

3 {(0nnNp= sum(n+ 1,N)n>0)

−→(0(n1)(n1)Np+n= sum((n1) + 1,N)), (n0nNp= sum(n+ 1,N)∧ ¬(n>0))−→p= sum(1,N)} 2 ∅ ∪(3)

WVC({0nn=N}c{p= sum(1,N)})

={{(0nn=N)−→(0nnN0 = sum(n+ 1,N))} ∪(3)

={(0nn=N)−→(0nnN0 = sum(n+ 1,N)), (0nnNp= sum(n+ 1,N)n>0)

−→(0(n1)(n1)Np+n= sum((n1) + 1,N)), (n0nNp= sum(n+ 1,N)∧ ¬(n>0))−→p= sum(1,N)}

(42)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{0nnNp= sum(n+ 1,N);}*/ {

4 p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP5 0(n1)(n1)Np= sum((n1) + 1,N) 4

0(n1)(n1)Np+n= sum((n1) + 1,N) 3 0nnNp= sum(n+ 1,N)

2 0nnN0 = sum(n+ 1,N) WVC 5,4

3 {(0nnNp= sum(n+ 1,N)n>0)

−→(0(n1)(n1)Np+n= sum((n1) + 1,N)), (n0nNp= sum(n+ 1,N)∧ ¬(n>0))−→p= sum(1,N)} 2 ∅ ∪(3)

WVC({0nn=N}c{p= sum(1,N)})

={{(0nn=N)−→(0nnN0 = sum(n+ 1,N))} ∪(3)

={(0nn=N)−→(0nnN0 = sum(n+ 1,N)), (0nnNp= sum(n+ 1,N)n>0)

−→(0(n1)(n1)Np+n= sum((n1) + 1,N)), (n0nNp= sum(n+ 1,N)∧ ¬(n>0))−→p= sum(1,N)}

(43)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{0nnNp= sum(n+ 1,N);}*/ {

4 p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP5 0(n1)(n1)Np= sum((n1) + 1,N) 4 0(n1)(n1)Np+n= sum((n1) + 1,N) 3

0nnNp= sum(n+ 1,N) 2 0nnN0 = sum(n+ 1,N) WVC 5,4

3 {(0nnNp= sum(n+ 1,N)n>0)

−→(0(n1)(n1)Np+n= sum((n1) + 1,N)), (n0nNp= sum(n+ 1,N)∧ ¬(n>0))−→p= sum(1,N)} 2 ∅ ∪(3)

WVC({0nn=N}c{p= sum(1,N)})

={{(0nn=N)−→(0nnN0 = sum(n+ 1,N))} ∪(3)

={(0nn=N)−→(0nnN0 = sum(n+ 1,N)), (0nnNp= sum(n+ 1,N)n>0)

−→(0(n1)(n1)Np+n= sum((n1) + 1,N)), (n0nNp= sum(n+ 1,N)∧ ¬(n>0))−→p= sum(1,N)}

(44)

Jetzt seid ihr dran!

1 // {0nn=N}

2 p= 0 ;

3 w h i l e ( n >0) //** inv{0nnNp= sum(n+ 1,N);}*/ {

4 p = p + n ;

5 n = n 1 ;

6 }

7 // {p= sum(1,N)}

AWP5 0(n1)(n1)Np= sum((n1) + 1,N) 4 0(n1)(n1)Np+n= sum((n1) + 1,N) 3 0nnNp= sum(n+ 1,N)

2

0nnN0 = sum(n+ 1,N) WVC 5,4

3 {(0nnNp= sum(n+ 1,N)n>0)

−→(0(n1)(n1)Np+n= sum((n1) + 1,N)), (n0nNp= sum(n+ 1,N)∧ ¬(n>0))−→p= sum(1,N)} 2 ∅ ∪(3)

WVC({0nn=N}c{p= sum(1,N)})

={{(0nn=N)−→(0nnN0 = sum(n+ 1,N))} ∪(3)

={(0nn=N)−→(0nnN0 = sum(n+ 1,N)), (0nnNp= sum(n+ 1,N)n>0)

−→(0(n1)(n1)Np+n= sum((n1) + 1,N)), (n0nNp= sum(n+ 1,N)∧ ¬(n>0))−→p= sum(1,N)}

Referenzen

ÄHNLICHE DOKUMENTE

Invariante und negierte Schleifenbedingung muss Nachbedingung implizieren; ggf.. Beweise innerhalb der Schleife

Korrekte Software: Grundlagen und Methoden Vorlesung 8 vom 29.05.18: Modellierung und Spezifikation.. Serge Autexier,

I Wir annotieren daher die Invarianten an Schleifen, und können dann die schwächste Vorbedingung und Verifikationsbedingungen.

I Die Regeln des Floyd-Hoare-Kalküls lassen sich, weitgehend schematisch, rückwärts (vom Ende her) anwenden — nur Schleifen machen Probleme?. I Wir annotieren daher die Invarianten

I return ohne Argument darf nur bei einer Nachbedingung Q auftreten, die kein \result enthält. I Bei return mit Argument ersetzt der Rückgabewert den \result in

I Wir annotieren daher die Invarianten an Schleifen, und können dann die schwächste Vorbedingung und Verifikationsbedingungen.

I Für die Berechnung der approximativen schwächsten Vorbedingung (AWP) und der Verifikationsbedingungen (WVC) müssen zwei Anpassungen vorgenommen werden:. I Sowohl AWP als auch

[r]