Dynamische Logik A. Salwicki 1970 (“algorithmische Logik”), V.R. Pratt 1976, D. Harel 1977 Idee: Erfinde nicht einfach einen komplett neuen Kalkül für neue Objekte (hier: Hoare-Tripel) sondern bilde Programmformeln und erweitere Kalkül um diese neuen Formeln. 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 183 / 290 Dynamische Logik: Syntax Die Menge DLFor(Σ,X ) der DL-Formeln über der Signatur Σ und der Variablenmenge X enthält • Alle prädikatenlogischen Formeln von For(Σ,X ) • Für α ∈ DLProg(Σ,X ) und ϕ ∈ DLFor(Σ,X ) auch • [α]ϕ ( box alpha phi“) ” Informelle Bedeutung: Wenn α terminiert, gilt nachher ϕ“ ” • hαiϕ ( diamond alpha phi“) ” Informelle Bedeutung: α hält, und nachher gilt ϕ“ ” Klassifikation: • Dynamische Logik ist eine (Multi-)Modallogik. • Modallogik mit Formeln ϕ (und 2 ϕ) stammen aus der Philosophie: “ich weiss ϕ”, “ich glaube ϕ”, “ϕ ist möglich” • Temporallogik: “irgendwann wird ϕ wahr sein” 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 184 / 290 Bemerkungen zur Syntax • Boxen und Diamonds binden stärker als Aussagenlogik: [α]ψ ∧ χ bedeutet ([α]ψ) ∧ χ • Schachtelung möglich: hαihβiψ bedeutet hαi ( hβiψ ) • Auch gemischte Schachtelung ist erlaubt: [α] ∀ x. ϕ ∧ hβiψ • Auch in DL betrachtet man Sequenzen, z. B. hαiψ, Γ ` ∆. • Wenn x in α vorkommt, x0 aber nicht, so besagt hαi x = x0 : “Am Ende von α hat x den Wert, den x0 jetzt hat” • hαi x = x0 → hβi x = x0 bedeutet: “Wann immer α in x einen Wert x0 ausrechnet so tut das auch β” Man kann in DL also über Programmähnlichkeit reden • Es gilt: [α]ψ ↔ ¬ hαi¬ ψ Man könnte also Box mit Hilfe von Diamond definieren 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 185 / 290 Semantik der Dynamischen Logik Die Semantik von Formeln der Prädikatenlogik wird erweitert durch A, v |= [α]ψ A, v |= hαiψ :⇔ :⇔ für alle w : (v , w ) ∈ [[α]] ⇒ A, w |= ψ. es gibt w : (v , w ) ∈ [[α]] und A, w |= ψ. Damit gilt A, v |= ϕ[α]ψ A, v |= ϕhαi ψ ⇔ ⇔ A, v |= ϕ → [α]ψ A, v |= ϕ → hαiψ, Hoare-Tripel sind also spezielle Formeln der Dynamischen Logik. 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 186 / 290 Dynamische Logik: Beispiele |= [x := 1] x = 1 |= x = x0 → [x := x + 1] x = x0 + 1 |= x = x0 → hx := x + 1i x = x0 + 1 Unterschied Box/Diamond: |= x = 5 → [abort] x = 5 6|= x = 5 → haborti x = 5 Sequenzen mit Programmen, Programme auch im Antezedent: |= x = x0 ` [x := x + 1] x = x0 + 1 |= x > 0 ` hwhile x > 1 do x := x -1i x = 1 |= hif x > 0 then y := 1 else aborti y = y 0 ` y 0 = 1 ∧ x > 0 |= [if x > 0 then y := 1 else abort] y = y 0 ` y 0 = 1 ∧ x > 0 ∨ x = 0 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 187 / 290 Kalkül für Dynamische Logik Grundidee: Symbolische Ausführung von Programmen Betrachte Ausführung des Programms α1 ; α2 ; . . . ; αn (αi ohne ; (compound) auf top-level) • Annahme: Initialer Zustand erfüllt Vorbedingung ϕ0 • Berechne ϕ1 , die stärkste Formel, die nach α1 gilt • Berechne ϕ2 , die stärkste Formel, die nach α1 ; α2 gilt • . . . solange bis das Programm verschwunden ist • Zum Schluss: Teste ob ϕn die Nachbedingung impliziert (nur noch Prädikatenlogik) • Symb. Ausführung geht sowohl im Antezedent als auch im Sukzedent! 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 188 / 290 DL-Kalkül: Normalisierung normalize right Γ ` hαihβiψ, ∆ Γ ` hα; βiψ, ∆ Γ ` [α][β]ψ, ∆ Γ ` [α; β]ψ, ∆ normalize left hαihβiψ, Γ ` ∆ hα; βiψ, Γ ` ∆ [α][β]ψ, Γ ` ∆ [α; β]ψ, Γ ` ∆ In KIV: Nie explizit angewandt, die erste Anweisung wird bei jeder Regelanwendung (in allen Programmformeln) immer automatisch abgespalten. KIV rotiert immer die Programmformeln nach vorne. 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 189 / 290 DL-Kalkül: Zuweisungen (1) assign right (so auch im Hoare-Kalkül) Γ ` ψxτ , ∆ Γ ` [x := τ ]ψ, ∆ assign right (Dynamische Logik) 0 0 Γxx , x = τxx ` [α]ψ, ∆xx Γ ` [x := τ ][α]ψ, ∆ 0 wobei x 0 eine neue Variable ist (bezeichnet den alten Wert von x) Beachte: config-Datei des Projekts setzt Option Hoare-assign rule“ ” (ohne Option wird x 0 eine Variable für den neuen Wert, und Programmvariablen werden umbenannt) 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 190 / 290 DL-Kalkül: Zuweisungen (2) • In KIV: assign right kombiniert beide Regeln: • Original-Hoare-Regel, falls nach der Zuweisung ψ kein Programm mehr enthält • Sonst die DL Regel • Die Regel gilt genau gleich auch für Diamonds statt Boxen • Die Regel für Zuweisung auf der linken Seite sieht genauso aus: assign left 0 0 x = τxx , [α]ψ, Γxx ` ∆xx [x := τ ][α]ψ, Γ ` ∆ 0 wobei x 0 eine neue Variable ist (für den Wert vor der Zuweisung) 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 191 / 290 DL-Kalkül: Regeln für if if right Γ, ε ` [α]ψ, ∆ Γ, ¬ ε ` [β]ψ, ∆ Γ ` [if ε then α else β]ψ, ∆ if positive right Γ, ε ` [α]ψ, ∆ Γ ` ε, ∆ Γ ` [if ε then α else β]ψ, ∆ Analog: if negative right, if left etc.. KIV versucht immer die Tests zu entscheiden (per Simplifier), damit nur eine Prämisse entsteht. 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 192 / 290 Invarianten Definition: Eine (Schleifen-)Invariante ist eine Formel, die vor und nach jedem Schleifendurchlauf gilt. Beispiel: m = 0 ∧ n = n0 → [ while n 6= 0 do n := n −1; m := m +1 od ] m = n0 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 193 / 290 Invarianten Definition: Eine (Schleifen-)Invariante ist eine Formel, die vor und nach jedem Schleifendurchlauf gilt. Beispiel: m = 0 ∧ n = n0 → [ while n 6= 0 do n := n −1; m := m +1 od ] m = n0 Invariante: m + m = n0 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 193 / 290 Bestimmung von Invarianten Wie kommt man drauf? • Schreibe Werte nach k Durchläufen der Schleife auf • Kann man zunächst für ein konkrete Anfangswerte (z.B. n0 = 5) machen. • Bestimme Formel, wie m,n nach k Durchläufen aussehen: m = k und n = n0 − k • Daraus Invariante ∃ k. m = k ∧ n = n0 − k • Diese Formel vereinfachen ergibt m + m = n0 Nebenbemerkung: Die Invariante benötigt +, die Schleife selbst nicht ⇒ manchmal brauchen Invarianten (genau wie beim Verallgemeinern von Induktionshypothesen) neue Funktionen 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 194 / 290 Notwendiges Kriterium für Invarianten Eine prädikatenlogische Formel INV ist eine Invariante, wenn sich zeigen lässt: • Die Formel gilt am Anfang der Schleife • Die Invariante wird von einem Schleifendurchlauf erhalten: Es gilt: INV ∧ ε → [α]INV Für jede Invariante gilt: Wenn die Schleife anhält, dann gilt am Ende die Invariante, und (offensichtlich) dass der Test am Ende falsch ist. 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 195 / 290 Terminierung von Schleifen Eine Schleife terminiert nur dann, wenn in jedem Schleifendurchlauf “etwas” abnimmt bezueglich einer noetherschen Ordnung (dann kann es nicht unendlich oft abnehmen). Vorgehen also: • Bestimme einen Term t, der abnimmt • Häufig: heruntergezählte Variable; Abstand einer hochgezählten Variable zur oberen Schranke; Größe einer Datenstruktur (z.B. Listenlänge) • Um Abnehmen zu zeigen, zeige mit (neuer) Hilfsvariable z zum Merken des alten Werts: z = t ∧ ε ∧ INV → hαi t < z 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 196 / 290 DL-Kalkül: While-Regel invariant right Γ ` INV , ∆ INV , ε ` [α]INV INV , ¬ ε ` ψ Γ ` [while ε do α]ψ, ∆ invariant right Γ ` INV , ∆ INV , ε, v = t ` hαi(INV ∧ t v ) Γ ` hwhile ε do αiψ, ∆ INV , ¬ ε ` ψ KIV: Die Schleifeninvariante INV und im zweiten Fall auch die Schranke t muss von Hand eingegeben werden (v ist neue Variable) 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 197 / 290 DL-Kalkül: Regeln für skip und abort skip right Γ ` ψ, ∆ Γ ` hskipiψ, ∆ Γ ` ψ, ∆ Γ ` [skip]ψ, ∆ skip left ψ, Γ ` ∆ hskipiψ, Γ ` ∆ ψ, Γ ` ∆ [skip]ψ, Γ ` ∆ abort right Γ`∆ Γ ` habortiψ, ∆ Γ ` [abort]ψ, ∆ abort left habortiψ, Γ ` ∆ 4. Juni 2013 Γ`∆ [abort]ψ, Γ ` ∆ G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 198 / 290 DL-Kalkül: Lokale Variablen vardecls right x0 x 0 = τ , Γ ` hαx iϕ Γ ` hlet x = τ in αiϕ vardecls left x0 hαx iϕ, x 0 = τ , Γ ` ∆ hlet x = τ in αiϕ, Γ ` ∆ x 0 sind neue Variablen (bezeichnen die lokalen Variablen). Dieselben Regeln gelten auch für Boxen. 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 199 / 290 Beispiel zur Korrekheit m := x.first, x0 := x.rest; while x0 6= [] do { if x0.first > m then m := x0.first ; x0 := x0.rest } 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 200 / 290 Beispiel zur Korrekheit Maximum einer nichtleeren Liste nat. Zahlen x: x 6= [] `h m := x.first, x0 := x.rest; while x0 6= [] do { if x0.first > m then m := x0.first ; x0 := x0.rest } i m = maxl(x) wobei maxl([]) = 0, maxl(n + x) = max(n,maxl(x)) 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 200 / 290 Zur nächsten Aufgabe Invarianten vorher überlegen!!! 4. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 201 / 290