• Keine Ergebnisse gefunden

Korrekte Software: Grundlagen und Methoden Vorlesung 7 vom 18.05.17: Vorwärts und Rückwärts mit Floyd und Hoare

N/A
N/A
Protected

Academic year: 2022

Aktie "Korrekte Software: Grundlagen und Methoden Vorlesung 7 vom 18.05.17: Vorwärts und Rückwärts mit Floyd und Hoare"

Copied!
27
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Korrekte Software: Grundlagen und Methoden

Vorlesung 7 vom 18.05.17: Vorwärts und Rückwärts mit Floyd und Hoare

Serge Autexier, Christoph Lüth

Universität Bremen

Sommersemester 2017

(2)

Fahrplan

I Einführung

I Die Floyd-Hoare-Logik

I Operationale Semantik

I Denotationale Semantik

I Äquivalenz der Operationalen und Denotationalen Semantik

I Korrektheit des Hoare-Kalküls

I Vorwärts und Rückwärts mit Floyd und Hoare

I Funktionen und Prozeduren

I Referenzen und Speichermodelle

I Verifikationsbedingungen Revisited

I Vorwärtsrechnung Revisited

I Programmsicherheit und Frame Conditions

I Ausblick und Rückblick

(3)

Vorwärts oder Rückwärts?

(4)

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 kannberechnetwerden.

I Muss das so sein? Ist das immer so?

(5)

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 kannberechnetwerden.

I Muss das so sein? Ist das immer so?

