KSGM (SoSe 2017) - informatik.uni-bremen.de

Werbung
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
Universität Bremen
I
Funktionen und Prozeduren
Sommersemester 2017
I
Referenzen und Speichermodelle
I
Verifikationsbedingungen Revisited
I
Vorwärtsrechnung Revisited
I
Programmsicherheit und Frame Conditions
I
Ausblick und Rückblick
Korrekte Software: Grundlagen und Methoden
Vorlesung 3 vom 20.04.17: Operationale Semantik
Serge Autexier, Christoph Lüth
09:06:58 2017-06-28
Korrekte Software
1 [24]
Zutaten
2 [24]
Unsere Programmiersprache
Wir betrachten einen Ausschnitt der Programmiersprache C (C0).
Ausbaustufe 1 kennt folgende Konstrukte:
I
// GGT(A,B)
i f ( a == 0 ) r = b ;
else {
w h i l e ( b != 0 ) {
i f ( a <= b )
b = b − a;
else a = a − b ;
}
r = a;
}
I
Programme berechnen Werte
Basierend auf
I
I
I
Korrekte Software
Werte sind Variablen zugewiesen
Evaluation von Ausdrücken
I
Typen: int ;
I
Ausdrücke: Variablen, Literale (für ganze Zahlen), arithmetische
Operatoren (für ganze Zahlen), Relationen (==, !=, <=, . . . ),
boolsche Operatoren (&&, || );
I
Anweisungen:
Folgt dem Programmablauf
3 [24]
I
Fallunterscheidung ( if . . . else. . . ), Iteration (while), Zuweisung, Blöcke;
I
Sequenzierung und leere Anweisung sind implizit
Korrekte Software
Semantik von C0
I
I
C0: Ausdrücke und Anweisungen
Die (operationale) Semantik einer imperativen Sprache wie C0 ist ein
Zustandsübergang: das System hat einen impliziten Zustand, der durch
Zuweisung von Werten an Adressen geändert werden kann.
Konkretes Beispiel: n = 3
p = 1;
p
c
n
?
?
3
p
c
n
1
?
3
p
c
n
1
1
3
p
c
n
1
1
3
...
p
c
n
6
4
3
Aexp a ::= N | Loc | a1 + a2 | a1 − a2 | a1 ∗ a2 | a1 /a2
c = 1;
w h i l e ( c <= n ) {
p = p ∗ c;
c = c + 1; }
Bexp b ::= 0 | 1 | a1 == a2 | a1 ! = a2
| a1 <= a2 | !b | b1 && b2 | b1 || b2
Exp e := Aexp | Bexp
Stmt c ::=
|
|
|
Systemzustände
I
4 [24]
Ausdrücke werten zu Werten V (hier ganze Zahlen) aus.
I
Adressen Loc sind hier Programmvariablen (Namen)
I
Ein Systemzustand bildet Adressen auf Werte ab: Σ = Loc * V
I
Ein Programm bildet einen Anfangszustand möglicherweise auf einen
Endzustand ab (wenn es terminiert).
I
Zusicherungen sind Prädikate über dem Systemzustand.
Korrekte Software
5 [24]
Eine Handvoll Beispiele
Loc = Exp;
if ( b ) c1 else c2
while ( b ) c
{c ∗ }
Korrekte Software
6 [24]
Operationale Semantik: Arithmetische Ausdrücke
// {y = Y ∧ y ≥ 0}
x = 1;
w h i l e ( y != 0 ) {
y = y −1;
x = 2∗ x ;
}
// {x = 2Y }
p = 1;
c = 1;
w h i l e ( c<=n ) {
c = c +1;
p = p∗ c ;
}
// {p = n!}
// {a ≥ 0 ∧ b ≥ 0}
r = b;
q = 0;
w h i l e ( b <= r ) {
r = r−y ;
q = q +1;
}
// {a = b ∗ q + r ∧ r < b}
// {0 ≤ a}
t = 1;
s = 1;
i = 0;
w h i l e ( s <= a ) {
t = t + 2;
s = s + t;
i = i + 1;
}
// {i 2 ≤ a ∧ a < (i + 1)2 }
Ein arithmetischer Ausdruck a wertet unter gegebenen Zustand σ zu
einer ganzen Zahl n (Wert) aus oder zu einem Fehler ⊥.
I
Aexp a ::= N | Loc | a1 + a2 | a1 − a2 | a1 ∗ a2 | a1 / a2
I
Zustände bilden Adressen/Programmvariablen auf Werte ab (σ)
ha, σi →Aexp n|⊥
Regeln:
Korrekte Software
7 [24]
hn, σi →Aexp n
X ∈ Loc, X ∈ Dom(σ), σ(X ) = v
hX , σi →Aexp v
Korrekte Software
X ∈ Loc, X 6∈ Dom(σ)
hX , σi →Aexp ⊥
8 [24]
Operationale Semantik: Arithmetische Ausdrücke
I
Aexp a ::= N | Loc | a1 + a2 | a1 − a2 | a1 ∗ a2 | a1 / a2
ha, σi →Aexp n|⊥
ha1 , σi →Aexp n1
Operationale Semantik: Arithmetische Ausdrücke
I
ha, σi →Aexp n|⊥
ha2 , σi →Aexp n2
ni ∈ N, n Summe n1 und n2
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 ∈ N, 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 ⊥
Korrekte Software
9 [24]
Aexp a ::= N | Loc | a1 + a2 | a1 − a2 | a1 ∗ a2 | a1 / a2
ha1 , σi →Aexp n1
ha2 , σi →Aexp n2
ni ∈ N, n Produkt n1 und n2
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 ∈ N, n2 6= 0, n Quotient n1 , n2
ha1 /a2 , σi →Aexp n
ha1 , σi →Aexp n1
ha2 , σi →Aexp n2
falls n1 = ⊥, n2 = ⊥ oder n2 = 0
ha1 /a2 , σi →Aexp ⊥
Korrekte Software
Beispiel-Ableitungen
10 [24]
Operationale Semantik: Boolesche Ausdrücke
Bexp b ::= 0 | 1 | a1 == a2 | a1 <= a2 | !b | b1 && b2 | b1 || b2
Regeln:
I
Sei σ(X ) = 6, σ(Y ) = 5.
hX , σi →Aexp 6
hY , σi →Aexp 5
hX , σi →Aexp 6
hY , σi →Aexp 5
hX + Y , σi →Aexp 11
hX − Y , σi →Aexp 1
h(X + Y ) ∗ (X − Y ), σi →Aexp 11
hb, σi →Bexp 1|0|⊥
h1, σi →Bexp 1
h0, σi →Bexp 0
ha1 , σi →Aexp n1
hX , σi →Aexp 6
hX , σi →Aexp 6
hY , σi →Aexp 5
hY , σi →Aexp 5
hX ∗ X , σi →Aexp 36
hY ∗ Y , σi →Aexp 25
h(X ∗ X ) − (Y ∗ Y ), σi →Aexp 11
ha1 , σi →Aexp n1
ha2 , σi →Aexp n2
ni 6= ⊥, n1 und n2 ungleich
ha1 == a2 , σi →Bexp 0
ha1 , σi →Aexp n1
Korrekte Software
11 [24]
ha2 , σi →Aexp n2
n1 = ⊥ or n2 = ⊥
ha1 == a2 , σi →Bexp ⊥
Korrekte Software
Operationale Semantik: Boolesche Ausdrücke
I
ha2 , σi →Aexp n2
ni 6= ⊥, n1 und n2 gleich
ha1 == a2 , σi →Bexp 1
Bexp b ::= 0 | 1 | a1 == a2 | a1 <= a2 | !b | b1 && b2 | b1 || b2
Regeln:
12 [24]
Operationale Semantik: Boolesche Ausdrücke
I
Bexp b ::= 0 | 1 | a1 == a2 | a1 <= a2 | !b | b1 && b2 | b1 || b2
Regeln:
hb, σi →Bexp 1|0|⊥
hb, σi →Bexp 1
h!b, σi →Bexp 0
hb, σi →Bexp 0
h!b, σi →Bexp 1
hb, σi →Bexp 1|0|⊥
hb, σi →Bexp ⊥
h!b, σi →Bexp ⊥
hb1 , σi →Bexp t1
hb2 , σi →Bexp t2
hb1 || b2 , σi →Bexp t
hb1 , σi →Bexp t1
hb2 , σi →Bexp t2
hb1 && b2 , σi →Bexp t
wobei t = 0 wenn t1 = t2 = 0;
t = 1 wenn t1 = 1 oder (t1 = 0 und t2 = 1);
t = ⊥ sonst
wobei t = 1 wenn t1 = t2 = 1;
t = 0 wenn t1 = 0 oder (t1 = 1 und t2 = 0);
t = ⊥ sonst
Korrekte Software
13 [24]
Korrekte Software
Operationale Semantik: Anweisungen
I
Stmt c ::= Loc = Exp; | {c ∗ } | if ( b ) c1 else c2 | while ( b ) c
Beispiel:
14 [24]
Operationale Semantik: Anweisungen
I
Stmt c ::= Loc = Exp; | {c ∗ } | if ( b ) c1 else c2 | while ( b ) c
Regeln:
0
hc, σi →Stmt σ |⊥
Definiere :
(
hX = 5, σi →Stmt σ 0
σ[m/X ](Y ) :=
m
if X = Y
σ(Y ) sonst
wobei σ 0 (X ) = 5 und σ 0 (Y ) = σ(Y ) für alle Y 6= X
hX = 5, σi →Stmt σ[5/X ]
Es gilt:
∀σ, n, m, ∀X , Y . X 6= Y ⇒ σ[n/X ][m/Y ] = σ[m/Y ][n/X ]
∀σ, n, m, ∀X . σ[n/X ][m/X ] = σ[m/X ]
Korrekte Software
15 [24]
Korrekte Software
16 [24]
Operationale Semantik: Anweisungen
Operationale Semantik: Anweisungen
Stmt c ::= Loc = Exp; | {c ∗ } | if ( b ) c1 else c2 | while ( b ) c
Regeln:
I
I
Stmt c ::= Loc = Exp; | {c ∗ } | if ( b ) c1 else c2 | while ( b ) c
Regeln:
h{ }, σi →Stmt σ
h{ }, σi →Stmt σ
ha, σi →Aexp ⊥
hX = a, σi →Stmt ⊥
ha, σi →Aexp n ∈ N
hX = a, σi →Stmt σ[n/X ]
hb, σi →Bexp 1
hc1 , σi →Stmt σ 0
hif ( b ) c1 else c2 , σi →Stmt σ 0
h{cs }, σ 0 i →Stmt σ 00 6= ⊥
hc, σi →Stmt σ 0 6= ⊥
h{c cs }, σi →Stmt σ 00
hb, σi →Bexp 0
hc2 , σi →Stmt σ 0
hif ( b ) c1 else c2 , σi →Stmt σ 0
hc, σi →Stmt ⊥
h{c cs }, σi →Stmt ⊥
hb, σi →Bexp ⊥
hif ( b ) c1 else c2 , σi →Stmt ⊥
hc, σi →Stmt σ 0 =
6 ⊥
h{cs }, σ 0 i →Stmt ⊥
h{c cs }, σi →Stmt ⊥
Korrekte Software
17 [24]
Korrekte Software
Operationale Semantik: Anweisungen
I
18 [24]
Beispiel
Stmt c ::= Loc = Exp; | {c ∗ } | if ( b ) c1 else c2 | while ( b ) c
Regeln:
h{ }, σi →Stmt σ
x = 1;
w h i l e ( y != 0 ) {
y = y − 1;
x = 2 ∗ x;
}
// x = 2y
hb, σi →Bexp 0
hwhile ( b ) c, σi →Stmt σ
hc, σi →Stmt σ 0
hwhile ( b ) c, σ 0 i →Stmt σ 00
hwhile ( b ) c, σi →Stmt σ 00
hb, σi →Bexp 1
hb, σi →Bexp 1
hc, σi →Stmt ⊥
hwhile ( b ) c, σi →Stmt ⊥
Korrekte Software
σ(y ) = 3
hb, σi →Bexp ⊥
hwhile ( b ) c, σi →Stmt ⊥
19 [24]
Korrekte Software
Äquivalenz arithmetischer Ausdrücke
20 [24]
Äquivalenz Boolscher Ausdrücke
Gegeben zwei Aexp a1 and a2
I
Sind sie gleich?
a1 ∼Aexp a2 gdw ∀σ, n.ha1 , σi →Aexp n ⇔ ha2 , σi →Aexp n
Gegeben zwei Bexp-Ausdrücke b1 and b2
I
(X∗X) + 2∗X∗Y + (Y∗Y)
und
(X+Y) ∗
Sind sie gleich?
(X+Y)
b1 ∼Bexp b2 iff ∀σ, b.hb1 , σi →Bexp b ⇔ hb2 , σi →Bexp b
I
Wann sind sie gleich?
A | | (A && B)
und
A
∃σ, n.ha1 , σi →Aexp n ⇔ ha2 , σi →Aexp n
X∗X
X∗X
und
und
9∗X+22
X∗X+1
Korrekte Software
21 [24]
Beweisen
Korrekte Software
22 [24]
Zusammenfassung
Zwei Programme c0 , c1 sind äquivalent gdw. sie die gleichen
Zustandsveränderungen bewirken. Formal definieren wir
I
Operationale Semantik als ein Mittel für Beschreibung der Semantik
I
Auswertungsregeln arbeiten entlang der syntaktischen Struktur
I
Werten Ausdrücke zu Werten aus und Programme zu Zuständen (zu
gegebenen Zustand)
I
Fragen zu Programmen: Gleichheit
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 an der Tafel
Korrekte Software
23 [24]
Korrekte Software
24 [24]
Herunterladen