Korrekte Software: Grundlagen und Methoden Vorlesung 2 vom 28.04.20
Operationale Semantik
Serge Autexier, Christoph Lüth
Universität Bremen Sommersemester 2020
13:55:42 2020-07-14 1 [43]
Fahrplan
IEinführung
IOperationale Semantik IDenotationale Semantik
IÄquivalenz der Operationalen und Denotationalen Semantik IDer Floyd-Hoare-Kalkül
IInvarianten und die Korrektheit des Floyd-Hoare-Kalküls IStrukturierte Datentypen
IVerifikationsbedingungen IVorwärts mit Floyd und Hoare IModellierung
ISpezifikation von Funktionen IReferenzen und Speichermodelle IAusblick und Rückblick
Korrekte Software 2 [43]
Zutaten
// GGT(A,B) i f ( a == 0 ) r = b ; e l s e {
w h i l e ( b != 0 ) { i f ( a <= b )
b = b− a ; e l s e a = a− b ; }
r = a ; }
IProgramme berechnenWerte IBasierend auf
I Werte sindVariablenzugewiesen I Evaluation vonAusdrücken IFolgt dem Programmablauf
Korrekte Software 3 [43]
Unsere Programmiersprache
Wir betrachten einen Ausschnitt der ProgrammierspracheC(C0).
Ausbaustufe 1 kennt folgende Konstrukte:
ITypen:int;
IAusdrücke: Variablen, Literale (für ganze Zahlen), arithmetische Operatoren (für ganze Zahlen), Relationen (==,<, . . . ), boolsche Operatoren (&&,||);
IAnweisungen:
IFallunterscheidung (if. . .else. . . ), Iteration (while), Zuweisung, Blöcke;
ISequenzierung und leere Anweisung sind implizit
Korrekte Software 4 [43]
C0: Ausdrücke und Anweisungen
Aexp a::=Z|Idt|a1+a2|a1−a2|a1∗a2|a1/a2 Bexp b::=1|0|a1==a2|a1<a2|!b|b1&&b2|b1||b2
Expe:=a|b Stmt c::= Idt=Exp
| if(b)c1 elsec2
| while(b)c
| c1;c2
| { } NB: Nicht diekonkreteSyntax.
Korrekte Software 5 [43]
Eine Handvoll Beispiele
a = (3+ y )∗x+5∗b ; a = ((3+ y )∗x )+(5∗b ) ; a = 3+y∗x+5∗b ;
p = 1 ; c = 1 ;
w h i l e ( c <= n ) { p= p ∗ c ; c= c + 1 ; }
Korrekte Software 6 [43]
Semantik von C0
IDie (operationale) Semantik einer imperativen Sprache wie C0 ist ein Zustandsübergang: das System hat einen impliziten Zustand, der durch Zuweisung vonWertenanAdressengeändert werden kann.
Systemzustände
IAusdrücke werten zuWertenV(hier ganze Zahlen) aus.
IAdressenLocsind hier Programmvariablen (Namen):Loc=Idt IEinSystemzustandbildet Adressen auf Werte ab: Σ =Loc*V IEin Programm bildet einen Anfangszustandmöglicherweiseauf einen
Endzustand ab (wenn esterminiert).
Partielle, endliche Abbildungen
Zustände sindpartielle, endliche Abbildungen(finite partial maps)
f :X*A Notation:
If(x) für den Wert vonxinf (lookup) If(x) =⊥wennxnicht inf (undefined)
If[n/x] für den Update an der Stellexmit dem Wertn:
f[n/x](y)def=
(n ifx=y f(y) otherwise
Ihx7→n,y7→miu.ä. für konkrete Abbildungen.
Ihiist die leere (überall undefinierte Abbildung):
hi(x) =⊥
Arbeitsblatt 2.1: Jetzt seid ihr dran!
IIn euren Gruppen-Arbeitsblättern unter
https://hackmd.informatik.uni-bremen.de/s/SkVLK1Q_Igebt folgendes an
IWie sieht ein Zustand aus, deraden Wert 6 und c den Wert 2 zuweist.
IWelches sind Zustände, und welche nicht:
(A)hx7→1,a7→3i (B)hx7→y,b7→6i (C)hx7→y,b7→6,y7→2i (D)hx7→3,b7→6,y7→2i IUpdate von Zuständen:
(A)hx7→1,a7→3i[1/y] :=??
(B)hx7→1,a7→3i[3/x] :=??
(C)hx7→1,a7→3i[3/x][y/1][4/x] :=??
Korrekte Software 9 [43]
Besprechung
IWie sieht ein Zustand aus, deraden Wert 6 und c den Wert 2 zuweist:ha7→6,c7→2i
IWelches sind Zustände, und welche nicht:
(A)hx7→1,a7→3i + (B)hx7→y,b7→6i − (C)hx7→y,b7→6,y7→2i − (D)hx7→3,b7→6,y7→2i + IUpdate von Zuständen:
(A)hx7→1,a7→3i[1/y] :=hx7→1,a7→3,y7→1i (B)hx7→1,a7→3i[3/x] :=hx7→3,a7→3i
(C)hx7→1,a7→3i[3/x][y/1][4/x] :=hx7→4,y7→1,a7→3i
Korrekte Software 10 [43]
Operationale Semantik: Arithmetische Ausdrücke
Ein arithmetischer Ausdruckawertet unter gegebenen Zustandσzu einer ganzen Zahln(Wert) aus oder zu einem Fehler⊥.
IAexpa::=Z|Idt|a1+a2|a1−a2|a1∗a2|a1/a2 ha, σi →Aexpn| ⊥ Regeln:
hn, σi →Aexpn x∈Idt,x∈Dom(σ), σ(x) =v
hx, σi →Aexpv
x∈Idt,x6∈Dom(σ) hx, σi →Aexp⊥
Korrekte Software 11 [43]
Regelschreibweise vs. Funktionen
SeiInt +=Int∪{⊥}
A e x p E v a l : : AExp−> ( Z u s t a n d−> I n t +) A e x p E v a l n : : I n t s −> n
A e x p E v a l x : : Loc s i f Dom( s ) c o n t a i n s x−> s ( x ) A e x p E v a l x : : Loc s i f n o t (Dom( s ) c o n t a i n s x )−>⊥
Korrekte Software 12 [43]
Operationale Semantik: Arithmetische Ausdrücke
IAexpa::=Z|Idt|a1+a2|a1−a2|a1∗a2|a1/a2 ha, σi →Aexpn| ⊥
ha1, σi →Aexpn1 ha2, σi →Aexpn2 ni∈Z,nSummen1undn2 ha1+a2, σi →Aexpn
ha1, σi →Aexpn1 ha2, σi →Aexpn2 fallsn1=⊥odern2=⊥ ha1+a2, σi →Aexp⊥
ha1, σi →Aexpn1 ha2, σi →Aexpn2 ni∈Z,nDiff.n1undn2 ha1−a2, σi →Aexpn
ha1, σi →Aexpn1 ha2, σi →Aexpn2 fallsn1=⊥odern2=⊥ ha1−a2, σi →Aexp⊥
Korrekte Software 13 [43]
Regelschreibweise vs. Funktionen
SeiInt +=Int∪{⊥}
A e x p E v a l : : AExp−> ( Z u s t a n d−> I n t +) A e x p E v a l n : : I n t s −> n
A e x p E v a l x : : Loc s i f Dom( s ) c o n t a i n s x−> s ( x ) A e x p E v a l x : : Loc s i f n o t (Dom( s ) c o n t a i n s x )−>⊥ A E x p E v a l ( a1 + a2 ) s −> l e t n1 = A E x p E v a l a1 s
n2 = A E x p E v a l a2 s i n
i f n1 : : I n t and n2 : : I n t t h e n n1 + n2 i f n1 ==⊥ o r n2 ==⊥t h e n ⊥
Korrekte Software 14 [43]
Operationale Semantik: Arithmetische Ausdrücke
IAexpa::=Z|Idt|a1+a2|a1−a2|a1∗a2|a1/a2 ha, σi →Aexpn| ⊥
ha1, σi →Aexpn1 ha2, σi →Aexpn2 ni∈Z,nProduktn1undn2
ha1∗a2, σi →Aexpn
ha1, σi →Aexpn1 ha2, σi →Aexpn2 fallsn1=⊥odern2=⊥ ha1∗a2, σi →Aexp⊥
ha1, σi →Aexpn1 ha2, σi →Aexpn2 ni∈Z,n26= 0,nQuotientn1,n2
ha1/a2, σi →Aexpn
ha1, σi →Aexpn1 ha2, σi →Aexpn2 fallsn1=⊥,n2=⊥odern2= 0 ha1/a2, σi →Aexp⊥
Arbeitsblatt 2.2: Jetzt seid ihr dran!
IIn euren Gruppen-Arbeitsblättern unter
https://hackmd.informatik.uni-bremen.de/s/SkVLK1Q_I vervollständigt die Funktion
A e x p E v a l : : AExp−> ( Z u s t a n d−> I n t +) A e x p E v a l n : : I n t s−> n
A e x p E v a l x : : Loc s i f Dom( s ) c o n t a i n s x−> s ( x ) A e x p E v a l x : : Loc s i f n o t (Dom( s ) c o n t a i n s x )−>⊥ A E x p E v a l ( a1 + a2 ) s −> l e t n1 = A E x p E v a l a1 s
n2 = A E x p E v a l a2 s i n
i f n1 : : I n t and n2 : : I n t t h e n n1 + n2 i f n1 ==⊥ o r n2 ==⊥t h e n ⊥
IErgänzt dies für * und für /
IFür⊥könnt ihr einfach\botschreiben.
Beispiel-Ableitungen
Seiσdef=hx7→6,y7→5i.
hx, σi →Aexp6 hy, σi →Aexp5 hx+y, σi →Aexp11
hx, σi →Aexp6 hy, σi →Aexp5 hx−y, σi →Aexp1 h(x+y)∗(x−y), σi →Aexp11
hx, σi →Aexp6 hx, σi →Aexp6 hx∗x, σi →Aexp36
hy, σi →Aexp5 hy, σi →Aexp5 hy∗y, σi →Aexp25 h(x∗x)−(y∗y), σi →Aexp11
Korrekte Software 17 [43]
Operationale Semantik: Boolesche Ausdrücke
IBexpb::= 0|1|a1==a2|a1 <a2|!b|b1&&b2|b1 || b2 hb, σi →Bexptrue|false| ⊥
Regeln:
h1, σi →Bexptrue h0, σi →Bexpfalse ha1, σi →Aexpn1 ha2, σi →Aexpn2 ni6=⊥,n1undn2gleich
ha1==a2, σi →Bexptrue
ha1, σi →Aexpn1 ha2, σi →Aexpn2 ni6=⊥,n1undn2ungleich ha1==a2, σi →Bexpfalse
ha1, σi →Aexpn1 ha2, σi →Aexpn2 n1=⊥orn2=⊥ ha1==a2, σi →Bexp⊥
Korrekte Software 18 [43]
Operationale Semantik: Boolesche Ausdrücke
IBexpb::= 0|1|a1==a2|a1 <a2|!b|b1&&b2|b1 || b2 hb, σi →Bexptrue|false| ⊥
Regeln:
hb, σi →Bexptrue h!b, σi →Bexpfalse
hb, σi →Bexpfalse h!b, σi →Bexptrue
hb, σi →Bexp⊥ h!b, σi →Bexp⊥ hb1, σi →Bexpfalse
hb1&&b2, σi →Bexpfalse
hb1, σi →Bexp⊥ hb1&&b2, σi →Bexp⊥ hb1, σi →Bexptrue hb2, σi →Bexpt
hb1&&b2, σi →Bexpt
Korrekte Software 19 [43]
Operationale Semantik: Boolesche Ausdrücke
IBexpb::= 0|1|a1==a2|a1 <a2|!b|b1&&b2|b1 || b2 hb, σi →Bexptrue|false| ⊥
Regeln:
hb1, σi →Bexptrue hb1&&b2, σi →Bexptrue
hb1, σi →Bexp⊥ hb1&&b2, σi →Bexp⊥ hb1, σi →Bexpfalse hb2, σi →Bexpt
hb1||b2, σi →Bexpt
Korrekte Software 20 [43]
Operationale Semantik: Anweisungen
IStmtc::=Idt=Exp|if(b)c1 else c2|while(b)c|c1;c2| { } Beispiel:
hc, σi →Stmtσ0| ⊥ hx= 5, σi →Stmtσ0
wobeiσ0(x) = 5 undσ0(y) =σ(y) für alley6=x
Korrekte Software 21 [43]
Operationale Semantik: Anweisungen
IStmtc::=Idt=Exp|if(b)c1 elsec2|while(b)c|c1;c2| { } Regeln:
h{ }, σi →Stmtσ ha, σi →Aexpn∈Z
hx=a, σi →Stmtσ[n/x]
ha, σi →Aexp⊥ hx=a, σi →Stmt⊥ hc1, σi →Stmtσ06=⊥ hc2, σ0i →Stmtσ006=⊥
hc1;c2, σi →Stmtσ00 hc1, σi →Stmt⊥ hc1;c2, σi →Stmt⊥
hc1, σi →Stmtσ06=⊥ hc2, σ0i →Stmt⊥ hc1;c2, σi →Stmt⊥
Korrekte Software 22 [43]
Operationale Semantik: Anweisungen
IStmtc::=Idt=Exp|if(b)c1 else c2|while(b)c|c1;c2| { } Regeln:
hb, σi →Bexptrue hc1, σi →Stmtσ0 hif(b)c1 elsec2, σi →Stmtσ0 hb, σi →Bexpfalse hc2, σi →Stmtσ0
hif(b)c1 elsec2, σi →Stmtσ0 hb, σi →Bexp⊥ hif(b)c1 elsec2, σi →Stmt⊥
Operationale Semantik: Anweisungen
IStmtc::=Idt=Exp|if(b)c1 elsec2|while(b)c|c1;c2| { } Regeln:
hb, σi →Bexpfalse hwhile(b)c, σi →Stmtσ
hb, σi →Bexptrue hc, σi →Stmtσ0 hwhile(b)c, σ0i →Stmtσ00 hwhile(b)c, σi →Stmtσ00
hb, σi →Bexptrue hc, σi →Stmt⊥ hwhile(b)c, σi →Stmt⊥
hb, σi →Bexp⊥ hwhile(b)c, σi →Stmt⊥
Beispiel
x = 1 ;
w h i l e ( y != 0 ) { y = y− 1 ; x = 2 ∗ x ; }
//x= 2y σdef=hy7→2i
Korrekte Software 25 [43]
h1, σi →Aexp1 hx= 1, σi →Stmtσ[1/x] :=σ1
hy, σ1i →Aexp2 hy! = 0, σ1i →Bexp1
(A) hy=y−1;x= 2∗x, σ1i →Stmt?
(B) hw,?i →Stmt? hwhile(y! = 0){y=y−1;x= 2∗x}, σ1i →Stmt? hx= 1;while(y! = 0){y=y−1;x= 2∗x}
| {z }
w
, σi →Stmt?
Korrekte Software 26 [43]
(A)
hy−1, σ1i →Aexp1 hy=y−1, σ1i →Stmtσ1[1/y] :=σ2
h2∗x, σ2i →Aexp2 hx= 2∗x, σ2i →Stmtσ2[2/x] :=σ3 hy=y−1;x= 2∗x, σ1i →Stmtσ3
Korrekte Software 27 [43]
h1, σi →Aexp1 hx= 1, σi →Stmtσ1
hy, σ1i →Aexp2 hy! = 0, σ1i →Bexp1
(A) hy=y−1;x= 2∗x, σ1i →Stmtσ3
(B) hw, σ3i →Stmt? hwhile(y! = 0){y=y−1;x= 2∗x}, σ1i →Stmt? hx= 1;while(y! = 0){y=y−1;x= 2∗x}
| {z }
w
, σi →Stmt?
Korrekte Software 28 [43]
(B)
hy, σ3i →Aexp1 hy! = 0, σ3i →Bexp1
hy−1, σ3i →Aexp0 hy=y−1, σ3i →Stmtσ3[0/y] :=σ4
h2∗x, σ4i →Aexp4 hx= 2∗x, σ4i →Stmtσ4[4/x] :=σ5 hy=y−1;x= 2∗x, σ3i →Stmtσ5
(C) hw, σ5i →Stmtσ5 hw, σ3i →Stmtσ5
hy, σ5i →Aexp0 hy! = 0, σ3i →Bexp0
hw, σ5i →Stmtσ5
(C) (1)
while(y! = 0){y=y−1;x= 2∗x}
| {z }
w
Korrekte Software 29 [43]
. . .
hy, σ1i →Aexp2 hy! = 0, σ1i →Bexp1
(A) hy=y−1;x= 2∗x, σ1i →Stmtσ3
(B) hw, σ3i →Stmtσ5 hwhile(y! = 0){y=y−1;x= 2∗x}, σ1i →Stmtσ5 hx= 1;while(y! = 0){y=y−1;x= 2∗x}
| {z }
w
, σi →Stmtσ5
σ5=σ4[4/x] =σ3[0/y][4/x] =σ2[2/x][0/y][4/x]
=σ1[1/y][2/x][0/y][4/x] =hy7→2i[1/y][2/x][0/y][4/x]
=hy7→0,x7→4i und es giltσ5(x) = 4 = 22= 2σ1(y)
Korrekte Software 30 [43]
Lineare, abgekürzte Schreibweise
//hy7→2i x = 1 ; //hy7→2,x7→1i w h i l e ( y != 0 ) {
y = y− 1 ; x = 2 ∗ x ; }
Lineare, abgekürzte Schreibweise
//hy7→2i
x = 1 ; // Ableitung fürx= 1
//hy7→2,x7→1i
w h i l e(w) //hy! = 0,hy7→2,x7→1ii →Bexp1
| y = y − 1 ; // Ableitung füry=y−1
| //hy7→1,x7→1i
| x = 2 ∗ x ; // Ableitung fürx= 2∗x
| //hy7→1,x7→2i w h i l e ( y != 0 ) {
y = y − 1 ; x = 2 ∗ x ; }
Lineare, abgekürzte Schreibweise
//hy7→2i x = 1 ; //hy7→2,x7→1i
w h i l e(w) //hy! = 0,hy7→2,x7→1ii →Bexp1
| y = y− 1 ; // Ableitung füry=y−1
| //hy7→1,x7→1i
| x = 2 ∗ x ; // Ableitung fürx= 2∗x
| //hy7→1,x7→2i
w h i l e(w) //hy! = 0,hy7→1,x7→2ii →Bexp1
| y = y− 1 ;
| //hy7→0,x7→1i
| x = 2 ∗ x ;
| //hy7→0,x7→4i
w h i l e(w) //hy! = 0,hy7→0,x7→2ii →Bexp0 //hy7→0,x7→4i
Korrekte Software 33 [43]
Was haben wir gezeigt?
//hy7→2i x = 1 ; //hy7→2,x7→1i w h i l e ( y != 0 ) {
y = y − 1 ; x = 2 ∗ x ; }
//hy7→0,x7→4i
IFüreinen festen Anfangszustandσ1=hy7→2igilt am Ende x= 4 = 22= 2σ1(y).
IGilt das für alle?
IFür welche nicht?
IWie kann man das für alle Anfangs-Zustände, für die es gilt, zeigen?
Korrekte Software 34 [43]
Was passiert hier?
//hy7→ −1i x = 1 ;
w h i l e ( y != 0 ) { y = y− 1 ; x = 2 ∗ x ; }
IAbleitung terminiert nicht (Ableitungsbaum der Auswerttung der while-Schleife wächst unendlich)
IIn linearer Schreibweise geht es immer wieder unten weiter.
Korrekte Software 35 [43]
Arbeitsblatt 2.3: Jetzt seid ihr dran!
IWerten Sie das nebenstehende Program aus für den
Anfangszustandhx7→5,y7→2i IGeben Sie die Auswertung in
abgekürzter Schreibweise an.
IWelche Beziehung gilt am Ende des Programs zwischen den Werten vonxundyim Endzustand und im Anfangszustand?
w h i l e ( y != 0 ) { x = x ∗ x ; y = y− 1 ; }
Korrekte Software 36 [43]
Lineare, abgekürzte Schreibweise
w h i l e(w) //hx7→5,y7→2i σ1
| //hy! = 0,hx7→5,y7→2ii →Bexp1
| x = x ∗ x ;
| //hx7→25,y7→2i
| y = y− 1 ;
| //hx7→25,y7→1i
w h i l e(w) //hy! = 0,hx7→25,y7→1ii →Bexp1
| x = x ∗ x ;
| //hx7→625,y7→1i
| y = y− 1 ;
| //hx7→625,y7→0i σ5
w h i l e(w) //hy! = 0,hx7→625,y7→0ii →Bexp0 //hx7→625,y7→0i
Und es gilt 625 = 54= 522bzw.σ5(x) =σ1(x)2σ1(y)
Korrekte Software 37 [43]
Äquivalenz arithmetischer Ausdrücke
Gegeben zwei Aexpa1anda2 ISind sie gleich?
a1∼Aexpa2gdw∀σ,n.ha1, σi →Aexpn⇔ ha2, σi →Aexpn ( x∗x ) + 2∗x∗y + ( y∗y ) und ( x+y ) ∗ ( x+y )
IWann sind sie gleich?
∀σ,n.ha1, σi →Aexpn⇔ ha2, σi →Aexpn
x∗x und 8∗x+9
x∗x und x∗x+1
Korrekte Software 38 [43]
Äquivalenz Boolscher Ausdrücke
Gegeben zwei Bexp-Ausdrückeb1andb2 ISind sie gleich?
b1∼Bexpb2iff∀σ,b.hb1, σi →Bexpb⇔ hb2, σi →Bexpb A | | (A && B) und A
Beweisen
Zwei Programmec0,c1sind äquivalent gdw. sie die gleichen Zustandsveränderungen bewirken. Formal definieren wir Definition
c0∼c1iff∀σ, σ0.hc0, σi →Stmtσ0⇔ hc1, σi →Stmtσ0
Ein einfaches Beispiel:
Lemma
Sei w≡while(b)c mit b∈Bexp, c∈Stmt.
Dann gilt: w∼if(b){c;w} else{ }
Beweis
Gegeben beliebiger Programmzustandσ. Zu zeigen ist, dass sowohlw also auchif(b){c;w} else{ }zu dem selben Programmzustand auswerten oder beide zu einem Fehler. Der Beweis geht per Fallunterscheidung über die Auswertung von Teilausdrücken bzw.
Teilprogrammen.
1 hb, σi →Bexp⊥:
hwhile(b)c, σi →Stmt⊥ hif(b){c;w} else{ }, σi →Stmt⊥
2 hb, σi →Bexpfalse:
hwhile(b)c, σi →Stmtσ
hif(b){c;w} else{ }, σi →Stmth{ }, σi →Stmtσ
Korrekte Software 41 [43]
Beweis II
3 hb, σi →Bexptrue:
1 hc, σi →Stmtσ0 h
w
z }| {
while(b)c, σi →Stmthc, σi →Stmtσ0 hw, σ0i →Stmtσ00
hif(b){c;w}else{ }, σi →Stmth{c;w}, σi →Stmthc, σi →Stmtσ0 hw, σ0i →Stmtσ00
2 hc, σi →Stmt⊥ h
w
z }| {
while(b)c, σi →Stmthc, σi →Stmt⊥
hif(b){c;w}else{ }, σi →Stmth{c;w}, σi →Stmthc, σi →Stmt⊥
Korrekte Software 42 [43]
Zusammenfassung
IOperationale Semantik als ein Mittel zur Beschreibung der Semantik
IAuswertungsregeln arbeiten entlang der syntaktischen Struktur
IWerten Ausdrücke zu Werten aus und Programme zu Zuständen (zu gegebenen Zustand)
IFragen zu Programmen: Gleichheit
Korrekte Software 43 [43]