Korrekte Software: Grundlagen und Methoden Vorlesung 2 vom 28.04.20
Operationale Semantik
Serge Autexier, Christoph Lüth
Universität Bremen
Sommersemester 2020
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
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 ; }
I Programme berechnenWerte I Basierend auf
I Werte sindVariablenzugewiesen I Evaluation vonAusdrücken I Folgt dem Programmablauf
Unsere Programmiersprache
Wir betrachten einen Ausschnitt der ProgrammierspracheC(C0).
Ausbaustufe 1 kennt folgende Konstrukte:
I Typen: int;
I Ausdrücke: Variablen, Literale (für ganze Zahlen), arithmetische Operatoren (für ganze Zahlen), Relationen (==,<, . . . ), boolsche Operatoren (&&, ||);
I Anweisungen:
I Fallunterscheidung (if. . .else. . . ), Iteration (while), Zuweisung, Blöcke;
I Sequenzierung und leere Anweisung sind implizit
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
Exp e :=a|b
Stmt c ::= Idt=Exp
| if(b) c1 else c2
| while (b) c
| c1;c2
| { }
NB: Nicht diekonkrete Syntax.
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 ; }
Semantik von C0
I Die (operationale) Semantik einer imperativen Sprache wie C0 ist ein Zustandsübergang: das System hat einen impliziten Zustand, der durch Zuweisung vonWertenan Adressen geändert werden kann.
Systemzustände
I Ausdrücke werten zuWerten V(hier ganze Zahlen) aus.
I AdressenLocsind hier Programmvariablen (Namen): Loc=Idt I EinSystemzustandbildet Adressen auf Werte ab: Σ =Loc*V I Ein Programm bildet einen Anfangszustandmöglicherweiseauf einen
Endzustand ab (wenn esterminiert).
Partielle, endliche Abbildungen
Zustände sind partielle, endliche Abbildungen(finite partial maps)
f :X *A Notation:
I f(x) für den Wert von x in f (lookup) I f(x) =⊥wennx nicht inf (undefined)
I f[n/x] für den Update an der Stelle x mit dem Wertn:
f[n/x](y)def=
(n if x=y f(y) otherwise
I hx 7→n,y7→miu.ä. für konkrete Abbildungen.
I hiist die leere (überall undefinierte Abbildung):
hi(x) =⊥
Arbeitsblatt 2.1: Jetzt seid ihr dran!
I In euren Gruppen-Arbeitsblättern unter
https://hackmd.informatik.uni-bremen.de/s/SkVLK1Q_Igebt folgendes an
I Wie sieht ein Zustand aus, dera den Wert 6 und c den Wert 2 zuweist.
I Welches sind Zustände, und welche nicht:
(A)hx7→1,a7→3i
(B)hx7→y,b7→6i
(C)hx7→y,b7→6,y 7→2i
(D)hx7→3,b7→6,y 7→2i I Update von Zuständen:
(A)hx7→1,a7→3i[1/y] :=??
(B)hx7→1,a7→3i[3/x] :=??
Besprechung
I Wie sieht ein Zustand aus, dera den Wert 6 und c den Wert 2 zuweist:ha7→6,c 7→2i
I Welches sind Zustände, und welche nicht:
(A)hx7→1,a7→3i +
(B)hx7→y,b7→6i −
(C)hx7→y,b7→6,y 7→2i −
(D)hx7→3,b7→6,y 7→2i + I Update von Zuständen:
(A)hx7→1,a7→3i[1/y] :=hx 7→1,a7→3,y 7→1i
(B)hx7→1,a7→3i[3/x] :=hx 7→3,a7→3i
(C)hx7→1,a7→3i[3/x][y/1][4/x] :=hx7→4,y 7→1,a7→3i
Operationale Semantik: Arithmetische Ausdrücke
Ein arithmetischer Ausdruck a wertet unter gegebenen Zustandσ zu einer ganzen Zahl n (Wert) aus oder zu einem Fehler⊥.
I Aexpa::=Z|Idt|a1+a2 |a1−a2 |a1∗a2 |a1 / a2
ha, σi →Aexp n | ⊥
Regeln:
hn, σi →Aexp n x ∈Idt,x ∈Dom(σ), σ(x) =v
hx, σi →Aexp v
x ∈Idt,x 6∈Dom(σ) hx, σi →Aexp ⊥
Operationale Semantik: Arithmetische Ausdrücke
Ein arithmetischer Ausdruck a wertet unter gegebenen Zustandσ zu einer ganzen Zahl n (Wert) aus oder zu einem Fehler⊥.
I Aexpa::=Z|Idt|a1+a2 |a1−a2 |a1∗a2 |a1 / a2
ha, σi →Aexp n | ⊥ Regeln:
hn, σi →Aexp n
x ∈Idt,x ∈Dom(σ), σ(x) =v hx, σi →Aexp v
x ∈Idt,x 6∈Dom(σ) hx, σi →Aexp ⊥
Operationale Semantik: Arithmetische Ausdrücke
Ein arithmetischer Ausdruck a wertet unter gegebenen Zustandσ zu einer ganzen Zahl n (Wert) aus oder zu einem Fehler⊥.
I Aexpa::=Z|Idt|a1+a2 |a1−a2 |a1∗a2 |a1 / a2
ha, σi →Aexp n | ⊥ Regeln:
hn, σi →Aexp n x ∈Idt,x ∈Dom(σ), σ(x) =v
hx, σi →Aexp v
x ∈Idt,x 6∈Dom(σ) hx, σi →Aexp ⊥
Regelschreibweise vs. Funktionen
Sei Int + = 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 ) −> ⊥
Operationale Semantik: Arithmetische Ausdrücke
I Aexpa::=Z|Idt|a1+a2 |a1−a2 |a1∗a2 |a1 / a2 ha, σi →Aexp n| ⊥
ha1, σi →Aexp n1 ha2, σi →Aexp n2 ni ∈Z,n Summe n1 undn2 ha1+a2, σi →Aexp n
ha1, σi →Aexp n1 ha2, σi →Aexp n2 falls n1 =⊥oder n2 =⊥ ha1+a2, σi →Aexp ⊥
ha1, σi →Aexp n1 ha2, σi →Aexp n2 ni ∈Z,n Diff.n1 und n2 ha1−a2, σi →Aexp n
ha1, σi →Aexp n1 ha2, σi →Aexp n2 fallsn1 =⊥oder n2 =⊥ ha1−a2, σi →Aexp ⊥
Operationale Semantik: Arithmetische Ausdrücke
I Aexpa::=Z|Idt|a1+a2 |a1−a2 |a1∗a2 |a1 / a2 ha, σi →Aexp n| ⊥
ha1, σi →Aexp n1 ha2, σi →Aexp n2 ni ∈Z,n Summe n1 undn2 ha1+a2, σi →Aexp n
ha1, σi →Aexp n1 ha2, σi →Aexp n2 falls n1 =⊥oder n2 =⊥ ha1+a2, σi →Aexp ⊥
ha1, σi →Aexp n1 ha2, σi →Aexp n2 ni ∈Z,n Diff.n1 und n2 ha1−a2, σi →Aexp n
ha1, σi →Aexp n1 ha2, σi →Aexp n2 falls n1 =⊥oder n2 =⊥ ha1−a2, σi →Aexp ⊥
Regelschreibweise vs. Funktionen
Sei Int + = 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 ⊥
Operationale Semantik: Arithmetische Ausdrücke
I Aexpa::=Z|Idt|a1+a2 |a1−a2 |a1∗a2 |a1 / a2
ha, σi →Aexp n| ⊥
ha1, σi →Aexpn1 ha2, σi →Aexpn2 ni∈Z,nProduktn1und n2
ha1∗a2, σi →Aexpn
ha1, σi →Aexpn1 ha2, σi →Aexpn2 fallsn1=⊥oder n2=⊥ ha1∗a2, σi →Aexp⊥
ha1, σi →Aexpn1 ha2, σi →Aexpn2 ni∈Z,n26= 0,nQuotientn1,n2
ha1/a2, σi →Aexp n
ha1, σi →Aexpn1 ha2, σi →Aexpn2 fallsn1=⊥,n2=⊥odern2= 0 ha1/a2, σi →Aexp⊥
Operationale Semantik: Arithmetische Ausdrücke
I Aexpa::=Z|Idt|a1+a2 |a1−a2 |a1∗a2 |a1 / a2
ha, σi →Aexp n| ⊥
ha1, σi →Aexpn1 ha2, σi →Aexpn2 ni∈Z,nProduktn1und n2
ha1∗a2, σi →Aexpn
ha1, σi →Aexpn1 ha2, σi →Aexpn2 fallsn1=⊥oder n2=⊥ ha1∗a2, σi →Aexp⊥
ha1, σi →Aexpn1 ha2, σi →Aexpn2 ni∈Z,n26= 0,nQuotientn1,n2
ha1/a2, σi →Aexp n
ha1, σi →Aexpn1 ha2, σi →Aexpn2 fallsn1=⊥,n2=⊥odern2= 0 ha1/a2, σi →Aexp⊥
Arbeitsblatt 2.2: Jetzt seid ihr dran!
I In 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 ⊥
I Ergänzt dies für * und für /
I Für⊥könnt ihr einfach\botschreiben.
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
h(x+y)∗(x−y), σi →Aexp
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
hx+y, σi →Aexp hx−y, σi →Aexp
h(x+y)∗(x−y), σi →Aexp
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
hx, σi →Aexp6
hx+y, σi →Aexp hx−y, σi →Aexp
h(x+y)∗(x−y), σi →Aexp
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
hx, σi →Aexp6 hy, σi →Aexp 5
hx+y, σi →Aexp hx−y, σi →Aexp
h(x+y)∗(x−y), σi →Aexp
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
hx, σi →Aexp6 hy, σi →Aexp 5
hx+y, σi →Aexp11 hx−y, σi →Aexp
h(x+y)∗(x−y), σi →Aexp
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
hx, σi →Aexp6 hy, σi →Aexp5 hx+y, σi →Aexp11
hx, σi →Aexp6 hy, σi →Aexp 5 hx−y, σi →Aexp
h(x+y)∗(x−y), σi →Aexp
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
hx, σi →Aexp6 hy, σi →Aexp5 hx+y, σi →Aexp11
hx, σi →Aexp6 hy, σi →Aexp 5 hx−y, σi →Aexp 1 h(x+y)∗(x−y), σi →Aexp
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
hx, σi →Aexp6 hy, σi →Aexp5 hx+y, σi →Aexp11
hx, σi →Aexp6 hy, σi →Aexp 5 hx−y, σi →Aexp 1 h(x+y)∗(x−y), σi →Aexp11
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
hx, σi →Aexp6 hy, σi →Aexp5 hx+y, σi →Aexp11
hx, σi →Aexp6 hy, σi →Aexp 5 hx−y, σi →Aexp 1 h(x+y)∗(x−y), σi →Aexp11
h(x∗x)−(y∗y), σi →Aexp
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
hx, σi →Aexp6 hy, σi →Aexp5 hx+y, σi →Aexp11
hx, σi →Aexp6 hy, σi →Aexp 5 hx−y, σi →Aexp 1 h(x+y)∗(x−y), σi →Aexp11
hx, σi →Aexp 6 hx, σi →Aexp6 hx∗x, σi →Aexp 36 h(x∗x)−(y∗y), σi →Aexp
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
hx, σi →Aexp6 hy, σi →Aexp5 hx+y, σi →Aexp11
hx, σi →Aexp6 hy, σi →Aexp 5 hx−y, σi →Aexp 1 h(x+y)∗(x−y), σi →Aexp11
hx, σi →Aexp6 hx, σi →Aexp6 hx∗x, σi →Aexp36
hy, σi →Aexp5 hy, σi →Aexp 5 hy∗y, σi →Aexp25 h(x∗x)−(y∗y), σi →Aexp
Beispiel-Ableitungen
Sei σdef=hx 7→6,y 7→5i.
hx, σi →Aexp6 hy, σi →Aexp5 hx+y, σi →Aexp11
hx, σi →Aexp6 hy, σi →Aexp 5 hx−y, σi →Aexp 1 h(x+y)∗(x−y), σi →Aexp11
hx, σi →Aexp6 hx, σi →Aexp6 hx∗x, σi →Aexp36
hy, σi →Aexp5 hy, σi →Aexp 5 hy∗y, σi →Aexp25 h(x∗x)−(y∗y), σi →Aexp11
Operationale Semantik: Boolesche Ausdrücke
I Bexpb::= 0|1|a1 ==a2 |a1 <a2 |!b |b1&&b2|b1 || b2
hb, σi →Bexp true|false| ⊥ Regeln:
h1, σi →Bexptrue h0, σi →Bexp false
ha1, σi →Aexp n1 ha2, σi →Aexp n2 ni 6=⊥,n1 und n2 gleich ha1 ==a2, σi →Bexptrue
ha1, σi →Aexp n1 ha2, σi →Aexp n2 ni 6=⊥,n1 und n2 ungleich ha1 ==a2, σi →Bexp false
ha1, σi →Aexp n1 ha2, σi →Aexp n2 n1 =⊥ orn2=⊥
Operationale Semantik: Boolesche Ausdrücke
I Bexpb::= 0|1|a1 ==a2 |a1 <a2 |!b |b1&&b2|b1 || b2
hb, σi →Bexp true|false| ⊥ Regeln:
hb, σi →Bexp true h!b, σi →Bexp false
hb, σi →Bexpfalse h!b, σi →Bexptrue
hb, σi →Bexp⊥ h!b, σi →Bexp ⊥ hb1, σi →Bexp false
hb1&&b2, σi →Bexpfalse
hb1, σi →Bexp⊥ hb1&&b2, σi →Bexp⊥ hb1, σi →Bexp true hb2, σi →Bexpt
hb1&&b2, σi →Bexp t
Operationale Semantik: Boolesche Ausdrücke
I Bexpb::= 0|1|a1 ==a2 |a1 <a2 |!b |b1&&b2|b1 || b2
hb, σi →Bexp true|false| ⊥ Regeln:
hb1, σi →Bexp true hb1&&b2, σi →Bexptrue
hb1, σi →Bexp ⊥ hb1&&b2, σi →Bexp ⊥ hb1, σi →Bexpfalse hb2, σi →Bexp t
hb1||b2, σi →Bexpt
Operationale Semantik: Anweisungen
I Stmtc ::=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 alle y6=x
Operationale Semantik: Anweisungen
I Stmtc ::=Idt=Exp|if (b) c1 else c2|while(b)c |c1;c2| { } Regeln:
h{ }, σi →Stmt σ ha, σi →Aexp n∈Z
hx =a, σi →Stmt σ[n/x]
ha, σi →Aexp ⊥ hx =a, σi →Stmt ⊥ hc1, σi →Stmt σ0 6=⊥ hc2, σ0i →Stmt σ006=⊥
hc1;c2, σi →Stmt σ00 hc1, σi →Stmt ⊥ hc1;c2, σi →Stmt ⊥
hc1, σi →Stmt σ0 6=⊥ hc2, σ0i →Stmt ⊥
Operationale Semantik: Anweisungen
I Stmtc ::=Idt=Exp|if (b) c1 else c2|while(b)c |c1;c2| { } Regeln:
hb, σi →Bexptrue hc1, σi →Stmt σ0 hif(b) c1 else c2, σi →Stmt σ0 hb, σi →Bexpfalse hc2, σi →Stmt σ0
hif(b) c1 else c2, σi →Stmt σ0 hb, σi →Bexp⊥
hif(b) c1 else c2, σi →Stmt ⊥
Operationale Semantik: Anweisungen
I Stmtc ::=Idt=Exp|if (b) c1 else c2|while(b)c |c1;c2| { } Regeln:
hb, σi →Bexpfalse hwhile (b) c, σi →Stmt σ
hb, σi →Bexp true 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
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?
(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
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?
(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
. . .
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] =hy 7→2i[1/y][2/x][0/y][4/x]
=hy 7→0,x 7→4i
und es giltσ5(x) = 4 = 22 = 2σ1(y)
Lineare, abgekürzte Schreibweise
// hy 7→2i x = 1 ; //
w h i l e ( y != 0 ) { y = y − 1 ; x = 2 ∗ x ; }
Lineare, abgekürzte Schreibweise
// hy 7→2i x = 1 ;
// hy 7→2,x7→1i w h i l e ( y != 0 ) {
y = y − 1 ; x = 2 ∗ x ; }
Lineare, abgekürzte Schreibweise
// hy 7→2i
x = 1 ; // Ableitung fürx = 1
// hy 7→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
// hy 7→2i x = 1 ;
// hy 7→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 // hy 7→0,x7→4i
Was haben wir gezeigt?
// hy 7→2i x = 1 ;
// hy 7→2,x7→1i w h i l e ( y != 0 ) {
y = y − 1 ; x = 2 ∗ x ; }
// hy 7→0,x7→4i
I Füreinen festen Anfangszustand σ1 =hy7→2i gilt am Ende x= 4 = 22= 2σ1(y).
I Gilt das für alle?
I Für welche nicht?
I Wie kann man das für alle Anfangs-Zustände, für die es gilt, zeigen?
Was passiert hier?
// hy 7→ −1i x = 1 ;
w h i l e ( y != 0 ) { y = y − 1 ; x = 2 ∗ x ; }
I Ableitung terminiert nicht (Ableitungsbaum der Auswerttung der while-Schleife wächst unendlich)
I In linearer Schreibweise geht es immer wieder unten weiter.
Was passiert hier?
// hy 7→ −1i x = 1 ;
w h i l e ( y != 0 ) { y = y − 1 ; x = 2 ∗ x ; }
I Ableitung terminiert nicht (Ableitungsbaum der Auswerttung der while-Schleife wächst unendlich)
I In linearer Schreibweise geht es immer wieder unten weiter.
Arbeitsblatt 2.3: Jetzt seid ihr dran!
I Werten Sie das nebenstehende Program aus für den
Anfangszustand hx 7→5,y 7→2i I Geben Sie die Auswertung in
abgekürzter Schreibweise an.
I Welche Beziehung gilt am Ende des Programs zwischen den Werten von x und y im Endzustand und im Anfangszustand?
w h i l e ( y != 0 ) { x = x ∗ x ; y = y − 1 ; }
Lineare, abgekürzte Schreibweise
w h i l e(w) // hx7→5,y 7→2i σ1
| // hy! = 0,hx7→5,y7→2ii →Bexp1
| x = x ∗ x ;
| // hx7→25,y 7→2i
| y = y − 1 ;
| // hx7→25,y 7→1i
w h i l e(w) // hy! = 0,hx7→25,y 7→1ii →Bexp 1
| x = x ∗ x ;
| // hx7→625,y 7→1i
| y = y − 1 ;
| // hx7→625,y 7→0i σ5
w h i l e(w) // hy! = 0,hx7→625,y7→0ii →Bexp 0 // hx 7→625,y7→0i
Lineare, abgekürzte Schreibweise
w h i l e(w) // hx7→5,y 7→2i σ1
| // hy! = 0,hx7→5,y7→2ii →Bexp1
| x = x ∗ x ;
| // hx7→25,y 7→2i
| y = y − 1 ;
| // hx7→25,y 7→1i
w h i l e(w) // hy! = 0,hx7→25,y 7→1ii →Bexp 1
| x = x ∗ x ;
| // hx7→625,y 7→1i
| y = y − 1 ;
| // hx7→625,y 7→0i σ5
w h i l e(w) // hy! = 0,hx7→625,y7→0ii →Bexp 0 // hx 7→625,y7→0i
Und es gilt 625 = 54= 522 bzw. σ5(x) =σ1(x)2σ1(y)
Äquivalenz arithmetischer Ausdrücke
Gegeben zwei Aexp a1 anda2 I Sind sie gleich?
a1∼Aexp a2 gdw ∀σ,n.ha1, σi →Aexp n⇔ ha2, σi →Aexp n ( x∗x ) + 2∗x∗y + ( y∗y ) und ( x+y ) ∗ ( x+y )
I Wann sind sie gleich?
∀σ,n.ha1, σi →Aexp n⇔ ha2, σi →Aexp n
x∗x und 8∗x+9
x∗x und x∗x+1
Äquivalenz Boolscher Ausdrücke
Gegeben zwei Bexp-Ausdrückeb1 and b2
I Sind sie gleich?
b1 ∼Bexp b2 iff ∀σ,b.hb1, σi →Bexpb ⇔ hb2, σi →Bexp b A | | (A && B) und A
Beweisen
Zwei Programmec0,c1 sind äquivalent gdw. sie die gleichen Zustandsveränderungen bewirken. Formal definieren wir Definition
c0 ∼c1 iff ∀σ, σ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 sowohl w 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σ