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]