Korrekte Software: Grundlagen und Methoden Vorlesung 5 vom 03.05.18: Die Floyd-Hoare-Logik
Serge Autexier, Christoph Lüth Universität Bremen Sommersemester 2018
11:50:50 2018-06-05 1 [23]
Fahrplan
I Einführung
I Operationale Semantik I Denotationale Semantik
I Äquivalenz der Operationalen und Denotationalen Semantik I Die Floyd-Hoare-Logik
I Invarianten und die Korrektheit des Floyd-Hoare-Kalküls I Strukturierte Datentypen
I Modellierung und Spezifikation I Verifikationsbedingungen I Vorwärts mit Floyd und Hoare I Funktionen und Prozeduren I Referenzen
I Ausblick und Rückblick
Korrekte Software 2 [23]
Drei Semantiken — Eine Sicht
p = 1;
c := 1;
while (c <= n) { p= p * c;
c= c + 1;
}
Operational
Axiomatisch Denotational
Programm
Korrekte Software 3 [23]
Floyd-Hoare-Logik: Idee
IWas wird hier berechnet?p=n!
IWarum? Wie können wir das beweisen?
IWir berechnen symbolisch, welche Werte Variablen über den Programmverlauf annehmen.
p= 1 ; c= 1 ;
w h i l e ( c <= n ) { p = p ∗ c ; c = c + 1 ; }
I Operationale/denotionale Semantik nicht fürKorrektheitsbeweise geeignet: Ausdrücke werden zu groß, skaliert nicht.
I Abstraktionnötig.
I Grundidee:Zusicherungenüber den Zustand an bestimmten Punkten im Programmablauf.
Korrekte Software 4 [23]
Bob Floyd und Tony Hoare
Bildquelle: Stanford University
Robert Floyd 1936 – 2001
Bildquelle: Wikipedia
Sir Anthony Charles Richard Hoare
∗1934
Korrekte Software 5 [23]
Grundbausteine der Floyd-Hoare-Logik
I Zusicherungenüber den Zustand I Beispiele:
I (B): Hier giltp=c= 1
I (D): Hier istcist um eines größer als der Wert voncan Punkt (C) I Gesamtaussage: Wenn am Punkt(A)
der Wert vonn≥0, dann ist am Punkt (E)p=n!.
// (A) p= 1 ; c= 1 ; // (B)
w h i l e ( c <= n ) { p= p ∗ c ; // (C) c= c + 1 ; // (D) } // (E)
Korrekte Software 6 [23]
Grundbausteine der Floyd-Hoare-Logik
I Logische Variablen(zustandsfrei) undProgrammvariablen
I Zusicherungenmit logischen und Programmvariablen I Floyd-Hoare-Tripel{P}c{Q}
I VorbedingungP(Zusicherung)
I Programmc
I NachbedingungQ(Zusicherung)
I Floyd-Hoare-Logik abstrahiert Programme durch logische Formeln.
Korrekte Software 7 [23]
Zusicherungen (Assertions)
I Erweiterung vonAexpandBexpdurch
ILogischeVariablenVar v:=N,M,L,U,V,X,Y,Z
IDefinierte Funktionen und Prädikate überAexp n!,Pn i=1i, . . .
IImplikation und Quantoren b1⇒b2,forallv.b,existsv.b I Formal:
Aexpv a::= Z|Idt|Var|a1+a2|a1−a2|a1×a2
|f(e1, . . . ,en)
Assn b::= 1|0|a1==a2|a1! =a2|a1<=a2
|!b|b1&&b2|b1||b2
|b1⇒b2|p(e1, . . . ,en)|forallv;b|existsv;b
Korrekte Software 8 [23]
Erfüllung von Zusicherungen
I Wann gilt eine Zusicherungb∈Assnin einem Zustandσ?
I Auswertung (denotationale Semantik) ergibttrue
I Aber:was ist mit den logischen Variablen?
I Belegungder logischen Variablen:I:Var→T I Semantik vonbunter der BelegungI:Bv[[b]]I,Av[[a]]I Erfülltheit von Zusicherungen
b∈Assnist in Zustandσmit BelegungIerfüllt (σ|=Ib), gdw Bv[[b]]I(σ) =true
Korrekte Software 9 [23]
Floyd-Hoare-Tripel
Partielle Korrektheit (|={P}c{Q})
cistpartiell korrekt, wenn für alle Zuständeσ, diePerfüllen, gilt:
wenndie Ausführung voncmitσinσ0terminiert,dannerfülltσ0Q.
|={P}c{Q} ⇐⇒ ∀I.∀σ. σ|=IP∧ ∃σ0.(σ, σ0)∈ C[[c]] =⇒σ0|=IQ I Gleiche Belegung der logischen Variablen fürPundQ.
Totale Korrektheit (|= [P]c[Q])
cisttotal korrekt, wenn für alle Zustandeσ, diePerfüllen, die Ausführung voncmitσinσ0terminiert, undσ0erfülltQ.
|= [P]c[Q]⇐⇒ ∀I.∀σ. σ|=IP=⇒ ∃σ0.(σ, σ0)∈ C[[c]]∧σ0|=IQ I Folgendesgilt:|={1}while(1){ } {1}
I Folgendes giltnicht:|= [1]while(1){ }[1]
Korrekte Software 10 [23]
Regeln der Floyd-Hoare-Logik
I Die Floyd-Hoare-Logik erlaubt es, Zusicherungen der Form
` {P}c{Q}syntaktischherzuleiten.
I DerKalkülder Logik besteht aus sechs Regeln der Form
` {P1}c1{Q1}. . .` {Pn}cn{Qn}
` {P}c{Q}
I Für jedes Konstrukt der Programmiersprache gibt es eine Regel.
Korrekte Software 11 [23]
Regeln des Floyd-Hoare-Kalküls: Zuweisung
` {P[e/x]}x=e{P}
I Eine Zuweisung x=e ändert den Zustand so dass an der Stellexjetzt der Wert vonesteht. Damitnachherdas PrädikatPgilt, muss also vorherdas Prädikat gelten, wenn wirxdurcheersetzen.
I Es ist völlig normal (aber dennoch falsch) zu denken, die Substitution gehöre eigentlich in die Nachbedingung.
I Beispiele:
{5<10⇐⇒(x<10)[5/x]}
x = 5 {x<10}
{x<9⇐⇒x+ 1<10}
x = x+ 1 {x<10}
Korrekte Software 12 [23]
Regeln des Floyd-Hoare-Kalküls: Fallunterscheidung
` {A&&b}c0{B} ` {A&&¬b}c1{B}
` {A}if(b)c0 elsec1{B}
I In der Vorbedingung desif-Zweiges gilt die Bedingungb, und im else-Zweig gilt die Negation¬b.
I Beide Zweige müssem mit derselben Nachbedingung enden.
Korrekte Software 13 [23]
Regeln des Floyd-Hoare-Kalküls: Iteration
` {A∧b}c{A}
` {A}while(b)c{A∧ ¬b}
I Iteration korrespondiert zuInduktion.
I Bei (natürlicher) Induktion zeigen wir, dass diegleicheEigenschaftP für 0 gilt, und dass wenn sie fürP(n) gilt, daraus folgt, dass sie für P(n+ 1) gilt.
I Analog dazu benötigen wir hier eineInvarianteA, die sowohlvorals auchnachdem Schleifenrumpf gilt.
I In derVorbedingungdesSchleifenrumpfeskönnen wir die Schleifenbedingungbannehmen.
I DieVorbedingungderSchleifeist die InvarianteA, und die NachbedingungderSchleifeistAund die Negation der Schleifenbedingungb.
Korrekte Software 14 [23]
Regeln des Floyd-Hoare-Kalküls: Sequenzierung
` {A}c1{B} ` {B}c2{C}
` {A}c1;c2{C}
I Hier wird eine ZwischenzusicherungBbenötigt.
` {A} { } {A}
I Trivial.
Korrekte Software 15 [23]
Regeln des Floyd-Hoare-Kalküls: Weakening
A0=⇒A ` {A}c{B} B=⇒B0
` {A0}c{B0}
c All possible program states
A c B
All possible program states B' A'
I |={A}c{B}: Ausführung voncstartet in Zustand, in demAgilt, und endet (ggf) in Zustand, in demBgilt.
I Zustandsprädikate beschreiben Mengen von Zuständen:P⊆Qgdw.
P=⇒Q.
I Wir könnenAzuA0einschränken (A0⊆AoderA0=⇒A), oderBzu B0vergrößern (B⊆B0oderB=⇒B0), und erhalten|={A0}c{B0}.
Korrekte Software 16 [23]
Überblick: die Regeln des Floyd-Hoare-Kalküls
` {P[e/x]}x=e{P}
` {A∧b}c0{B} ` {A∧ ¬b}c1{B}
` {A}if(b)c0 elsec1{B}
` {A∧b}c{A}
` {A}while(b)c{A∧ ¬b}
` {A} { } {A}
` {A}c1{B} ` {B}c2{C}
` {A}c1;c2{C}
A0=⇒A ` {A}c{B} B=⇒B0
` {A0}c{B0}
Korrekte Software 17 [23]
Einfache Beispiele
Seip:
z= x ; x= y ; y= z ;
Seiq:
i f ( x < y ) { z = x ; } e l s e { z= y ; } Zu zeigen:
I pvertauschtxundy I ` {x=X∧y=Y}
p
{x=Y∧y=X}
Zu zeigen:
Iqberechnet inzdas Minimum vonxundy
I` {true}
q
{z≤x∧z≤y}
Korrekte Software 18 [23]
Wie wir Floyd-Hoare-Beweise aufschreiben
//{P}
//{P1} x= e ; //{P2} //{P3} w h i l e ( x< n ) {
//{P3∧x<n}
//{P4} z= a ; //{P3} }
//{P3∧ ¬(x<n)}
//{Q}
IBeispiel zeigt:` {P}c{Q}
IProgramm wird mit gültigen Zusicherungen annotiert.
IVor einer Zeile steht die Vorbedingung, danach die Nachbedingung.
IImplizite Anwendung der Sequenzenregel.
IWeakening wird notiert durch mehrere Zusicherungen, und mussbewiesenwerden.
IIm Beispiel:P=⇒P1, P2=⇒P3,P3∧x<n=⇒P4, P3∧ ¬(x<n) =⇒Q.
Korrekte Software 19 [23]
Das einfache Beispiel in neuer Notation
//{x=X∧y=Y}
//{y=Y∧x=X}
z= x ;
//{y=Y∧z=X}
x= y ;
//{x=Y∧z=X}
y= z ;
//{x=Y∧y=X}
Korrekte Software 20 [23]
Das Fakultätsbeispiel
//{1 = 0!∧ ∧0≤n}
//{1 = (1−1)!∧1≤1∧1−1≤n}
p= 1 ;
//{p= (1−1)!∧1≤1∧1−1≤n}
c= 1 ;
//{p= (c−1)!∧1≤c∧c−1≤n}
w h i l e ( c<= n ) {
//{p= (c−1)!∧1≤c∧c−1≤n∧c≤n}
//{p∗c= (c−1)!∗c∧1≤c∧c≤n}
//{p∗c=c!∧1≤c∧c≤n}
//{p∗c= ((c+ 1)−1)!∧1≤c+ 1∧(c+ 1)−1≤n}
p= p∗c ;
//{p= ((c+ 1)−1)!∧1≤c+ 1∧(c+ 1)−1≤n}
c= c +1;
//{p= (c−1)!∧1≤c∧c−1≤n}
}
//{p= (c−1)!∧1≤c∧c−1≤n∧ ¬(c≤n)}
//{p= (c−1)!∧1≤c∧c−1≤n∧c>n}
//{p= (c−1)!∧1≤c∧c−1 =n}
//{p=n!}
Korrekte Software 21 [23]
Das Fakultätsbeispiel (Quellcode)
/∗∗ { 1 == f a c t o r i a l ( 0 ) && 0 <= n } ∗/
/∗∗ { 1 == f a c t o r i a l (1− 1 ) && 1 <= 1 && 1−1 <= n } ∗/
p= 1 ;
/∗∗ { p == f a c t o r i a l (1− 1 ) && 1 <= 1 && 1−1 <= n } ∗/
c= 1 ;
/∗∗ { p == f a c t o r i a l ( c− 1 ) && 1 <= c && c−1 <= n } ∗/
w h i l e ( c<= n ) {
/∗∗ { p == f a c t o r i a l ( c−1) && 1<= c && c−1 <= n && c <= n } ∗/
/∗∗ { p∗c == f a c t o r i a l ( c−1)∗ c && 1 <= c && c <= n } ∗/
/∗∗ { p∗c == f a c t o r i a l ( c ) && 1 <= c && c <= n } ∗/
/∗∗ { p∗c == f a c t o r i a l ( ( c+1)− 1 ) && 1 <= c+1 && ( c+1)−1 <= n } ∗/
p= p∗c ;
/∗∗ { p == f a c t o r i a l ( ( c +1)−1) && 1<= c+1 && ( c+1)−1 <= n } ∗/
c= c +1;
/∗∗ { p == f a c t o r i a l ( c−1) && 1 <= c && c−1 <= n } ∗/
}
/∗∗ { p == f a c t o r i a l ( c−1) && 1<= c && c−1 <= n && f a c t o r i a l ( c <= n ) } ∗/
/∗∗ { p == f a c t o r i a l ( c−1) && 1<= c && c−1 <= n && c > n } ∗/
/∗∗ { p == f a c t o r i a l ( c−1) && 1<= c && c−1 == n } ∗/
/∗∗ { p == f a c t o r i a l ( n ) } ∗/
Korrekte Software 22 [23]
Zusammenfassung Floyd-Hoare-Logik
I Die Logik abstrahiert über konkrete Systemzustände durch Zusicherungen(Hoare-Tripel{P}c{Q}).
I Zusicherungen sind boolsche Ausdrücke, angereichert durch logische Variablen.
I SemantischeGültigkeitvon Hoare-Tripeln:|={P}c{Q}.
I SyntaktischeHerleitbarkeitvon Hoare-Tripeln:` {P}c{Q}
I Zuweisungen werden durch Substitution modelliert, d.h. die Menge der gültigen Aussagen ändert sich.
I Für Iterationen wird eineInvariantebenötigt (dienichthergeleitet werden kann).
Korrekte Software 23 [23]