(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 kannberechnetwerden.

I Muss das so sein? Ist das immer so?

(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 kannberechnetwerden.

I Muss das so sein? Ist das immer so?

(8)

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 kannberechnetwerden.

I Muss das so sein? Ist das immer so?

(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.

` {P[e/x]}x =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}c{B} ` {B} {cs} {C}

` {A} {c cs} {C}

` {A∧b}c{A}

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

` {A0}c{B0}

(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.

` {P[e/x]}x =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}c{B} ` {B} {cs} {C}

` {A} {c cs} {C}

` {A∧b}c{A}

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

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

` {A0}c{B0}

(11)

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.

` {P[e/x]}x =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}c{B} ` {B} {cs} {C}

` {A} {c cs} {C}

` {A∧b}c{A}

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

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

` {A0}c{B0}

(12)

Vorwärts?

I Alternative Zuweisungsregel (nach Floyd):

V 6∈FV(P)

` {P}x =e{∃V.x =e[V/x]P[V/x]}

I FV(P) sind diefreienVariablen in P.

I Jetzt ist die Vorbedingung offen — Regel kann vorwärts angewandt werden

I Gilt auch für die anderen Regeln

(13)

Vorwärtsverkettung

V 6∈FV(P)

` {P}x =e{∃V.x =e[V/x]P[V/x]}

I Ein einfaches Beispiel (nach Mike Gordon):

//{x = 1}

x= x +1;

//{∃V.x=x+ 1[V/x](x= 1)[V/x]}

I Vereinfachungder Nachbedingung:

∃V.x = (x+ 1)[V/x]∧(x = 1)[V/x]

⇐⇒ ∃V.x = (V + 1)∧(V = 1)

⇐⇒x = 1 + 1

⇐⇒x = 2

(14)

Vorwärtsverkettung

I Vorwärtsaxiom äquivalent zum Rückwärtsaxiom.

I In der Anwendungumständlicher.

I Vereinfachung benötigt Lemma:∃x.P(x)∧x=t⇐⇒P(t)

I Vorteile?

I Wir wollten doch sowieso die Anwendung automatisieren. . .

I Wir stellen die Frage erstmal zurück

Zwischenfazit: Der Floyd-Hoare-Kalkül istsymmetrisch

Es gibt zwei Zuweisungsregeln, eine für dieRückwärtsanwendung von Regeln, eine für die Vorwärtsanwendung

(15)

Schwächste Vorbedingungen

(16)

Berechnung von Vorbedingungen

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

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

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

I sp(P,c) diestärkste NachbedingungQ so dass|={P}c{Q}

I PrädikatP schwächer alsQ wennQ =⇒P (stärkerwennP =⇒Q).

I Semantische Charakterisierung:

|={P}c{Q} ⇐⇒ P =⇒wp(c,Q)

|={P}c{Q} ⇐⇒ sp(P,c) =Q

(17)

Berechnung von Vorbedingungen

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

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

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

I sp(P,c) diestärkste NachbedingungQ so dass|={P}c{Q}

I PrädikatP schwächer alsQ wennQ =⇒P (stärkerwennP =⇒Q).

I Semantische Charakterisierung:

|={P}c{Q} ⇐⇒ P =⇒wp(c,Q)

|={P}c{Q} ⇐⇒ sp(P,c) =Q

(18)

Berechnung von Vorbedingungen

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

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

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

I sp(P,c) diestärkste NachbedingungQ so dass|={P}c{Q}

I PrädikatP schwächer alsQ wennQ =⇒P (stärkerwennP =⇒Q).

I Semantische Charakterisierung:

|={P}c{Q} ⇐⇒ P =⇒wp(c,Q)

|={P}c{Q} ⇐⇒ sp(P,c) =Q

(19)

Berechnung von wp(c , Q)

I Einfach für Programme ohne Schleifen:

wp({ },P) def= P wp(x =e,P) def= P[e/x]

wp({c cs},P) def= wp(c,wp({cs},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” (Gordon)

I Wir können rekursive Formulierung angeben:

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

I Hilft auch nicht weiter. . .

(20)

Lösung: Annotierte Programme

I Wir helfen dem Rechner weiter undannotieren die Schleifeninvariante am Programm.

I Damit berechnen wir:

I dieapproximativeschwächste Vorbedingung awp(c,Q) zusammen mit einer Menge vonVerifikationsbedingungenwvc(c,Q)

I oder dieapproximativestärkste Nachbedingung asp(P,c) zusammen mit einer Menge vonVerifikationsbedingungensvc(P,c)

I Die Verifikationsbedingungen treten dort auf, wo die Weakening-Regel angewandt werden muss.

I Es gilt:

Vwvc(c,Q) =⇒ |={awp(c,Q)}c{Q}

Vsvc(P,c) =⇒ |={P}c{asp(P,c)}

(21)

Lösung: Annotierte Programme

I Wir helfen dem Rechner weiter undannotieren die Schleifeninvariante am Programm.

I Damit berechnen wir:

I dieapproximativeschwächste Vorbedingung awp(c,Q) zusammen mit einer Menge vonVerifikationsbedingungenwvc(c,Q)

I oder dieapproximativestärkste Nachbedingung asp(P,c) zusammen mit einer Menge vonVerifikationsbedingungensvc(P,c)

I Die Verifikationsbedingungen treten dort auf, wo die Weakening-Regel angewandt werden muss.

I Es gilt:

Vwvc(c,Q) =⇒ |={awp(c,Q)}c{Q}

Vsvc(P,c) =⇒ |={P}c{asp(P,c)}

(22)

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)

(23)

Überblick: Approximative schwächste Vorbedingung

awp({ },P) def= P awp(x =e,P) def= P[e/x]

awp({c cs},P) def= awp(c,awp({cs},P))

awp(if(b)c0 else c1,P) def= (b∧awp(c0,P))∨(¬b∧awp(c1,P)) awp(/∗∗{q}∗/,P) def= q

awp(while(b) /∗∗ inv i ∗/ c,P) def= i wvc({ },P) def= ∅ wvc(x =e,P) def= ∅

wvc({c cs},P) def= wvc(c,awp({cs},P))∪wvc({cs},P) wvc(if(b)c0 else c1,P) def= wvc(c0,P)∪wvc(c1,P)

wvc(/∗∗{q}∗/,P) def= {q=⇒P}

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

∪ {i∧ ¬b =⇒P}

(24)

Alternative Schreibweise: AWP

Pawp { },P P[e/x]awpx =e,P Pcawp c,Pcs Pcsawp{cs},P

Pcawp {c cs},P

Pc0awpc0,P Pc1awp c1,P (b∧Pc0)∨(¬b∧Pc1)←awp if(b) c0 else c1,P

iawp while(b) /** inv i */ c,P

(25)

Alternative Schreibweise: WVC

{ },Pwvcx =e,Pwvc

Pcsawp cs,P c,Pcswvc VCc {cs},Pwvc VCcs {c cs},Pwvc VCcVCcs

c0,Pwvc VCc0 c1,Pwvc VCc1

if(b) c0 else c1,Pwvc VCc0VCc1

/**{q} */,Pwvc {q=⇒P} c,iwvc VCc Pcawp c,i

while (b) /** inv i */ c,Pwvc VCc∪ {i∧b =⇒Pc,i∧ ¬b=⇒P}

(26)

Beispiel: das Fakultätsprogramm

I In der Praxis sind Vor- und Nachbedingung gegeben, und nur die Verifikationsbedingungen relevant.

I SeiF das annotierte Fakultätsprogramm:

i n t c , n , p ; /∗ ∗ { 0 <= n } ∗/

p= 1 ; c= 1 ;

w h i l e ( c <= n ) /∗ ∗ i n v p == f a c ( c−1) && c−1 <= n ; ∗/ { p = p c ;

c = c + 1 ; }

/∗ ∗ { p == f a c ( n ) } ∗/

I Berechnung der Verifikationsbedingungen zur Nachbedingung:

wvc(F,p==fac(N))

(27)

Zusammenfassung

I Die Regeln des Floyd-Hoare-Kalküls sindsymmetrisch: Die Zuweisungsregel gibt es“rückwärts” und “vorwärts”.

I Bis auf die Invarianten an Schleifen können wir Korrektheit automatisch prüfen.

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

automatisch berechnen.

I Davon sind dieVerifikationsbedingungendas interessante.

I Die Generierung von Verifikationsbedingungen korrespondiert zur relativen Vollständigkeit der Floyd-Hoare-Logik.

Referenzen

ÄHNLICHE DOKUMENTE

[r]

I Für Iterationen wird eine Invariante benötigt (die nicht hergeleitet

I Für Iterationen wird eine Invariante benötigt (die nicht hergeleitet werden kann).. Korrekte Software

I Wenn wir eine gültige Zusicherung nicht herleiten können, liegt das nur daran, dass wir eine Beweisverpflichtung nicht beweisen können.. I Logik erster Stufe ist unvollständig,

Korrekte Software: Grundlagen und Methoden Vorlesung 10 vom 12.06.18: Vorwärts mit Floyd und Hoare.. Serge Autexier,

I Rückwärtsberechnung ist einfacher zu handhaben, erzeugt aber (tendenziell sehr) große Terme.. Korrekte Software

I Axiomatische Semantik beschreibt die Bedeutung eines Programmes durch Beweisregeln, mit welchem sich gültige Eigenschaften herleiten lassen.. Das prominenteste Beispiel hierzu ist

I Wenn wir eine gültige Zusicherung nicht herleiten können, liegt das nur daran, dass wir eine Beweisverpflichtung nicht beweisen können. I Logik erster Stufe ist unvollständig,