Formale Methoden Alexander Knapp, Gerhard Schellhorn Universität Augsburg Formale Methoden: Ziele (1) Grundlagen für die Softwareerstellung Mathematik von Spezifikations- und Programmiersprachen“ ” I Vermeidung von Mißverständnissen und Unklarheiten I I Was bedeutet eine UML-Spezifikation? Welche Compileroptimierungen sind möglich? I Ermöglichung von präzisen Vorhersagen und Tests I Verständnisverbesserung I I I Was sind gute“, gut strukturierte“ und gut dokumentierte“ Programme? ” ” ” Was sind saubere“ Schnittstellen? ” Was ist eine gute“ Spezifikationssprache? ” A computer is a mathematical machine. A program is a mathematical expression. A programming language is a mathematical theory. Programming is a mathematical activity. — C. Anthony R. Hoare, 1989 A. Knapp, G. Schellhorn: Formale Methoden 2 Formale Methoden: Ziele (2) Entwicklung von Software mit formalen Spezifikationen I Formale Spezifikation der Anforderungen ; höhere Abstraktion als direkte Programmierung I Validierung, Nachweis von (Sicherheits-)Eigenschaften ; Qualitätsverbesserung durch frühere Fehlererkennung I Methodik, um von abstrakten Anforderungen zu Programmen zu kommen ; modulare Softwareentwicklung I Aber: formale Spezifikationen beseitigen keine Mißverständnisse mit dem Kunden ; formale Methoden sind für den Softwareingenieur, nicht für den Kunden A. Knapp, G. Schellhorn: Formale Methoden 3 Formale Methoden: Ziele (3) Formaler, systemunterstützter Nachweis von Eigenschaften I Beweise von Eigenschaften sichern Qualität der Spezifikation I Beweise für die Korrektheit von Programmen bzgl. Spezifikation sichern Qualität der Programme I formale Beweise kosten Zusatzaufwand ; Grad der Formalisierung immer eine Kosten/Nutzen-Abwägung! Proofs of programs are too boring for the social process of mathematics to work. — Richard DeMillo, Richard Lipton, Alan Perlis, 1979 A. Knapp, G. Schellhorn: Formale Methoden 4 Spezifikationssprachen Eine Spezifikationssprache ist eine Sprache zur Beschreibung von Softwaresystemen oder der Anforderungen an Softwaresysteme. Beispiele I automatenartige Spezifikationen (Statecharts etc.) I algebraische Spezifikationen I Programmiersprachen Grundsätzliches Vorgehen zur Definition I Festlegung von Syntax und Semantik A. Knapp, G. Schellhorn: Formale Methoden 5 Spezifikationssprachen: Syntax und Semantik Syntax: Wie sehen zulässige Sprachkonstrukte aus? I Formal: Definition einer Menge von zulässigen Texten (Zeichenketten) I bei Rechnerunterstützung typischerweise durch Grammatik gegeben Semantik: Was bedeutet eine Zeichenkette? I Formal: Zuordnung von mathematischen Strukturen (meist basierend auf Mengenlehre) I Bei Programmiersprachen: Informell im Handbuch durch Beschreibung des Effekts jedes Konstrukts auf den Ausführungszustand A. Knapp, G. Schellhorn: Formale Methoden 6 Formales Beweisen I Einbettung von Spezifikationen in eine formale Sprache, mit der Aussagen bewiesen werden können I Formale Beweise ersetzen mathematische Beweise durch Berechnung“ ” mit einem Kalkül I keine Fehler (wenn nur Kalkülregeln fehlerfrei) I Logik = Syntax + Semantik + Kalkül I Grundlegende Sprachen zur Formulierung von Aussagen: Aussagenlogik und Prädikatenlogik A. Knapp, G. Schellhorn: Formale Methoden 7 Überblick I Logische Grundlagen I I Aussagenlogik Prädikatenlogik I Spezifikation von Datenstrukturen I Semantik von Programmen I Beweisen mit Programmen I Von abstrakten Spezifikationen zu konkreten Programmen I I algebraische Verfeinerung Datenverfeinerung A. Knapp, G. Schellhorn: Formale Methoden 8 Aussagenlogik Ein Satz ist, was an sich verneint oder bejaht werden kann. — Chrysipp, Dialektische Definitionen (nach Diogenes Laertios) Der genannte Mann (Chrysipp) sagt, daß er (der Hund) öfters das fünfte Unbeweisbare anwendet, wenn er, auf eine Kreuzung von drei Wegen kommend, nachdem er zwei Wege, durch welche das Wild nicht gegangen ist, berochen hat, unmittelbar durch den dritten sich wirft, ohne ihn zu beriechen. Der alte (Meister) sagt nämlich, daß der Hund potentiell so schließt: Entweder hier, oder hier, oder hier ist das Wild durchgegangen; ” nun weder hier, noch hier; also hier.“ — M. Tullius Cicero, Topica 57 Es krächzen selbst die Raben auf den Dächern, welche Implikationen richtig sind. — Kallimachos (nach Sextus Empiricus) A. Knapp, G. Schellhorn: Formale Methoden 9 Aussagenlogik: Syntax (Endliche) Menge von atomaren Aussagen P (Propositionen) I Proposition entweder wahr oder falsch I Zeichenketten (verschieden von true“, false“, ¬“, ∧“, . . . ) ” ” ” ” I z. B. P = {a, b, c} Definition Die Menge der aussagenlogischen Formeln F (P) über einer Menge von Propositionen P ist die kleinste Menge mit: I P ⊆ F (P) I true, false ∈ F (P) I Wenn A ∈ F (P), dann (¬A) ∈ F (P). I Wenn A, B ∈ F (P), dann (A ∧ B), (A ∨ B), (A → B), (A ↔ B) ∈ F (P). ¬, ∧, ∨, →, ↔ heißen Junktoren. A. Knapp, G. Schellhorn: Formale Methoden 10 Formeln: Notation I Klammern werden entsprechend der Bindungsstärken weggelassen: {¬} {∧} {∨} {→} {↔} ( bedeutet: bindet stärker als) I Außenklammern werden ebenfalls weggelassen. I Aufzählungen mit ∧, ∨ sind implizit nach rechts geklammert. Beispiele: I a → ¬b ↔ c statt ((a → (¬b)) ↔ c) I a ↔ ¬b ∧ c ∧ d ∨ e statt (a ↔ (((¬b) ∧ (c ∧ d)) ∨ e)) A. Knapp, G. Schellhorn: Formale Methoden 11 Formeln: Definitionsprinzip für Funktionen Um eine Funktion f auf Formeln F (P) zu definieren, verfahre rekursiv: 1. f (p) für Propositionen p ∈ P 2. f (false), f (true) 3. f (¬A) unter Zuhilfenahme von f (A) 4. f (A ∧ B), f (A ∨ B), f (A → B), f (A ↔ B) unter Zuhilfenahme von f (A), f (B) Beispiele: I Anzahl der Junktoren I (endliche) Menge der vorkommenden Propositionen I Menge der Unterformeln einer Formel A. Knapp, G. Schellhorn: Formale Methoden 12 Formeln: Beweisprinzip für Eigenschaften Um zu zeigen, daß alle Formeln in F (P) eine Eigenschaft E haben, verfahre induktiv: 1. E(p) gilt für alle atomaren Formeln p ∈ P. 2. E(false), E(true) 3. Wenn E(A) für A ∈ F (P) gilt, dann auch E(¬A). 4. Wenn E(A) und E(B) für A, B ∈ F (P) gelten, dann auch E(A ∧ B), E(A ∨ B), E(A → B), E(A ↔ B). Beispiel: I Alle Formeln haben eine gerade Zahl von Klammern. A. Knapp, G. Schellhorn: Formale Methoden 13 Aussagenlogik: Semantik (1) Zuweisung eines Wahrheitswerts für jede aussagenlogische Formel I Wahrheitswert hängt nur von Wahrheitswerten der vorkommenden Propositionen ab Definition Eine Interpretation I : P → B ordnet jeder Proposition einen Wahrheitswert aus B = {ff , tt} zu. Die Semantikklammern J−K umschließen immer Sprachkonstrukte und liefern deren Semantik. Hier hängt die Semantik PJAK I einer aussagenlogischen Formel A von einer Interpretation I ab. A. Knapp, G. Schellhorn: Formale Methoden 14 Aussagenlogik: Semantik (2) Definition Für jede Interpretation I wird einer aussagenlogischen Formel A als Semantik der folgende Wahrheitswert PJAK I zugeordnet: I PJpK I = I(p) I PJfalseK I = ff I PJtrueK I = tt I PJ¬AK I = tt gdw. PJAK I = ff I PJA ∧ BK I = tt gdw. PJAK I = tt und PJBK I = tt I PJA ∨ BK I = tt gdw. PJAK I = tt oder PJBK I = tt I PJA → BK I = tt gdw. PJAK I = ff oder PJBK I = tt I PJA ↔ BK I = tt gdw. PJAK I = PJBK I Die Definitionen für ∧, ∨, &c. entsprechen den üblichen Wahrheitstafeln. A. Knapp, G. Schellhorn: Formale Methoden 15 Modelle Definition Eine Interpretation I heißt ein Modell einer aussagenlogischen Formel A, geschrieben als I |= A, falls PJAK I = tt. Definition Sei A eine aussagenlogische Formel. I A ist erfüllbar, wenn es ein Modell von A gibt. I A ist widersprüchlich (eine Kontradiktion), wenn es kein Modell von A gibt. I A ist allgemeingültig (eine Tautologie), geschrieben als |= A, wenn jede Interpretation ein Modell von A ist. Beispiele: I a ∨ ¬a ist allgemeingültig. I a ∨ ¬b ist erfüllbar, aber nicht allgemeingültig. I a ∧ ¬a ist widersprüchlich. Es gilt: A ist erfüllbar gdw. ¬A ist nicht allgemeingültig. A. Knapp, G. Schellhorn: Formale Methoden 16 Tautologien (1) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. (A ∨ B) ↔ (B ∨ A) (A ∨ B) ∨ C ↔ A ∨ (B ∨ C) A∨A↔A (A ∧ B) ↔ (B ∧ A) (A ∧ B) ∧ C ↔ A ∧ (B ∧ C) A∧A↔A A ∨ (B ∧ C) ↔ (A ∨ B) ∧ (A ∨ C) A ∧ (B ∨ C) ↔ (A ∧ B) ∨ (A ∧ C) ¬(A ∨ B) ↔ ¬A ∧ ¬B ¬(A ∧ B) ↔ ¬A ∨ ¬B A ∧ (A ∨ B) ↔ A A ∨ (A ∧ B) ↔ A ¬¬A ↔ A A. Knapp, G. Schellhorn: Formale Methoden Kommutativität ∨ Assoziativität ∨ Idempotenz ∨ Kommutativität ∧ Assoziativität ∧ Idempotenz ∧ Distributivität ∨ Distributivität ∧ DeMorgan ∨ DeMorgan ∧ Redundanz ∧ Redundanz ∨ Doppelnegation 17 Tautologien (2) 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. (A → B) → ((B → C) → (A → C)) A → ((A → B) → B) (A → ¬A) → ¬A (A → B) ↔ (¬B → ¬A) (A ∧ ¬A) → B (A → B) ↔ (¬A ∨ B) (A ↔ B) ↔ (A → B) ∧ (B → A) (A ↔ B) ↔ (A ∧ B) ∨ (¬A ∧ ¬B) (A → B) ∧ (¬A → B) → B A → (B → C) ↔ A ∧ B → C (A ↔ B) ↔ (B ↔ A) ((A ↔ B) ↔ C) ↔ (A ↔ (B ↔ C)) A. Knapp, G. Schellhorn: Formale Methoden Transitivität Modus Ponens Selbstwiderlegung Kontraposition Ex falso quodlibet Implikation vs. Disjunktion Äquivalenz ∧ Äquivalenz ∨ Fallunterscheidung geschachtelte Implikation Kommutativität ↔ Assoziativität ↔ 18 Tautologien (3) 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. (A ∧ false) ↔ false (A ∧ true) ↔ A (A → false) ↔ ¬A (A → true) ↔ true (true → A) ↔ A (false → A) ↔ true (A ↔ true) ↔ A (A ↔ false) ↔ ¬A (A ∨ ¬A) ↔ true (A ∧ ¬A) ↔ false And-false And-true Imp-false Imp-true true-Imp false-Imp Equiv-true Equiv-false triviale Disjunktion triviale Konjunktion Analog auch Or-true &c. A. Knapp, G. Schellhorn: Formale Methoden 19 Folgerbarkeit Folgerung von Theoremen aus (als wahr angenommenen) Axiomen Ax ⊆ F (P) Definition Eine Interpretation I heißt ein Modell einer Menge von aussagenlogischen Formeln Ax, geschrieben als I |= Ax, falls PJAK I = tt für alle A ∈ Ax. Die Menge Ax heißt erfüllbar, wenn es ein Modell von Ax gibt. Für endliche Mengen Ax ist I |= Ax äquivalent zu I |= V A∈Ax A. Definition Eine aussagenlogische Formel A ist eine Folgerung aus einer Menge von aussagenlogischen Formeln Ax, geschrieben als Ax |= A, wenn für jede Interpretation I mit I |= Ax auch I |= A gilt. A. Knapp, G. Schellhorn: Formale Methoden 20 Folgerbarkeit und Erfüllbarkeit Satz I I I Zu Ax |= A sind äquivalent: Ax ∪ {¬A} ist nicht erfüllbar. V |= ( Ax) → A, falls Ax endlich. Reduktion des Folgerbarkeitsproblem auf die Suche nach einer erfüllenden Interpretation A. Knapp, G. Schellhorn: Formale Methoden 21 Erfüllbarkeit: Beispiel (1) n-Damen-Problem I Ist es möglich, auf einem Schachbrett mit n × n Feldern n Damen so zu plazieren, daß keine Dame direkt eine andere Dame schlagen kann? I Suche einer Aufstellung, in der in jeder Zeile genau eine Dame, und auf keiner Spalte und keiner Diagonale zwei Damen A. Knapp, G. Schellhorn: Formale Methoden 22 Erfüllbarkeit: Beispiel (2) Codierung des n-Damen-Problems I n2 Variablen der Form p(x,y) mit x, y ∈ {1, . . . , n} I p(x,y) für auf Feld (x, y) steht eine Dame“ ” 1. In jeder Zeile und Spalte nur eine Dame Vn V p(x,y) → ni=x+1 ¬p(i,y) V V V F2 ≡ nx=1 ny=1 p(x,y) → ni=y+1 ¬p(x,i) F1 ≡ x=1 Vn y=1 2. Auf jeder Diagonale nur eine Dame F3 ≡ ¬p (x+i,y+i) ∧ x=1 y=1 i=1 Vn Vn Vmin(x−1,n−y) p → ¬p (x−i,y+i) (x,y) x=1 y=1 i=1 Vn Vn p(x,y) → Vmin(n−x,n−y) 3. In jeder Zeile (mindestens) eine Dame F4 ≡ Vn y=1 Wn x=1 p(x,y) A. Knapp, G. Schellhorn: Formale Methoden 23 Sequenzenkalkül I Ableitung aller allgemeingültigen Aussagen I Erfunden von Gerhard Gentzen (1934) I Hier: Fassung nach Oiva Ketonen (1944) I arbeitet auf Sequenzen I Charakteristik: versucht, Beweisziel auf Axiome zu reduzieren (schrittweise Vereinfachung des Problems); am menschlichen Beweisen orientiert I Nur einer von vielen möglichen Kalkülen: Hilbertkalkül, natürliches Schließen, Tableaukalkül, Modellelimination, Resolutionskalkül A. Knapp, G. Schellhorn: Formale Methoden 24 Sequenzen Seien A1 , . . . , Am , B1 , . . . , Bn ∈ F (P). A1 , . . . , Am ⇒ B1 , . . . , Bn heißt Sequenz. Definition A1 , . . . , Am I I I heißt Antezedent (m ≥ 0). B1 , . . . , Bn heißt Sukzedent (n ≥ 0). Γ, Γ1 , ∆, . . . bezeichnen Listen von Formeln Γ = A1 , . . . , Am = [A1 , . . . , Am ] ∆ = B1 , . . . , Bn = [B1 , . . . , Bn ] Γ⇒∆ Γ, A ⇒ B Γ, A ∧ B, ∆ ⇒ V [A1 , . . . , Am ] V [] W [B1 , . . . , Bn ] W [] = = = = = = = A. Knapp, G. Schellhorn: Formale Methoden A1 , . . . , Am ⇒ B1 , . . . , Bn A1 , . . . , Am , A ⇒ B A1 , . . . , Am , A ∧ B, B1 , . . . , Bn ⇒ A1 ∧ . . . ∧ Am true B1 ∨ . . . ∨ Bn false 25 Sequenzen: Semantik Auffassung einer Sequenz Γ ⇒ ∆ als V Γ→ W ∆ Definition Eine Interpretation I ist ein Modell einer Sequenz Γ ⇒ ∆, V W geschrieben als I |= Γ ⇒ ∆, wenn I |= Γ → ∆. Eine Sequenz Γ ⇒ ∆ ist eine Folgerung aus einer Menge von aussagenlogischen Formeln Ax, geschrieben als Ax |= Γ ⇒ ∆, wenn für jede Interpretation I mit I |= Ax auch I |= Γ ⇒ ∆ gilt. I Insbesondere: Γ ⇒ ist wahr, falls die Formeln in Γ widersprüchlich sind. A. Knapp, G. Schellhorn: Formale Methoden 26 Formeln und Sequenzen Lemma Sei I eine Interpretation, A eine aussagenlogische Formel und Ax eine Menge von aussagenlogischen Formeln. I |= A ⇐⇒ I |= ⇒ A I |= ¬A ⇐⇒ I |= A ⇒ Ax |= A ⇐⇒ Ax |= ⇒ A Ax |= ¬A ⇐⇒ Ax |= A ⇒ Definition identifiziert: Folgende Formeln und Sequenzen werden miteinander Γ⇒∆ ≡ V Γ→ W ⇒∆ ≡ W ∆, falls ∆ nicht leer ∆, falls Γ nicht leer ⇒A ≡ A ⇒ ≡ false A. Knapp, G. Schellhorn: Formale Methoden 27 Eigenschaften von Sequenzen Seien I eine Interpretation, A, B aussagenlogische Formeln und Γ, Γ1 , Γ2 , ∆, ∆1 , ∆2 Listen von aussagenlogischen Formeln. Lemma I |= Γ1 , Γ2 ⇒ ∆ ⇐⇒ I |= Γ2 , Γ1 ⇒ ∆ I |= Γ ⇒ ∆1 , ∆2 ⇐⇒ I |= Γ ⇒ ∆2 , ∆1 I |= Γ ⇒ A, ∆ ⇐⇒ I |= Γ, ¬A ⇒ ∆ I |= Γ, A ⇒ ∆ ⇐⇒ I |= Γ ⇒ ¬A, ∆ I |= Γ ⇒ A ∨ B, ∆ ⇐⇒ I |= Γ ⇒ A, B, ∆ I |= Γ ⇒ A → B, ∆ ⇐⇒ I |= A, Γ ⇒ B, ∆ I |= Γ ⇒ A ∧ B, ∆ ⇐⇒ I |= Γ ⇒ A, ∆ und I |= Γ ⇒ B, ∆ A. Knapp, G. Schellhorn: Formale Methoden 28 Form von Kalkülregeln Regel Γ1 ⇒ ∆1 ... Γn ⇒ ∆n Γ⇒∆ I Γ ⇒ ∆ heißt Konklusion der Regel I Γ1 ⇒ ∆1 , . . . , Γn ⇒ ∆n heißen Prämissen der Regel I Regeln ohne Prämissen (n = 0) heißen Axiome I Regel gelesen als: Aus den Prämissen läßt sich die Konklusion ableiten I Verwendung der Regel: Reduktion der Konklusion auf die Prämissen A. Knapp, G. Schellhorn: Formale Methoden 29 Regeln des Sequenzenkalküls für Aussagenlogik (AL) (1) Schreibweise: Interessierende Formel am Anfang A, Γ ⇒ B, ∆ Γ ⇒ A → B, ∆ (A) (Lfalse) statt Γ1 , A, Γ2 ⇒ ∆1 , B, ∆2 Γ1 , Γ2 ⇒ ∆1 , A → B, ∆2 A, Γ ⇒ A, ∆ false, Γ ⇒ ∆ A. Knapp, G. Schellhorn: Formale Methoden (Rtrue) Γ ⇒ true, ∆ 30 Regeln des Sequenzenkalküls für Aussagenlogik (AL) (2) (L¬) (L∧) (L∨) Γ ⇒ A, ∆ ¬A, Γ ⇒ ∆ A, B, Γ ⇒ ∆ A ∧ B, Γ ⇒ ∆ A, Γ ⇒ ∆ B, Γ ⇒ ∆ A ∨ B, Γ ⇒ ∆ A. Knapp, G. Schellhorn: Formale Methoden (R¬) (R∧) (R∨) A, Γ ⇒ ∆ Γ ⇒ ¬A, ∆ Γ ⇒ A, ∆ Γ ⇒ B, ∆ Γ ⇒ A ∧ B, ∆ Γ ⇒ A, B, ∆ Γ ⇒ A ∨ B, ∆ 31 Regeln des Sequenzenkalküls für Aussagenlogik (AL) (3) (L→) (L↔) (Cut) Γ ⇒ A, ∆ B, Γ ⇒ ∆ A → B, Γ ⇒ ∆ A, B, Γ ⇒ ∆ Γ ⇒ A, B, ∆ A ↔ B, Γ ⇒ ∆ Γ ⇒ A, ∆ A, Γ ⇒ ∆ Γ⇒∆ A. Knapp, G. Schellhorn: Formale Methoden (R→) (R↔) (Weak) A, Γ ⇒ B, ∆ Γ ⇒ A → B, ∆ A, Γ ⇒ B, ∆ B, Γ ⇒ A, ∆ Γ ⇒ A ↔ B, ∆ Γ1 ⇒ ∆1 Γ1 , Γ2 ⇒ ∆1 , ∆2 32 Sequenzenkalkül für AL: Beispiele I ¬(a ∨ b) ⇒ ¬a ∧ ¬b ¬a ∧ ¬b ⇒ ¬(a ∨ b) (R↔) ⇒ ¬(a ∨ b) ↔ ¬a ∧ ¬b I ⇒ a ∨ b, ¬a ∧ ¬b (L¬) ¬(a ∨ b) ⇒ ¬a ∧ ¬b I ⇒ a, b, ¬a ∧ ¬b (R∨) ⇒ a ∨ b, ¬a ∧ ¬b I ⇒ a, b, ¬a ⇒ a, b, ¬b (R∧) ⇒ a, b, ¬a ∧ ¬b I a ⇒ a, b (R¬) ⇒ a, b, ¬a I a ⇒ a, b (A) A. Knapp, G. Schellhorn: Formale Methoden 33 Ableitbarkeit Definition Eine Sequenz Γ ⇒ ∆ heißt mit AL ableitbar aus einer Menge von aussagenlogischen Formeln Ax, geschrieben als Ax `AL Γ ⇒ ∆, wenn es eine Ableitung in AL für Γ ⇒ ∆ aus Ax gibt, d. h. einen geschlossenen Beweisbaum, der als Wurzel die Sequenz Γ ⇒ ∆ (die Konklusion) hat, als Blätter Sequenzen ⇒ A mit A ∈ Ax (die Prämissen) und dessen innere Knoten durch Regeln von AL gebildet sind. Beweisprinzip für Beweisbäume (Ableitungen) I Zeige, daß alle Blätter die Eigenschaft haben und alle Regeln die Eigenschaft erhalten. A. Knapp, G. Schellhorn: Formale Methoden 34 Ableitbarkeit in AL: Beispiel Ableitung für die Sequenz ⇒ ¬(a ∨ b) ↔ ¬a ∧ ¬b (DeMorgan ∨) (A) (A) a ⇒ a, b b ⇒ a, b (L∨) (A) (A) a ∨ b ⇒ a, b a ⇒ a, b b ⇒ a, b (L¬) (R¬) (R¬) a ∨ b, ¬b ⇒ a ⇒ a, b, ¬a ⇒ a, b, ¬b (L¬) (R∧) a ∨ b, ¬a, ¬b ⇒ ⇒ a, b, ¬a ∧ ¬b (R¬) (R∨) ¬a, ¬b ⇒ ¬(a ∨ b) ⇒ a ∨ b, ¬a ∧ ¬b (L¬) (L∧) ¬(a ∨ b) ⇒ ¬a ∧ ¬b ¬a ∧ ¬b ⇒ ¬(a ∨ b) (R↔) ⇒ ¬(a ∨ b) ↔ ¬a ∧ ¬b A. Knapp, G. Schellhorn: Formale Methoden 35 Theorembeweiser KIV für AL I In Datei specification specification constants a : bool; b : bool; c : bool; end specification I In Datei sequents lemmas tertium-non-datur: ` a ∨ ¬ a ; DeMorgan-∨: ` ¬ (a ∨ b) ↔ ¬ a ∧ ¬ b DeMorgan-∧: ` ¬ (a ∧ b) ↔ ¬ a ∨ ¬ b Hilbert-1: ` a → (b → a) ; Hilbert-2: ` (a → b) → (¬ b → ¬ a) Hilbert-3: ` ((a → b) → (a → c)) → A. Knapp, G. Schellhorn: Formale Methoden ; ; ; (a → (b → c)) ; 36 Verwendung von Schnitt und Abschwächung Schnitt (Cut) und Abschwächung (Weak) für Ableitungen von Tautologien in AL nicht nötig Für Ableitungen aus Axiomen entsprechen Schnitt und Abschwächung der Verwendung eines Lemmas I Zu zeigen: Ax `AL Γ ⇒ ∆ I Einführung von A ∈ Ax zu Ax `AL A, Γ ⇒ ∆: ⇒A (Weak) A, Γ ⇒ ∆ Γ ⇒ A, ∆ (Cut) Γ⇒∆ A. Knapp, G. Schellhorn: Formale Methoden 37 Regelkorrektheit und Regelinvertierbarkeit von AL Lemma Für jede Regel (Γ1 ⇒ ∆1 . . . Γn ⇒ ∆n )/(Γ ⇒ ∆) von AL und jede Interpretation I folgt aus I |= {Γ1 ⇒ ∆1 , . . . , Γn ⇒ ∆n }, daß I |= Γ ⇒ ∆. Lemma Für jede Regel (Γ1 ⇒ ∆1 . . . Γn ⇒ ∆n )/(Γ ⇒ ∆) von AL außer der Abschwächungsregel (Weak) und jede Interpretation I folgt aus I |= Γ ⇒ ∆, daß I |= {Γ1 ⇒ ∆1 , . . . , Γn ⇒ ∆n }. A. Knapp, G. Schellhorn: Formale Methoden 38 Korrektheit Wenn I |= {Γ1 ⇒ ∆1 , . . . , Γn ⇒ ∆n } und {Γ1 ⇒ ∆1 , . . . , Γn ⇒ ∆n } `AL Γ ⇒ ∆, dann I |= Γ ⇒ ∆. Satz Beweisskizze Regelkorrektheit und Induktion über Anzahl der angewandten Regeln Insbesondere: Korrektheit von AL I Wenn Ax `AL Γ ⇒ ∆, dann Ax |= Γ ⇒ ∆. A. Knapp, G. Schellhorn: Formale Methoden 39 Invertierbarkeit Lemma Hat ein Beweisbaum ohne (Weak) die Konklusion Γ ⇒ ∆ und eine Prämisse Γ0 ⇒ ∆0 mit I |6 = Γ0 ⇒ ∆0 für eine Interpretation I , so ist auch I |6 = Γ ⇒ ∆. Beweisskizze Regelinvertierbarkeit und Induktion über Anzahl angewandter Regeln Korrektheit verlangt, daß, wenn die Prämissen eines Beweisbaums wahr sind, dann auch die Konklusion wahr ist. I Invertierbare Regeln gehen nie fehl: Ist die Konklusion beweisbar, so auch die Prämissen. I Allerdings kann eine unpassende Regel den Beweisbaum doppelt so groß machen. A. Knapp, G. Schellhorn: Formale Methoden 40 Terminierung Satz Sei Γ ⇒ ∆ eine Sequenz. Dann terminiert jedes Bilden eines Beweisbaums ohne (Cut) und (Weak). Beweisskizze Die maximale Höhe jedes Beweisbaums ist gleich der Anzahl der Junktoren in der Ausgangssequenz, da jede Regelanwendung (ohne (Cut) und (Weak)) wenigstens einen Junktor beseitigt. A. Knapp, G. Schellhorn: Formale Methoden 41 Entscheidbarkeit Satz Die Allgemeingültigkeit einer aussagenlogischen Formel ist entscheidbar durch Anwenden der Regeln des Sequenzenkalküls AL ohne (Cut) und (Weak): Es entsteht genau dann ein geschlossener Beweisbaum, wenn die Formel allgemeingültig ist. Beweisskizze Wegen Korrektheit Konklusion eines geschlossenen Beweisbaums allgemeingültig. Existenz eines geschlossenen Beweisbaums für allgemeingültige Formel als Konklusion: Bildungsprozeß terminiert; angenommen ergibt keinen geschlossenen Beweisbaum, d. h., es existiert eine Prämisse, auf die keine Regel anwendbar ist. Dann enthält die Prämisse nur atomare Aussagen und evtl. true links und false rechts, und Antezedent und Sukzedent haben keine gemeinsamen atomaren Aussagen. Wähle Interpretation I so, daß Atome im Antezedent wahr, im Sukzedent falsch; dann macht I die Prämisse falsch. Nach Invertierbarkeit ist die Konklusion für I falsch, im Widerspruch zur Allgemeingültigkeit der Konklusion. A. Knapp, G. Schellhorn: Formale Methoden 42 Erfüllbarkeit Verwendung des Sequenzenkalküls zur Konstruktion erfüllender Belegungen Satz Gegeben eine aussagenlogische Formel A erhält man alle erfüllenden Belegungen wie folgt: 1. Bilde die Sequenz A ⇒ und wende Sequenzenkalkül an. 2. Zu jeder offenen Prämisse bilde die Belegungen I , die die Atome im Antezedent wahr, die im Sukzedent falsch machen (alles andere beliebig). A. Knapp, G. Schellhorn: Formale Methoden 43 Erfüllbarkeit: Beispiel Erfüllende Belegungen für ¬a ↔ (b ∨ c) I Sequenzenkalkül b⇒a c⇒a a ⇒ b, c b∨c⇒a ⇒ ¬a, b, c ¬a, b ∨ c ⇒ ⇒ ¬a, b ∨ c ¬a ↔ (b ∨ c) ⇒ I Erfüllende Belegungen a b c ff tt ff ff tt tt ff ff tt ff tt tt tt ff ff b⇒a b⇒a c⇒a c⇒a a ⇒ b, c A. Knapp, G. Schellhorn: Formale Methoden 44 Schwache Vollständigkeit Satz Wenn |= Γ ⇒ ∆, dann `AL Γ ⇒ ∆. Beweisskizze Bilde Beweisbaum (ohne (Cut) und (Weak)), bis keine Regel mehr anwendbar ist (Termination); falls er keine offene Prämisse hat, ist die Formel allgemeingültig wegen Korrektheit. Sonst bilde eine Belegung I , die eine offene Prämisse falsch macht; nach Regelinvertierbarkeit ist auch die Konklusion falsch für I , also nicht allgemeingültig. A. Knapp, G. Schellhorn: Formale Methoden 45 Deduktionstheorem Satz Ax ∪ {B} `AL ⇒ C gdw. Ax `AL B ⇒ C gdw. Ax `AL ⇒ B → C. Beweisskizze ⇒“ in der oberen Äquivalenz: Füge in geschlossenem Beweisbaum ” für Ax ∪ {B} `AL ⇒ C allen Sequenzen links die Formel B hinzu; ergibt Beweisbaum. Die Prämisse B wird zum Axiom und verschwindet; Prämissen der Form B ⇒ Ax werden mit Abschwächung wieder zu Ax. Die Konklusion ist das gewünschte Resultat. ⇐“ in der oberen Äquivalenz: Hänge an geschlossenen Beweisbaum für Ax `AL B ⇒ C einen Beweisbaum für Lemmaanwendung von B mit Γ leer und ∆ = C ” an. Untere Äquivalenz: Verwendung der ersten Äquivalenz. A. Knapp, G. Schellhorn: Formale Methoden 46 Starke Vollständigkeit Satz Ist Ax endlich, dann gilt mit Ax |= Γ ⇒ ∆, daß Ax `AL Γ ⇒ ∆. Beweisskizze Ax |= Γ ⇒ ∆ gdw. |= Ax, Γ ⇒ ∆ nach Folgerbarkeit; |= Ax, Γ ⇒ ∆ impliziert `AL Ax, Γ ⇒ ∆ nach schwacher Vollständigkeit; `AL Ax, Γ ⇒ ∆ gdw. Ax `AL Γ ⇒ ∆ nach Deduktionstheorem. Starke Vollständigkeit gilt auch für unendliche Mengen Ax. A. Knapp, G. Schellhorn: Formale Methoden 47 Konsistenz Definition Eine Menge Ax von Axiomen heißt konsistent, wenn sich aus Ax die leere Sequenz nicht ableiten läßt. I Kalkül korrekt gdw. jede erfüllbare Menge konsistent I Kalkül vollständig gdw. jede konsistente Menge erfüllbar Daraus Vollständigkeitssatz: Für jede konsistente Menge Konstruktion eines Modells. A. Knapp, G. Schellhorn: Formale Methoden 48 Substitution (1) Definition Für aussagenlogische Formeln A, B, C heißt A{B 7→ C} die Substitution (oder Ersetzung) von B durch C in A, gegeben durch: I I I I ( C, falls p = B p{B 7→ C} = p, falls p 6= B ( C, falls (¬A) = B (¬A){B 7→ C} = ¬(A{B 7→ C}), falls (¬A) 6= B ( C, falls (A ∧ A0 ) = B (A ∧ A0 ){B 7→ C} = (A{B 7→ C}) ∧ (A0 {B 7→ C}), falls (A ∧ A0 ) 6= B analog für die anderen Junktoren A. Knapp, G. Schellhorn: Formale Methoden 49 Substitution (2) Lemma Ist I |= B ↔ C, dann gilt für jedes A: I |= A gdw. I |= A{B 7→ C}. I Formeln können durch äquivalente Formeln ersetzt werden. I Insbesondere darf man B durch C ersetzen, wenn B ↔ C eine Tautologie ist. A. Knapp, G. Schellhorn: Formale Methoden 50 Vereinfachung von Sequenzen (1) I Reine Anwendung von Sequenzenkalkülregeln ergibt oft lange Beweise; Substitution für Abkürzungen A → B{A 7→ true}, Γ ⇒ ∆ A → B, Γ ⇒ ∆ A{B 7→ false} → B, Γ ⇒ ∆ A → B, Γ ⇒ ∆ A ∨ B{A 7→ false}, Γ ⇒ ∆ A ∨ B, Γ ⇒ ∆ Γ ⇒ A ∧ B{A 7→ true}, ∆ Γ ⇒ A ∧ B, ∆ A, Γ{A 7→ true} ⇒ ∆{A 7→ true} A, Γ ⇒ ∆ Γ{A 7→ false} ⇒ A, ∆{A 7→ false} Γ ⇒ A, ∆ Beispiel: Für ⇒ A ∧ A zeige ⇒ A ∧ A{A 7→ true}, d. h. ⇒ A ∧ true, also ⇒ A mit (And-true). A. Knapp, G. Schellhorn: Formale Methoden 51 Vereinfachung von Sequenzen (2) Zulässigkeit der Regel Def. Sem. Seq. ⇐⇒ Taut. 23 ⇐⇒ Def. Sem. Impl. ⇐⇒ Taut. 32 ⇐⇒ Subst.lem. ⇐⇒ Def. Subst.fkt. ⇐⇒ Taut. 32 ⇐⇒ Def. Sem. Impl. ⇐⇒ Taut. 23 ⇐⇒ Def. Sem. Seq. ⇐⇒ A, Γ{A 7→ true} ⇒ ∆{A 7→ true} A, Γ ⇒ ∆ I |= A, Γ ⇒ ∆ V W I |= A ∧ Γ → ∆ V W I |= A → ( Γ → ∆) V W I |= A ⇒ I |= Γ → ∆ V W I |= A ↔ true ⇒ I |= Γ → ∆ V W I |= A ↔ true ⇒ I |= ( Γ → ∆){A 7→ true} V W I |= A ↔ true ⇒ I |= Γ{A 7→ true} → ∆{A 7→ true} V W I |= A ⇒ I |= Γ{A 7→ true} → ∆{A 7→ true} V W I |= A → ( Γ{A 7→ true} → ∆{A 7→ true}) V W I |= A ∧ Γ{A 7→ true} → ∆{A 7→ true} I |= A, Γ{A 7→ true} ⇒ ∆{A 7→ true} A. Knapp, G. Schellhorn: Formale Methoden 52 Resolutionskalkül I Nachweis der Unerfüllbarkeit von Aussagen I erfunden von J. Alan Robinson (1965) I operiert auf Klauselmengen I I aus konjunktiver Normalform Charakteristik: spezialisierte Schnittregel; geeignet für maschinelles Beweisen A. Knapp, G. Schellhorn: Formale Methoden 53 Literale und konjunktive Normalform Definition Ein Literal ist eine Proposition oder eine negierte Proposition. Definition Eine Formel ist in konjunktiver Normalform (CNF), wenn sie I eine Konjunktion von Disjunktionen von Literalen ist; I in jeder Disjunktion jede Proposition nur einmal vorkommt. A. Knapp, G. Schellhorn: Formale Methoden 54 Existenz der konjunktiven Normalform (1) Zu jeder Formel A gibt es eine äquivalente Formel B, die entweder true oder false oder in konjunktiver Normalform ist. Satz Beweisskizze Wiederholtes Umschreiben der Formel mittels Substitutionslemma. I Implikationen und Äquivalenzen beseitigen mit Tautologien 19 und 21. I true, false beseitigen mit And-false, And-true, Or-false, &c. Falls das Ergebnis true oder false ist, fertig. I Negation nach innen schieben mit DeMorgan (Tautologien 9 und 10), Doppelnegationen beseitigen (Tautologie 13). I ∨ über ∧ distribuieren mit Tautologie 7. I doppelte Literale in Disjunktionen beseitigen mit Tautologie 3. I Disjunktionen, die A und ¬A enthalten löschen. A. Knapp, G. Schellhorn: Formale Methoden 55 Existenz der konjunktiven Normalform (2) Alternative Konstruktion der konjunktiven Normalform I Bilde Sequenz ⇒ A und wende Sequenzenkalkül an. Die entstehenden Prämissen seien P1 , . . . , Pk . I I Für eine Prämisse P = A1 , . . . , Am ⇒ B1 , . . . , Bn sei disj(P) = ¬A1 ∨ . . . ∨ ¬Am ∨ B1 ∨ . . . ∨ Bn . V Dann gilt |= A ↔ 1≤i≤k disj(Pi ) wegen Korrektheit und Invertierbarkeit. V 1≤i≤k disj(Pi ) ist also die konjunktive Normalform. I Spezialfälle: Wenn keine Prämisse: true; wenn leere Prämisse: false. I A. Knapp, G. Schellhorn: Formale Methoden 56 Konjunktive Normalform: Beispiel Konstruktion einer konjunktiven Normalform von ¬a ↔ (b ∨ c) I Methode (1) ¬a ↔ (b ∨ c) (¬a → b ∨ c) ∧ (b ∨ c → ¬a) gdw. (¬¬a ∨ b ∨ c) ∧ (¬(b ∨ c) ∨ ¬a) gdw. (a ∨ b ∨ c) ∧ (¬b ∧ ¬c ∨ ¬a) gdw. (a ∨ b ∨ c) ∧ (¬b ∨ ¬a) ∧ (¬c ∨ ¬a) I Taut. 21 Taut. 19 Taut. 9, 13 Taut. 5 (CNF) Methode (2) a, b ⇒ a, c ⇒ ⇒ a, b, c ¬a ⇒ b, c b ⇒ ¬a c ⇒ ¬a ¬a ⇒ b ∨ c b ∨ c ⇒ ¬a ⇒ ¬a ↔ (b ∨ c) A. Knapp, G. Schellhorn: Formale Methoden 57 Tseitin-Codierung Erzeugung einer erfüllbarkeitsäquivalenten CNF-Formel A0 zu einer Formel A I Einführung von Hilfspropositionen für Junktoren I A0 linear in der Größe von A Beispiel: a → (b ∧ c) I Einführung von x2 für b ∧ c und Einführung von x1 für a → x2 x1 ↔ (a → x2 ) x2 ↔ (b ∧ c) I daraus konjunktive Normalform (x1 ∨ a) ∧ (x1 ∨ ¬x2 ) ∧ (¬x1 ∨ ¬a ∨ x2 ) ∧ (¬x2 ∨ b) ∧ (¬x2 ∨ c) ∧ (x2 ∨ ¬b ∨ ¬c) ∧ (x1 ) A. Knapp, G. Schellhorn: Formale Methoden 58 Klauseln Definition Eine Klausel ist eine Menge von Literalen. Eine Klauselmenge ist eine Menge von Klauseln. I Eine Klausel wird als Disjunktion interpretiert; die leere Klausel wird als false angesehen. I Eine Klauselmenge wird als Konjunktion interpretiert; die leere Klauselmenge entspricht true. Damit: Formeln in konjunktiver Normalform und true, false entsprechen Klauselmengen. Beispiel I (a ∨ b ∨ c) ∧ (¬b ∨ ¬a) ∧ (¬c ∨ ¬a) ≡ {{a, b, c}, {¬b, ¬a}, {¬c, ¬a}} A. Knapp, G. Schellhorn: Formale Methoden 59 Resolutionskalkül Lemma Sind die Klauseln C1 und C2 mit p ∈ C1 und ¬p ∈ C2 gemeinsam erfüllbar, dann ist die Klausel (C1 ∪ C2 ) \ {p, ¬p} erfüllbar. Resolutionsregel p, C1 ¬p, C2 C1 , C2 Satz Eine Klauselmenge C ist genau dann unerfüllbar, wenn sich aus C durch Anwendung der Resolutionsregel die leere Klausel ableiten läßt. Beispiel: (¬a ∨ b) ∧ (a) ∧ (¬b) ¬b ¬a, b a b ∅ A. Knapp, G. Schellhorn: Formale Methoden 60 Unit-Resolution Lemma Die Klauseln {`} und C mit ¬` ∈ C sind genau dann gemeinsam erfüllbar, wenn C \ {¬`} erfüllbar ist. Unit-Resolutionsregel ` ¬`, C C Boolean constraint propagation (BCP) I Ersetzung der Klauseln {`} und C mit ¬` ∈ C in einer Klauselmenge C durch C \ {¬`} zu neuer Klauselmenge C 0 Beispiel: Anwendung von BCP auf (a) ∧ (¬a ∨ b) ∧ (c ∨ ¬b ∨ d) (a) ∧ (¬a ∨ b) ∧ (c ∨ ¬b ∨ d) ; (b) ∧ (c ∨ ¬b ∨ d) ;c∨d A. Knapp, G. Schellhorn: Formale Methoden 61 Davis-Putnam-Logemann-Loveland-Algorithmus Prüfung einer aussagenlogischen Formel in CNF auf Erfüllbarkeit I Grundlage vieler SAT-Beweiser zur Auffindung einer erfüllenden Belegung DPLL(A) ≡ A0 ← BCP(A) if A0 = true then return true else if A0 = false then return false else p ← choose vars(A0 ) return DPLL(A0 {p 7→ true}) ∨ DPLL(A0 {p 7→ false}) fi fi A. Knapp, G. Schellhorn: Formale Methoden 62 SAT-Beweiser Eingabeformat (DIMACS): I Propositionen sind positive Zahlen, negiertes Atom n ist -n. I Klausel als Folge von Literalen geschrieben, durch Leerzeichen getrennt, 0 beendet Klausel; Klauseln hintereinander geschrieben I Zu Beginn der Datei eine Zeile mit: I I p cnf m n m ist die Nummer der maximalen Nummer einer Proposition n ist die Zahl der noch folgenden Zeilen in der Datei Ausgabeformat I Liste der Propositionen, die mit tt zu belegen sind Beispiel: a ∧ (¬b ∨ a) ∧ (c ∨ ¬d) p cnf 4 3 1 0 -2 1 0 3 -4 0 Ausgabe etwa 1 3 A. Knapp, G. Schellhorn: Formale Methoden 63 Zusammenfassung I Aussagenlogik I I I Sequenzenkalkül AL I I I Syntax und Semantik Modelle, Folgerbarkeit, Erfüllbarkeit Korrektheit und Vollständigkeit Theorembeweiser KIV Resolutionskalkül I I Konjunktive Normalform, Klauseln SAT-Beweiser A. Knapp, G. Schellhorn: Formale Methoden 64 Prädikatenlogik Denn wenn A von jedem B und B von jedem C, muß A von jedem C ausgesagt werden. — Aristoteles, Analytica Priora A 4, 25b37ff. Daraus der Vers: . . . Barbara, celarent, darii, ferion, baralipton, Celantes, dabitis, fapesmo, frisesomorum; Cesare, camestres, festino, baroco; darapti, Felapto, disamis, datisi, bocardo, ferison. — Petrus Hispanus, Summulae Logicales 4.17 ` : . (z) . ϕz ⊃ ψz : ϕx : ⊃ . ψx . . . Dies ist eine Form des Syllogismus in Barbara. Man setze z. B. ϕz . = . z ist ein Mensch, ψz . = . z ist sterblich, x = Sokrates. Dann wird die Aussage zu: Wenn alle Menschen sterblich sind und Sokrates ein Mensch ist, dann ” ist Sokrates sterblich.“ — Alfred N. Whitehead, Bertrand Russell, Principia Mathematica, *10.26 A. Knapp, G. Schellhorn: Formale Methoden 65 Signaturen Definition Eine Signatur Σ = (S, F, P) besteht aus: I einer endlichen Menge S von Sorten I einer endlichen Menge F von Funktionssymbolen f : ~s → s mit I Argumentsorten ~ s = s1 . . . sn ∈ S∗ (Liste von Sorten) I Resultatsorte s ∈ S I endlicher Menge P von Prädikatsymbolen p : ~s I Ein Funktionssymbol mit leerer Argumentliste heißt Konstante. I Ein Prädikatsymbol mit leerer Argumentliste heißt Proposition. A. Knapp, G. Schellhorn: Formale Methoden 66 Signaturen: Beispiele Zugriffsmöglichkeiten“ auf einen Datentypen ” I Gruppen ΣGrp = ({Elt}, {1 : → Elt, · : Elt Elt → Elt, −1 : Elt → Elt}, ∅) I Natürliche Zahlen ΣNat1 = ({Nat}, {0 : → Nat, s : Nat → Nat}, ∅) ΣNat2 = ({Nat}, {0 : → Nat, 1 : → Nat, + : Nat Nat → Nat}, {< : Nat Nat}) I Wahrheitswerte ΣBool = ({Bool}, ∅, {true : , false : }) I Listen ΣList = ({Elt, List}, {empty : → List, cons : Elt List → List}, {isEmpty : List}) A. Knapp, G. Schellhorn: Formale Methoden 67 Signaturen in KIV specification sorts s1; s2; nat; set; constants c1, c2 : s1; ∅ : set; functions f : s1 × s2 → s2; + : nat × nat → nat; * : nat × nat → nat; predicates p : s1 × s2; ⊆ : set × set; end specification A. Knapp, G. Schellhorn: Formale Methoden 68 Terme Definition Eine Variablenmenge X für eine Signatur Σ = (S, F, P) ist die Vereinigung von abzählbar unendlichen Mengen Xs für jede Sorte s ∈ S. Definition Seien Σ = (S, F, P) eine Signatur und X eine Variablenmenge für Σ. Dann sind die Mengen T (Σ, X)s der Terme der Sorte s über Σ und X gegeben durch I x ∈ Xs ist ein Term der Sorte s. I Sind t1 , . . . , tn Terme der Sorten s1 , . . . , sn und f : s1 . . . sn → s ∈ F , dann ist f (t1 , . . . , tn ) ein Term der Sorte s. T (Σ, X) sind alle Terme (aller Sorten) über Σ und X . Beispiele: I In ΣGrp : −1 (1), ·(x, 1) für x ∈ XElt I In ΣNat1 : 0, s(s(s(0))) A. Knapp, G. Schellhorn: Formale Methoden 69 Algebren Definition Eine Algebra A = ((As )s∈S , (f A )f ∈F , (pA )p∈P ) über einer Signatur Σ = (S, F, P) (kurz: eine Σ-Algebra) besteht aus: I nichtleeren Mengen As für jede Sorte s ∈ S (Trägermengen) I Funktionen f A : As1 × · · · × Asn → As für alle f : s1 . . . sn → s ∈ F I Mengen pA ⊆ As1 × · · · × Asn für alle p : s1 . . . sn ∈ P Die Klasse aller Σ-Algebren über Σ wird mit Alg(Σ) bezeichnet. A. Knapp, G. Schellhorn: Formale Methoden 70 Algebren: Beispiele Mögliche Interpretationen“ von Datentyp-Signaturen ” I I Für ΣGrp : AGrp+ additiv AElt = Z 1AGrp+ = 0, ·AGrp+ (x, y) = x + y, −1 AGrp+ (x) = −x Für ΣNat1 : ANat∗ ANat = {∗} 0ANat∗ = ∗, sANat∗ (x) = x I Für ΣList : AList(Nat) Listen über natürlichen Zahlen AElt = N, AList = N∗ emptyAList(Nat) = ε, consAList(Nat) (x, l) = x :: l isEmptyAList(Nat) = {ε} A. Knapp, G. Schellhorn: Formale Methoden 71 Belegungen S Definition Eine Belegung (valuation) v : s∈S (Xs → As ) ist eine Abbildung, die jedem Variablensymbol x ∈ Xs einen Wert v(x) ∈ As zuordnet. Definition Die Abänderung v{x 7→ a} der Belegung v für x ∈ Xs und a ∈ As ist gegeben durch ( v(y) falls x 6= y (v{x 7→ a})(y) = . a falls x = y A. Knapp, G. Schellhorn: Formale Methoden 72 Semantik von Termen Definition Sei A eine Σ-Algebra und v eine Belegung. Dann ist die Semantik (Auswertung) T JtK A v eines Terms t ∈ T (Σ, X)s der Sorte s der Wert in As mit I I T JxK A v = v(x), falls x ∈ X ; T Jf (t1 , . . . , tn )K A v = f A (T Jt1 K A v, . . . , T Jtn K A v) für f : s1 . . . sn → s ∈ F und ti ∈ T (Σ, X)si . A. Knapp, G. Schellhorn: Formale Methoden 73 Variablen eines Terms Für Terme gilt ein analoges Definitions- und Beweisprinzip wie für aussagenlogische Formeln. Definition Die Variablen var(t) eines Terms sind I var(x) = {x} für x ∈ X ; I var(f (t1 , . . . , tn )) = var(t1 ) ∪ . . . ∪ var(tn ). Die Semantik eines Terms hängt nur von der Belegung der Variablen in var(t) ab (Koinzidenzlemma). Satz Sind v und w Belegungen und gilt v(x) = w(x) für alle Variablen x ∈ var(t), so ist T JtK A v = T JtK A w. I Für Auswertung von Termen t mit var(t) = ∅ Belegung irrelevant. I Schreibweise: T JtK A statt T JtK A v, falls var(t) = ∅ A. Knapp, G. Schellhorn: Formale Methoden 74 Substitution in Termen Definition Die Substitution einer Variablen x durch einen Term t in einem Term u, geschrieben als u{x 7→ t}, ist gegeben durch I ( t falls y = x y{x 7→ t} = y falls y 6= x I f (t1 , . . . , tn ){x 7→ t} = f (t1 {x 7→ t}, . . . , tn {x 7→ t}). für y ∈ X ; Die Semantik des Terms u{x 7→ t} ist dieselbe wie die des Terms u unter einer Belegung, in der x den Wert von t hat (Substitutionslemma). Lemma T Ju{x 7→ t}K A v = T JuK A v{x 7→ T JtK A v}. A. Knapp, G. Schellhorn: Formale Methoden 75 Formeln Definition Für eine Signatur Σ = (S, F, P) und eine Variablenmenge X für Σ ist die Menge der prädikatenlogischen Formeln F (Σ, X) gegeben durch I true, false ∈ F (Σ, X); I t1 = t2 ∈ F (Σ, X), falls t1 , t2 ∈ T (Σ, X)s für ein s ∈ S; I p(t1 , . . . , tn ) ∈ F (Σ, X), falls p : s1 . . . sn ∈ P und ti ∈ T (Σ, X)si für 1 ≤ i ≤ n; I Wenn ϕ, ψ ∈ F (Σ, X), dann (¬ϕ), (ϕ ∧ ψ), (ϕ ∨ ψ), (ϕ → ψ), (ϕ ↔ ψ) ∈ F (Σ, X); I Wenn ϕ ∈ F (Σ, X) und x ∈ X , dann (∀x . ϕ), (∃x . ϕ) ∈ F (Σ, X). A. Knapp, G. Schellhorn: Formale Methoden 76 Formeln: Notation I Es gelten dieselben Präzendenz- und Klammerregeln wie bei Aussagenlogik. I Zusätzlich: Quantoren binden am schwächsten ∀x . ϕ ∧ ψ ↔ ∃y . π ∨ ρ ≡ (∀x . ((ϕ ∧ ψ) ↔ (∃y . (π ∨ ρ)))) I Quantoren binden immer soweit nach rechts wie möglich. I Abkürzung: Listen von Quantoren ∀x1 , x2 , . . . , xn . ϕ ≡ ∀x1 . ∀x2 . . . . ∀xn . ϕ Beispiele: I In ΣGrp : ∀x . ·(x, −1 (x)) = 1 I In ΣNat2 : ∀m, n . <(m, n) ↔ ∃k . ¬(k = 0) ∧ +(m, k) = n Oft auch Mixfix- statt Präfix-Schreibweise für Terme I x · x−1 statt ·(x, −1 (x)) A. Knapp, G. Schellhorn: Formale Methoden 77 Prädikatenlogische Spezifikationen in KIV specification sorts nat; constants zero : nat; one : nat; functions . + . : nat × nat → nat prio 9 right; predicates . < . : nat × nat; variables m, n, k : nat; axioms commutativity+ : m + n = n + m; less : m < n ↔ ∃ k. ¬ (k = zero) ∧ m + k = n; end specification A. Knapp, G. Schellhorn: Formale Methoden 78 Semantik von Formeln Definition Für eine Algebra A und eine Belegung v ist die Semantik einer Formel FJAK A v der Wahrheitswert aus B mit I FJtrueK A v = tt I FJfalseK A v = ff I FJt1 = t2 K A v = tt gdw. T Jt1 K A v = T Jt2 K A v I FJp(t1 , . . . , tn )K A v = tt gdw. (T Jt1 K A v, . . . , T Jtn K A v) ∈ pA I FJ¬ϕK A v = tt gdw. FJϕK A v = ff I FJϕ ∧ ψK A v = tt gdw. FJϕK A v = tt und FJψK A v = tt I FJϕ ∨ ψK A v = tt gdw. FJϕK A v = tt oder FJψK A v = tt I FJϕ → ψK A v = tt gdw. FJϕK A v = ff oder FJψK A v = tt I FJϕ ↔ ψK A v = tt gdw. FJϕK A v = FJψK A v I FJ∀x . ϕK A v = tt gdw. f. a. a ∈ As : FJϕK A v{x 7→ a} = tt (für x ∈ Xs ) I FJ∃x . ϕK A v = tt gdw. ex. a ∈ As : FJϕK A v{x 7→ a} = tt (für x ∈ Xs ) A. Knapp, G. Schellhorn: Formale Methoden 79 Variablen einer Formel Definition Die Variablen var(ϕ) einer Formel ϕ sind gegeben durch I var(true) = var(false) = ∅ I var(t1 = t2 ) = var(t1 ) ∪ var(t2 ) I var(p(t1 , . . . , tn )) = var(t1 ) ∪ . . . ∪ var(tn ) I var(¬ψ) = var(ψ) I var(ψ ? π) = var(ψ) ∪ var(π) für ? ∈ {∧, ∨, →, ↔} I var(Qx . ψ) = {x} ∪ var(ψ) für Q ∈ {∀, ∃} A. Knapp, G. Schellhorn: Formale Methoden 80 Freie Variablen einer Formel Definition Die freien Variablen fvar(ϕ) einer Formel ϕ sind gegeben durch I fvar(true) = fvar(false) = ∅ I fvar(t1 = t2 ) = var(t1 ) ∪ var(t2 ) I fvar(p(t1 , . . . , tn )) = var(t1 ) ∪ . . . ∪ var(tn ) I fvar(¬ψ) = fvar(ψ) I fvar(ψ ? π) = fvar(ψ) ∪ fvar(π) für ? ∈ {∧, ∨, →, ↔} I fvar(Qx . ψ) = fvar(ψ) \ {x} für Q ∈ {∀, ∃} Eine Formel ohne freie Variablen heißt geschlossen. A. Knapp, G. Schellhorn: Formale Methoden 81 Koinzidenzlemma für Formeln Die Semantik einer Formel hängt nur von den freien Variablen ab (Koinzidenzlemma). Lemma Sind zwei Belegungen v und w gleich für alle freien Variablen einer Formeln ϕ, dann gilt FJϕK A v = FJϕK A w. I Für geschlossene Formeln ϕ Belegung v irrelevant. A. Knapp, G. Schellhorn: Formale Methoden 82 Substitution in Formeln Definition Die Substitution ϕ{x 7→ t} einer Variablen x durch einen Term t in einer Formel ϕ ist gegeben durch I true{x 7→ t} = true I false{x 7→ t} = false I (t1 = t2 ){x 7→ t} = t1 {x 7→ t} = t2 {x 7→ t} I p(t1 , . . . , tn ){x 7→ t} = p(t1 {x 7→ t}, . . . , tn {x 7→ t}) I (¬ψ){x 7→ t} = ¬(ψ{x 7→ t}) I (ψ ? π){x 7→ t} = ψ{x 7→ t} ? π{x 7→ t} falls y = x oder x ∈ / fvar(ψ) Qy . ψ / var(t), x ∈ fvar(ψ) Qy . ψ{x 7→ t} falls y 6= x, y ∈ (Qy . ψ){x 7→ t} = Qz . (ψ{y 7→ z}){x 7→ t} falls y 6= x, y ∈ var(t), x ∈ fvar(ψ) (z neu, d. h. z ∈ / fvar(ψ) ∪ var(t)) I A. Knapp, G. Schellhorn: Formale Methoden 83 Substitutionslemma für Formeln Die Formel ϕ{x 7→ t} ist wahr in der Algebra A unter der Belegung v genau dann, wenn die Formel ϕ unter einer abgeänderten Belegung wahr ist, in der x den Wert von t hat (Substitutionslemma). Lemma FJϕ{x 7→ t}K A v = FJϕK A v{x 7→ T JtK A v}. Beispiel für Umbenennung bei Quantoren: I ∃m . n < m wahr über den natürlichen Zahlen (bei jeder Belegung von n). I Nach dem Lemma darf für n jeder Term eingesetzt werden, und man erhält wieder eine wahre Aussage. I Ersetzen von n durch m · m würde ohne Umbenennung aber ∃m . m · m < m ergeben, was falsch ist. I Das richtige Ergebnis ist ∃m0 . m · m < m0. A. Knapp, G. Schellhorn: Formale Methoden 84 Gültigkeit und Modelle Definition Die Formel ϕ ist in A unter der Belegung v gültig, geschrieben als A, v |= ϕ, wenn FJϕK A v = tt. Eine Algebra A ist ein Modell der Formel ϕ, geschrieben als A |= ϕ, wenn für alle Belegungen v gilt: A, v |= ϕ. Eine Algebra A ist ein Modell für die Formelmenge Φ, geschrieben als A |= Φ, falls A |= ϕ für alle ϕ ∈ Φ. Definition I I Sei ϕ eine Formel und Φ eine Formelmenge. ϕ ist eine Tautologie, in Zeichen |= ϕ, falls A |= ϕ für alle A ∈ Alg(Σ). ϕ ist erfüllbar in der Algebra A, falls es eine Belegung v mit A, v |= ϕ gibt. Φ ist erfüllbar in der Algebra A, falls es eine Belegung v mit A, v |= ϕ für alle ϕ ∈ Φ gibt. I ϕ ist erfüllbar, falls ϕ ist erfüllbar in einer Algebra. I Φ ist erfüllbar, falls Φ erfüllbar in einer Algebra. I A. Knapp, G. Schellhorn: Formale Methoden 85 Tautologie, Erfüllbarkeit: Beispiele I x = x, p(x) ∨ ¬p(x) sind Tautologien. I p(x) hat Modelle, ist erst recht erfüllbar (in mehr Algebren als den Modellen). I x = y ist erfüllbar (in jeder Algebra) und hat ein Modell (das einelementige). I x 6= y, p(x) ∧ ¬p(y) sind erfüllbar (aber nicht in jeder Algebra), haben keine Modelle Es gilt: I ϕ ist Tautologie ⇒ ϕ hat Modell ⇒ ϕ ist erfüllbar, aber keine Umkehrung I ϕ ist nicht erfüllbar genau dann, wenn ¬ϕ eine Tautologie ist. A. Knapp, G. Schellhorn: Formale Methoden 86 Folgerbarkeit Definition Eine Formel ϕ ist eine Folgerung aus der Formelmenge Φ, geschrieben als Φ |= ϕ, falls für alle A ∈ Alg(Σ) gilt: A |= Φ impliziert A |= ϕ. Φ als Axiome einer Datentypspezifikation Beispiel I Für ΣGrp : ΦGrp ∀x . x · 1 = x ∀x . 1 · x = x ∀x, y, z . x · (y · z) = (x · y) · z ∀x . x · x−1 = 1 ∀x . x−1 · x = 1 I Dann ΦGrp |= ∀e . (∀x . x · e = x ∧ e · x = x) → e = 1. A. Knapp, G. Schellhorn: Formale Methoden 87 Eigenschaften der Prädikatenlogik Definition Ist fvar(ϕ) = {x1 , . . . , xn }, so ist der Allabschluß cl∀ (ϕ) = ∀x1 , . . . , xn . ϕ. 1. A, v |= ϕ gdw. nicht A, v |= ¬ϕ (geschrieben als A, v 6|= ¬ϕ) 2. A, v |= ϕ oder A, v |= ¬ϕ 3. A |= ϕ oder A |= ¬ϕ, falls ϕ geschlossen 4. A |= ϕ gdw. A 6|= ¬ϕ, falls ϕ geschlossen 5. A |= ϕ gdw. A |= cl∀ (ϕ) 6. Φ |= ϕ gdw. Φ |= cl∀ (ϕ) 7. Φ ∪ {ϕ} |= ψ gdw. Φ ∪ {cl∀ (ϕ)} |= cl∀ (ψ) 8. Φ ∪ {ϕ} |= ψ gdw. Φ |= cl∀ (ϕ) → ψ Aus Φ ∪ {ϕ} |= ψ folgt nur für geschlossenes ϕ, daß Φ |= ϕ → ψ . Implikation und Folgerbarkeit fallen also nicht zusammen: I x > 0 |= ∀x . x > 0 ist wahr, |= x > 0 → ∀x . x > 0 ist falsch (über N) A. Knapp, G. Schellhorn: Formale Methoden 88 Eigenschaften von Quantoren Satz Wenn z ∈ / fvar(ϕ) \ {y}, so gelten: A, v |= ∀y . ϕ gdw. A, v |= ∀z . ϕ{y 7→ z} , |= (∀y . ϕ) ↔ (∀z . ϕ{y 7→ z}) . Beweisskizze Satz Aus Substitutionslemma. Für jede Formel ϕ gelten |= (∀x . ϕ) → ϕ{x 7→ t} , |= ϕ{x 7→ t} → (∃x . ϕ) . Beweisskizze Aus Substitutionslemma. A. Knapp, G. Schellhorn: Formale Methoden 89 Tautologien für Quantoren (1) Sei y ∈ / fvar(ϕ). Q1. Q2. Q3. Q4. Q5. Q6. Q7. Q8. A. Knapp, G. Schellhorn: Formale Methoden (∀x . ϕ) ↔ (∀y . ϕ{x 7→ y}) (∃x . ϕ) ↔ (∃y . ϕ{x 7→ y}) (¬∀x . ϕ) ↔ (∃x . ¬ϕ) (¬∃x . ϕ) ↔ (∀x . ¬ϕ) (∀x . ∀y . ϕ) ↔ (∀y . ∀x . ϕ) (∃x . ∃y.ϕ) ↔ (∃y . ∃x . ϕ) (∃x . ϕ ∨ ψ) ↔ ((∃x . ϕ) ∨ (∃x . ψ)) (∀x . ϕ ∧ ψ) ↔ ((∀x . ϕ) ∧ (∀x . ψ)) 90 Tautologien für Quantoren (2) Q9. Q10. Q11. Q12. Q13. Q14. Q15. A. Knapp, G. Schellhorn: Formale Methoden (∃x . ϕ ∧ ψ) → ((∃x . ϕ) ∧ (∃x . ψ)) ((∀x . ϕ) ∨ (∀x . ψ)) → (∀x . ϕ ∨ ψ) (∀x . ϕ → ψ) → ((∀x . ϕ) → (∀x . ψ)) (∀x . ϕ ↔ ψ) → ((∀x . ϕ) ↔ (∀x . ψ)) (∀x . ϕ) → ϕ{x 7→ t} ϕ{x 7→ t} → ∃x . ϕ (∃x . ∀y . ϕ) → ∀y . ∃x . ϕ 91 Tautologien für Quantoren (3) Sei x ∈ / fvar(ψ). Q16. Q17. Q18. Q19. Q20. Q21. Q22. Q23. Q24. Q25. A. Knapp, G. Schellhorn: Formale Methoden (∀x . ψ) ↔ ψ (∃x . ψ) ↔ ψ (∃x . ϕ ∨ ψ) ↔ ((∃x . ϕ) ∨ ψ) (∀x . ϕ ∨ ψ) ↔ ((∀x . ϕ) ∨ ψ) (∃x . ϕ ∧ ψ) ↔ ((∃x . ϕ) ∧ ψ) (∀x . ϕ ∧ ψ) ↔ ((∀x . ϕ) ∧ ψ) (∃x . ψ → ϕ) ↔ (ψ → ∃x . ϕ) (∀x . ψ → ϕ) ↔ (ψ → ∀x . ϕ) (∀x . ϕ → ψ) ↔ ((∃x . ϕ) → ψ) (∃x . ϕ → ψ) ↔ ((∀x . ϕ) → ψ) 92 Substitution von Formeln durch Formeln Umformungen mittels Tautologien, lokale Simplifikation Definition Für Formeln ϕ, ψ , π ist die Substitution von ψ durch π in ϕ, geschrieben als ϕ{ψ 7→ π}, definiert wie in der Aussagenlogik; zusätzlich für Q ∈ {∀, ∃}: I (Qx . ϕ){ψ 7→ π} = π , falls ψ = Qx . ϕ; I (Qx . ϕ){ψ 7→ π} = Qx . (ϕ{ψ 7→ π}), falls x ∈ / fvar(ψ) ∪ fvar(π); I (Qx . ϕ){ψ 7→ π} = Qy . ((ϕ{x 7→ y}){ψ 7→ π}) mit y∈ / fvar(ϕ) ∪ fvar(ψ) ∪ fvar(π), falls x ∈ fvar(ψ) ∪ fvar(π). Lemma Wenn A, v |= ψ ↔ π , dann A, v |= ϕ{ψ 7→ π} ↔ ϕ. A. Knapp, G. Schellhorn: Formale Methoden 93 Pränex-Normalform Zu jeder Formel ϕ gibt es eine quantorenfreie Formel ψ , Quantoren Q1 , . . . , Qn ∈ {∀, ∃} und Variablen x1 , . . . xn , sodaß Satz |= ϕ ↔ Q1 x1 . . . . Qn xn . ψ gilt. Beweisskizze I Ersetze Äquivalenzen durch Konjunktion von zwei Implikationen. I Schiebe Quantoren nach außen (zuerst den äußersten); mit Q3, Q4, Q18–Q25 (rechte durch linke Seite ersetzen). I Wenn das nicht geht, weil eine gebundene Variable auch frei in π ist, benenne die gebundene Variable vorher um mit Q1, Q2. A. Knapp, G. Schellhorn: Formale Methoden 94 Tautologien für Gleichheit Sei x ∈ / var(t0 ). E1. E2. E3. E4. E5. E6. E7. E8. E9. E10. E11. t=t t1 = t2 → t2 = t1 t1 = t2 ∧ t2 = t3 → t1 = t3 t1 = u1 ∧ . . . ∧ tn = un → f (t1 , . . . , tn ) = f (u1 , . . . , un ) t1 = u1 ∧ . . . ∧ tn = un → (p(t1 , . . . , tn ) ↔ p(u1 , . . . , un )) t = u → s{x 7→ t} = s{x 7→ u} t = u → ϕ{x 7→ t} ↔ ϕ{x 7→ u} ∃x . x = t (∃x . x = t0 ∧ ϕ) ↔ ϕ{x 7→ t0 } (∀x . x = t0 → ϕ) ↔ ϕ{x 7→ t0 } (∀x . x 6= t0 ∨ ϕ) ↔ ϕ{x 7→ t0 } A. Knapp, G. Schellhorn: Formale Methoden Reflexivität Symmetrie Transitivität Kongruenz für f Kongruenz für p Einsetzung in Term s Einsetzung in Formel ϕ nichtleere Trägermengen Beseitigung Existenzquantor Beseitigung Allquantor Beseitigung Allquantor 95 Sequenzen Wie in der Aussagenlogik ist eine Sequenz eine Kurzschreibweise für eine Formel: A, v |= Γ ⇒ ∆ ⇐⇒ A, v |= V Γ→ W ∆ Definition Eine Algebra A ist ein Modell einer Sequenz Γ ⇒ ∆, V W geschrieben als A |= Γ ⇒ ∆, falls A |= cl∀ ( Γ → ∆). A. Knapp, G. Schellhorn: Formale Methoden 96 Regeln des Sequenzenkalküls PL I Regeln des aussagenlogischen Sequenzenkalküls werden übernommen. I Zusätzlich je eine Regel für Quantor und Gleichheit links und rechts. (L∀) (L∃) (Refl) ϕ{x 7→ t}, ∀x . ϕ, Γ ⇒ ∆ ∀x . ϕ, Γ ⇒ ∆ ϕ{x 7→ y}, Γ ⇒ ∆ ∃x . ϕ, Γ ⇒ ∆ (1) Γ ⇒ t = t, ∆ (R∃) (R∀) (Eq) Γ ⇒ ϕ{x 7→ t}, ∃x . ϕ, ∆ Γ ⇒ ∃x . ϕ, ∆ Γ ⇒ ϕ{x 7→ y}, ∆ Γ ⇒ ∀x . ϕ, ∆ (1) x = t, Γ{x 7→ t} ⇒ ∆{x 7→ t} x = t, Γ ⇒ ∆ (2) (1) y ∈ / (fvar(ϕ) \ {x}) ∪ fvar(Γ) ∪ fvar(∆) (2) auch mit t = x statt x = t A. Knapp, G. Schellhorn: Formale Methoden 97 Ableitbarkeit, Korrektheit, Invertierbarkeit Definition Eine Sequenz Γ ⇒ ∆ ist aus einer Menge von Formlen Φ ableitbar, geschrieben als Φ `PL Γ ⇒ ∆, falls es einen mit den Regeln von PL gebildeten Beweisbaum mit Konklusion Γ ⇒ ∆ und Prämissen der Form ⇒ ϕ mit ϕ ∈ Φ gibt. Satz Für einen Baum mit Konklusion Γ ⇒ ∆ und Prämissen Γ1 ⇒ ∆1 , . . . Γn ⇒ ∆n gilt: I Γ1 ⇒ ∆1 , . . . Γn ⇒ ∆n |= Γ ⇒ ∆ (Korrektheit) I Wenn Φ `PL Γ ⇒ ∆, dann Φ |= Γ ⇒ ∆ (Korrektheit von PL). I Falls keine Abschwächung vorkommt, gilt für jedes 1 ≤ i ≤ n, daß Γ ⇒ ∆ |= Γi ⇒ ∆i (Invertierbarkeit). Beweisskizze Wie für AL: Behauptung gilt für jede Regel, Induktion über die Anzahl der angewandten Regeln A. Knapp, G. Schellhorn: Formale Methoden 98 Ableitbarkeit in PL: Beispiel (1) Ableitung für die Sequenz ⇒ (∃x . ∀y . ϕ) → ∀y . ∃x . ϕ (Q15) (A) (ϕ{x 7→ z}){y 7→ w}, ∀y . ϕ1 ⇒ (ϕ{y 7→ w}){x 7→ z}, ∃x . ϕ2 (R∃) (ϕ{x 7→ z}){y 7→ w}, ∀y . ϕ{x 7→ z} ⇒ ∃x . ϕ{y 7→ w} (L∀) ∀y . ϕ{x 7→ z} ⇒ ∃x . ϕ{y 7→ w} = (∀y . ϕ){x 7→ z} ⇒ (∃x . ϕ){y 7→ w} (R∀) (∀y . ϕ){x 7→ z} ⇒ ∀y . ∃x . ϕ (L∃) ∃x . ∀y . ϕ ⇒ ∀y . ∃x . ϕ (R→) ⇒ (∃x . ∀y . ϕ) → ∀y . ∃x . ϕ wobei w, z ∈ / fvar(ϕ), ϕ1 = ϕ{x 7→ z}, ϕ2 = ϕ{y 7→ w} A. Knapp, G. Schellhorn: Formale Methoden 99 Ableitbarkeit in PL: Beispiel (2) Ableitung für die Sequenz ⇒ ∀x, y, z . x = y ∧ x = z → y = z (A) x = y, y = z ⇒ y = z (Eq) x = y, x = z ⇒ y = z (L∧) x=y∧x=z⇒y=z (R→) ⇒x=y∧x=z→y=z (R∀) ⇒ ∀z . x = y ∧ x = z → y = z (R∀) ⇒ ∀y, z . x = y ∧ x = z → y = z (R∀) ⇒ ∀x, y, z . x = y ∧ x = z → y = z A. Knapp, G. Schellhorn: Formale Methoden 100 Ableitbarkeit in PL: Beispiel (3) Ableitung für die Sequenz ⇒ ∀e . (∀x . x · e = x) → e = 1 aus ΦGrp (A) [. . .] e = 1, 1 · e = e, 1 · e = 1 ⇒ e = 1 (L→) 1 · e = e ∧ 1 · e = 1 → e = 1, 1 · e = e, 1 · e = 1 ⇒ e = 1 3 × (L∀) ∀x, y, z . x = y ∧ x = z → y = z, 1 · e = e, 1 · e = 1 ⇒ e = 1 (Lem2) 1 · e = e, 1 · e = 1 ⇒ e = 1 (L∀) ∀x . 1 · x = x, 1 · e = 1 ⇒ e = 1 (Lem1) 1·e=1⇒e=1 (L∀) ∀x . x · e = x ⇒ e = 1 (R→) ⇒ (∀x . x · e = x) → e = 1 (R∀) ⇒ ∀e . (∀x . x · e = x) → e = 1 I (Lem1): (Cut) für ∀x . 1 · x = x aus ΦGrp I (Lem2): (Cut) für ∀x, y, z . x = y ∧ x = z → y = z A. Knapp, G. Schellhorn: Formale Methoden 101 Beweisen mit Prädikatenlogik in KIV Bisher: Basis-PL-Kalkül (mit “use basic rules”); in Zukunft KIV-Kalkül: alles was im Basiskalkül umständlich mit mehreren Schritten gemacht werden muss, wird in natürliche Schritte zusammengefasst: I Regeln zur Verwendung von Lemmata, d. h. anderer (schon bewiesener) Theoreme oder Axiome (statt nur cut-Regel) I Gleichungseinsetzen für beliebige Gleichungen t = u I Gleichungseinsetzen an speziellen Positionen (statt überall) I Gleichungseinsetzen und (L∀), (R∃) mit “discard” I Fallunterscheidungsregel (“case distinction”) faßt alle aussagenlogischen Regeln mit zwei Prämissen zusammen ((L∨), (L→),(L↔), (R∧),(R↔)) I Regel “prop simplification”, um AL-Regeln mit einer Prämisse anzuwenden, wird aber normalerweise nicht verwendet I stattdessen: Simplifier-Regel A. Knapp, G. Schellhorn: Formale Methoden 102 Der Simplifier in KIV KIV-Simplifier macht viele Vereinfachungen automatisch I wendet aussagenlogische Regeln mit weniger als zwei Prämissen an, ausserdem (Refl) I wendet (R∀), (L∃) an I wendet kontextabhängige Substitutionen (wie etwa A, Γ{A 7→ true} ⇒ ∆{A 7→ true}/A, Γ ⇒ ∆) an I setzt x = t mit x ∈ / var(t) ein und entfernt x = t setzt Gleichungen u = t ein, falls t einfacher“ als u ” I Weglassen überflüssiger Quantoren mit (Q16–Q23), (E9–E11) I I Rewriting: Umschreiben von Gleichungen mit gegebenen Theoremen durch automatischem insert rewrite lemma mit Theoremen (später) KIV macht nach jeder Regelanwendung einen Test, ob der KIV-Simplifier Prämissen schliessen kann. Wenn ja, bekommt man diese Prämissen nicht zu sehen (abstellbar mit der Option “no automatic predtest”). A. Knapp, G. Schellhorn: Formale Methoden 103 KIV-Kalkül: Allgemeines Einsetzen von Gleichungen Allgemeine Substitution aus t = u, Γ{x 7→ u} ⇒ ∆{x 7→ u} `PL t = u, Γ{x 7→ t} ⇒ ∆{x 7→ t} I x markiert“ die Ersetzungsstellen ” Im KIV-Kalkül deshalb als (Eq) die Regel (insert equation) t = u, Γ{x 7→ u} ⇒ ∆{x 7→ u} t = u, Γ{x 7→ t} ⇒ ∆{x 7→ t} Beispiel: e = 1 · e, 1 = 1 · e ⇒ 1 = 1 · e (insert equation) e = 1 · e, 1 = 1 · e ⇒ 1 = e wegen (1 = e) ≡ (1 = x){x 7→ e} und (1 = 1 · e) ≡ (1 = x){x 7→ 1 · e} A. Knapp, G. Schellhorn: Formale Methoden 104 KIV-Kalkül: Lemmaanwendung Anwendung von Axiomen mit (Cut), (L∀) und evtl. (insert equation) oft umständlich Im KIV-Kalkül spezielle Regel (insert lemma) Γ0 ⇒ ∆0 Γ ⇒ ( V Γ0 )θ, ∆ ( W ∆0 )θ, Γ ⇒ ∆ Γ⇒∆ I Γ0 ⇒ ∆0 ist das Lemma (Axiom oder anderes Theorem) I θ ist eine Substitution für die freien Variablen des Lemmas Beispiel: Lemma x = y, x = z ⇒ y = z x = y, x = z ⇒ y = z 1 · e = e, 1 · e = 1 ⇒ 1 · e = e ∧ 1 · e = 1, e = 1 e = 1, 1 · e = e, 1 · e = 1 ⇒ e = 1 (insert lemma) 1 · e = e, 1 · e = 1 ⇒ e = 1 mit θ = {x 7→ 1 · e, y 7→ e, z 7→ 1} A. Knapp, G. Schellhorn: Formale Methoden 105 KIV-Kalkül: Ersetzungslemmata (insert rewrite lemma) Γ0 ⇒ ϕ → t = u Γ ⇒ ( V Γ0 ∧ ϕ)θ, ∆ Γ00 ⇒ ∆00 Γ⇒∆ I Γ0 ⇒ ϕ → t = u ist das Lemma (Γ0 und Vorbedingung ϕ dürfen fehlen) I θ ist eine Substitution für die freien Variables des Lemmas I Γ00 ` ∆00 entsteht aus Γ ` ∆ durch Ersetzen von tθ durch uθ I Lemmata der Form Γ0 ⇒ ϕ → (ψ ↔ π) mit ψ Literal erlaubt: Dann wird ψθ durch πθ ersetzt A. Knapp, G. Schellhorn: Formale Methoden 106 Deduktionstheorem Φ ∪ {ϕ} `PL ⇒ ψ gdw. Φ `PL cl∀ (ϕ) ⇒ ψ gdw. Φ `PL ⇒ cl∀ (ϕ) → ψ Satz Beweisskizze Obere Äquivalenz wie für Aussagenlogik mit zwei Zusätzen: ⇒“ muß cl∀ (ϕ) (nicht nur ϕ) in jedem Antezedent addiert werden. ” I Damit bleiben bei (R∀) und (L∃) die Variablenbedingungen gültig. I Prämissen cl∀ (ϕ) ⇒ ϕ können mit (L∀) geschlossen werden. I Für ⇐“ braucht man (Cut) mit ⇒ cl∀ (ϕ) (für das Axiom ϕ). I Die Prämisse ⇒ cl∀ (ϕ), ψ kann mit (Weak), dann (R∀) zum Axiom ϕ I Bei ” reduziert werden. A. Knapp, G. Schellhorn: Formale Methoden 107 Konsistenzlemma Definition Lemma Modell. Eine Menge Φ von Formeln heißt konsistent, falls Φ 6`PL ⇒. Jede konsistente Menge prädikatenlogischer Formeln hat ein Ohne Beweis (Kurt Gödel 1929) A. Knapp, G. Schellhorn: Formale Methoden 108 Vollständigkeitssatz Satz Für eine Formel ϕ und eine Formelmenge Φ gilt Φ |= ϕ ⇒ Φ `PL ⇒ ϕ Beweisskizze ⇔ ⇒ ⇔ ⇒ Φ |= ϕ Φ ∪ {¬ cl∀ (ϕ)} hat kein Modell Φ ∪ {¬ cl∀ (ϕ)} `PL ⇒ Φ `PL ⇒ cl∀ (ϕ) Φ `PL ⇒ ϕ (Def. Φ |= ϕ) (Konsistenzlemma) (Deduktionstheorem) (mit Regel (R∀)) Intuition: Korrektheit und Vollständigkeit von PL garantieren, daß Berechnungen im Kalkül“ genau die Theoreme ergeben, die in allen ” Datenstrukturen der Axiome gelten. A. Knapp, G. Schellhorn: Formale Methoden 109 Endlichkeitssatz Satz Eine Menge von Formeln Φ hat genau dann ein Modell, wenn jede endliche Teilmenge von Φ ein Modell hat. Beweisskizze ist. Für ⇐“: Nach Konsistenzlemma reicht es zu zeigen, daß Φ konsistent ” I Angenommen, Φ wäre inkonsistent. I Dann gibt es einen Beweis für die leere Sequenz (false). I Der Beweis verwendet nur endliche viele Axiome. I Somit ist schon diese endliche Menge inkonsistent und hat kein Modell, im Widerspruch zur Annahme. A. Knapp, G. Schellhorn: Formale Methoden 110 Unentscheidbarkeit der Prädikatenlogik Satz Es gibt kein Entscheidungsverfahren für die Allgemeingültigkeit von prädikatenlogischen Formeln. Ohne Beweis (Alonzo Church 1936) Zählt man alle Beweise des Sequenzenkalküls auf, so wird darin jede allgemeingültige Formel irgendwann vorkommen, aber das Verfahren kann nicht so verschärft werden, daß es auch für alle nicht allgemeingültigen Formeln immer abbricht. Somit ist Prädikatenlogik schwierig“ im Gegensatz zur Aussagenlogik, für die ” der Sequenzenkalkül ein Entscheidungsverfahren ist. Das Problem bei PL liegt bei der Frage, welche Terme t man bei den Regeln (L∀) und (R∃) wählen soll. A. Knapp, G. Schellhorn: Formale Methoden 111 Zusammenfassung I Prädikatenlogik I I I I Sequenzenkalkül PL I I I Syntax: Signaturen, Terme, Formeln Semantik: Algebren Modelle, Folgerbarkeit, Erfüllbarkeit Korrektheit und Vollständigkeit Beweisen in KIV Unentscheidbarkeit der Prädikatenlogik A. Knapp, G. Schellhorn: Formale Methoden 112 Semantische Beschreibung von Softwaresystemen Operationale Sicht I Semantischer Bereich: Zustandsübergangssysteme (Automaten) I Zustände, Zustandsübergänge, Abläufe Algebraische Sicht I Semantischer Bereich: Algebren I Datentypen mit Sorten und Operationen A. Knapp, G. Schellhorn: Formale Methoden 113 Algebraische Sicht: Automaten specification sorts state; predicates trans : state × state; initial : state; final : state; end specification Abläufe eines Automaten als Folgen [s1 , . . . , sn ] von Zuständen initial(s1 ) ∧ final(sn ) ∧ ∀k . k < n → trans(sk , sk + 1 ) A. Knapp, G. Schellhorn: Formale Methoden 114 Algebraische Sicht: Abstrakte Syntaxbäume specification sorts prog; boolexpr; ... functions (: Konstruktoren :) mkif : boolexpr × prog × prog → prog; mkwhile : boolexpr × prog → prog; ... (: Selektoren :) test : prog → boolexpr; thenbranch : prog → prog; ... variables b : boolexpr; p1, p2 : prog; ... axioms test(mkif(b, p1, p2)) = b; thenbranch(mkif(b, p1, p2)) = p1; ... end specification A. Knapp, G. Schellhorn: Formale Methoden 115 Algebraische Sicht: Syntax und Semantik Syntax und semantische Bereiche als Datentypen beschreibbar Relation zwischen Syntax und semantischen Bereichen als Abbildung I sem : prog → set(trace) I Semantik von Programmier- und Spezifikationssprachen A. Knapp, G. Schellhorn: Formale Methoden 116 Algebraische Spezifikationen Ziel: Festlegung eines bestimmten Datentyps (Algebra) I Welche Operationen? I Welche Axiome? I Welche Datentypen können überhaupt spezifizieren werden? I Sind alle wahren Aussagen über dem Datentyp beweisbar? A. Knapp, G. Schellhorn: Formale Methoden 117 Einfache Spezifikationen Definition Eine einfache Spezifikation Sp = (Σ, X, Ax) besteht aus einer Signatur Σ, einer Variablenmenge X für Σ und einer entscheidbaren Menge von Axiomen Ax ⊆ F (Σ, X). I Axiomenschemata“ führen auf unendliche Mengen von Axiomen ” Eine Algebra A ist ein Modell einer einfachen Spezifikation Sp = (Σ, X, Ax), geschrieben als A |= Sp oder A ∈ Mod(Sp), falls A ∈ Alg(Σ) und A |= Ax. Definition I Lose Semantik von Sp: Modellklasse Mod(Sp) Eine Formel ϕ ∈ F (Σ, X) folgt aus einer einfachen Spezifikation Sp = (Σ, X, Ax), geschrieben als Sp |= ϕ, falls für alle M ∈ Mod(Sp) gilt: M |= ϕ. Definition A. Knapp, G. Schellhorn: Formale Methoden 118 Einfache Spezifikationen: Beispiel Bool = specification sorts bool; constants tt, ff : bool; variables b : bool; axioms ax1: tt 6= ff; ax2: b = tt ∨ b = ff; end specification I B ∈ Mod(Bool) mit ttB = tt, ffB = ff I Mod(Bool) = {B}? A. Knapp, G. Schellhorn: Formale Methoden 119 Homomorphismen Sei Σ = (S, F, P) eine Signatur. Für zwei Algebren A, B ∈ Alg(Σ) ist ein Σ-Homomorphismus h : A → B eine Familie von Abbildungen (hs )s∈S mit Definition I hs : As → Bs I Für jedes f : s1 . . . sn → s ∈ F gilt hs (f A (a1 , . . . , an )) = f B (hs1 (a1 ), . . . , hsn (an )) . I Für jedes p : s1 . . . sn ∈ P gilt: (a1 , . . . , an ) ∈ pA ⇐⇒ (hs1 (a1 ), . . . , hsn (an )) ∈ pB . I Ein Σ-Homomorphismus ist eine Familie von Abbildungen zwischen den Trägermengen zweier Algebren, die mit den Funktions- und Prädikatsymbolen verträglich ist. I Verallgemeinerung von Homomorphismen für Gruppen, Ringe &c. A. Knapp, G. Schellhorn: Formale Methoden 120 Isomorphismus, Monomorphie Definition Ein Σ-Homomorphismus (hs )s∈S ist ein Σ-Isomorphismus, falls alle hs bijektiv sind. Zwei Σ-Algebren A, B heißen isomorph, geschrieben als A ∼ = B , falls ein Σ-Isomorphismus h : A → B existiert. I Ein Isomorphismus h : A → B benennt die Elemente von A in die Elemente von B um. Definition Eine Spezifikation Sp ist monomorph, wenn für alle A, B ∈ Mod(Sp) gilt: A ∼ = B. A. Knapp, G. Schellhorn: Formale Methoden 121 Monomorphie: Beispiel Die Spezifikation Bool spezifiziert B bis auf Isomorphie. Beweisskizze Sei A ∈ Mod(Bool). I Dann enthält Abool die Elemente ttA und ffA (nach Definition). I Wegen A |= ax1 sind die beiden Elemente verschieden. I Wegen A |= ax2 gibt es keine weiteren Elemente in Abool . I Also folgt aus I Definiere A ∈ Mod(Bool), daß Abool = {ttA , ffA }. h : A → B durch hbool (ttA ) = tt, hbool (ffA ) = ff . I h ist mit den Funktionssymbolen (hier: Konstanten) verträglich, da ttB = tt, ffB = ff ; h ist also ein Homomorphismus. I h ist ein Isomorphismus, da injektiv und surjektiv. A. Knapp, G. Schellhorn: Formale Methoden 122 Axiomatisierung der natürlichen Zahlen Signatur ΣNat = ({Nat}, {0 : → Nat, s : Nat → Nat}, ∅) Peano-Axiome für ΣNat -Algebren A P1 0 ist kein Wert der Nachfolgerfunktion s. I A |= ∀n . s(n) 6= 0 P2 Die Nachfolgerfunktion s ist injektiv. I A |= ∀m, n . s(m) = s(n) → m = n P5 Für jede Teilmenge X von ANat gilt: Ist 0A ∈ X und ist mit n ∈ X stets sA (n) ∈ X , so ist X = ANat . I A |= ∀X . (X(0) ∧ ∀x . X(x) → X(s(x))) → ∀y . X(y) Insbesondere: N erfüllt Peano-Axiome. I 0N = 0, sN (n) = n + 1 (P5) Induktionsprinzip I ad-hoc“-Formalisierung in Prädikatenlogik zweiter Stufe ” A. Knapp, G. Schellhorn: Formale Methoden 123 Peano-Axiome: Charakterisierung der natürlichen Zahlen (1) Satz Die Peano-Axiome (P1, P2, P5) charakterisieren N bis auf Isomorphie. Sei A ein Modell von (P1), (P2) und (P5). Beweisskizze M = {T J0K A, T Js(0)K A, T Js(s(0))K A, . . . , T Jsn (0)K A, . . .} mit sn (0) für den Term s(s(. . . (0) . . .)) mit n Vorkommen von s I Setze I I Dann gilt I Setze M ⊆ ANat und aus (P5) folgt, daß M = ANat . h : N → A mit hNat (n) = T Jsn (0)K A. I Dann ist h ein Homomorphismus, da 0N = 0, T Jsn (0)K N = n. I Weiters ist hNat surjektiv, da A. Knapp, G. Schellhorn: Formale Methoden ANat = {T Jsn (0)K A | n ∈ N}. 124 Peano-Axiome: Charakterisierung der natürlichen Zahlen (2) Beweisskizze I (Forts.) hNat ist auch injektiv, d. h. m 6= n ⇒ T Jsm (0)K A = 6 T Jsn (0)K A für alle m, n ∈ N, durch Induktion über m: I Für m = 0: direkt mit (P1). I Schluß von I I m auf m + 1: Induktionshypothese: Für alle n ∈ N gilt: m 6= n ⇒ T Jsm (0)K A = 6 T Jsn (0)K A. Zu zeigen: Für alle n ∈ N gilt: m + 1 6= n ⇒ T Jsm+1 (0)K A = 6 T Jsn (0)K A. I Für n = 0 ebenfalls direkt mit (P1). I Für n 6= 0, ist n = n0 + 1 für ein n0 ∈ N. I Da m + 1 6= n, ist m 6= n0 . I Induktionshypothese mit n0 für I Mit (P2) folgt die Behauptung. A. Knapp, G. Schellhorn: Formale Methoden 0 n liefert: T Jsm (0)K A = 6 T Jsn (0)K A. 125 Ausdrucksschwäche der Prädikatenlogik (1) Satz Es gibt keine einfache Spezifikation Sp = (Σ, X, Ax) mit Sorte Nat und Funktionssymbolen 0 : Nat, s : Nat → Nat in Σ, die bis auf Isomorphie als einziges Modell die natürlichen Zahlen hat. I Satz von Thoralf Skolem (1934) I Prädikatenlogische Axiome können nicht ausdrücken, daß es neben den echten“ natürlichen Zahlen keine weiteren Zahlen gibt. ” A. Knapp, G. Schellhorn: Formale Methoden 126 Ausdrucksschwäche der Prädikatenlogik (2) Habe Sp die natürlichen Zahlen als Modell: N |= Ax Beweisskizze I Erweitere Σ um neue Konstante c : Nat zu Σ0 . I Dann gilt für alle (Σ0 , X, Ax) |= ϕ. I Setze ϕ ∈ F (Σ, X), daß (Σ, X, Ax) |= ϕ genau dann, wenn Ax0 = Ax ∪ {c 6= 0, c 6= s(0), . . .}. I Jede endliche Teilmenge von I Aus Endlichkeitssatz folgt: I Ax0 hat N (für geeignetes cN ) als Modell. Ax0 hat ein Modell A0 . 0 A0 muß ein Element a = cA enthalten, das ungleich T Jsn (0)K A für alle n ∈ N ist. I Somit ist A0 betrachtet über Σ ein Modell von Ax, das nicht isomorph zu N ist. A. Knapp, G. Schellhorn: Formale Methoden 127 Ausdrucksschwäche der Prädikatenlogik (3) Prädikatenlogik kann nicht ausdrücken, daß es außer den Zahlen 0, 1, 2, . . . (d. h. den aus 0 und s gebildeten Termen 0, s(0), s(s(0)), . . . ) keine weiteren Elemente gibt. Dasselbe Problem gibt es auch für andere Datentypen: I I Alle ganzen Zahlen sind mit 0, +1, −1 gebildet. Alle Listen sind die aus [] und + gebildeten Terme: [], a + [], a + b + [], . . . I Terme dürfen Elementvariablen enthalten I Alle (endlichen) Graphen bekommt man aus dem leeren Graphen ∅ durch Addieren von Knoten mit addnode und Kanten mit addedge. I Alle Arrays bekommt man durch mkarray(n) (erzeugt Array der Größe n) und put(a, i, d) (schreibt an Position i das Datum d). Gemeinsame Idee: Alle Datenelemente durch endlich-malige Anwendung von Konstruktoren bildbar. A. Knapp, G. Schellhorn: Formale Methoden 128 Generiertheitsklauseln Spezialaxiome für: Daten eines Datentyps sind genau die mit bestimmten Konstruktoren gebildeten Terme. Definition Eine Generiertheitsklausel shCi für eine Signatur Σ = (S, F, P) besteht aus einer Sorte s ∈ S und einer endlichen Menge von Konstruktoren C ⊆ F , wobei die Ergebnissorte jedes f ∈ C die Sorte s ist und für wenigstens ein f ∈ C alle Argumentsorten ungleich s sind. Die Menge aller Generiertheitsklauseln für ein Σ wird mit G (Σ) bezeichnet. Ein Konstruktorterm t hat die Sorte s, ist mit Konstruktoren gebildet und enthält nur Variablen anderer Sorten, ist also aus T ((S, C, ∅), X \ Xs )s . Beispiel: Listen I Generiertheitsklausel Listh{[], +}i I Konstruktorterme [], x + y + [] für x, y ∈ XElt A. Knapp, G. Schellhorn: Formale Methoden 129 Generiertheitsklauseln: Semantik Jedes Element der generierten Sorte ist der Wert eines Konstruktorterms, wenn man die Parametervariablen geeignet belegt. Definition Eine Generiertheitsklausel shCi gilt über einer Algebra A, geschrieben als A |= shCi, wenn es für jedes a ∈ As eine Belegung v und einen Konstruktorterm t ∈ T ((S, C, ∅), X \ Xs )s mit a = T JtK A v gibt. Beispiel: Liste über den natürlichen Zahlen [2, 5] I Konstruktorterm x + y + [] I Belegung v der Variablen x, y als v(x) = 2 und v(y) = 5 I Dann: T Jx + y + []K AList(Nat) v = [2, 5]. A. Knapp, G. Schellhorn: Formale Methoden 130 Elementare Spezifikationen Definition Eine elementare Spezifikation Sp = (Σ, X, Ax, Gen) besteht aus einer Signatur Σ, einer Variablenmenge für Σ, einer entscheidbaren Menge Ax ⊆ F (Σ, X) von Axiomen und einer Menge Gen ⊆ G (Σ) von Generiertheitsklauseln. Eine Algebra A ist ein Modell einer elementaren Spezifikation Sp = (Σ, X, Ax, Gen), geschrieben als A |= Sp oder A ∈ Mod(Sp), falls A ∈ Alg(Σ), A |= Ax und A |= Gen. Definition Definition Eine Formel ϕ ∈ F (Σ, X) folgt aus einer elementaren Spezifikation Sp = (Σ, X, Ax, Gen), geschrieben als Sp |= ϕ, falls für alle M ∈ Mod(Sp) gilt: M |= ϕ. A. Knapp, G. Schellhorn: Formale Methoden 131 Basis-Spezifikation der natürlichen Zahlen I In KIV: induction s generated by C für shCi Nat-basic = specification sorts nat; constants 0 : nat; functions . +1 : nat → nat; induction nat generated by 0, +1; variables m, n : nat; axioms P1: 0 6= n +1; P2: m +1 = n +1 ↔ m = n; end specification Satz Nat-basic ist konsistent und monomorph für N. Beweisskizze Analog zum Beweis, daß die Peano-Axiome monomorph sind: Die Generiertheitsklausel garantiert (anstelle von (P5)) für jedes Modell A, daß ANat = {T J0K A, T Js(0)K A, T Js(s(0))K A, . . . , T Jsn (0)K A, . . . }. A. Knapp, G. Schellhorn: Formale Methoden 132 Spezifikation der natürlichen Zahlen Nat = specification sorts nat; constants 0 : nat; functions . +1 : nat → nat; . + . : nat × nat → nat; (: prio 9 left :) . ∗ . : nat × nat → nat prio 10 left; induction nat generated by 0, +1; variables m, n : nat; axioms P1: 0 6= n +1; P2: m +1 = n +1 ↔ m = n; P3a: m + 0 = m; P3b: m + n +1 = (m + n) +1; P4a: m ∗ 0 = 0; P4b: m ∗ n +1 = m ∗ n + m; end specification Satz Nat ist konsistent und monomorph für N. Beweisskizze Die Definitionen von + und ∗ folgen einem strukturellem Rekursionsschema; ein solches Schema definiert immer genau eine Funktion. A. Knapp, G. Schellhorn: Formale Methoden 133 Basis-Spezifikation von Listen List-basic = specification sorts elem; list; constants [] : list; functions . + . : elem × list → list; induction list generated by [], +; variables a, b : elem; variables x, y : list; axioms [] 6= a + x; a + x = b + y ↔ a = b ∧ x = y; end specification Satz List-basic ist konsistent. Die Spezifikation ist nicht monomorph, aber jedes Modell A ist isomorph zur Algebra der Listen mit Elementen aus Aelem . I Monomorphie modulo der Elemente“ ” A. Knapp, G. Schellhorn: Formale Methoden 134 Induktionsprinzip aus Generiertheitsklauseln: Beispiele (1) Generiertheitsklausel sh{c : s, f : s → s}i I Jedes Element der Trägermenge darstellbar als Konstruktorterm f(f(. . . f(c))) I Intuition: wie natürliche Zahlen (ohne (P1), (P2)) Induktionsformeln ϕ{x 7→ c} ∧ (∀x . ϕ → ϕ{x 7→ f(x)}) → ∀x . ϕ Induktionsregel Γ{x 7→ c} ⇒ ∆{x 7→ c} IH, Γ{x 7→ f(x)} ⇒ ∆{x 7→ f(x)} Γ⇒∆ mit IH = ∀~y . V Γ→ W A. Knapp, G. Schellhorn: Formale Methoden ∆, ~y = fvar(Γ ⇒ ∆) \ {x} 135 Induktionsprinzip aus Generiertheitsklauseln: Beispiele (2) Generiertheitsklausel sh{c : s, g : s0 s s → s}i I Konstruktorterme: c, g(y, c, c), g(y0 , g(y1 , c, c), g(y2 , c, c)), . . . I Intuition: wenn alle Terme verschieden, Binärbäume mit Blättern c und inneren Knoten g (mit Inhalt aus s0 ) I Die Terme müssen nicht alle verschieden sein: Auch endliche Mengen mit cA = ∅, gA (y, m0 , m1 ) = {y} ∪ m0 ∪ m1 mögliche Algebra Induktionsformeln ϕ{x 7→ c} ∧ (∀x1 , x2 . ϕ{x 7→ x1 } ∧ ϕ{x 7→ x2 } → ϕ{x 7→ g(y, x1 , x2 )}) → ∀x . ϕ Induktionsregel Γ{x 7→ c} ⇒ ∆{x 7→ c} IH1 , IH2 , Γ{x 7→ g(y, x1 , x2 )} ⇒ ∆{x 7→ g(y, x1 , x2 )} Γ⇒∆ mit IHi = ∀~y . V Γ{x 7→ xi } → A. Knapp, G. Schellhorn: Formale Methoden W ∆{x 7→ xi } für i ∈ {1, 2}, ~y = fvar(Γ ⇒ ∆) \ {x} 136 Regel der strukturellen Induktion Für Generiertheitsklausel sh{f1 , . . . , fn }i strukturelle Induktionsregel IH1 , Γ1 ⇒ ∆1 IHn , Γn ⇒ ∆n ... Γ⇒∆ mit I Pro Konstruktor fi : s1 . . . sk → s ∈ C eine Prämisse Γi ⇒ ∆i = Γ{x 7→ fi (x1 , . . . , xk )} ⇒ ∆{x 7→ fi (x1 , . . . , xk )} I I Die Variablen x1 , . . . , xk sind dabei neue Argumentvariablen. Pro Konstruktor fi : s1 . . . sk → s ∈ C eine Induktionshypothese IHi = V sj =s IH{x 7→ xj } für genau die Argumente xj , deren Sorte s ist; wobei IH = ∀~y. V Γ→ A. Knapp, G. Schellhorn: Formale Methoden W ∆ mit ~y = fvar(Γ ⇒ ∆) \ {x} 137 Kalkül mit struktureller Induktion Definition Eine Sequenz Γ ⇒ ∆ ist aus einer elementaren Spezifikation Sp induktiv ableitbar, geschrieben als Sp `IND Γ ⇒ ∆, wenn sie aus den Axiomen und den Generiertheitsklauseln von Sp durch Anwendung des Sequenzenkalküls und der Regel der strukturellen Induktion ableitbar ist. Satz Die Induktionsregel ist korrekt für jede Algebra, die die entsprechende Generiertheitsklausel erfüllt. Insbesondere gilt Sp `IND Γ ⇒ ∆ ⇒ Sp |= Γ ⇒ ∆ Der Kalkül ist nicht vollständig. A. Knapp, G. Schellhorn: Formale Methoden 138 Wechselseitig rekursive Konstruktoren Beispiel: Bäume mit endlich vielen Prämissen I Konstruktor für Bäume: mktree : Node Treelist → Tree I Konstruktoren für Baumlisten: [] : Treelist (leere Liste) + : Tree Treelist → Treelist (Element vorne an Liste anhängen) I Konstruktorterme aus T (({Node, Tree, Treelist}, {mktree, [], +}, ∅), XNode )Tree bzw. T (({Node, Tree, Treelist}, {mktree, [], +}, ∅), XNode )Treelist sollen alle Bäume bzw. Baumlisten beschreiben. I Zwei einzelne Generiertheitsklauseln Treeh{mktree}i und Treelisth{[], +}i würden Graphen erlauben, z. B. t = mktree(n, tl), tl = t + [] Ähnlich in Programmiersprachen: Ausdrücke und Listen von Ausdrücken; Anweisungen und Blöcke A. Knapp, G. Schellhorn: Formale Methoden 139 Allgemeine Generiertheitsklauseln Eine allgemeine Generiertheitsklausel GhCi für eine Signatur Σ = (S, F, P) besteht aus einer Menge von Sorten G ⊆ S und einer endlichen Menge von Konstruktoren C ⊆ F , wobei die Ergebnissorte jedes f ∈ C eine Sorte in G ist und für wenigstens ein f ∈ C alle Argumentsorten nicht aus G Definition sind. Ein Konstruktorterm t hat eine Sorte aus G, ist mit Konstruktoren gebildet und enthält nur Variablen von Sorten nicht aus G, ist also aus S T ((S, C, ∅), X \ g∈G Xg )s für ein Sorte s ∈ G. Definition Eine allgemeine Generiertheitsklausel GhCi gilt über einer Algebra A, geschrieben als A |= GhCi, wenn es für jedes s ∈ G und jedes a ∈ As eine BelegungSv und einen Konstruktorterm t ∈ T ((S, C, ∅), X \ g∈G Xg )s mit a = T JtK A v gibt. Beispiel: Bäume mit endlichen vielen Prämissen I Generiertheitsklausel {Tree, Treelist}h{mktree, +, []}i A. Knapp, G. Schellhorn: Formale Methoden 140 Allgemeine Generiertheitsklauseln: Induktion Beispiel: Bäume mit endlich vielen Prämissen I Jetzt zwei Induktionsbehauptungen ϕ für Bäume und ψ für Baumlisten. Induktionsregel ⇒ ψ{tl 7→ []} ϕ, ψ ⇒ ψ{tl 7→ t + tl} ψ ⇒ ϕ{t 7→ mktree(n, tl)} ⇒ ∀t . ϕ ∧ ∀tl . ψ A. Knapp, G. Schellhorn: Formale Methoden 141 Strukturell-rekursive Definitionen von Funktionen Dem Induktionsprinzip entspricht die Definition durch strukturelle Rekursion. Beispiel: Definition von + und ∗ über den natürlichen Zahlen (mit Nath{0, s}i) plus-base: m + 0 = m plus-rec: m + s(n) = s(m + n) mult-base: m ∗ 0 = 0 mult-rec: m ∗ s(n) = m ∗ n + m Axiome folgen dem strukturellen Rekursionsschema I f -base: f (~y, 0) = t; f -rec: f (~y, s(n)) = t0 I rekursive Position nicht notwendig an letzter Stelle I An rekursiver Position Konstruktor mit Argumentvariablen: 0 bzw. s(n) I Variablen ~y ∪ {n} paarweise verschieden I var(t) ⊆ ~y und t enthält kein Vorkommen von f I var(t0 ) ⊆ ~y ∪ {n} und t0 enthält nur Aufrufe von f (~u, n) mit Termen ~u A. Knapp, G. Schellhorn: Formale Methoden 142 Strukturelle Rekursion und Induktion I Sei f durch strukturelle Rekursion definiert f -base: f (~y, 0) = t f -rec: f (~y, s(n)) = t0 I Gegeben sei eine Behauptung ϕ, in der ein Term f (~u, x) vorkommt (mit beliebigen Termen ~u). I Dann ergibt Induktion über x zwei Prämissen: ϕ{x 7→ 0}, ϕ{x 7→ s(x)}; auf die erste ist f -base, auf die zweite f -rec anwendbar. I In KIV: Häufig f -base und f -rec Simplifierregeln I Generelles Vorgehen für induktive Beweise I I I I Suche Variable, die nur an rekursiven Positionen eines f vorkommt. Induziere über diese Variable, wende jeweils passendes Axiom an. Umgekehrt: Induktion über Variable, die an keiner rekursiver Position vorkommt, nicht sinnvoll Schwieriger: gemischte Fälle (häufig Lemmas, Verallgemeinerung &c.) A. Knapp, G. Schellhorn: Formale Methoden 143 Strukturell-rekursive Definition von Prädikaten Beispiel: Definition von even und grt über den natürlichen Zahlen even-base: even(0) gt-base: gt(0, m) ↔ false even-rec: even(s(n)) ↔ ¬even(n) gt-rec: gt(s(n), m) ↔ m = n ∨ gt(n, m) Axiome folgen dem strukturellen Rekursionsschema I p-base: p(~y, 0) ↔ ϕ; p-rec: p(~y, s(n)) ↔ ϕ0 I An rekursiver Position Konstruktor mit Argumentvariablen: 0 bzw. s(n) I rekursive Position bei gt ist die erste Stelle I Variablen ~y ∪ {n} paarweise verschieden I fvar(ϕ) ⊆ ~y und ϕ enthält kein Vorkommen von p I fvar(ϕ0 ) ⊆ ~y ∪ {n} und ϕ0 enthält nur Aufrufe von p(~u, n) mit Termen ~u A. Knapp, G. Schellhorn: Formale Methoden 144 Strukturelle Rekursion: Beispiele Listen von natürlichen Zahlen mit Listh{[] : List, + : Nat List → List}i I Definition von append : List List → List durch append-base: append([], y) = y append-rec: append(m + x, y) = m + append(x, y) I Definition von ordered : List ordered-base: ordered([]) ordered-rec: ordered(m + x) ↔ ordered(x) ∧ (x = [] ∨ ∃n, y . x = n + y ∧ m < n) I Alternativ: Umformung von ordered-rec mit x = [] ∨ ∃n, y . x = n + y zu ordered-rec1: ordered(m + []) ordered-rec2: ordered(m + n + y) ↔ m < n ∧ ordered(n + y) A. Knapp, G. Schellhorn: Formale Methoden 145 Strukturelle Rekursion mit Fallunterscheidung Listen über Nat mit Listh{[] : List, + : Nat List → List}i I Definition von remove : Nat List → List durch remove-base: remove(m, []) = [] remove-rec1: m = n → remove(m, n + x) = remove(m, x) remove-rec2: m 6= n → remove(m, n + x) = n + remove(m, x) I Alternative Formulierung von remove-rec1 remove-rec1: remove(m, m + x) = remove(m, x) Aufspaltung von Basis- oder Rekursionsfall nach Bedingungen f -rec1: ϕ1 → f (~y, n + x) = t1 ... f -reck: ϕk → f (~y, n + x) = tk I Einschränkungen für Bedingungen ϕi wie für ti I Bedingungen gegenseitig ausschließend und überdeckend ( I typisch für parameterisierte Datentypen (Listen über . . . , Bäume über . . . ) W A. Knapp, G. Schellhorn: Formale Methoden ϕi ↔ true) 146 KIV-Simplifier Beobachtung: Viele Gleichungen und Äquivalenzen dienen zur Vereinfachung I datenstrukturunabhängig: Tautologien wie ϕ ∧ ϕ ↔ ϕ I datenstrukturabhängige Regeln Beispiel: Natürliche Zahlen I ` n + 0 = n zum Ersetzen von t + 0 durch t Selbstdefinierte Simplifierregeln I markierte Axiome oder (schon bewiesene) Theoreme Für das Verständnis von KIV wichtig: Welche Simplifierregel hat welchen Effekt? A. Knapp, G. Schellhorn: Formale Methoden 147 KIV-Simplifier: Lokale und globale Regeln Zwei Klassen von Simplifierregeln I lokale Simplifierregeln werden in Beweisen über der Spezifikation, in der sie definiert sind, benutzt. I globale Simplifierregeln werden in Beweisen in Spezifikationen, die über der, in der sie definiert sind, benutzt. Pragmatik I Lokal werden Axiome als Simplifierregeln verwendet. I Global werden Theoreme verwendet, die gute“ Simplifierregeln sind. ” Eintragen von Theoremen als Simplifierregeln durch used for: s, ls; nach Sequenz in specification/sequents-Datei A. Knapp, G. Schellhorn: Formale Methoden 148 KIV-Simplifier: Typen von Simplifierregeln Termersetzungsregel (Rewriteregel) I Form: Γ ` ϕ → (t = u) I Effekt: (Instanzen von) t durch u ersetzen Formelersetzungsregel (Äquivalenzregel) I Form: Γ ` ϕ → (ψ ↔ χ) I Effekt: (Instanzen von) ψ durch χ ersetzen Assoziativität und Kommutativität I Form: ` (a + b) + c = a + (b + c) und ` a + b = b + a I Effekt: Alle anderen Regeln modulo Assoziativität und Kommutativität anwenden A. Knapp, G. Schellhorn: Formale Methoden 149 KIV-Simplifier: Pragmatik von Bedingungen (1) Rewrite- und Äquivalenzregeln haben die Form Γ ` ϕ → t = u und Γ ` ϕ → (ψ ↔ χ) Vorbedingungen Γ und ϕ: Als Formel dieselbe Bedeutung, aber unterschiedlich behandelt: I I Γ darf beliebige Formeln enthalten ϕ muß Konjunktion ϕ1 ∧ . . . ∧ ϕn von Literalen sein I Literal: evtl. negierte Gleichung oder Prädikatformel I (Instanzen von) ϕ1 , . . . , ϕn werden in der Sequenz gesucht: nicht-negierte Formeln im Antezedent, negierte im Sukzedent I Γ wird versucht, durch rekursiven Simplifieraufruf zu beweisen A. Knapp, G. Schellhorn: Formale Methoden 150 KIV-Simplifier: Pragmatik von Bedingungen (2) Wann Vorbedingungen in Γ, wann in ϕ1 , . . . , ϕn ? I Vorbedingungen vor `“ in Γ nur, ” wenn sie in sinnvollen Sequenzen immer erfüllt sind. I I sonst viele nutzlose Simplifieraufrufe Typische sinnvolle Vorbedingungen: Definiertheitsbedingungen I m −1 (Vorgänger von m) ist nur für m 6= 0 definiert I m − n ist nur für n ≤ m definiert I .rest und .last sind nur für nichtleere Listen definiert I Arrays: i < #a sollte für Zugriff a[i] immer wahr sein A. Knapp, G. Schellhorn: Formale Methoden 151 KIV-Simplifier: Beispiele zu Vorbedingungen I I n 6= 0 ` (m < n − 1 ↔ m + 1 < n) Vorbedingung im Antezedent, da 0 − 1 nicht sinnvoll ist ` m < n → (n < m + 2 ↔ m + 1 = n) Vorbedingung nicht im Antezedent, sonst, sobald Instanzen von n < m + 2 vorkommen: viele unnötige Beweisversuche für m < n I m ≤ n ` (n − m) + m = n beweist z. B. die Sequenz f(x) > 5 ` (f(x) − 3) + 3 = f(x) (da der Simplifier f(x) > 5 ` 3 ≤ f(x) beweisen kann) ` m ≤ n → (n − m) + m = n beweist die Sequenz nicht, da 3 ≤ f(x) nicht in der Sequenz vorkommt A. Knapp, G. Schellhorn: Formale Methoden 152 KIV-Simplifier: Rewrite-Regeln Γ`ϕ→t=u ersetzt (Instanzen von) t durch u, wenn Vorbedingungen gelten I fvar(ϕ) ∪ var(t) muß alle freien Variablen abdecken I t und u müssen Terme sein, t darf keine Variable sein Beispiele: I ` (m + n) − n = m I ` i > 0 → sqrt(iˆ2) = i (i Ganzzahl) I ` (s1 ∪ s2) \ s2 = s1 \ s2 (Mengen) I ` y 6= [] → append(x, y).last = y.last (Listen) A. Knapp, G. Schellhorn: Formale Methoden 153 KIV-Simplifier: Äquivalenzregeln Γ ` ϕ → (ψ ↔ χ) ersetzt (Instanzen von) ψ durch χ, wenn Vorbedingungen gelten I fvar(ϕ) ∪ fvar(ψ) muß alle freien Variablen abdecken I ψ muß Prädikat oder Gleichung sein, χ ist beliebige Formel I Vereinfachung: falls ψ keine Gleichung, statt (ψ ↔ true) nur ψ I Vereinfachung: statt (ψ ↔ false) nur ¬ ψ Beispiele: I ` sorted([a]), #(x) = 0 ↔ x = [] (Listen) I ` m + n < m + n0 ↔ n < n0 I ` n 6= 0 ` (m < n −1 ↔ m +1 < n) A. Knapp, G. Schellhorn: Formale Methoden 154 KIV-Simplifier: Äquivalenzregeln mit Konjunktion, Disjunktion Äquivalenzregel ` a ∈ s1 ∪ s2 ↔ a ∈ s1 ∨ a ∈ s2 führt auf Γ ` a ∈ s1, a ∈ s2, ∆ Γ ` a ∈ s1 ∪ s2, ∆ Γ, a ∈ s1 ` ∆, a ∈ s2 Γ, a ∈ s2 ` ∆, a ∈ s1 Γ, a ∈ s1 ∪ s2 ` ∆, a ∈ s2 Γ, a ∈ s1 ∪ s2 ` ∆, a ∈ s1 Kein Effekt auf Γ1 , a ∈ s1 ∪ s2, Γ2 ` ∆ (wenn a ∈ s1 und a ∈ s2 nicht in ∆) I Verschachtelte aussagenlogische Ausdrücke schwer zu lesen Dasselbe, falls χ in Äquivalenzregel Γ ` ϕ → (ψ ↔ χ) eine Konjunktion (mit Antezedent und Sukzendent vertauscht); z. B. ` a ∈ s1 ∩ s2 ↔ a ∈ s1 ∧ a ∈ s2 A. Knapp, G. Schellhorn: Formale Methoden 155 KIV-Simplifier: Weitere Äquivalenzregeln I Wenn in Γ ` ϕ → (ψ ↔ χ) das χ keine Konjunktion oder Disjunktion ist, wird immer ersetzt I Deshalb: Die Regel ` a ∈ s1 ∪ s2 ↔ ¬ ¬(a ∈ s1 ∨ a ∈ s2) umgeht den Effekt der Disjunktion (nur selten verwendet) I Regel, die nur auf ψ (Prädikat oder Gleichung) im Antezedent angewandt wird: Γ ` ϕ → (¬ ¬ ψ ↔ ¬ χ) I Regel, die nur auf ψ im Sukzedent angewandt wird: Γ ` ϕ → (¬ ψ ↔ χ) A. Knapp, G. Schellhorn: Formale Methoden 156 KIV-Simplifier: Pragmatik für einseitige Regeln Verwendung von ` ϕ → ψ als Simplifierregel, wobei ϕ komplexe Formel, ψ einfache, schwächere Formel Beispiel: ` prime(n) → n > 1 I Direkte Verwendung als Simplifierregel ergibt: I Beweisziele prime(n), Γ ` n > 1, ∆ werden geschlossen I Aus Beweiszielen prime(n), n > 1, Γ ` ∆ wird n > 1 gelöscht I Letzteres ist unerwünscht, da n > 1 evtl. eine nützliche Vorbedingung ist. I Deshalb besser: ` prime(n) → (¬ n > 1 ↔ false) Beispiel: ` prime(n) ∧ n 6= 2 → ¬ even(n) I (ψ negiert) Besser: ` prime(n) ∧ n 6= 2 → (¬ ¬ even(n) ↔ false) A. Knapp, G. Schellhorn: Formale Methoden 157 KIV-Simplifier: Beispiele für Äquivalenzregeln I ` m ≤ n → (n < m ↔ false) I I I ` (s1 \ s2) \ s3 = (s1 \ s3) \ s2 ↔ true I I beweist m ≤ n, n < m, Γ ` ∆ entfernt in m ≤ n, Γ ` n < m, ∆ das n < m beweist Gleichung im Sukzedent, entfernt sie im Antezedent ` s ∩ s0 = ∅ ∧ a ∈ s → ¬ a ∈ s0 als Simplifierregel I I In Sequenz s ∩ s0 = ∅, a ∈ s ` a ∈ s0 nicht das a ∈ s0 durch false ersetzen (und damit entfernen). Nur im Antezedent auf s ∩ s0 = ∅, a ∈ s, a ∈ s0 anwenden und damit Sequenz schließen Damit besser: ` s ∩ s0 = ∅ ∧ a ∈ s → (¬ ¬ a ∈ s0 ↔ false) A. Knapp, G. Schellhorn: Formale Methoden 158 KIV-Simplifier: Kommutativität und Assoziativität I Assoziative und kommutative Operatoren: +, ·, min, ggT auf ganzen Zahlen, ∪, ∩ auf Mengen, . . . I Assoziative Operatoren: append auf Listen, · auf Matrizen, . . . Simplifierregeln: I Kommutativität: ` m + n = n + m, I Assoziativität: ` (m + n) + k = n + (m + k), I für assoziativ und kommutativ kurz AC(+) I A, C, AC werden nicht direkt verwendet; ob eine Simplifierregel paßt, wird kurz: C(+) kurz: A(+) modulo“ dieser Regeln geprüft ” Beispiele: I ` a + b ∗ c = c ∗ b + a wird mit C(+, ∗) sofort (per Reflexivität) bewiesen. I ` b ∗ c ≤ (c ∗ a) ∗ b wird für AC(∗) mit der Regel ` m ≤ m ∗ n bewiesen. A. Knapp, G. Schellhorn: Formale Methoden 159 KIV-Simplifier: Regeln für Zahlen I Zahlen in KIV vordefiniert: I für die Sorte nat: 0, 1, 2, . . . I für die Sorte int: . . . , ∼2, ∼1, 0, 1, 2, . . . I Implizite Regeln in KIV: Summen, Differenzen, <, ≤ &c. mit Zahlen werden immer gleich ausgewertet. I Wenn eine Simplifierregel nur angewendet werden soll, wenn eine ihrer Variablen m durch eine Zahl instantiiert ist: (∗ m) statt m mindestens einmal in der Regel Beispiel: ` a ∗ (∗ m) + a ∗ (∗ n) = a ∗ (n + m) (Distributivität) I Sind m, n Zahlen, so wird n + m sofort ausgerechnet I Sind m, n keine Zahlen, dann wird die Regel umgekehrt angewendet A. Knapp, G. Schellhorn: Formale Methoden 160 KIV-Simplifier: Forwardregeln Hinzufügung abgeleiteter Information zu Sequenzen I Transitivität von Ordnungs- und Äquivalenzrelationen: ` m < n ∧ n < n0 → m < n0 ` isperm(x, y) ∧ isperm(y, z) → isperm(x, z) Forward-Regeln der Form Γ ` ϕ1 ∧ . . . ∧ ϕn → ψ I Lokale und globale Regeln wie bei Simplifierregeln Deklaration als used for: f, lf; I Vorbedingungen werden wie bei Simplifierregeln behandelt. I ψ wird genau einmal zur Sequenz hinzugefügt. A. Knapp, G. Schellhorn: Formale Methoden 161 KIV-Simplifier: Pragmatik von Forwardregeln I Transitivität unkritisch I Häufig etliche Varianten notwendig ` m < n ∧ n ≤ n0 → m < n0 ` m < n ∧ ¬n0 < n → m < n0 ` m ≤ n + 1 ∧ n < n0 → m ≤ n0 I Forward-Regeln führen leicht zu Endlosschleifen im Simplifier I z. B. ` m < n → m < n + 1 I Ein Lemma sollte nie Forward- und Simplifierregel sein. I Forwardregeln auch mit Zahlen 0 < n ` (∗ n) ≤ m → m 6= 0 A. Knapp, G. Schellhorn: Formale Methoden 162 Automatisierung in KIV: Heuristiken I Flexible Automatisierung ist zentral, um bei großen Fallstudien nicht immer wieder die gleichen Beweisschritte wiederholen zu müssen I Deshalb in KIV: Automatisierung durch zuschaltbare Heuristiken I Simplifier eine Heuristik; sollte man (fast) immer benutzen I Für jedes Beweisziel werden alle Heuristiken der Reihen nach ausprobiert I gewählte Heuristiken jederzeit änderbar Für das Verständnis von KIV wichtig: Welche Heuristik hat welchen Effekt? A. Knapp, G. Schellhorn: Formale Methoden 163 Wichtige Heuristiken für PL in KIV (1) I Simplifier I I I I I I wendet die Simplifier-Regel an PL case distinction wendet Regel case distinction an für einfache bis mittelschwere Beweise Gefahr, unnötige Fallunterscheidungen zu machen if-then-else-Split I I I I if-then-else-Operator: (ϕ ⊃ σ; τ ) bezeichnet σ , falls ϕ wahr ist, sonst τ wendet (Cut)-Regel mit ϕ an Häufig einsetzbar, um sinnvolle Fallunterscheidungen zu erzwingen Beispiel: Fallunterscheidung nach Anwendung von Rewrite-Regel abs(i) = (i ≥ 0 ⊃ i; −i) A. Knapp, G. Schellhorn: Formale Methoden 164 Wichtige Heuristiken für PL in KIV (2) I Quantifier closing I I I I I Sucht Instanzen, mit denen eine Prämisse direkt geschlossen werden kann immer verwenden einziges Problem: bei sehr vielen Quantoren braucht die Heuristik viel unnötige Zeit deshalb Spezifikationsmethodik: Prädikat (& Simplifierregeln) definieren, statt große Quantorenformeln zu verwenden Quantifier I I I Sucht sinnvolle“ Instanzen für Quantoren ” kann Endlosschleifen verursachen! nur bei einfachen Quantorenbeweisen einsetzbar A. Knapp, G. Schellhorn: Formale Methoden 165 Wichtige Heuristiken für PL in KIV (3) I Structural induction I I I I Macht strukturelle Induktion über sinnvolle“ Terme ” Idee für sinnvoll“: Variablen an rekursiven Positionen: ” n ist sinnvoll in m + n, da + rekursiv über das zweite Argument definiert: m + 0 = m, m + (n +1) = (m + n) +1 Funktioniert meistens, aber nicht immer Module specific I I I eigentlich eine Meta-Heuristik: erlaubt heuristische Anwendung von Regeln durch Patterns Pattern: Gibt Formeln (oder Schemata für Formeln) an, die in der Sequenz vorkommen müssen bzw. nicht vorkommen dürfen & Regel die angewandt werden soll Alle Patterns stehen in der Datei module-specific A. Knapp, G. Schellhorn: Formale Methoden 166 Heuristiksätze in KIV I In KIV drei vordefinierte Heuristiksätze: I I I I PL Heuristics: minimale Menge sinnvoller Heuristiken PL Heuristics + Case Splitting: Keine Induktion, FU automatisch PL Heuristics + Struct. Ind.: versucht Ziel induktiv zu beweisen und Fallunterscheidungen (FU) automatisch zu machen Standardüberlegung zur Wahl des Heuristiksatzes: I I I Ist der Beweis induktiv?: Wenn ja, PL Heuristics + Struct. Ind. Wenn nein, sind die Fallunterscheidungen im Beweis ungefähr die, die sich aus den aussagenlog. Verknüpfungen der Sequenz ergeben? Wenn ja, PL Heuristics + Case Splitting, sonst nur PL Heuristics I Für größere Projekte definiert man häufig seinen eigenen Standardsatz (in Datei default-heuristics) I Weitere Heuristiken für Programme; dort noch wichtiger, da Programme mehr Struktur haben. A. Knapp, G. Schellhorn: Formale Methoden 167 Natürliche Zahlen: Peano-Axiom 5 vs. Induktion Induktionsaxiom codiert (P5) für ΣNat -Formeln ϕ I Induktionsaxiom: ϕ{n 7→ 0} ∧ (∀n . ϕ → ϕ{n 7→ s(n)}) → ∀n . ϕ I Instanz von (P5) für X = {n | ϕ(n)} (P5) spricht über alle Teilmengen von N I Es gibt nur abzählbar viele Formeln. I I Zeichenketten sind numerierbar, z. B. durch ASCII-Code. Die Teilmengen von N sind nicht abzählbar: I Angenommen X0 , X1 , X2 , . . . wäre eine Aufzählung der Teilmengen. I Setze X = {k | k 6∈ X }. k I Dann kommt X nicht in der Aufzählung vor; Widerspruch. Gibt es eine konsistente, entscheidbare Menge von Axiomen, sodaß alle wahren Formeln über N bewiesen werden können? A. Knapp, G. Schellhorn: Formale Methoden 168 Natürliche Zahlen ohne Multiplikation Satz Die Formeln über den natürlichen Zahlen mit 0, +, < sind entscheidbar. Ohne Beweis (Mojżsez Presburger 1929) I keine Multiplikation I Aufwand doppelt exponentieller in der Länge der Formel Lineare Arithmentik erfordert keine Kreativität, nur viel Rechenaufwand I Entscheidbarkeit gilt nur ohne weitere Funktionen. I Entscheidungsprozeduren auch für andere einfache“ Datentypen ” I I verwendet etwa in PVS, automatischen Theorembeweisern Kombination mehrerer Entscheidungsprozeduren und mit zusätzlichen Funktionen schwierig (Verfahren von Nelson und Oppen, 1979) A. Knapp, G. Schellhorn: Formale Methoden 169 Gödelscher Unvollständigkeitssatz (1) Satz Es gibt keine konsistente, entscheidbare Menge von Formeln über (0, s, +, ·), die (P1–4) und n 6= 0 → ∃m . n = s(m) enthält oder impliziert, mit der sich alle in N wahren Aussagen ableiten lassen. I Satz von Kurt Gödel (1930) I Unvollständigkeit einer Axiomenmenge (für N) heißt, daß nicht alle wahren Aussagen über N bewiesen werden können. I Ein Kalkül heißt vollständig, wenn alle in allen Modellen wahren Aussagen bewiesen werden können. A. Knapp, G. Schellhorn: Formale Methoden 170 Gödelscher Unvollständigkeitssatz (2) Beweisskizze Zunächst: Für einen Algorithmus und eine Numerierung seiner Einund Ausgabedaten läßt sich eine Formel α(x, y) über 0, s, + und · angeben mit: α(sm (0), sn (0)) gilt genau dann, wenn der Algorithmus mit Eingabe Nummer m die Ausgabe Nummer n liefert. I Intuitiv: Jeder Algorithmus kann in eine Zahlenrechnung codiert werden.“ ” Formeln und Beweisbäume sind numerierbar; Ableitbarkeit und Substitution sind Algorithmen. I Es gibt eine Formel Abl(x) mit: Abl(sn (0)) gilt genau dann, wenn die Formel Nummer n ableitbar ist. Subst(x, y) mit: Subst(sm (0), sn (0)) gilt genau dann, wenn die Formel Nummer n aus der Formel Nummer m mit Ersetzung der freien Variablen durch sm (0) entsteht. I Es gibt eine Formel Setze G(x) = ∀y . Subst(x, y) → ¬Abl(y). Die Formel habe Nummer k. I Die Gödelformel G(sk (0)) sagt: Die Formel mit meiner Nummer ist nicht ” ableitbar“. (Instanz des Lügnerparadoxons) I Diese Formel ist nicht ableitbar, aber wahr. A. Knapp, G. Schellhorn: Formale Methoden 171 Gödelscher Unvollständigkeitssatz (3) Es gibt keine gute“ Axiomenmenge, mit der alle wahren Aussagen über N ” herleitbar sind. I Induktionsaxiome reichen nicht, um alle wahren Aussagen zu finden. I Die Menge der wahren Aussagen über N wäre aussreichend, ist also nicht entscheidbar. I Scheitern des Hilbertschen Programms, die Mathematik auf einfachen“ ” Grundlagen aufzubauen Für praktische Beweise ist die Gödelformel wenig relevant. A. Knapp, G. Schellhorn: Formale Methoden 172 Ω-Kalkül Für eine Signatur Σ = (S, F, P) und eine Generiertheitsklausel shCi ∈ G (Σ) Ω-Regel (⇒ ϕ{x 7→ t})t∈T ((S,C,∅),X\Xs )s ⇒ϕ I Ω-Regel hat i. A. unendlich viele Prämissen, deshalb auf Rechnern nicht implementierbar Definition Eine Sequenz Γ ⇒ ∆ ist aus einer elementaren Spezifikation Sp Ω-ableitbar, geschrieben als Sp `ω Γ ⇒ ∆, wenn sie aus den Axiomen und den Generiertheitsklauseln von Sp durch Anwendung des Sequenzenkalküls und der Ω-Regeln für jede Generiertheitsklausel ableitbar ist. I Beweisbäume sind endlich hoch aber unendlich breit: Infinitärer Kalkül A. Knapp, G. Schellhorn: Formale Methoden 173 Ω-Kalkül: Korrektheit und Vollständigkeit Satz Für eine Formel ϕ und eine elementare Spezifikation Sp gilt Sp `ω ϕ ⇔ Sp |= ϕ Wenn man von der Ableitbarkeit von ϕ(0), ϕ(s(0)), ϕ(s(s(0))), . . . auf ∀n . ϕ(n) schließen darf, reicht das aus, um die natürlichen Zahlen als minimale Menge“ zu charakterisieren. ” I Das Problem ist also lediglich, daß manchmal der Beweis nicht per Induktion geht: ϕ(n) → ϕ(s(n)) ist nicht immer beweisbar. I A. Knapp, G. Schellhorn: Formale Methoden 174 Beinahe-Vollständigkeit der strukturellen Induktion (1) Spezifikation von x from a: Liste x ab dem erstem Vorkommen des Elements a (exklusiv); falls a in x nicht vorkommt, die leere Liste. specification sorts elem; list; constants [] : list; functions . + . : elem × list → list; . from . : list × elem → list; induction list generated by [], +; variables a, b : elem; x, y : list; axioms [] 6= a + x; x 6= y → a + x 6= b + y; [] from a = []; (a + x) from a = x; a 6= b → (b + x) from a = x from a; end specification Spezifikation monomorph modulo der Elemente; genau eine Listenfunktion from A. Knapp, G. Schellhorn: Formale Methoden 175 Beinahe-Vollständigkeit der strukturellen Induktion (2) I Für die Funktion from gilt ∀x . ϕ mit ϕ(x) = x 6= [] → x from a 6= x I Es lassen sich ϕ([]), ϕ(b + []), . . . beweisen: [] 6= [] → [] from a 6= [] b + [] 6= [] → (b + []) from a 6= b + [] b + c + [] 6= [] → (b + c + []) from a 6= b + c + [] b + c + d + [] 6= [] → (b + c + d + []) from a 6= b + c + d + [] ... I I Aber: Induktionsschluß x from a 6= x → (b + x) from a 6= b + x nicht durchführbar Man muß die Aussage für Induktion verallgemeinern: x 6= [] → x from a < x x 6= [] → #(x from a) < #x I Dazu neues Prädikat < (ist Endstück) oder neue Funktion # (Länge) notwendig; beide können rekursiv definiert werden A. Knapp, G. Schellhorn: Formale Methoden 176 Beinahe-Vollständigkeit der strukturellen Induktion (3) Im allgemeinen benötigt man für ein ϕ mit Sp |= ϕ eine Erweiterung Sp0 von Sp um neue, rekursiv definierte Funktionen, damit Sp0 `IND ϕ gilt. I Die Induktions-Regel ist nicht vollständig, manchmal ist ϕ(n) → ϕ(s(n)) nicht beweisbar. I In diesem Fall muß man die Behauptung verallgemeinern: Die zusätzlichen Symbole von Sp0 machen eine passend verallgemeinerte Induktionshypothese ψ für den Beweis von ϕ ausdrückbar: Sp0 `IND ψ(x) → ϕ(x) und Sp0 `IND ψ(n) → ψ(s(n)) I Die Erweiterung Sp0 ist je nach ϕ verschieden (kein uniformes Sp0 ). I In jedem Sp0 gibt es eine Formel ϕ0 , die wahr aber nicht ableitbar ist. I Kreativitität also für Verallgemeinerung und passende Hilfsfunktionen A. Knapp, G. Schellhorn: Formale Methoden 177 Spezifikation von Datentypen Vorgehen I Definition der benötigten Sorten I Definition der Konstruktoren und Generiertheitsklauseln I I Datentypen auf Rechnern generiert Definition weiterer Operationen und Axiome I Keine Einführung von Inkonsistenzen, möglichst monomorphe Charakterisierung A. Knapp, G. Schellhorn: Formale Methoden 178 Freie und nichtfreie Datentypen Manche Datentypen sind frei erzeugt: Zwei verschiedene Konstruktorterme repräsentieren auch immer zwei verschiedene Elemente. nat nat list freely generated by 0, +1 generated by 0, 1, + 0+0=0 freely generated by [], + integer generated by 0, +1, −1 0 +1 −1 = 0 set generated by ∅, ins ins(a, ins(a, ∅)) = ins(a, ∅) set generated by ∅, {.}, ∪ {a} ∪ {a} = {a} stack freely generated by empty, push bintree freely generated by mkleaf, mkbranch graph generated by ∅, +node, +edge ∅ +node n +node n = ∅ +node n array generated by mkar, put put(put(mkar(n), i, d), i, d) = put(mkar(n), i, d) A. Knapp, G. Schellhorn: Formale Methoden 179 Freie Erzeugtheitsklauseln Eine freie Generiertheitsklausel GhhCii für eine Signatur Σ = (S, F, P) besteht aus einer Menge von Sorten G ⊆ S und einer endlichen Menge von Konstruktoren C ⊆ F , wobei die Ergebnissorte jedes f ∈ C eine Sorte G ist und für wenigstens ein f ∈ C alle Argumentsorten nicht Sorten aus G sind. Definition Definition Eine freie Generiertheitsklausel GhhCii gilt über einer Algebra A, geschrieben als A |= GhhCii, wenn A |= GhCi gilt, für jedes f ∈ C die Funktion f A injektiv ist, und für f : s1 . . . sn → s, f 0 : s01 . . . s0n0 → s mit f 6= f 0 ∈ C, s ∈ G und a1 ∈ As1 , . . . , an ∈ Asn , a01 ∈ As0 , . . . , a0n0 ∈ Asn0 gilt: f A (a1 , . . . , an ) 6= f 0A (a01 , . . . , a0n0 ). 1 Insbesondere sind Terme mit verschiedenen Konstruktoren immer verschieden. A. Knapp, G. Schellhorn: Formale Methoden 180 Axiome für freie Datentypen Beispiel: Konstante c, einstellige Funktion f, zweistellige Funktion g I Verschiedenheit der Konstruktoren c, f und g: c 6= f(x), f(x) 6= g(y, z), c 6= g(x, y) I Injektivität der Konstruktoren: f(x) = f(y) ↔ x = y, g(x, y) = g(u, v) ↔ x = u ∧ y = v A. Knapp, G. Schellhorn: Formale Methoden 181 Freie Generiertheitsklauseln als Abkürzung Es gilt A |= GhhCii genau dann, wenn Satz I A |= GhCi I Für alle f ∈ C gilt A |= f (~x) = f (~y) ↔ ~x = ~y. I Für alle f 6= g ∈ C mit derselben Zielsorte gilt A |= f (~x) 6= g(~y). Freie Generiertheit ist also durch Axiome und Generiertheit ausdrückbar. In KIV: I G freely generated by C für GhhCii I G freely generated by C als Abkürzung; daraus werden die Axiome für freie Generiertheit erzeugt. A. Knapp, G. Schellhorn: Formale Methoden 182 Freie Datentypen: Beispiele (1a) Wochentage Weekday = specification sorts weekday; constants Mon, Tue, Wed, Thu, Fri, Sat, Sun : weekday; induction weekday freely generated by Mon, Tue, Wed, Thu, Fri, Sat, Sun; variables w : weekday; end specification Generierte Axiome: I Die Konstanten Mon, Tue, Wed, . . . sind paarweise verschieden: Mon 6= Tue, A. Knapp, G. Schellhorn: Formale Methoden Mon 6= Wed, Mon 6= Thu, Mon 6= Fri, ... 183 Freie Datentypen: Beispiele (1b) Induktionsregel für die Sorte weekday Γ{w 7→ Mon} ⇒ ∆{w 7→ Mon} ... Γ{w 7→ Sun} ⇒ ∆{w 7→ Sun} Γ⇒∆ Damit: Beweise durch Fallunterscheidung nach dem Tag I Verallgemeinerung: Aufzählungstypen A. Knapp, G. Schellhorn: Formale Methoden 184 Freie Datentypen: Beispiele (2a) Paare Pair = specification sorts elem1, elem2, pair; functions mkpair : elem1 × elem2 → pair; induction pair freely generated by mkpair; variables a, a1, a2 : elem1; b, b1, b2 : elem2; p : pair; end specification Generiertes Axiom: mkpair(a1, b1) = mkpair(a2, b2) ↔ a1 = a2 ∧ b1 = b2 A. Knapp, G. Schellhorn: Formale Methoden 185 Freie Datentypen: Beispiele (2b) Induktionsregel für die Sorte pair Γ{p 7→ mkpair(a, b)} ⇒ ∆{p 7→ mkpair(a, b)} Γ⇒∆ Damit: Variable p expandiert zu mkpair(a, b) I Verallgemeinerung: Tupel A. Knapp, G. Schellhorn: Formale Methoden 186 Freie Datentypen: Beispiele (3) Natürliche Zahlen Nat = specification sorts nat; constants 0 : nat; functions . +1 : nat → nat; induction nat freely generated by 0, +1; variables n : nat; end specification Axiome für natürliche Zahlen daraus generiert A. Knapp, G. Schellhorn: Formale Methoden 187 Freie Datentypen: Beispiele (4a) Listen List = specification sorts list, elem; constants [] : list; functions . + . : elem × list → list; induction list freely generated by [], +; variables a, b : elem; l, l1, l2 : list; end specification Generierte Axiome: [] 6= a + l, a + l1 = b + l2 ↔ a = b ∧ l1 = l2 A. Knapp, G. Schellhorn: Formale Methoden 188 Freie Datentypen: Beispiele (4b) Induktionsregel für die Sorte list ∀~y . V Γ{l 7→ []} ⇒ ∆{l 7→ []} W Γ → ∆, Γ{l 7→ a + l} ⇒ ∆{l 7→ a + l} Γ⇒∆ wobei ~y = fvar(Γ ⇒ ∆) \ {l} A. Knapp, G. Schellhorn: Formale Methoden 189 KIV: Data Specifications Häufige Situation: I freie Generiertheit mit Konstruktoren c I Selektoren, die aus c(x1 , . . . , xn ) die xi auswählen Testprädikate ist mit Konstruktor c gebildet“ ” I Ordnung ist Unterterm von“ ” I Größenfunktion Anzahl nichtkonstanter Konstruktoren“ ” I Für Datendefinitionen eigenes KIV-Syntaxkonstrukt data specification zur Vermeidung unnötiger Schreibarbeit A. Knapp, G. Schellhorn: Formale Methoden 190 KIV-Data Specifications: Beispiele (1) Wochentage Weekday = data specification weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun; variables w : weekday; end data specification Axiome für freie Generiertheit (Mon 6= Tue, &c.) werden wie bei einem freely generated by erzeugt. A. Knapp, G. Schellhorn: Formale Methoden 191 KIV-Data Specifications: Beispiele (2) Paare Pair = data specification using Elem1, Elem2; pair = mkpair (. .1 : elem1; . .2 : elem2); variables p : pair; end data specification Für jeden Selektor wird ein Axiom generiert: mkpair(a, b).1 = a mkpair(a, b).2 = b A. Knapp, G. Schellhorn: Formale Methoden 192 KIV-Data Specifications: Beispiele (3) Natürliche Zahlen Nat = data specification nat = 0 | . +1 (. −1 : nat); order predicates . < . : nat × nat; variables k, m, n : nat; end data specification Neues Axiom für den Selektor −1 (0 −1 ist nicht spezifiziert) n +1 −1 = n Neue Axiome für das Prädikat < (strukturell-rekursive Definition) ¬m < 0 m < n +1 ↔ (m = n ∨ m < n) Irreflexivität und Transitivität werden auch generiert (könnte man beweisen) ¬n < n m<n∧n<k→m<k A. Knapp, G. Schellhorn: Formale Methoden 193 KIV-Data Specifications: Beispiele (4a) Listen List = data specification using Nat, Elem; list = [] with nilp | . + . (. .first : elem; . .rest : list) with consp; order predicates . . : list × list; (: ist Unterterm für Listen: ist Endstück :) size functions length : list → nat; variables l : list; end data specification A. Knapp, G. Schellhorn: Formale Methoden 194 Partielle Funktionen Anwendung eines Selektors auf einen falschen Summanden I Was sind [].first und [].rest? I Ähnlich für 0 −1 oder n/0 (natürliche Zahlen) oder “Out-of-bounds”-Zugriffe a[i] für Arrays Allgemeiner: Behandlung partieller Funktionen I Prädikatenlogik kennt keine partiellen Funktionen I Mehrere Möglichkeiten: Erweiterung der Logik, Unterspezifikation, Fehlerelemente, . . . A. Knapp, G. Schellhorn: Formale Methoden 195 Unterspezifikation I [].rest und n/0 bleiben unspezifiziert I I Konsequenz: [].rest muß irgendeine Liste sein, da Funktion total I I Vorteil: kein unnötiger Overhead Die Spezifikation ist dann nicht monomorph: In Modell A: T J[].restK A = []. In Modell B : T J[].restK B = [a] mit einem Element a. In Modell C : T J[].restK C = [b] mit einem Element b 6= a. Konsequenz: Wenn [].rest bzw. n/0 in Programmen aufgerufen wird, dann muß I I entweder die Implementierung irgendeine Liste/Zahl zurückgeben (und keine Exception auslösen) oder in der Programmsemantik dieser Fall speziell behandelt werden (bei Exceptions muß das sowieso sein, Programmabbruch geht einfacher) A. Knapp, G. Schellhorn: Formale Methoden 196 KIV-Data Specifications: Beispiele (4b) Neue Axiome für List I I I Axiome für nilp und consp (eines pro Konstruktur) nilp([]) ¬nilp(a + l) ¬consp([]) consp(a + l) Axiome für die Selektoren (je eines pro Verwendung) (a + l).first = a kein Axiom für [].first (a + l).rest = l kein Axiom für [].rest Axiome für das Ordnungsprädikat ist Endstück“ (strukt.-rek. Def.) ” ¬l [] l (a + l1 ) ↔ l = l1 ∨ l l1 ¬l l l1 l2 ∧ l2 l3 → l1 l3 beweisbar, aber der Einfachheit halber generiert I Axiome für die Größenfunktion Länge“ (zählt nur nicht-konst. Konstr.) ” length([]) = 0 A. Knapp, G. Schellhorn: Formale Methoden length(a + l) = length(l) +1 197 KIV-Kalkül: Elimination für Selektoren I Listen haben (Postfix-)Selektoren I .first (erstes Element) I .rest (Rest der Liste) I Beseitigung von Selektoren mit Hilfe von (insert elim lemma) I Benötigt wird Lemma ` x 6= [] → a = x.first ∧ y = x.rest ↔ x = a + y I Eliminationsregel sucht einen Term t.first oder t.rest I Wenn t 6= [] gilt, wird t = a + y ersetzt (neue Variablen a, y) I Damit wird aus t.first bzw. t.rest jetzt a bzw. y t = a + y, Γ(a, y, a + y) ` ∆(a, y, a + y) t 6= [], Γ(t.first, t.rest, t) ` ∆(t.first, t.rest, t) A. Knapp, G. Schellhorn: Formale Methoden 198 KIV-Kalkül: Elimination für andere Funktionen I Manchmal geht Elimination auch für andere unbeliebte“ Funktionen, etwa ” Minus und Division I Lemma für Minus: n ≤ m ` n0 = m − n ↔ m = n0 + n I Vorteil: Man kann auf Simplifierregeln für − verzichten I Nachteil: Neue Variable n0 wird eingeführt (manchmal unintuitiv) Γ(n0 + n, n, n0) ` ∆(n0 + n, n, n0) n ≤ m, Γ(m, n, m − n) ` ∆(m, n, m − n) I KIV-Heuristik Elimination gesteuert durch Eliminationsregeln (analog zu: Simplifier durch Simplifierregeln) I KIV-Eingabe analog zu Simplifierregeln: used for: e; &c. A. Knapp, G. Schellhorn: Formale Methoden 199 KIV-Data Specifications: Beispiele (5) I Bäume (gegenseitig rekursive Definition) und Binärbäume sind freie Datentypen. I Abstrakte Syntaxbäume von Sprachen sind freie Datentypen. I Auch Terme und Formeln sind freie Datentypen: formula = . = . ( . .term1 : term; . .term2 : term) | ∀ . . . ( . .var : var; . .fma : formula) | ... A. Knapp, G. Schellhorn: Formale Methoden 200 KIV-Data Specifications: Allgemeine Form (1) Eine KIV-Datentyp-Definition hat die Form (optionales in eckigen Klammern) s = c1 (σ1,1 : s1,1 ; . . . ; σ1,n1 : s1,n1 ) [with p1 ] | ... | ck (σk,1 : sk,1 ; . . . ; σk,nk : sk,nk ) [with pk ]; I Überladene Selektoren: σi,j = σi0 ,j0 erlaubt, falls si,j = si0 ,j0 , ansonsten alle Operationen paarweise verschieden A. Knapp, G. Schellhorn: Formale Methoden 201 Datentyp-Definitionen in Java abstract class s { } /* Subklasse für Konstruktor c1 */ class c1 extends s { s11 sel11; // ein Feld pro Selektor s12 sel12; ... /* Konstruktor */ public c1(s11 sel11, s12 sel12, ...) { this.sel11 = sel1; this.sel12 = sel12; ... } } /* Subklasse für Konstruktor c2 */ class c2 extends s { ... } A. Knapp, G. Schellhorn: Formale Methoden 202 KIV-Data Specifications: Allgemeine Form (2) Syntax von KIV-Data Specifications data specification using hspecname1i, hspecname2 i, . . .; hDatentyp-Definition für Sorte s1i; hDatentyp-Definition für Sorte s2i; ... order predicates p1 : s1 × s1; p2 : s2 × s2; ... size functions f1 : s1 → nat; ... variables x1 : s1; . . . end data specification I Die Sorten sind gegenseitig rekursiv (eine Generiertheitsklausel für alle) I wenn size function, dann für alle Sorten, und using nat A. Knapp, G. Schellhorn: Formale Methoden 203 KIV-Data Specifications: Eigenschaften Satz Eine Data Specification, die keine anderen Datentypen verwendet, ist konsistent. Sie ist monomorph, bis auf unspezifizierte Selektoren. I Die natürlichen Zahlen sind also als Spezialfall monomorph, genauso Aufzählungstypen. I Für Listen von Elementen, Tupel &c. gilt Analoges. A. Knapp, G. Schellhorn: Formale Methoden 204 Zusammenfassung I Einfache Spezifikationen I I I Homomorphismen, Isomorphismen Monomorphie Elementare Spezifikationen I I I Generiertheitsklauseln Strukturelle Induktion Strukturelle Rekursion I KIV: Simplifier und Heuristiken I Unvollständigkeit der Arithmetik I Ω-Regel I Freie Datentypen I I Freie Generiertheitsklauseln KIV-Data Specifications A. Knapp, G. Schellhorn: Formale Methoden 205 Strukturierte Spezifikationen Spezifikationen werden sehr schnell sehr groß: Strukturierung I Übersichtlichkeit & Verständlichkeit I Wiederverwendung von Komponenten I unabhängige Entwicklung von Komponenten I Strukturierung und Wiederverwendung von Beweisen A. Knapp, G. Schellhorn: Formale Methoden 206 Strukturierte Spezifikationen in KIV I KIV zeigt strukturierte Spezifikationen als Spezifikationsgraph an. I In KIV enthält jeder Knoten neben der Spezifikation außerdem eine Theorembasis. I Die Theorembasis enthält eine Menge von Theoremen (Sequenzen) über der Gesamtsignatur. I Für jede Sequenz kann ein Beweis vorhanden sein, der zeigt, daß die Sequenz aus der Spezifikation und anderen Theoremen folgt (keine zyklischen Abhängigkeiten). I Theoreme aus darunterliegenden Spezifikationen werden mit (insert spec-lemma) statt (insert lemma) angewendet. I KIV hat ein Korrektheitsmanagement, um Abhängigkeiten zwischen Beweisen zu verwalten. A. Knapp, G. Schellhorn: Formale Methoden 207 Vereinigung und Anreicherung I Vereinigung I I Sp1 + Sp2 wirft Signaturen und Axiome zusammen KIV-Syntax: union specification hSpec1i + hSpec2 i + . . . end union specification I Anreicherung I I Sp (Σ, X, Ax, Gen) addiert neue Signaturen und Axiome KIV-Syntax: enrich hSpec1i, hSpec2 i, . . . with hsig i hind i hax i end enrich I implizit: Ausgangsspezifikation der Anreicherung ist die Vereinigung von hSpec1i, hSpec2 i, . . . A. Knapp, G. Schellhorn: Formale Methoden 208 Anreicherung Hinzunahme neuer Axiome macht eine Spezifikation schnell inkonsistent; es sind nur konsistenzerhaltende“ Anreicherungen gewünscht. ” I Formaler Begriff: Konsistenzerhaltend = hierarchiepersistent I I Neue Operationen sollten monomorphieerhaltend“ sein: Wenn genau ein ” Datentyp spezifiziert ist, sollte die Operation ebenfalls eindeutig festgelegt sein. I Formaler Begriff: Monomorphieerhaltend = eindeutig Vorgehen I Anreicherung nur durch rekursive und nichtrekursive Definitionen für neue Operationen. Diese sind hierarchiepersistent und eindeutig. A. Knapp, G. Schellhorn: Formale Methoden 209 Erweiterungen und Redukte Eine Signatur Σ0 = (S0 , F 0 , P0 ) heißt Erweiterung von Σ = (S, F, P), geschrieben als Σ ⊆ Σ0 , wenn S ⊆ S0 , F ⊆ F 0 und P ⊆ P0 und Funktionen und Prädikate dieselben Sorten haben. Definition 0 0 Sei Σ = (S, F, P), Σ0 = (S0 , F 0 , P0 ), A0 = ((A0s )s∈S0 , (f A )f ∈F0 , (pA )p∈P0 ) mit Σ ⊆ Σ0 und A0 ∈ Alg(Σ0 ). 0 0 Dann ist A0 |Σ = ((As )s∈S , (f A |Σ )f ∈F , (pA |Σ )p∈P ) eine Σ-Algebra mit I As = A0s für alle s ∈ S I f A |Σ = f A für alle f ∈ F I pA |Σ = pA für alle p ∈ P 0 0 0 0 Definition Ist Σ ⊆ Σ0 und A0 ∈ Alg(Σ0 ), so heißt A0 |Σ, das Redukt von A0 auf Σ und A0 eine Erweiterung von A|Σ. A. Knapp, G. Schellhorn: Formale Methoden 210 Anreicherung und Algebren I Wenn A ∈ Alg(Σ) und Σ ⊆ Σ0 , dann gibt es eine Erweiterung A0 mit A0 |Σ = A. I Ist A0 ∈ Mod(Sp (Σ0 , X 0 , Ax0 , Gen0 )), dann ist A0 |Σ(Sp) ∈ Mod(Sp) (wobei Σ(Sp) die Signatur von Sp ist). I Wann kann jedes Modell von Sp erweitert werden? I Wann ist die Erweiterung konsistent? I Wann gibt es nur eine Erweiterung? A. Knapp, G. Schellhorn: Formale Methoden 211 Hierarchiepersistenz Eine Anreicherung ist hierarchiepersistent, wenn sie die Bedeutung alter Symbole nicht einschränkt: Jedes Modell der Ausgangsspezifikation läßt sich erweitern. Definition Eine Anreicherung Sp0 = Sp (Σ, X, Ax, Gen) heißt hierarchiepersistent, wenn es für jedes A ∈ Mod(Sp) ein A0 ∈ Mod(Sp0 ) mit A0 |Σ(Sp) = A gibt. I Eine hierarchiepersistente Anreicherung einer konsistenten Spezifikation ist konsistent. A. Knapp, G. Schellhorn: Formale Methoden 212 Eindeutigkeit Eine Anreicherung ist eindeutig, wenn man für die neuen Symbole nicht zwei echt verschiedene Bedeutungen finden kann, sofern man eine für die alten festlegt. I Es ist aber möglich, daß sich nur bestimmte alte Datenstrukturen (im schlimmsten Falle keine) erweitern lassen. Definition Eine Anreicherung Sp0 = Sp (Σ, X, Ax, Gen) ist eindeutig, wenn je zwei Modelle A0 , A00 ∈ Mod(Sp0 ) mit A0 |Σ(Sp) = A00 |Σ(Sp) isomorph sind. I Eine eindeutige Anreicherung einer monomorphen Spezifikation ist monomorph. A. Knapp, G. Schellhorn: Formale Methoden 213 Reine Signaturerweiterung und zusätzliche Axiome Satz Sp (Σ, ∅, ∅, ∅) ist hierarchiepersistent. Satz Sp (∅, X, Ax, Gen) ist eindeutig. Die Anreicherung ist bei Gen = ∅ aber nur hierarchiepersistent, wenn die neuen Axiome aus den alten folgen. Satz Sp ((S, C, ∅), ∅, ∅, ShhCii) ist eindeutig und hierarchiepersistent. A. Knapp, G. Schellhorn: Formale Methoden 214 Eigenschaften von Datendefinitionen Satz Eine Datendefinition ist eine spezielle Anreicherung der verwendeten Spezifikationen und ist hierarchiepersistent. Sie ist eindeutig, bis auf unspezifizierte Selektoren. Für List: Beschreibung exakt des Datentyps der Listen I I Zu jedem Elementtyp gibt es einen Listentyp. Genau ein Listentyp für jeden Elementtyp, bis auf die Festlegung von [].first und [].rest. A. Knapp, G. Schellhorn: Formale Methoden 215 Anreicherung: Beispiele (1) Partielle und totale Ordnungen POElem = specification sorts elem; predicates . < . : elem × elem; variables a, b, c : elem; axioms ¬ a < a; a < b ∧ b < c → a < c; end specification TOElem = enrich POElem with axioms a < b ∨ a = b ∨ b < a; end enrich I Die Anreicherung TOElem ist nicht hierarchiepersistent, aber (trivial) eindeutig. A. Knapp, G. Schellhorn: Formale Methoden 216 Anreicherung: Beispiele (2) Ringe und Körper Ring = specification sorts elem; constants 0, 1 : elem; functions . + . : elem × elem → elem; − . : elem → elem; . ∗ . : elem × elem → elem; variables a, b, c : elem; axioms a + 0 = a; a + (− a) = 0; 1 ∗ a = a; a ∗ (b + c) = a ∗ b + a ∗ c; ... end specification Field = enrich Ring with functions . −1 : elem → elem; axioms a 6= 0 → a ∗ (a−1 ) = 1; end enrich I Die Anreicherung Field ist nicht hierarchiepersistent; sie ist fast eindeutig, bis auf das unspezifizierte inverse Element der 0. A. Knapp, G. Schellhorn: Formale Methoden 217 Anreicherung: Verwendungen Anreicherung wird also zu zwei Zwecken verwendet: I hierarchiepersistent: um neue Funktionalität zu spezifizieren I I I der Standardfall häufig auch eindeutig, aber manchmal will man auch nur interessante“ Fälle ” definieren nicht hierarchiepersistent und eindeutig: um kleinere Klassen von Modellen auszuzeichnen I I I Gefahr der Inkonsistenz sollte man in Softwarespezifikationen besser vermeiden Besser: Man beweise, daß die Modelle der einen Spezifikation eine Teilmenge der Modelle einer anderen sind. I Spezialfall von Verfeinerung A. Knapp, G. Schellhorn: Formale Methoden 218 Transitivität von Hierarchiepersistenz und Eindeutigkeit Satz Seien I Sp1 = Sp (Σ, X, Ax, Gen), I Sp2 = Sp1 (Σ0 , X 0 , Ax0 , Gen0 ) I Sp3 = Sp (Σ ∪ Σ0 , X ∪ X 0 , Ax ∪ Ax0 , Gen ∪ Gen0 ) Dann gilt: I Sind Sp1 und Sp2 hierarchiepersistent, dann ist auch Sp3 hierarchierpersistent. I Sind Sp1 und Sp2 eindeutig, dann ist auch Sp3 eindeutig. A. Knapp, G. Schellhorn: Formale Methoden 219 Vereinigung Satz Ist Sp1 + Sp2 eine Vereinigung, so ist sie hierarchiepersistent als Anreicherung von Sp1 um die Differenz von Sp2 und Sp1 (und umgekehrt), wenn I der beiden gemeinsame Teil ausschließlich in gemeinsamen Unterspezifikationen Sp01 , . . . , Sp0n definiert ist; I die Anreicherungen von Sp0i zu Sp1 und Sp2 hierarchiepersistent sind; I für jede Vereinigung Sp0i + Sp0j dasselbe Kriterium wie für Sp1 + Sp2 gilt. Kriterium für Hierarchiepersistenz von Vereinigungen I Spezialfall: Die Spezifikationen haben disjunkte Signatur. A. Knapp, G. Schellhorn: Formale Methoden 220 Modulare Spezifikationsgraphen Für alle Spezifikationsknoten in einem Spezifikationsgraphen zeigt man: Jede Spezifikation ist hierarchiepersistente Erweiterung jeder Teilspezifikation. Wenn Sp1 und Sp2 dann als Durchschnitt Sp0 = Sp01 + . . . + Sp0n haben, dann I sind sowohl Sp1 als auch Sp2 hierarchiepersistente Erweiterung von Sp0 ; I jedes Modell A von Sp0 kann also zu A1 ∈ Mod(Sp1 ), A2 ∈ Mod(Sp2 ) erweitert werden, mit A1 |Σ(Sp0 ) = A2 |Σ(Sp0 ) = A. I Die beiden Modelle können also zusammengeworfen“ werden zu einem ” Modell von Sp1 + Sp2 (und das geht für alle A1 , A2 wegen Hierarchiepersistenz). I Wenn also alle elementaren Spezifikationen konsistent sind, alle Anreicherungen hierarchiepersistent, und die Vereinigungen das Kriterium erfüllen (modularer Spezifikationsgraph), dann ist die Gesamtspezifikation konsistent. A. Knapp, G. Schellhorn: Formale Methoden 221 Nichtrekursive Definitionen Definitionen zur Abkürzung großer Terme und Formeln I Prädikat: p(~x) ↔ ϕ (p kommt in Formel ϕ nicht vor, fvar(ϕ) ⊆ ~x) I Funktion: f (~x) = t (f kommt im Term t nicht vor, var(t) ⊆ ~x) A. Knapp, G. Schellhorn: Formale Methoden 222 Nichtrekursive Definitionen: Beispiele (1) Anreicherung um nichtrekursives Prädikat NatDiv = enrich Nat with predicates | : nat × nat; axioms m | n ↔ ∃ k . k * m = n; end enrich I Die Anreicherung NatDiv ist hierarchiepersistent und eindeutig. A. Knapp, G. Schellhorn: Formale Methoden 223 Nichtrekursive Definitionen: Beispiele (2) Anreicherung um nichtrekursives Prädikat mit Fallunterscheidung NatPrime = enrich NatDiv with predicates prime : nat; axioms ¬ prime(0); ¬ prime(1); n ≥ 2 → (prime(n) ↔ ∀ m . m | n → m = 1 ∨ m = n); end enrich I Die Anreicherung NatPrime ist hierarchiepersistent und eindeutig (da Fallunterscheidung nach n = 0, n = 1, n ≥ 2 vollständig). A. Knapp, G. Schellhorn: Formale Methoden 224 Nichtrekursive Definitionen: Beispiele (3) Anreicherung um nichtrekursive Konstante Nat12 = enrich Nat with constants 1 : nat; 2 : nat; axioms 1 = 0 +1 2 = 0 +1 +1; end enrich I Die Anreicherung Nat12 ist hierarchiepersistent und eindeutig. A. Knapp, G. Schellhorn: Formale Methoden 225 Nichtrekursive Definitionen: Beispiele (4) I m ≤ n ↔ ∃k . m + k = n I m < n ↔ m ≤ n ∧ m 6= n I m>n↔n<m I even(n) ↔ ∃m . n = m + m I odd(n) ↔ ¬even(n) I m < n → min(m, n) = m, ¬m < n → min(m, n) = n I x ≥ 0 → abs(x) = x, x < 0 → abs(x) = −x I last(l + (a + [])) = a (unvollständige Definition) I a ∈ l ↔ ∃l0 , l00 . l0 + a + l00 = l I isprefix(l, l0 ) ↔ ∃l00 . l + l00 = l0 I nodups(l) ↔ ¬∃l1 , l2 , l3 , a . l = l1 + a + l2 + a + l3 A. Knapp, G. Schellhorn: Formale Methoden 226 Nichtrekursive Definitionen: Allgemeine Form I Prädikat: p(~x) ↔ ϕ (p kommt in Formel ϕ nicht vor, fvar(ϕ) ⊆ ~x) I Funktion: f (~x) = t (f kommt im Term t nicht vor, var(t) ⊆ ~x) I Prädikat mit zwei vollständigen Fällen: γ(x, y) → (p(x, y) ↔ ϕ1 (x, y)), ¬γ(x, y) → (p(x, y) ↔ ϕ2 (x, y)) I Funktionen mit drei unvollständigen Fällen: γ1 (x, y) ∧ γ2 (x, y) → f (x, y) = t1 , γ1 (x, y) ∧ ¬γ2 (x, y) → f (x, y) = t2 , ¬γ1 (x, y) ∧ γ2 (x, y) → f (x, y) = t3 Satz Die Hinzunahme einer neuen Operation (Funktion oder Prädikat) mit nichtrekursiver Definition ist immer hierarchiepersistent. Wenn die Fälle vollständig sind, ist die Erweiterung eindeutig. A. Knapp, G. Schellhorn: Formale Methoden 227 Rekursive Definitionen I Datentypen bestehen aus (der Semantik von) Konstruktortermen. I Rekursive Definitionen geben Definition durch Reduktion auf kleinere Konstruktorterme. I Rekursive Definitionen entsprechen einem rekursiven Programm, das den Term abläuft (das Programm terminiert immer). Satz Die Hinzunahme einer neuen Operation mit rekursiver Definition zu einem freien Datentyp ist immer hierarchiepersistent. Wenn die Fälle vollständig sind, ist die Erweiterung immer eindeutig. A. Knapp, G. Schellhorn: Formale Methoden 228 Rekursive Definitionen: Beispiele (1) Anreicherung um rekursive Funktion Length = enrich List with functions length : list → nat; axioms ax1: length([]) = 0; ax2: length(a + l) = length(l) +1; end enrich I Length ist hierarchiepersistent und eindeutig. I Dabei darf ax2 nicht durch length(x) = length(x.rest) +1 ersetzt werden. A. Knapp, G. Schellhorn: Formale Methoden 229 Rekursive Definitionen: Beispiele (2) Anreicherung um rekursive Funktion Append = enrich List with functions . + . : list × list → list; axioms [] + l = l; (a + l) + l’ = a + (l + l’); end enrich I Append ist hierarchiepersistent und eindeutig. I Dabei ist + überladen: sowohl Element vor Liste hängen, als auch zwei Listen zusammenhängen A. Knapp, G. Schellhorn: Formale Methoden 230 Rekursive Definitionen: Beispiele (3) Anreicherung um rekursives Prädikat mit Fallunterscheidung Ordered = enrich List with predicates ordered : list; axioms ordered([]); ordered(a + []); ordered(a + b + l) ↔ a < b ∧ ordered(b + l); end enrich I Ordered ist hierarchiepersistent und eindeutig, da die Fallunterscheidung vollständig ist (jede Liste ist entweder gleich [], a + [] oder a + b + l). A. Knapp, G. Schellhorn: Formale Methoden 231 Umbenennung Umbenennung Spρ I benennt die Operationen einer Spezifikation um I nützlich um zwei Kopien zu erhalten I KIV-Syntax: rename hSpec i by morphism hrenaming1i; ... hrenamingni; end rename mit hrenaming i von der Form hsort/op/vari → hsort/op/vari I identische Umbenennungen weglassen (werden beim Ansehen der Spezifikation aber angezeigt) I Nicht zwei Symbole auf dasselbe abbilden: injektiv umbenennen I entweder alle Variablen oder keine umbenennen A. Knapp, G. Schellhorn: Formale Methoden 232 Umbenennung: Beispiel Listen zu Stacks rename List by morphism list → stack; [] → empty; (: Typangabe für überladenes Symbol :) + :: (elem × list → list) → push prio 0; (: pop soll nicht mehr Postfix sein, default übernimmt prio :) .rest → pop prio 0; (: top soll nun Präfix sein :) .first → top .; (: eigentlich keine Stack-Operation, nur um Overloading zu zeigen :) + :: (list × list → list) → concat prio 0; x → st; y → st0; z → st1; end rename A. Knapp, G. Schellhorn: Formale Methoden 233 Generische Spezifikation Generische Spezifikation I KIV-Syntax: generic specification parameter hSpec i using hSpec1i, . . . , hSpecni target hsig i hind i hax i end generic specification I wie Anreicherung (von hSpec i, hSpec1i, . . . , hSpecni), nur wird von hSpec i explizit gesagt, daß es sich um einen Parameter handelt I Vereinigung und Anreicherung übernimmt den (oder die) Parameter der Unterspezifikationen I Variante: generic data specification: wie data specification, nur mit Parameter A. Knapp, G. Schellhorn: Formale Methoden 234 Generische Spezifikationen: Aktualisierung (1) Aktualisierung I instantiiert Parameter (oder einen Parameter) einer Spezifikation I KIV-Syntax: actualize hSpec i with hASpec1i, . . . , hASpecni by morphism hrenaming1i; ... hrenamingmi; end actualize mit hrenaming i von der Form hsort/op/vari → hsort/op/vari I Die Vereinigung von hASpec1i, . . . , hASpecni heißt aktuelle Spezifikation I identische Umbenennungen weglassen I entweder alle Variablen oder keine umbenennen A. Knapp, G. Schellhorn: Formale Methoden 235 Generische Spezifikationen: Aktualisierung (2) Aktualisierung I Der Parameter muß in die aktuelle Spezifikation abgebildet werden. I Abbildung darf auch nicht injektiv sein: pair(elem1, elem2) → pair(nat, nat) I Der Nicht-Parameter-Teil darf nur injektiv und disjunkt zur aktuellen Spezifikation umbenannt werden, z. B. list → natlist I Die instantiierten Axiome des Parameters müssen Axiome in der aktuellen Spezifikation sein. I Verallgemeinerung instantiated specification I I Axiome müssen bewiesen werden mapping statt morphism erlaubt es, eine Sorte auf ein Tupel von Sorten abzubilden A. Knapp, G. Schellhorn: Formale Methoden 236 Aktualisierung: Beispiel (1) Order = specification sorts elem; constants d : elem; predicates : elem × elem variables a, b, c : elem; axioms ¬ a a; a b ∧ b c → a c; ¬ a d; (: d ist minimal :) end specification List-Ord = generic data specification parameter Order; using Nat list = [] | . + . (. .first : elem; . .rest : list); size functions length : list → nat; end generic data specification A. Knapp, G. Schellhorn: Formale Methoden 237 Aktualisierung: Beispiel (2) Nat-List = actualize List-Ord with Nat by morphism list → natlist; elem → nat; → <; d → 0; a → n; b → n0; c → n1; end actualize I Die instantiierten Axiome (u. a. ¬n < 0) sind (modulo Umbenennung der Variablen) in Nat vorhanden. I Die Listenoperationen (+, .rest, etc.) werden nicht umbenannt, sie bekommen nur die neuen Sorten als Argumente. A. Knapp, G. Schellhorn: Formale Methoden 238 Nichtfreie Datentypen Orderedlist = enrich List with predicates . < . : elem × elem; ordered : list; axioms ¬ a < a; a < b ∨ a = b ∨ b < a; a < b ∧ b < c → a < c; ordered([]); ordered(a + []); ordered(a + b + l) ↔ a < b ∧ ordered (b + l); end enrich I Hinzunahme von ∀l . ordered(l) wäre inkonsistent. I Allgemein: Ein generierter Datentyp enthält immer alle Konstruktorterme. Man kann nicht nachträglich Terme ausschließen. Man kann nur einen nichtfreien Datentyp bilden, der Terme identifiziert. A. Knapp, G. Schellhorn: Formale Methoden 239 Spezifikation nichtfreier Datentypen I Spezifikationen nichtfreier Datentypen werden sehr leicht inkonsistent oder uneindeutig. I Deshalb: Standardvorgehen, das für alle containerartigen Datentypen, die Elemente enthalten“, funktioniert (z. B. Arrays, Graphen, Mengen, ” Multimengen, etc.) I Einzige Ausnahme für das Standardvorgehen: Ganze Zahlen (spezieller Nachweis, daß Integerspezifikation monomorph) A. Knapp, G. Schellhorn: Formale Methoden 240 Standardvorgehen zur Spezifikation nichtfreier Datentypen I Grundidee: Konstruiere nichtfreien Datentyp durch Zusammenfassung von Termen in Klassen, die gleich sind. I Als erstes nach der Bestimmung der Konstruktoren: Definiere Gleichheit durch Extensionalitätsaxiom: x = y ↔ EQ(x, y) I Dann: die in EQ verwendeten Operationen werden rekursiv definiert. I Damit Monomorphie: höchstens ein Datentyp spezifiziert I Aber: rekursive Definitionen können inkonsistent sein. A. Knapp, G. Schellhorn: Formale Methoden 241 Beispiel einer inkonsistenten rekursiven Definition I Annahmen I I I Mengen von natürlichen Zahlen definiert, mit ∅ und insert generiert Aus den Axiomen folgt: insert(a, insert(a, ∅)) = insert(a, ∅) Rekursive Definition sum(∅) = 0 , sum(insert(a, s)) = a + sum(s) inkonsistent, da aus insert(1, insert(1, ∅)) = insert(1, ∅) folgt, daß 2 = sum(insert(1, insert(1, ∅))) = sum(insert(1, ∅)) = 1 I Korrekte Definition sum(∅) = 0 , ¬a ∈ s → sum(insert(a, s)) = a + sum(s) (im Fall a ∈ s ist insert(a, s) = s) I Operation sum muß mit der Definition der Gleichheit auf Mengen, d. h. dem Extensionalitätsaxiom verträglich sein. A. Knapp, G. Schellhorn: Formale Methoden 242 Standardvorgehen: Beispiele (1a) Arrays Array = generic specification parameter Elem; using Nat; target sorts array; functions mkar : nat → array; . [ . , . ] : array × nat × elem → array; . [ . ] : array × nat → elem; # . : array → nat; induction array generated by mkar, . [ . , . ]; variables d : elem; ar, ar1, ar2 : array; A. Knapp, G. Schellhorn: Formale Methoden 243 Standardvorgehen: Beispiele (1b) Festlegungen: I Konstruktor mkar(n) liefert ein Array mit unbekannten Elementen I Alternative: mkar(n, d) mit Initialelement d I Für m ≥ #a ist Selektion a[m] unspezifiziert I Für m ≥ #a ist Modifikation die Identität: a[m, d] = a I Alternativen: liefert irgendein Array, ein Array gleicher Größe axioms ar1 = ar2 ↔ # ar1 = # ar2 ∧ ∀ n . n < # ar1 → ar1[n] = ar2[n]; # mkar(n) = n; # ar[m , d] = # ar; m < # ar → ar[m , d][m] = d; n 6= m → ar[m , d][n] = ar[n]; end generic specification A. Knapp, G. Schellhorn: Formale Methoden 244 Beweisverpflichtungen für nichtfreie Datentypen I Der freie Datentyp existiert immer, rekursvie Definitionen dort eindeutig I Durch die EQ-Formel aus dem Extensionalitätsaxiom werden die Konstruktorterme in Klassen eingeteilt, die gleich sind. I Damit EQ eine sinnvolle Klasseneinteilung bewirkt, muß gelten: I Reflexivität: EQ(a, a) I Symmetrie: EQ(a, b) → EQ(b, a) I Transitivität: EQ(a, b) ∧ EQ(b, c) → EQ(a, c) I Verträglichkeit: EQ(a, b) → f (a) = f (b) I I für a, b aus der gleichen Klasse muß Operation f dasselbe liefern Um die Konsistenz eines nichtfreien Datentyps formal zu zeigen, muß EQ eine Kongruenz (= Äquivalenzrelation + Verträglichkeit) über dem freien Datentyp sein A. Knapp, G. Schellhorn: Formale Methoden 245 Standardvorgehen: Beispiele (1c) Das Extensionalitätsaxiom ist eine Kongruenz; für EQ(ar1, ar2) = #ar1 = #ar2 ∧ ∀n . n < #ar1 → ar1[n] = ar2[n] läßt sich (ohne das Exensionalitätaxiom) zeigen: I Reflexivität: EQ(ar1, ar1) I Symmetrie: EQ(ar1, ar2) → EQ(ar2, ar1) I Transitivität: EQ(ar1, ar2) ∧ EQ(ar2, ar3) → EQ(ar1, ar3) I Verträglichkeit mit #: EQ(ar1, ar2) → #ar1 = #ar2 I Verträglichkeit mit Auswahl: EQ(ar1, ar2) → ar1[n] = ar2[n] I Verträglichkeit mit Änderung: EQ(ar1, ar2) → EQ(ar1[n, d], ar2[n, d]) allerdings nur mit vollständig definiertem Selektor, z. B. mit #ar ≤ n → ar[n] = mkar(0)[0] A. Knapp, G. Schellhorn: Formale Methoden 246 Standardvorgehen: Beispiele (2a) Geordnete Listen Orderedlist = specification sorts elem, ordlist; constants [] : ordlist; functions . + . : elem × ordlist → ordlist; min : ordlist → elem; butmin : ordlist → ordlist; predicates . < . : elem × elem; variables a, b, c : elem; l, l’ : ordlist; induction ordlist generated by [], +; A. Knapp, G. Schellhorn: Formale Methoden 247 Standardvorgehen: Beispiele (2b) axioms ¬ a a l < a; b ∨ a = b ∨ b < a; b ∧ b < c → a < c; l’ ↔ l = [] ∧ l’ = [] ∨ l 6= [] ∧ l’ 6= [] ∧ min(l) = min(l’) ∧ butmin(l) = butmin(l’); min(a + []) = a; a < b → min(a + b + l) = min(a + l); ¬ a < b → min(a + b + l) = min(b + l); butmin(a + []) = []; a < b → butmin(a + b + l) = b + butmin(a + l); ¬ a < b → butmin(a + b + l) = a + butmin(b + l); end specification a < < = A. Knapp, G. Schellhorn: Formale Methoden 248 Standardvorgehen: Beispiele (3a) Speicher Store = generic specification parameter Loc+Data (: Parametersorten loc, data :) using Nat target sorts store; constants (: leerer Speicher :) ∅ : store; functions (: Schreiben :) . [ . , . ] : store × loc × data → store; (: Lesen :) . [ . ] : store × loc → data; (: Anzahl allokierter Adressen :) # . : store → nat; (: Freigeben :) . -- . : store × loc → store; (: neue, nicht allokierte Adresse :) new : store → loc; predicates (: Adresse ist allokiert :) . ∈ . : loc × store; A. Knapp, G. Schellhorn: Formale Methoden 249 Standardvorgehen: Beispiele (3b) Entscheidungen: I Schreib-Konstruktor allokiert Adresse, falls noch nicht vorhanden I I Falls a ∈ / st, liefert Selektion st[a] immer dasselbe unspezifizierte Datum ∅[a]. I I Alternative: separates Allokieren Alternative: das unspezifizierte Element ändert sich evt. beim Schreiben (Axiom At-other und st1[a] = st2[a] in Extension mit zusätzlicher Vorbedingung a ∈ st) unbeschränkte Zahl an Adressen vorhanden (keine Memory overflows betrachtet) nur unendliche Parameter für loc verwendbar (nicht hierarchiepersistent) I Alternativen: new : store → loc or overflow oder Prädikat full(st) A. Knapp, G. Schellhorn: Formale Methoden 250 Standardvorgehen: Beispiele (3c) induction store generated by ∅, . [ . , . ] :: (store × loc × data → store); variables a, b : loc; d : data; st, st1, st2 : store; axioms Extension: st1 = st2 ↔ ∀ a . (a ∈ st1 ↔ a ∈ st2) ∧ st1[a] = st2[a]; In-empty: ¬ a ∈ ∅; In-insert: a ∈ st[b, d] ↔ a = b ∨ a ∈ st; At-same: st[a, d][a] = d; At-other: a 6= b → st[b, d][a] = st[a]; Size-base: # ∅ = 0; Size-rec: ¬ a ∈ st → # st[a, d] = # st + 1; (: a ∈ st → # st[a, d] = # st ist beweisbar :) Del-base: ∅ -- b = ∅; Del-same: st[a, d] -- a = st -- a ; Del-other: a 6= b → (st[b, d] -- a) = (st -- a)[b, d]; New: ¬ new(st) ∈ st; end generic specification A. Knapp, G. Schellhorn: Formale Methoden 251 Spezifikation der ganzen Zahlen (1) I Integers sind von 0, +1, −1 generiert I Damit beliebig gemischte Terme: 0 +1 −1 −1 +1 +1 . . . −1 +1 I In einer Algebra A (ohne Axiome) können diese beliebig gleich oder verschieden sein. I Zwei Ziele für die Axiome, um die Integers als einzige Algebra zu haben: 1. Alle Werte aus Aint sind I T J0 +1 . . . +1K A = T J0 +1n K A = Sn mit n > 0 oder | {z } I T J0 −1 . . . −1K A = T J0 −1m K A = Pm mit m > 0 oder | {z } I T J0K A = 0A n× m× 2. 0A , Sn und Pm sind alle verschieden. I Dann Isomorphismus h : A → Z mit h(Sn ) = n, h(Pm ) = −m, h(0A ) = 0. A. Knapp, G. Schellhorn: Formale Methoden 252 Spezifikation der ganzen Zahlen (2) Ziel 1: Keine weiteren Elemente außer Sn , 0, Pm Axiome: predsucc: i −1 +1 = i succpred: i +1 −1 = i Für jeden Konstruktorterm t gilt (in jedem Modell der Axiome): |= t = 0 oder |= t = 0 +1n oder |= t = 0 −1m (und damit T JtK A ∈ {Sn , 0A , Pm }). Durch Induktion über die Anzahl k der Konstruktoren in t: I I k = 0: Dann ist t = 0 und die Behauptung gilt. k → k + 1: I I I Es gilt: t = t0 +1 oder t = t0 −1. Nach Induktionsvoraussetzung |= t0 = 0 +1n oder |= t = 0 −1m oder |= t0 = 0. Zwei interessante Fälle mit insert rewrite lemma: t = t0 −1 und |= t0 = 0 +1n : Verwendung von predsucc t = t0 +1 und |= t0 = 0 −1m : Verwendung von succpred A. Knapp, G. Schellhorn: Formale Methoden 253 Spezifikation der ganzen Zahlen (3) Ziel 2: Die Elemente Sn , 0A und Pm sind alle verschieden. 0 Problem: Endlich viele Ungleichungen (z. B. 0 +1n 6= 0 +1n für n 6= n0 genügen nicht, da es beliebig große Zn (sogar Körper, wenn n Primzahl) gibt. Auch rekursive Definitionen von Addition und Multiplikation gelten in Zn . Deshalb: Definition der <-Ordnung (endlich viele Axiome). Irreflexivität impliziert i < j → i 6= j, somit sind die Elemente dann alle verschieden. Damit < exakt die richtige Ordnung ist, muß gelten: 1. Für 0 ≤ m < n: (a) |= 0 +1m < 0 +1n und (b) |= ¬0 +1n < 0 +1m 2. Für 0 ≤ m < n: (a) |= 0 −1n < 0 −1m und (b) |= ¬0 −1m < 0 −1n 3. Für 0 ≤ m, 0 < n: (a) |= 0 −1m < 0 +1n und (b) |= ¬0 +1m < 0 −1n . 4. Für 0 ≤ n: |= ¬0 +1n < 0 +1n , |= ¬0 −1n < 0 −1n . A. Knapp, G. Schellhorn: Formale Methoden 254 Spezifikation der ganzen Zahlen (4) Reduktion der Fälle: Mit den Axiomen irrefl: ¬i < i trans: i < j ∧ j < k → i < k läßt sich Fall (4) beweisen, und Fall (1b) kann auf Fall (1a) (und analog (2b)/(3b) auf (2a)/(3a)) reduziert werden: Zu zeigen ist: Wenn 0 ≤ m < n, dann |= ¬0 +1n < 0 +1m . I Wegen (1a): |= 0 +1m < 0 +1n . I Nach Transitivität: |= i < j ∧ j < i → i < i I Zusammen mit Irreflexivität und Aussagenlogik also: |= i < j → ¬j < i I Zusammen mit (1a) also: |= ¬0 +1n < 0 +1m . A. Knapp, G. Schellhorn: Formale Methoden 255 Spezifikation der ganzen Zahlen (5) Weitere Reduktion: (2a) kann auf (1a) reduziert werden mit dem Axiom remsucc: i < j ↔ i +1 < j +1 Es gilt auch (durch Einsetzen von i0 = i −1, j0 = j −1 und predsucc) rempred: i −1 < j −1 ↔ i < j Denn: Sei 0 ≤ m < n. Mit (1a): |= 0 +1m < 0 +1n Mit rempred m + n mal: |= 0 +1m −1m+n < 0 +1n −1m+n Mit succpred m + n mal: |= 0 −1n < 0 −1m Analog: (3a) kann auf (1a) reduziert werden. A. Knapp, G. Schellhorn: Formale Methoden 256 Spezifikation der ganzen Zahlen (6) Es bleibt also, Axiome zu finden, so daß Fall (1a): |= 0 +1m < 0 +1n für 0 ≤ m < n gilt. Axiom wie bei natürlichen Zahlen: less-recsucc: i < j +1 ↔ i < j ∨ i = j Aus dem Axiom folgt speziell (für i = j): less-succ: i < i +1 Damit 0 < 0 +1, 0 +1 < 0 +1 +1, . . . . Mit Transitivität folgt die Behauptung (exakter Beweis: Induktion über Konstruktorenzahl wie vorher). Ähnliches Problem wie bei der from-Funktion: less-succ genügt für Monomorphie, aber ¬∃i . 0 < i < 0 +1 ist wegen des schwachen Induktionsprinzips wohl nur mit less-recsucc beweisbar. A. Knapp, G. Schellhorn: Formale Methoden 257 Spezifikation der ganzen Zahlen: Zusammenfassung Integer = specification sorts int; constants 0 : int; functions . +1 : int → int; . −1 : int → int; . + . : int × int → int; predicates . < . : int × int; induction int generated by 0, +1, −1; variables i, j : int; axioms i +1 −1 = i; i −1 +1 = i; ¬ i < i; i < j ∧ j < k → i < k; i < j ↔ i +1 < j +1; i < j +1 ↔ i < j ∨ i = j; i + 0 = i; i + (j +1) = (i + j) +1; i + (j −1) = (i + j) −1; end specification A. Knapp, G. Schellhorn: Formale Methoden 258 Resolution und Skolemisierung Aussagenlogik I Konjunktive Normalform I Klauseln I darauf basierend SAT-Beweiser Prädikatenlogik I Pränex-Normalform mit konjunktiver Normalform Q1 x1 . Q2 x2 . . . . . Qn xn . V W i j Li,j Jedes Li,j ist Literal (also evtl. negierte Gleichung oder Prädikat) I Skolemisierung: Beseitigung von Existenzquantoren I damit: Klauseln I darauf basierend Resolutions-Beweiser A. Knapp, G. Schellhorn: Formale Methoden 259 Skolemisierung (1) Satz Sei ψ = ∀~x . ∃y . ϕ(~x, y) eine geschlossene Formel über Σ = (S, F, P) mit ~s den Sorten von ~x und s0 die Sorte von y. Sei f : ~s → s0 ein neues Funktionssymbol, das nicht in F vorkommt, und χ = ∀~x . ϕ(~x, f (~x)). Dann gilt: ψ hat genau dann ein Modell über Σ, wenn χ ein Modell über (S, F ∪ {f }, P) hat. Der Satz gestattet es, in der Pränexnormalform den äußersten Existenzquantor zu beseitigen. Iteration beseitigt alle Existenzquantoren. Das ergibt die Skolem-Normalform. A. Knapp, G. Schellhorn: Formale Methoden 260 Skolemisierung (2) Beweisskizze ⇒“: Wenn ψ ein Modell A hat, gibt es zu jeder Belegung ~a der ” Variablen ~x eine Belegung b für y, sodaß ψ wahr wird. Also läßt sich das Modell zu A0 0 0 erweitern durch Definition einer Funktion f A , sodaß f A (~a) = b. (Der Beweis verwendet das Auswahlaxiom der Mengenlehre: Ist M S eine Menge nichtleerer Mengen, dann gibt es eine Auswahlfunktion f : M → M mit f (M) ∈ M für jedes M ∈ M. Hier: M Menge aller M~a = {b | FJϕ(~x, y)K A v{~x, y 7→ ~a, b} = tt}.) ⇐“: ϕ{y 7→ f (~x)} → ∃y . ϕ ist Tautologie. ” A. Knapp, G. Schellhorn: Formale Methoden 261 Klauseln für Prädikatenlogik Definition Ein (prädikatenlogisches) Literal ist ein Prädikat, eine Gleichung oder die Negation eines der beiden. Eine Klausel C = {L1 , . . . Ln } ist eine Menge von Literalen; die Semantik der Klausel ist die Formel cl∀ (L1 ∨ . . . ∨ Ln ). Eine Klauselmenge C = {C1 , . . . , Cm } ist eine endliche Menge von Klauseln; V Die Semantik der Klauselmenge ist die Formel 1≤i≤m Ci . I In einer Klausel sind die Variablen wie in einem Axiom implizit allquantifiziert. A. Knapp, G. Schellhorn: Formale Methoden 262 Transformation von Formeln in Klauseln Satz Zu jeder Formel ϕ gibt es eine Klauselmenge C (ϕ), sodaß ϕ genau dann ein Modell hat, wenn C (ϕ) ein Modell hat. Beweisskizze I Bilde Pränexnormalform. I Bringe Rumpf in konjunktive Normalform. I Skolemisiere. I Schiebe die übrigbleibenden Allquantoren über die Konjunktionen nach innen mit (∀x . ψ ∧ χ) ↔ (∀x . ψ) ∧ (∀x . χ). I Es ergibt sich eine Konjunktion von allquantifzierten Disjunktionen. A. Knapp, G. Schellhorn: Formale Methoden 263 Klauseln und Beweise Satz Jedes Beweisproblem Ax |= ϕ mit endlicher Axiomenmenge läßt sich in eine Klauselmenge C transformieren, sodaß Ax |= ϕ genau dann, wenn C kein Modell hat. Beweisskizze ⇔ ⇔ Es gilt: Ax |= ϕ Ax ∪ {¬ cl∀ (ϕ)} hat kein Modell S {C (ψ) | ψ ∈ Ax ∪ {¬ cl∀ (ϕ)}} hat kein Modell A. Knapp, G. Schellhorn: Formale Methoden 264 Resolutionskalkül für Prädikatenlogik Resolutionskalkül I Berechne Klauselmenge zum Problem Ax |= ϕ. I Nehme inkrementell neue Klauseln hinzu. I Sobald die leere Klausel (entspricht ff ) hinzugenommen wird, hat die Menge kein Modell, d. h. der Beweis war erfolgreich. I Wesentliche Regel zum Klauseln hinzunehmen: Resolution. I Schwierig: Gleichheit behandeln mit Paramodulation, Superposition Beispiel {p(x, g(z)), q(x, z)} {¬p(f(w), y), r(w, y)} {q(f(w), z), r(w, g(z))} A. Knapp, G. Schellhorn: Formale Methoden 265 Skolemisierung und Klauseln Skolemisierung I Skolemisierung besagt: man kann auf Existenzquantoren verzichten, Allquantoren implizit I Programmiersprachen verzichten auch auf Quantoren I Spezifikationssprache nur mit rekursiven Definitionen: ACL2 Klauseln I Eine Klausel der Form {P, ¬P1 , . . . , ¬Pn } heißt Hornklausel. I Man schreibt sie auch P ← P ∧ . . . ∧ P 1 n I Algorithmus: Beweise P, indem P1 , . . . , Pn bewiesen wird. I Suchbaum für die Lösung, terminiert mit Fakten P ←. I Programmiersprache Prolog A. Knapp, G. Schellhorn: Formale Methoden 266 Logiken höherer Stufe I Prädikatenlogik = Logik erster Stufe I schwache Logik 2. Stufe erlaubt Funktions- und Prädikatvariablen und Quantoren darüber I volle Logik 2. Stufe (“second order logic”) erlaubt Funktionen als Argumente von Funktionen (2. Stufe), z. B. compose : (A → B) × (B → C) → (A → C) I Logik 3. Stufe hat Variablen und Quantoren für Funktionen mit Funktionen als Argument etc. I Allgemeine Higher-Order-Logik (HOL) erlaubt beliebige Funktionen mit beliebigen Typen. A. Knapp, G. Schellhorn: Formale Methoden 267 HOL: Typen Definition Sei S eine Menge von Sorten mit bool ∈ S. Dann ist die Menge der Typen T definiert durch I Für jede Sorte s ∈ S ist s ∈ T . I Wenn τ1 , . . . , τn , τ ∈ T , dann ist der Funktionstyp τ1 × . . . × τn → τ ∈ T . Eine Signatur Σ = (S, F) besteht aus Sorten S und typisierten Operationen f : τ ∈ F. A. Knapp, G. Schellhorn: Formale Methoden 268 HOL: Semantik von Typen Definition Sei Σ = (S, F) eine Signatur. Eine Σ-HOL-Algebra enthält für jede Sorte s eine Trägermenge As und Abool = {ff , tt}. Die Standardsemantik eines Funktionstyps τ1 × . . . × τn → τ ∈ T ist die Menge aller Funktionen Aτ1 ×...×τn →τ = Aτ1 × . . . × Aτn → Aτ . Jede Operation f : τ ∈ F erhält als Semantik ein f A ∈ Aτ . Alternativen zur Standardsemantik I die Menge der durch einen Algorithmus berechenbaren Funktionen I die Menge der syntaktisch ausdrückbaren Funktionen, etc. A. Knapp, G. Schellhorn: Formale Methoden 269 HOL: Ausdrücke Definition HOL-Ausdrücke e ∈ E (Σ, X)τ des Typs τ ∈ T über der Signatur Σ und über den Variablen X = (Xτ )τ ∈T sind rekursiv gegeben durch I x ∈ Xτ ist ein Ausdruck des Typs τ . I f ∈ Fτ ist ein Ausdruck des Typs τ . I Sind e1 , . . . , en Ausdrücke der Typen τ1 , . . . , τn und ist e vom Typ τ1 × . . . × τn → τ dann ist e(e1 , . . . , en ) ein Ausdruck des Typs τ . I Sind e1 , e2 vom Typ τ , so ist e1 = e2 ein Ausdruck des Typs bool. I Wenn e ein Ausdruck des Typs bool und x eine Variable ist, so sind ∀x . e und ∃x . e Ausdrücke des Typs bool. I Sind e1 , e2 Ausdrücke des Typs τ und e ein Ausdruck des Typs bool, so ist (e ⊃ e1 ; e2 ) ein Ausdruck der Sorte τ . A. Knapp, G. Schellhorn: Formale Methoden 270 HOL: Semantik von Ausdrücken Definition Gegeben eine HOL-Algebra A und eine Belegung v. Dann ist die Semantik EJeK A v eines Ausdrucks e des Typs τ das folgende Element aus Aτ : I EJxK A v = v(x) für x ∈ X I EJf K A v = f A für f ∈ F I I EJe(e1 , . . . , en )K A v = (EJeK A v) (EJe1 K A v, . . . , EJen K A v) EJe1 = e2 K A v = tt, falls EJe1 K A v = EJe2 K A v (sonst ff ) I EJ∀x . eK A v = tt, falls, wenn x ∈ Xτ , für alle a ∈ Aτ gilt: EJeK A v{x 7→ a} = tt (sonst ff ) I EJ∃x . eK A v = tt, falls, wenn x ∈ Xτ , es ein a ∈ Aτ gibt mit EJeK A v{x 7→ a} = tt (sonst ff ) I EJ(e ⊃ e1 ; e2 )K A v: falls EJeK A v = tt, dann EJe1 K A v, sonst EJe2 K A v. A. Knapp, G. Schellhorn: Formale Methoden 271 HOL: λ-Ausdrücke I HOL erlaubt die Definition von anonymen Funktionen: λn . n + 2 ist die Funktion, die jedem n den Wert n + 2 zuordnet. I Allgemeine Definition: Ist e ein Ausdruck des Typs τ und sind x1 , . . . , xn Variablen der Typen τ1 , . . . , τn , so ist λx1 , . . . , xn . e eine Funktion vom Typ τ1 × . . . × τn → τ I Semantik: EJλ~x . eK A v ist die Funktion, die zu jedem ~a passenden Typs als Ergebnis EJeK A v{~x 7→ ~a} berechnet. A. Knapp, G. Schellhorn: Formale Methoden 272 HOL: Varianten und Vereinfachungen I Eine Funktion f : A × B → C ist äquivalent zu f : A → (B → C): Currying I Deshalb: Man kann auf mehrstellige Funktionen verzichten. I Quantoren können als Abkürzung aufgefaßt werden: ∀x . ϕ gilt genau dann, wenn λx . ϕ = λx . true. I Notation: Wenn nur einstellige Funktionen: Schreibe f x statt f (x) wie in funktionalen Programmiersprachen I Einstellige Funktionen mit Polymorphie (Generics in Java) z. B. in Isabelle I In KIV: nur mehrsortig, mehrstellige Funktionen, Parametrisierung statt Polymorphie A. Knapp, G. Schellhorn: Formale Methoden 273 HOL: Axiome Die Erweiterung der Logik erfordert zusätzliche Axiome: I Extensionalität: f = g ↔ ∀x . f (x) = g(x) I I I I realisiert als Regeln (expand left) und (expand right) β -Reduktion: (λ~x . f )(~e) = f {~x 7→ ~e} im Simplifier Auswahlaxiom: (∀~x . ∃y . ϕ) → ∃f . ∀~x . ϕ{y 7→ f (~x)} I realisiert als Regeln (choice left), (choice right) A. Knapp, G. Schellhorn: Formale Methoden 274 Eigenschaften von HOL I HOL-Kalkül ist (sehr) unvollständig, aber auch sehr ausdrucksstark I Mengenlehre (mit evtl. unendlichen Mengen!) läßt sich codieren: Statt {x | ϕ(x)} charakteristische (boolesche) Funktion λx . ϕ(x) I Es gibt jetzt eine Formel für strukturelle Induktion mit Variable P : nat → bool ∀P . (P(0) ∧ ∀n . P(n) → P(n+1)) → ∀n . P(n) I automatisches Beweisen wird wesentlich schwieriger A. Knapp, G. Schellhorn: Formale Methoden 275 Existenz und Eindeutigkeit: Beispiele (1a) Spezifikation der Ganzzahldivision x div y Nat div : nat nat → nat, Ax Alternativen für Axiome Ax I Ax1: y 6= 0 → (x div y = k ↔ k ∗ y ≤ x ∧ x < (k + 1) ∗ y) I I Ohne y 6= 0 inkonsistent Es gilt, daß ein passendes k immer existiert: Nat |= ∀x, y . ∃k . y 6= 0 → k ∗ y ≤ x ∧ x < (k + 1) ∗ y I div ist die Skolemfunktion dieser Formel I Die entsprechende Formel mit Skolemfunktion eingesetzt ist: Ax2: y 6= 0 → (x div y) ∗ y ≤ x ∧ x < ((x div y) + 1) ∗ y I Wegen Skolemisierung Anreicherung mit Ax2 hierarchiepersistent A. Knapp, G. Schellhorn: Formale Methoden 276 Existenz und Eindeutigkeit: Beispiel (1b) I Ax2 ist äquivalent zu →“ in der Äquivalenz von Ax1 ” Die Rückrichtung ←“ in der Äquivalenz verlangt, daß k eindeutig ist. ” I Gäbe es zwei verschiedene k, die Ax1 erfüllen, wäre die Spezifikation inkonsistent. I I Bei Ax2 ist die Spezifikation i. a. nicht eindeutig: Es gibt evtl. mehrere Funktionen I k ist aber eindeutig, denn es gilt: |= y 6= 0 ∧ k ∗ y ≤ x < (k + 1) ∗ y ∧ k0 ∗ y ≤ x < (k0 + 1) ∗ y → k = k0 I Eindeutigkeit garantiert, daß auch die Anreicherung eindeutig ist. I Damit: Mit Ax1 zu spezifizieren, erfordert Nachweis der Existenz und der Eindeutigkeit; mit Ax2 zu spezifizieren, erfordert nur Nachweis der Existenz. Beide Axiome laufen ohne Beweise Gefahr, inkonsistent zu werden. A. Knapp, G. Schellhorn: Formale Methoden 277 Spezifikation über Existenz und Eindeutigkeit Satz Sei ϕ(~x, y) eine Formel mit freien Variablen ~x der Sorten ~s und y der 0 Sorte s über einer Spezifikation Sp. Außerdem sei exists = ∀~x . ∃y . ϕ(~x, y) unique = ∀~x, y, z . ϕ(~x, y) ∧ ϕ(~x, z) → y = z Sp0 = Sp f : ~s → s0 , f (~x) = y ↔ ϕ(~x, y) Sp00 = Sp f : ~s → s0 , ϕ(~x, f (~x)) Dann gilt: I Wenn Sp 6|= exists, dann sind Sp0 und Sp00 inkonsistent. I Wenn Sp |= exists, dann ist Sp00 hierarchiepersistent. I Wenn Sp |= unique, dann sind Sp0 und Sp00 eindeutig. I Wenn Sp 6|= unique, ist Sp0 inkonsistent (aber nicht notwendig Sp00 ). I Wenn Sp |= exists und Sp |= unique, sind Sp0 und Sp00 äquivalent. A. Knapp, G. Schellhorn: Formale Methoden 278 Existenz und Eindeutigkeit: Beispiele (2) Spezifikation von .last und .butlast mit last-butlast: x 6= [] → x.butlast + x.last = x I Beweisbar ist: ∀x . ∃a . ∃y . x 6= [] → y + a = x I Mit vorigem Satz ist Hinzunahme von .last mit Axiom onlylast: ∀x . ∃y . x 6= [] → y + x.last = x hierarchiepersistent I Dieses Axiom hat wieder die Form ∀x . ∃y . . . .; also ist die Hinzunahme von last-butlast hierarchiepersistent I onlylast folgt aus last-butlast I .last und .butlast sind eindeutig spezifiziert, weil ∀x . x 6= [] ∧ y + a = x ∧ y0 + a0 = x → y = y0 ∧ a = a0 gilt. A. Knapp, G. Schellhorn: Formale Methoden 279 Existenz und Eindeutigkeit: Beispiele (1c) Ganzzahldivision mit Existenz und Eindeutigkeit zu definieren, erfordert Beweise. Rekursive Ansätze I Versuch 1: strukturell über y I x div 0 wird nicht spezifiziert. I Welches ϕ in x div (y +1) = ϕ(x div y) wählen? I Versuch 2: strukturell über x I div-base: y 6= 0 → 0 div y = 0 I Welches ϕ für div-rec: y 6= 0 → x +1 div y = ϕ(x div y) wählen? I Es geht mit ϕ(z) = (x mod y = y −1 ⊃ z +1; z) I Einfachere, implementierungsnahe rekursive Definition div-base: x < y → x div y = 0 div-rec: y 6= 0 ∧ x ≥ y → x div y = (x − y) div y +1 I Korrektheit? Korrekt für y = 0? Eindeutigkeit? A. Knapp, G. Schellhorn: Formale Methoden 280 Existenz und Eindeutigkeit: Beispiele (3) Löschen aus Multimengen I Axiome zum Löschen aller Vorkommen (delall) aus Multisets mit Hilfe des Löschens eines Vorkommens (delone) ¬a ∈ s → delall(s, a) = s a ∈ s → delall(s, a) = delall(delone(s, a), a) I implementierungsnah I Sinnvolle Definition? A. Knapp, G. Schellhorn: Formale Methoden 281 Allgemeine rekursive Definition Definition Eine allgemeine rekursive Definition für ein f ist gegeben durch eine Menge von Axiomen der Form ϕ → f (~x) = t, wobei sich die Vorbedingungen ϕ gegenseitig ausschließen und f nicht enthalten, und in ϕ und t nur die freien Variablen ~x vorkommen. Wenn die Formeln ϕ alle Fälle abdecken, so heißt die Definition vollständig. I In t dürfen (ein oder mehrere) rekursive Aufrufe f (~t0 ) vorkommen. I Vollständige Definitionen kann man durch Verwendung des “if-then-else”-Operators ⊃ immer in der Form f (~x) = t schreiben. A. Knapp, G. Schellhorn: Formale Methoden 282 Rekursion und Nichtterminierung (1) Ein rekursives Programm liefert immer eine eindeutige partielle Funktion (bei Nichterminierung undefiniert). In Logik wird eine totale Funktion erzwungen. Die Spezifikation kann dann uneindeutig oder auch inkonsistent sein. Beispiele I f(n) = f(n): Programm terminiert nicht, spezifiziert wird eine beliebige Funktion I f(n) = f(n +1) (über den natürlichen Zahlen): Programm terminiert nicht, spezifiziert wird eine konstante Funktion I f(n) = f(n) +1: Programm terminiert nicht, Spezifikation ist inkonsistent I leq(i, j) ↔ i = j ∨ leq(i, j −1) (über den ganzen Zahlen): terminiert genau für i ≤ j (und liefert true), Spezifikation hat auch: leq(i, j) gilt für alle i, j als Modell. A. Knapp, G. Schellhorn: Formale Methoden 283 Rekursion und Nichtterminierung (2) Wenn die Rekursion nicht terminiert, ergibt sich in der Spezifikation Beliebiges. Wir zeigen: Wenn die Rekursion immer terminiert, dann ergibt sich eine eindeutig spezifizierte Funktion. Diese ist dann auch das Ergebnis der Rekursion. Sicherstellung der Termination Definiere Relation x~0 ≺ ~x durch f (x~0 ) ist rekursiver Aufruf in f (~x)“. ” I Zeige, daß die Argumente abnehmen, und das nicht unendlich oft können. I I Nachweis, daß ≺ eine noethersche Relation ist. A. Knapp, G. Schellhorn: Formale Methoden 284 Noethersche Relationen Definition Sei A eine Menge und ≺ ⊆ A × A. Die Relation ≺ heißt noethersch (oder wohlfundiert, engl. well-founded), wenn es keine unendlichen ≺-Ketten der Form . . . ≺ a3 ≺ a2 ≺ a1 ≺ a0 in A gibt. Beispiele und Gegenbeispiele: I < auf N ist noethersch. I ⊂ auf endlichen Mengen ist noethersch (aber nicht ⊆). I x y definiert durch length(x) < length(y) auf Listen ist noethersch. I < auf Z ist nicht noethersch. A. Knapp, G. Schellhorn: Formale Methoden 285 Noethersche Relationen: Beispiele (1) Satz Ordnungsprädikate aus Datendefinitionen sind noethersch. Beweisskizze t ≺ t0 bedeutet, daß t weniger Konstruktoren als t0 hat. Also kann eine Kette, die bei t beginnt, nur Anzahl der Konstruktoren von t lang sein. I insbesondere < für Nat noethersch Satz Sei für einen Datentyp D eine Größenfunktion # : D → N gegeben. Dann ist d ≺ d0 definiert durch #(d) < #(d0 ) eine noethersche Relation. Beweisskizze Eine unendliche Kette . . . ≺ d2 ≺ d1 ≺ d0 ergäbe auch eine unendliche Kette . . . < #(d2 ) < #(d1 ) < #(d0 ). I Insbesondere für Größenfunktionen length für Listen, Kardinalität für Mengen, die size functions in Datendefinitionen I Fast alle Terminerungsbeweise funktionieren mit einer Größenfunktion. A. Knapp, G. Schellhorn: Formale Methoden 286 Noethersche Relationen: Beispiele (2) Satz Sind A und B Mengen und ≺1 ⊆ A × A und ≺2 ⊆ B × B noethersch, so ist auch die lexikalische Kombination ≺ ⊆ (A × B) × (A × B) von ≺1 und ≺2 mit (a, b) ≺ (a0 , b0 ) gdw. a ≺1 a0 ∨ (a = a0 ∧ b ≺2 b0 ) noethersch. Beweisskizze Angenommen es gäbe eine Kette . . . ≺ (a2 , b2 ) ≺ (a1 , b1 ) ≺ (a0 , b0 ). I Dann nimmt ai nach Definition in jedem Schritt (bzgl. I ≺1 ) ab oder bleibt gleich. ai kann nicht unendlich oft abnehmen, da ≺1 noethersch ist. Also wird ai irgendwann konstant. I Ab dieser Stelle nimmt bi unendlich oft ab, im Widerspruch zur Voraussetzung, daß ≺2 noethersch ist. A. Knapp, G. Schellhorn: Formale Methoden 287 Noethersche Relationen und partielle Ordnungen Satz Sei ≺ ⊆ A × A eine noethersche Relation. I ≺ ist irreflexiv. I Ist ≺0 ⊆ ≺, so ist ≺0 noethersch. I Die transitive Hülle ≺+ ist noethersch und eine partielle Ordnung. I Insbesondere kann man bei noetherschen Relationen immer Transitivität fordern. A. Knapp, G. Schellhorn: Formale Methoden 288 Noethersche Relationen und Rekursion Für eine allgemeine rekursive Definition von f definiere man ein Prädikat x~0 ≺ ~x, das genau dann zutrifft, wenn I es einen Fall ϕ → f (~x) = t gibt I ϕ gilt und x~0 = ~t0 für einen rekursiven Aufruf f (~t0 ) in t. Dann: Rekursion terminiert immer, genau dann, wenn ≺ noethersch. Beispiel: Ganzzahldivision I I Axiom: y 6= 0 ∧ x ≥ y → x div y = (x − y) div y +1 Zugehörige Relation: (x0 , y0 ) ≺ (x, y) ↔ y 6= 0 ∧ x ≥ y ∧ x0 = x − y ∧ y0 = y. I Es gilt offenbar: (x0 , y0 ) ≺ (x, y) → x0 < x I Damit ist nach dem vorigem Satz ≺ noethersch. Allgemein: Man zeige für eine bekannte noethersche Relation, daß die Argumente im rekursiven Aufruf abgenommen haben. A. Knapp, G. Schellhorn: Formale Methoden 289 Wohlfundierte Rekursion Satz Sei ≺ eine noethersche Relation, und sei eine vollständige allgemein rekursive Definition mit Axiomen ϕ → f (~x) = t gegeben. Dann gibt es zu jedem Ausdruck e(~x), der f nicht enthält, immer genau eine totale Funktion f , die die folgenden abgeänderten Axiome erfüllt: ϕ → f (~x) = t{f 7→ f 0 }, wobei f 0 (~y) = (~y ≺ ~x ⊃ f (~y); e(~y)). Ohne Beweis I Für fixe Stelligkeit im Kalkül beweisbar. I Intuition: Die Rekursion wird abgebrochen (und irgendein e(~y) als Ergebnis genommen), wenn die Argumente nicht kleiner geworden sind. I Für unvollständige Definitionen gilt, daß es zu jeder Ergänzung zu einer vollständigen Definition eine Funktion gibt, die Definition also nicht mehr eindeutig ist. A. Knapp, G. Schellhorn: Formale Methoden 290 Wohlfundierte Rekursion: Beispiele Ganzzahldivision I Originalaxiom: y 6= 0 ∧ x ≥ y → x div y = (x − y) div y +1 I Modifiziertes Axiom (mit < ⊆ N × N als noetherscher Ordnung): y 6= 0 ∧ x ≥ y → x div y = (x − y < x ⊃ (x − y) div y +1; e(x, y)) I Äquivalent zum Originalaxiom, da der “else”-Fall nie verwendet wird. Löschen aus einer Multimenge I Originalaxiom: a ∈ s → delall(s, a) = delall(delone(s, a), a) I Modifiziertes Axiom (für Größe der Multimenge): a ∈ s → delall(s, a) = delall(#delone(s, a) < #s ⊃ delall(delone(s, a), a); e(s, a)) I Äquivalent zum Original, da a ∈ s → #delone(s, a) < #s beweisbar ist. Man kann allgemeine rekursive Definitionen auch nur dann erlauben, wenn ein ≺ angegeben wird und die Äquivalenz von Original und modifiziertem Axiom gezeigt werden kann (als Option z. B. in Isabelle). A. Knapp, G. Schellhorn: Formale Methoden 291 Charakterisierung noetherscher Relationen Satz Eine Relation ≺ ⊆ A × A ist genau dann noethersch, wenn jede nicht-leere Menge M ⊆ A ein ≺-minimales Element besitzt, es also ein Element a ∈ M gibt, zu dem kein b ∈ M mit b ≺ a existiert. Beweisskizze ⇒“: Angenommen es gibt eine Menge M ohne ≺-minimales Element. ” I Wähle ein erstes Element a0 I Da es kein ∈ M (existiert, da M 6= ∅). ≺-minimales Element in M ist, gibt es ein a1 ∈ M mit a1 ≺ a0 . I Zu a1 gibt es weiteres Element a2 ∈ M mit a2 ≺ a1 usw. I Nach dem Auswahlaxiom kann man also eine unendliche absteigende Kette konstruieren. ⇐“: Eine unendliche ≺-Kette als Menge {. . . , a1 , a0 } ist eine nicht-leere Menge ohne ≺-minimales Element. ” A. Knapp, G. Schellhorn: Formale Methoden 292 Noethersche Relationen in Logik Satz Sei ≺ ein zweistelliges Prädikatsymbol. Es gibt keine prädikatenlogische Formel ϕ (in der ≺ vorkommt), sodaß gilt: A |= ϕ genau dann, wenn ≺A eine noethersche Relation ist. Falls es ein ϕ gäbe, betrachte man die Formelmenge {. . . , c2 ≺ c1 , c1 ≺ c0 , ϕ} mit neuen Konstanten c0 , c1 , . . .. Die ganze Menge hat kein Beweisskizze Modell, aber jede endliche Teilmenge hat ein Modell, im Widerspruch zum Endlichkeitssatz. I In Higher-Order-Logik läßt sich eine solche Formel angeben wf(≺) ↔ ∀P . (∃x . P(x)) → ∃y . P(y) ∧ ¬∃z . z ≺ y ∧ P(z) I Prädikat P für Menge, ∃x . P(x) bedeutet, daß die Menge nicht leer ist, y ist ein ≺-minimales Element A. Knapp, G. Schellhorn: Formale Methoden 293 Noethersche Induktion Eine Relation ≺ ⊆ A × A is noethersch genau dann, wenn für jedes P ⊆ A gilt: Wenn für jedes a ∈ A aus der Gültigkeit von P(a0 ) für alle Elemente a0 ≺ a die Gültigkeit von P(a) gefolgert werden kann, so gilt P für alle Elemente von A: Satz ∀a . (∀a0 . (a0 ≺ a → P(a0 )) → P(a)) → ∀b . P(b) Beweisskizze ⇒“: Sei ≺ noethersch und der Vordersatz richtig, es gebe aber ein b ” für das P(b) falsch ist. Dann ist die Menge aller b, für die P(b) falsch ist, nicht leer und hat damit ein ≺-minimales Element a. Für alle Elemente a0 ≺ a ist P(a0 ) dann richtig, und also nach dem Vordersatz auch P(a), im Widerspruch zur Annahme. ⇐“: Angenommen M ist eine nicht-leere Menge, die kein ≺-minimales Element hat. ” Setze P(b) zu b ∈ / M . Falls für ein a alle a0 ≺ a nicht in M sind, so kann auch a nicht in M sein, sonst wäre es ein ≺-minimales Element von M . Aus der Implikation folgt also: kein Element ist in M , im Widerspruch zur Annahme. A. Knapp, G. Schellhorn: Formale Methoden 294 Noethersche Induktionsregel Definition Sei ~y = fvar(Γ ⇒ ∆) \ {x} und ≺ noethersch. Dann ist die noethersche Induktionsregel über x gegeben durch (Ind≺) ∀~y . ∀x0 . x0 ≺ x → ( V Γ→ W ∆){x 7→ x0 }, Γ ⇒ ∆ Γ⇒∆ Beispiele I Natürliche Zahlen: I Listen: ∀n0 . n0 < n → ϕ(n0 ) ⇒ ϕ(n) ⇒ ϕ(n) ∀l0 . (l0 l) → ϕ(l0 ) ⇒ ϕ(l) ⇒ ϕ(l) A. Knapp, G. Schellhorn: Formale Methoden 295 Noethersche Induktion in KIV (1) I In KIV ist die Regel (induction) mit den vordefinierten Ordnungsprädikaten (pro Sorte eines) und den Größenfunktionen anwendbar. I Größenfunktionen für nichtfreie Datentypen kann man mit Unit – Add ” HeuristicInfo“ hinzufügen. Die Induktionshypothese wird in KIV als Ind-Hyp“ abgekürzt angezeigt. ” I Goal-Again with Ind-Hyp“ zeigt die Induktionshypothese an. ” I Anwendung der Induktionshypothese mit (apply induction) (statt (all left)). I A. Knapp, G. Schellhorn: Formale Methoden 296 Noethersche Induktion in KIV (2) I Strukturelle Induktion für strukturell rekursiv definierte Funktionen I Analog: Noethersche Induktion für wohlfundiert allgemein rekursiv definierte Funktionen I Typischer Beweis: Induktion — Definition anwenden — Induktionshypothese anwenden I Allerdings: Im Gegensatz zu struktureller Induktion kann die Definition nicht als Rewriteregel angewandt werden. Für echte Programme gibt es daher die KIV-Heuristik einmal Definition anwenden“. ” A. Knapp, G. Schellhorn: Formale Methoden 297 Zusammenfassung I Strukturierte Spezifikationen I I Anreicherung, Vereinigung, Umbenennung Hierarchiepersistenz, Eindeutigkeit I Generische Spezfikationen I Nichtfreie Datentypen I Nichtrekursive, rekursive und allgemein rekursive Definitionen I Noethersche Relationen, noethersche Induktion I Resolution I Higher-Order-Logik A. Knapp, G. Schellhorn: Formale Methoden 298 Deduktion über Programme (1) Alternative 1: Definition der Semantik von Programmen als Funktion auf einer Datenstruktur: J−K : Program → SemanticValue Vorteile: I Formale Definition und Beweise über die Semantik möglich: Korrektheit der Typisierung, korrekte Compilation, etc. I Keine Änderung der Logik Nachteile: I Kalkül für Programme muß reduziert werden auf Prädikatenlogik; aufwendig, ineffizient I Syntax der Programme (Parsing) exakt zu imitieren erfordert sehr viel Flexibilität I Programmvariablen nicht Variablen der Logik; man erbt keine Typisierung I allerdings nutzt das nichts, wenn die Typen der Logik nicht den Typen der Programmiersprache entsprechen A. Knapp, G. Schellhorn: Formale Methoden 299 Deduktion über Programme (2) Alternative 2: Erweiterung der Logik I Programmvariablen sind Variablen der Logik. I Ein Zustand eines Programms ist eine Belegung der Logik. I Abstrakte Programme, die über abstrakte Datentypen (auch solche, die nicht direkt schon in einer Programmiersprache vorhanden sind) und abstrakte Konzepte reden, ohne schon mit allen Details von Programmen belastet“ zu sein. ” A. Knapp, G. Schellhorn: Formale Methoden 300 Programme: Syntax Definition Die Menge der Programme p ∈ P(Σ, X) besteht aus I Sofortige Termination: skip I Nichtterminierung: abort I Parallele Zuweisung: x1 := t1 , x2 := t2 , . . ., xn := tn I mit Variablen x ∈ X , Termen t ∈ T (Σ, X) i i I kurz: ~ x := ~t I Sequentielle Komposition: p1 ; p2 I Fallunterscheidung: if b then p1 else p2 I b ist (normalerweise) quantorenfreie Formel aus F (Σ, X) I Abkürzung: if b then p für if b then p else skip I Schleife: while b do p I In konkreter Syntax Blöcke begin p end für eindeutige Klammerung. A. Knapp, G. Schellhorn: Formale Methoden 301 Programme: Zustände Für eine Σ-Algebra A betrachtet man die Menge SA = {v | v : S s∈S Xs → As } der Variablenbelegungen. I Im folgenden meist nur S (ohne Index), wenn Algebra A klar. I Eine Variablenbelegung aus S kann man als einen Zustand eines Programms ansehen. I Einfachster Fall eines Zustands; genügt für abstrakte Programme. I Für komplexere Programme allgemeiner: Ein Zustand enthält eine Variablenbelegung. A. Knapp, G. Schellhorn: Formale Methoden 302 Programmsemantik: Ein-/Ausgabe-Verhalten Für die Definition einer Semantik von Programmen oder auch anderen Spezifikations- und Programmierkonstrukten hat man immer zwei Möglichkeiten, je nachdem welche Eigenschaften interessant sind. Alternative 1: Beschreibung des Effekts, d. h. des Ein- Ausgabeverhaltens eines Programms oder Ausdrucks I I Big-step Semantik: JpK(input) = output genügt für den Korrektheitsnachweis von Kalkülen für sequentielle Programme I auch relevant für funktionale und sequentielle objektorientierte Programme und Ausdrücke I auch verwendet für die Definition von Logik A. Knapp, G. Schellhorn: Formale Methoden 303 Programmsemantik: Abläufe Alternative 2: Berücksichtigung von Zwischenzuständen I Explizite Trace-Semantik (Menge von Abläufen) oder implizite small-step Semantik (Schritte von (p, v) nach (p0 , v0 ); die Abläufe ergeben sich generisch) I feingranularer und maschinennäher als Alternative 1 I relevant für Compilerbau: jeder Schritt wird durch Maschineninstruktionen implementiert I relevant für parallele Systeme (z. B. Threads, Statecharts) I relevant für die Modellierung von allen Systemen, die evtl. endlos laufen (z. B. Betriebssysteme, eingebettete Systeme etc.) I notwendig als Semantik für Kalküle, die über die Zwischenzustände reden (Temporallogik: es gilt ständig ϕ“, es gilt immer wieder ϕ“) ” ” A. Knapp, G. Schellhorn: Formale Methoden 304 Programme: Relationale Semantik (1) Ein Programm überführt einen Anfangszustand in einen Endzustand: JpK : S → S Probleme mit dieser Semantik: I Was ist die Semantik von abort? I Addiere ⊥ mit der Bedeutung terminiert nicht“: JpK : S → S ∪ {⊥} ” I Wie auf indeterministische Programme erweitern? I nicht nur ein Ergebnis, sondern potentiell mehrere A. Knapp, G. Schellhorn: Formale Methoden 305 Programme: Relationale Semantik (2) Deshalb: Relationale Semantik RJpK ⊆ S × S I (v, v0 ) ∈ RJpK bedeutet: Zustand v wird von p in v0 überführt I Wenn zu v kein v0 mit (v, v0 ) ∈ RJpK vorhanden ist: s terminiert nicht, wenn in v gestartet I Wenn {(v, v0 ), (v, v00 )} ⊆ RJpK, so ist das Programm mit v gestartet indeterministisch mit zwei möglichen Endzuständen: v0 und v00 I Derzeit betrachtete Programme sind deterministisch: zu jedem v höchstens ein v0 A. Knapp, G. Schellhorn: Formale Methoden 306 Programme: Relationale Semantik (3) Die relationale Semantik RJpK A eines Programmes p ∈ P(Σ, X) bzgl. der Algebra A ∈ Alg(Σ) ist rekursiv gegeben durch Definition RJabortK A = ∅ RJskipK A = {(v, v) | v ∈ SA } RJ~x := ~tK A = {(v, w) | w = v{~x 7→ T J~tK A v}} RJp1 ; p2 K A = {(u, w) | ∃v . (u, v) ∈ RJp1 K A ∧ (v, w) ∈ RJp2 K A} RJif b then p1 else p2 K A = {(v, w) | (A, v |= b ∧ (v, w) ∈ RJp1 K A) ∨ (A, v |= ¬b ∧ (v, w) ∈ RJp2 K A)} RJwhile b do pK A = S n n∈N RJ(if b then p else abort) ; if b then abortK A wobei pn = p ; ...; p | {z n mal (formal p0 = skip, pn+1 = p ; pn ) } A. Knapp, G. Schellhorn: Formale Methoden 307 Korrektheitsbegriffe für Programme Partielle Korrektheit: {ϕ} p {ψ} I Falls zu Beginn ϕ gilt und p terminiert, I dann gilt anschließend ψ . Totale Korrektheit: [ϕ] p [ψ] I Falls zu Beginn ϕ gilt, I dann terminiert p und anschließend gilt ψ . I ϕ heißt Vorbedingung für das Programm p, ψ die Nachbedingung. I Die Angabe einer Vor- und Nachbedingung ist die Standardmethode, um die Funktionalität einzelner Programme (Prozeduren, Methoden) zu spezifizieren. I Vor- und Nachbedingung zusammen heißen oft Kontrakt. A. Knapp, G. Schellhorn: Formale Methoden 308 Korrektheitsaussagen: Semantik Definition Sei p ∈ P(Σ, X), A ∈ Alg(Σ), ϕ, ψ ∈ F (Σ, X). I A |= {ϕ} p {ψ}, falls für jedes v ∈ SA mit A, v |= ϕ und jedes w ∈ SA mit (v, w) ∈ RJpK A gilt: A, w |= ψ . I A |= [ϕ] p [ψ], falls es für jedes v ∈ SA mit A, v |= ϕ ein w ∈ SA gibt mit (v, w) ∈ RJpK A und A, w |= ψ . A. Knapp, G. Schellhorn: Formale Methoden 309 Korrektheitsaussagen: Beispiele Partielle Korrektheit I |= {true} x := 2 {x = 2} I |= {x = 2} x := x + 1 {x = 3} I |= {x = y} x := x + 1 {x − 1 = y} I |= {x = a ∧ y = b} x := y, y := x {x = b ∧ y = a} I |= {x = 2} abort {x > 2} Unterschied partielle und totale Korrektheit I |= {true} if y = 0 then abort else x := 1 {x = 1} I 6|= [true] if y = 0 then abort else x := 1 [x = 1] I |= [y 6= 0] if y = 0 then abort else x := 1 [x = 1] A. Knapp, G. Schellhorn: Formale Methoden 310 Hoare-Kalküle I Entwickelt von Robert W. Floyd (1967) und Charles A. R. Hoare (1969) Sp `HP {ϕ} p {ψ} Sp `HT [ϕ] p [ψ] I Kalküle HP, HT: Regeln zur Behandlung von Programmen zusammen mit Regeln des Sequenzenkalküls A. Knapp, G. Schellhorn: Formale Methoden 311 Hoare-Kalkül für partielle Korrektheit: Regeln (1) (skiphp ) (aborthp ) (assignhp ) (seqhp ) {ϕ} skip {ϕ} {ϕ} abort {ψ} {ϕ{~x 7→ ~t}}~x := ~t {ϕ} {ϕ} p1 {ψ} {ψ} p2 {χ} {ϕ} p1 ; p2 {χ} A. Knapp, G. Schellhorn: Formale Methoden 312 Hoare-Kalkül für partielle Korrektheit: Regeln (2) {ϕ ∧ b} p1 {ψ} (ifhp ) {ϕ} if b then p1 else p2 {ψ} (whilehp ) (conshp ) I {ϕ ∧ ¬b} p2 {ψ} {ϕ ∧ b} p {ϕ} {ϕ} while b do p {ϕ ∧ ¬b} {ϕ0 } p {ψ 0 } {ϕ} p {ψ} , falls Sp `PL ϕ → ϕ0 , Sp `PL ψ 0 → ψ In (whilehp ) ϕ Invariante A. Knapp, G. Schellhorn: Formale Methoden 313 Hoare-Kalkül für partielle Korrektheit: Beweisabriß Proof outline I Einfügung von Zusicherungen {ϕ} nach jeder Zeile eines Programms I eventuell Auslassung von (conshp )-Anwendungen I Insbesondere Angabe der Invariante A. Knapp, G. Schellhorn: Formale Methoden 314 Hoare-Kalkül für partielle Korrektheit: Beispiel (1) Beweisabriß {x ≥ 0 ∧ y > 0} ϕ1 : {x = 0 ∗ y + x ∧ x ≥ 0 ∧ y > 0} d := 0; ψ1 = ϕ2 : {x = d ∗ y + x ∧ x ≥ 0 ∧ x ≥ 0 ∧ y > 0} r := x; ψ2 = Inv: {x = d ∗ y + r ∧ r ≥ 0 ∧ x ≥ 0 ∧ y > 0} while r ≥ y do begin Inv ∧ r ≥ y: {x = d ∗ y + r ∧ r ≥ 0 ∧ x ≥ 0 ∧ y > 0 ∧ r ≥ y} Inv{d 7→ d + 1}{r 7→ r − y}: {x = (d + 1) ∗ y + (r − y) ∧ r − y ≥ 0 ∧ x ≥ 0 ∧ y > 0} r := r − y; Inv{d 7→ d + 1}: {x = (d + 1) ∗ y + r ∧ r ≥ 0 ∧ x ≥ 0 ∧ y > 0} d := d + 1; Inv: {x = d ∗ y + r ∧ r ≥ 0 ∧ x ≥ 0 ∧ y > 0} end Inv ∧ r < y: {x = d ∗ y + r ∧ r ≥ 0 ∧ x ≥ 0 ∧ y > 0 ∧ r < y} {d = x div y} A. Knapp, G. Schellhorn: Formale Methoden 315 Hoare-Kalkül für partielle Korrektheit: Beispiel (2) {x ≥ 0 ∧ y > 0} ϕ1 d := 0 ψ1 ϕ2 r := x ψ2 Inv Inv ∧ r < y Inv r≥y {d = x div y} Inv ∧ r ≥ y Inv{d 7→ d + 1}{r 7→ r − y} r := r − y Inv{d 7→ d + 1} d := d + 1 A. Knapp, G. Schellhorn: Formale Methoden 316 Hoare-Kalkül für partielle Korrektheit: Beispiel (3) x ≥ 0∧y > 0 Inv{r 7→ x}{d 7→ 0} d := 0 Inv{r 7→ x} r := x Inv ∧ r < y d = x div y r<y Inv r≥y Inv ∧ r ≥ y Inv{d 7→ d + 1}{r 7→ r − y} d := d + 1 r := r − y Inv{d 7→ d + 1} A. Knapp, G. Schellhorn: Formale Methoden 317 Hoare-Kalkül für totale Korrektheit HT wie HP (mit [−] statt {−}), nur Änderungen für abort und while wegen möglicher Nichtterminierung. Bedingung bei abort-Regel: Vorbedingung muß falsch sein: (abortht ) [ϕ] abort [ψ], falls `PL ¬ϕ Bedingung bei while-Regel: Schleife darf nur endlich oft durchlaufen werden: Benutze dazu noethersche Ordnung ≺ und einen Term t, der durch das Programm bzgl. ≺ verkleinert wird, sowie eine Variable x ∈ / var(p). (whileht ) [ϕ ∧ b ∧ x = t] p [ϕ ∧ t ≺ x] [ϕ] while b do p [ϕ ∧ ¬b] A. Knapp, G. Schellhorn: Formale Methoden 318 Hoare-Kalkül für totale Korrektheit: Beispiel Beweisabriß [x ≥ 0 ∧ y > 0] [x = 0 ∗ y + x ∧ x ≥ 0 ∧ y > 0] d := 0; [x = d ∗ y + x ∧ x ≥ 0 ∧ x ≥ 0 ∧ y > 0] r := x; [x = d ∗ y + r ∧ r ≥ 0 ∧ x ≥ 0 ∧ y > 0] while r ≥ y do begin [x = d ∗ y + r ∧ r ≥ 0 ∧ x ≥ 0 ∧ y > 0 ∧ r ≥ y ∧ a = r] [x = (d + 1) ∗ y + (r − y) ∧ r − y ≥ 0 ∧ x ≥ 0 ∧ y > 0 ∧ r − y < a] r := r − y; [x = (d + 1) ∗ y + r ∧ r ≥ 0 ∧ x ≥ 0 ∧ y > 0 ∧ r < a] d := d + 1; [x = d ∗ y + r ∧ r ≥ 0 ∧ x ≥ 0 ∧ y > 0 ∧ r < a] end [x = d ∗ y + r ∧ r ≥ 0 ∧ x ≥ 0 ∧ y > 0 ∧ r < y] [d = x div y] A. Knapp, G. Schellhorn: Formale Methoden 319 Korrektheit der Hoare-Kalküle Satz gilt: Die Hoare-Kalküle für partielle und totale Korrektheit sind korrekt. Es Sp `HP {ϕ} p {ψ} ⇒ Sp |= {ϕ} p {ψ} und Sp `HT [ϕ] p [ψ] ⇒ Sp |= [ϕ] p [ψ] Ohne Beweis A. Knapp, G. Schellhorn: Formale Methoden 320 Unvollständigkeit des Hoare-Kalküls Nat = data specification nat = 0 | . +1 (. -1 : nat) end data specification {x = 0 ∧ y = y0 } while y 6= 0 do begin y := y -1; x := x +1 end {x = y0 } Schleifeninvariante x + y = y0 keine Formel in Nat I selbes Problem wie bei Induktionshypothesen A. Knapp, G. Schellhorn: Formale Methoden 321 Relative Vollständigkeit des Hoare-Kalküls Satz Die Hoare-Kalküle für partielle und totale Korrektheit sind unvollständig. Wenn die zugrundeliegende Spezifikation die Arithmetik mit (0, 1, +, ∗) enthält, ist der Kalkül vollständig, wenn man annimmt, alle wahren Aussagen über (0, 1, +, ∗) seien als Axiome vorhanden (relative Vollständigkeit). Ohne Beweis (Stephen A. Cook 1978) I Die Unvollständigkeit liegt daran, daß eine Schleife wird endlich oft iteriert“ ” dieselbe Problematik wie die Generiertheitsklausel hat (jede natürliche Zahl kann mit endlich vielen s-Aufrufen errreicht werden). I Die relative Vollständigkeit folgt daraus, daß man mit (0, 1, +, ∗) alle Programme in arithmetische Formeln codieren kann. A. Knapp, G. Schellhorn: Formale Methoden 322 Dynamische Logik I Modale Logik für Korrektheit von Programmen I Erweiterung der Formeln um Programme, Erweiterung des Kalküls für neue Formeln I Entwickelt von Vaughan R. Pratt (1976) I I basierend auf Andrzej Salwickis algorithmischer Logik (1970) Bezeichnung dynamische Logik“ von David Harel (1977) ” A. Knapp, G. Schellhorn: Formale Methoden 323 Dynamische Logik: Syntax (1) Definition Die Menge D(Σ, X) der Formeln der dynamischen Logik über der Signatur Σ und der Variablenmenge X enthält I alle prädikatenlogischen Formeln F (Σ, X) I für p ∈ P(Σ, X) und ϕ ∈ D(Σ, X) auch [p]ϕ und hpiϕ. Informelle Bedeutung I [p]ϕ: Wenn p terminiert, gilt anschließend ϕ“ I hpiϕ: p hält, und anschließend gilt ϕ“ ” ” In KIV sind statt der prädikatenlogischen Formeln ϕ alle Higher-Order-Formeln (boolesche Ausdrücke) zugelassen. A. Knapp, G. Schellhorn: Formale Methoden 324 Einordnung der dynamischen Logik I Dynamische Logik ist eine (Multi-)Modallogik. I Für jedes Programm gibt es einen Modal-Operator 2 und einen Modal-Operator ♦ (mit dem Programm in der “box” und dem “diamond”). I Modallogik mit Formeln 2ϕ und ♦ϕ stammen aus der philosophischen Logik. I Alethisch: Es ist notwendig, daß ϕ“, es ist möglich, daß ϕ“ ” ” I Epistemisch: Ich halte es für gewiß, daß ϕ“, ich halte es für möglich, daß ϕ“ ” ” I Deontisch: Es wird geboten, daß ϕ“, es ist erlaubt, daß ϕ“ ” ” I Temporal: ϕ gilt in der Zukunft immer“, ϕ gilt irgendwann in der Zukunft“ ” A. Knapp, G. Schellhorn: Formale Methoden ” 325 Dynamische Logik: Syntax (2) I Modal-Operatoren binden stärker als Junktoren: [p]ϕ ∧ ψ bedeutet ([p]ϕ) ∧ ψ I Schachtelung möglich: hp1 ihp2 iϕ bedeutet hp1 i(hp2 iϕ) I Auch gemischte Schachtelung: [p1 ](∀x . ϕ ∧ hp2 iψ) I Auch in dynamischer Logik betrachtet man Sequenzen, z. B. hp1 iϕ, ψ ⇒ hp2 ihp1 iχ, ρ A. Knapp, G. Schellhorn: Formale Methoden 326 Dynamische Logik: Semantik Definition Die Semantik von Formeln der dynamischen Logik ist definiert als A, v |= [p]ϕ ⇐⇒ für alle w ∈ SA : wenn (v, w) ∈ RJpK A, dann A, w |= ϕ A, v |= hpiϕ ⇐⇒ es gibt ein w ∈ SA mit (v, w) ∈ RJpK A und A, w |= ϕ I Es gilt: [p]ϕ ↔ ¬hpi¬ϕ I I Man könnte also Box mit Hilfe von Diamond definieren. Hoare-Tripel können als spezielle Formeln der dynamischen Logik angesehen werden: A, v |= {ϕ} p {ψ} ⇐⇒ A, v |= ϕ → [p]ψ A, v |= [ϕ] p [ψ] ⇐⇒ A, v |= ϕ → hpiψ A. Knapp, G. Schellhorn: Formale Methoden 327 Dynamische Logik als Verallgemeinerung der Hoare-Logiken I Wenn x in p vorkommt, x0 aber nicht, so besagt hpix = x0 : Am Ende von ” p hat x den Wert, den x0 jetzt hat“. I hp1 ix = x0 → hp2 ix = x0 besagt: Wann immer p1 in x einen Wert x0 ” ausrechnet, so tut das auch p2“ I Man kann in dynamischer Logik also über Programmähnlichkeit reden; wichtig, wenn man von einer abstrakten Spezifikation (mit abstrakten Programmen) zu konkreten übergehen will (Verfeinerung). A. Knapp, G. Schellhorn: Formale Methoden 328 Dynamische Logik: Beispiele I |= [x := 1]x = 1 I |= x = x0 → [x := x + 1]x = x0 + 1 I |= x = x0 → hx := x + 1ix = x0 + 1 Unterschied Box und Diamond: I |= x = 5 → [abort]x = 5 I 6|= x = 5 → habortix = 5 In Sequenzen Programme auch im Antezedent: I |= x = x0 ⇒ [x := x + 1]x = x0 + 1 I |= x > 0 ⇒ hwhile x > 1 do x := x − 1ix = 1 I |= hif x > 0 then y := 1 else abortiy = y0 ⇒ y0 = 1 ∧ x > 0 I |= [if x > 0 then y := 1 else abort]y = y0 ⇒ y0 = 1 ∧ x > 0 ∨ x = 0 A. Knapp, G. Schellhorn: Formale Methoden 329 Sequenzenkalkül DL für dynamische Logik Symbolische Ausführung von Programmen Ausführung des Programms p1 ; p2 ; . . . ; pn (pi ohne ; auf oberster Ebene) I Annahme: Initialer Zustand erfüllt Vorbedingung ϕ0 . I Berechne ϕ1 , die stärkste Formel, die nach p1 gilt; I berechne ϕ2 , die stärkste Formel, die nach p1 ; p2 gilt; I . . . solange, bis das Programm abgearbeitet ist. I Zum Schluß: Teste, ob ϕn die Nachbedingung impliziert (nur noch PL). I Gegenüber Hoare-Kalkül: Kein Raten von Zwischenformeln bzw. Rückwärtsausführen, stattdessen Zuweisung vorwärts ausführen. I Symbolische Ausführung sowohl im Antezedent als auch im Sukzedent. A. Knapp, G. Schellhorn: Formale Methoden 330 Sequenzenkalkül DL: Sequentielle Komposition (L[;]) (Lh;i) [p1 ][p2 ]ϕ, Γ ⇒ ∆ [p1 ; p2 ]ϕ, Γ ⇒ ∆ hp1 ihp2 iϕ, Γ ⇒ ∆ hp1 ; p2 iϕ, Γ ⇒ ∆ (R[;]) (Rh;i) Γ ⇒ [p1 ][p2 ]ϕ, ∆ Γ ⇒ [p1 ; p2 ]ϕ, ∆ Γ ⇒ hp1 ihp2 iϕ, ∆ Γ ⇒ hp1 ; p2 iϕ, ∆ I Normalisierung I In KIV: Nie explizit angewendet; die erste Anweisung wird bei jeder Regelanwendung (in allen Programmformeln) immer automatisch abgespalten; Programmformeln werden nach vorne rotiert. A. Knapp, G. Schellhorn: Formale Methoden 331 Sequenzenkalkül DL: Zuweisung (1) Originalregel im Hoare-Kalkül würde besagen: Γ ⇒ ([p]ϕ){x 7→ t}, ∆ Γ ⇒ [x := t][p]ϕ, ∆ Aber ([p]ϕ){x 7→ t} kann nicht [p{x 7→ t}](ϕ{x 7→ t}) sein: I Für t = 3 und p = x := x + 1 ergäbe sich ([x := x + 1]x = 5){x 7→ 3} = [3 := 3 + 1]3 = 5 I Die Substitution müßte den Effekt der Zuweisung in das Programm hineinziehen“. Das geht für die Zuweisung hier (Resultat wäre x := 3 + 1 ” und die Nachbedingung bliebe x = 5), aber nicht für allgemeine Programme (insbesondere Schleifen). I Substitution wird aber für Quantorenregeln (L∀), (R∃) gebraucht. A. Knapp, G. Schellhorn: Formale Methoden 332 Dynamische Logik: Substitution und Umbenennung Definition Das Resultat einer Substitution in einer Programmformel ist ([p]ϕ){~x 7→ ~t} = [~x := ~t][p]ϕ (hpiϕ){~x 7→ ~t} = h~x := ~tihpiϕ Damit ist die Hoare-Regel für DL für eine Programmformel ϕ nicht verwendbar. I Bei (R∀), (L∃) werden Variablen in neue umbenannt; das geht auch für Programmformeln. Definition Die in einem Programm p vorkommenden Variablen werden mit var(p) bezeichnet. Für eine Programmformel π = [p]ϕ oder π = hpiϕ ist die Menge der freien Variablen fvar(π) gegeben durch var(p) ∪ fvar(ϕ). A. Knapp, G. Schellhorn: Formale Methoden 333 Sequenzenkalkül DL: Zuweisung (2) (L[:=]1 ) (R[:=]1 ) ϕ{~x 7→ ~t}, Γ ⇒ ∆ [~x := ~t]ϕ, Γ ⇒ ∆ Γ ⇒ ϕ{~x 7→ ~t}, ∆ Γ ⇒ [~x := ~t]ϕ, ∆ (L[:=]2 ) (R[:=]2 ) ~y = ~t, [p{~x 7→ ~y}]ϕ{~x 7→ ~y}, Γ ⇒ ∆ [~x := ~t][p]ϕ, Γ ⇒ ∆ (1) ~y = ~t, Γ ⇒ [p{~x 7→ ~y}]ϕ{~x 7→ ~y}, ∆ Γ ⇒ [~x := ~t][p]ϕ, ∆ (1) (1) ~y ∈ / fvar([~x := ~t][p]ϕ) ∪ fvar(Γ) ∪ fvar(∆) I Analog: (Lh:=i1 ), (Lh:=i2 ), (Rh:=i1 ), (Rh:=i2 ) I Neue Programmvariablen ~y bezeichnen die neuen Werte von ~x I In KIV: (assign left/right) kombinieren beide Regeln: Hoare-Regeln“ ” (L/R[:=]1 ), falls ϕ kein Programm enthält, sonst (L/R[:=]2 ). A. Knapp, G. Schellhorn: Formale Methoden 334 Sequenzenkalkül DL: Fallunterscheidung (L[if]) (R[if]) b, [p1 ]ϕ, Γ ⇒ ∆ ¬b, [p2 ]ϕ, Γ ⇒ ∆ [if b then p1 else p2 ]ϕ, Γ ⇒ ∆ Γ, b ⇒ [p1 ]ϕ, ∆ Γ, ¬b ⇒ [p2 ]ϕ, ∆ Γ ⇒ [if b then p1 else p2 ]ϕ, ∆ I Analog: (Lhifi), (Rhifi), I KIV versucht immer die Tests zu entscheiden (per Simplifier), damit nur eine Prämisse entsteht. A. Knapp, G. Schellhorn: Formale Methoden 335 Sequenzenkalkül DL: Schleife (R[while]) (Rhwhilei) Γ ⇒ ψ, ∆ ψ, b ⇒ [p]ψ ψ, ¬b ⇒ ϕ Γ ⇒ [while b do p]ϕ, ∆ Γ ⇒ ψ, ∆ ψ, b, x = t ⇒ hpi(ψ ∧ t ≺ x) ψ, ¬b ⇒ ϕ Γ ⇒ hwhile b do piϕ, ∆ (2) (2) x ∈ / fvar([while b do p]ϕ) I Analog: (L[while]), (Lhwhilei) I In KIV: Die Schleifeninvariante ψ und die Schranke t müssen von Hand eingegeben werden. A. Knapp, G. Schellhorn: Formale Methoden 336 Sequenzenkalkül DL: (Nicht-)Termination (L[abort]) (Lhaborti) (L[skip]) (Lhskipi) Γ⇒∆ [abort]ϕ, Γ ⇒ ∆ habortiϕ, Γ ⇒ ∆ ϕ, Γ ⇒ ∆ [skip]ϕ, Γ ⇒ ∆ ϕ, Γ ⇒ ∆ hskipiϕ, Γ ⇒ ∆ A. Knapp, G. Schellhorn: Formale Methoden (R[abort]) (Rhaborti) (R[skip]) (Rhskipi) Γ ⇒ [abort]ϕ, ∆ Γ⇒∆ Γ ⇒ habortiϕ, ∆ Γ ⇒ ϕ, ∆ Γ ⇒ [skip]ϕ, ∆ Γ ⇒ ϕ, ∆ Γ ⇒ hskipiϕ, ∆ 337 Lokale Variablen Neues Programmkonstrukt let ~x = ~t in p für lokale Variablen I Variablen ~x duplikatfrei Relationale Semantik RJlet ~x = ~t in pK A = {(v, v0 ) | ∃v00 . (v{~x 7→ T J~tK A v}, v00 ) ∈ RJpK A ∧ v0 = v00 {~x 7→ v(~x)}} A. Knapp, G. Schellhorn: Formale Methoden 338 Lokale Variablen: Kalkülregeln Der partielle (und genauso der totale) Hoare-Kalkül wird um die folgende Regel erweitert (~y sind neue Variablen): (lethp ) {~x = ~t{~x 7→ ~y} ∧ ϕ{~x 7→ ~y}} p {ψ{~x 7→ ~y}} {ϕ} let ~x = ~t in p {ψ} Für die Dynamische Logik erhält man (~y sind neue Variablen): (L[let]) (R[let]) ~y = ~t, [p{~x 7→ ~y}]ϕ, Γ ⇒ ∆ [let ~x = ~t in p]ϕ, Γ ⇒ ∆ ~y = ~t, Γ ⇒ [p{~x 7→ ~y}]ϕ, ∆ Γ ⇒ [let ~x = ~t in p]ϕ, ∆ und dieselben Regeln für Diamonds statt Boxes. A. Knapp, G. Schellhorn: Formale Methoden 339 Prozeduren: Syntax (1) Neues Programmkonstrukt q(~t; ~z) für Prozeduraufrufe I I I q ist Prozedurname. Terme ~t der Sorten ~s sind (aktuelle) Eingabeparameter. Paarweise verschiedene Variablen ~z der Sorten ~s0 sind (aktuelle) I/O-Parameter. In KIV: I Konvention für Prozedurenamen: q# I Prozedurdefinitionen q# ~s : ~s0 ∈ Proc sind neuer Bestandteil der Signatur einer DL-Spezifikation: Σ = (S, F, P, Proc) I ~ s : ~s0 heißt (Aufrufs-)Modus der Prozedur. I Definitionen zwischen predicates und variables per procedures q# s1 × . . . × sn : s01 × . . . × s0m ; A. Knapp, G. Schellhorn: Formale Methoden 340 Prozeduren: Syntax (2) Eine Prozedurdeklaration hat die Form q(~x; ~y) p mit formalen Eingabeparametern ~x und formalen I/O-Parametern ~y. Die Parameter ~x, ~y sind paarweise verschieden. Eine DL-Spezfikation enthält neben Signatur, Variablen, Axiomen und Generiertheitsklauseln eine Menge von Prozedurdeklarationen Decl mit paarweise verschiedenen Prozeduren: DLSpec = ((S, F, P, Proc), X, Ax, Gen, Decl). In KIV: I Es ist nicht erforderlich, für jede Prozedur eine Deklaration anzugeben. Man kann Prozeduren auch nur mit Axiomen (z. B. Vor-/Nachbedingung) spezifizieren. I Gegenseitige Rekursion ist erlaubt. A. Knapp, G. Schellhorn: Formale Methoden 341 Prozedurdeklarationen in KIV: Beispiel (1) Prozedurdeklarationen nach axioms procedures f# nat : nat; declaration f#(x; y) begin if x = 0 then y := 1 else begin f#(x -1; y); y := y * x end end; Die Prozedur ist funktional (das Ergebnis in y hängt nicht vom Anfangswert ab; i. e. y wird nur als Ausgabeparameter benutzt). Sie verwendet keine globalen Variablen. A. Knapp, G. Schellhorn: Formale Methoden 342 Prozedurdeklarationen in KIV: Beispiel (2) procedures MAXL# natlist : nat; MAX# nat, nat : nat; declaration MAX#(m, n; n0) begin if m < n then n0 := n else n0 := m end; MAXL#(x; n) begin if x = [] then n := 0 else begin MAXL#(x.rest; n); MAX#(n, x.first; n) end end; A. Knapp, G. Schellhorn: Formale Methoden 343 KIV-Prozeduren: Funktionsprozeduren I Prozeduren in KIV relativ einfach, keine Funktionsprozeduren (oder äquivalent Methoden mit Ergebnis). Zusätzliche Komplexität von Funktionsprozeduren: I Terme müssen jetzt auch Prozedurnamen enthalten. I Eine Möglichkeit: Prozedurnamen = Funktionsbezeichner für Funktionen mit einem Spezialergebnis ⊥ für Nichtterminierung. I Nichtterminierung (und evtl. Exceptions) muß nicht nur auf der Programmebene, sondern auch auf der Termebene (also überall) berücksichtigt werden. A. Knapp, G. Schellhorn: Formale Methoden 344 KIV-Prozeduren: Alternative zur Modellierung Deklarationen in KIV sind Teil der Spezifikation. Alternative: Deklarationen sind Teil des Zustands (oder gleichwertig: neben dem Zustand noch eine Umgebung für die Semantikdefinition). I Vorteil: Die Semantik einer kompletten Klasse oder eines Pakets wird spezifizierbar, Deklarationen sind dynamisch überschreibbar. Programmiersprachensemantiken wählen deshalb meist diese Alternative. I Nachteil: Keine nur spezifizierten und nicht implementierten Prozeduren. Mit DL-Axiomen für Prozeduraufrufe kann man beliebige partielle Funktionen (Definitionsbereich = Terminierungsbereich) beschreiben. A. Knapp, G. Schellhorn: Formale Methoden 345 Prozeduren: Relationale Semantik Analogie: Schleifen sind spezielle Form der Rekursion (tail recursion). while b do p entspricht dem Aufruf einer Prozedur w mit w() begin if b then p; w() else skip end Der Zahl der Schleifendurchläufe entspricht gerade der Rekursionstiefe. n I Bei Schleifen kann die Semantik iteriert werden: RJif b then pK ; bei Prozeduren nicht so einfach. I Für Schleifen geht es auch syntaktisch: loop p times n in KIV; das geht auch für Prozeduren. A. Knapp, G. Schellhorn: Formale Methoden 346 Tiefenbeschränkte Rekursion Beschränkung der Rekursionstiefe in Analogie zur Beschränkung der Iterationszahl mit loop. Neues Programmkonstrukt q(~t; ~z) : c für beschränkten Prozeduraufruf I c Term der Sorte nat: maximale Rekursionstiefe (an der Obergrenze abort) Einführung einer Funktion p ↓ c, die im Rumpf von q alle Aufrufe mit der Schranke c versieht, u. a.: I skip ↓ c = skip I p ; p0 ↓ c = (p ↓ c) ; (p0 ↓ c) q(~t; ~z) ↓ c = q(~t; ~z) : c (q(~t; ~z) : c0 ) ↓ c = q(~t; ~z) : min(c, c0 ) I I I kann undefiniert bleiben, wenn (wie in KIV) beschränkte Prozeduraufrufe innerhalb von Deklarationen verboten sind A. Knapp, G. Schellhorn: Formale Methoden 347 Tiefenbeschränkte Rekursion: Relationale Semantik Relationale Semantik für q(~x; ~y) p ∈ Decl RJq(~t; ~z) : cK A = {(v, v0 ) | ∃n . n + 1 = T JcK A v ∧ ∃v00 . (v{~x,~y 7→ T J~tK A v, v(~z)}, v00 ) ∈ RJp ↓ n̂K A ∧ v0 = v00 {~x,~y 7→ v(~x), v(~y)}{~z 7→ v00 (~y)}} S RJq(~t; ~z)K A = n∈N RJq(~t; ~z) : n̂K A I n̂ steht für den Term 0 + 1 + . . . + 1, der die Zahl n bezeichnet. A. Knapp, G. Schellhorn: Formale Methoden 348 Semantik von (implementationslosen) Prozeduren Die Semantik einer Prozedur q ~s : ~s0 ist eine Relation über den Parametern: RJqK A ⊆ A~s × A~s0 × A~s0 I (~a,~a0 ,~a00 ) ∈ RJqK A bedeutet: Die Prozedur q, aufgerufen mit I I Eingaben ~a für die Eingabe-Variablen Eingaben ~a0 für die Ein/Ausgabe-Variablen terminiert mit Ausgabe ~a00 in den Ein/Ausgabe-Variablen. I In KIV: keine globale Variablen, stattdessen I/O-Parameter I I I I auch vorteilhaft für Beweise Alternative: nur globale Variablen, keine Parameter (vgl. µ-Kalkül) Implementierungen ersetzen evtl. I/O-Parameter durch globale Variablen Normalfall in KIV sind funktionale Prozeduren: I I/O-Variablen dienen nur der Ausgabe; I ~a00 und Terminierung hängen nicht von ~a0 ab. I I Funktionale Prozeduren haben etwas einfachere Regeln. Wenn nicht funktional, Schlüsselwort nonfunctional am Ende der Prozedurdefinition A. Knapp, G. Schellhorn: Formale Methoden 349 Prozeduren: DL-Kalkülregeln (1) (Rh()i1 ) (Rh()i2 ) (Rh():i) ~x0 = ~t,~y0 = ~z, Γ ⇒ hp{~x,~y 7→ ~x0 ,~y0 }iϕ{~z 7→ ~y0 }, ∆ Γ ⇒ hq(~t; ~z)iϕ, ∆ Γ ⇒ ∃n . hq(~t; ~z) : niϕ, ∆ Γ ⇒ hq(~t; ~z)iϕ, ∆ n = c − 1,~x0 = ~t,~y0 = ~z, Γ ⇒ c 6= 0 ∧ h(p ↓ n){~x,~y 7→ ~x0 ,~y0 }iϕ{~z 7→ ~y0 }, ∆ Γ ⇒ hq(~t; ~z) : ciϕ, ∆ mit neuen Variabeln n, ~x0 , ~y0 . Analoge Regeln für die linke Seite und Boxen I In KIV: (h()i2 ) “proc omega”. A. Knapp, G. Schellhorn: Formale Methoden 350 Prozeduren: DL-Kalkülregeln (2) (Lhexeci) (Rhexeci) I hq(~t; ~z)iϕ, hq(~t0 ; ~y)iψ, Γ ⇒ ∆ Γ ⇒ ~t = ~t0 , ∆ hq(~t; ~z)i~z = ~z0 , ϕ{~z 7→ ~z0 }, Γ ⇒ ψ{~y 7→ ~z0 }, ∆ hq(~t; ~z)iϕ, Γ ⇒ hq(~t0 ; ~y)iψ, ∆ Gilt so für funktionale Prozeduren und neue Variablen ~z0 . I I Γ ⇒ ~t = ~t0 , ∆ hq(~t; ~z)i~z = ~z0 , ϕ{~z 7→ ~z0 }, ψ{~y 7→ ~z0 }, Γ ⇒ ∆ Für nichtfunktionale Prozeduren muß in der ersten Prämisse ~z = ~y hinzugefügt werden. nicht invertierbar (~t = ~t0 kann falsch sein) Anwendung bei Induktion, um den Aufruf aus der Induktionsvoraussetzung gegen den gerade aktuellen Aufruf zu kürzen“. ” I In KIV: (Lhexeci) “contract call left”, (Rhexeci) “execute call” I A. Knapp, G. Schellhorn: Formale Methoden 351 Deklarationen als Abkürzung für Axiome Satz I I I I Eine Prozedurdeklaration q(~x; ~y) p ist äquivalent zu den Axiomen hq(~t; ~z)iϕ ↔ (h~x0 , ~y0 := ~t, ~z; p{~x,~y 7→ ~x0 ,~y0 }iϕ{~z 7→ ~y0 } hq(~t; ~z)iϕ ↔ ∃n . hq(~t; ~z) : niϕ c = 0 → ¬hq(~t; ~z) : ciϕ c 6= 0 ∧ n = c − 1 → (hq(~t; ~z) : ciϕ ↔ h~x0 , ~y0 := ~t, ~z; (p ↓ n){~x,~y 7→ ~x0 ,~y0 }iϕ{~z 7→ ~y0 }) mit neuen Variablen n, ~x0 , ~y0 . Die Axiome ergeben sich direkt aus den Regeln (Rh()i1 ), (Rh()i2 ), (Rh():i). A. Knapp, G. Schellhorn: Formale Methoden 352 Prozeduren im Hoare-Kalkül Die Tiefenbeschränkung wird zum Beweis von semantischen Aussagen gebraucht (Analoga zu Koinzidenzlemma etc.). Außerdem rechtfertigt sie folgendes Vorgehen im Hoare-Kalkül für partielle Korrekheit (Skizze): I I Gezeigt werden soll {ϕ} q(~x; ~y) {ψ} für rekursive Prozedur q(~x; ~y) p. Dazu genügt es, einen Hoare-Kalkül-Beweisbaum mit Konklusion {ϕ} p {ψ} zu bilden. Der Beweisbaum darf jetzt offene Prämissen für die inneren Aufrufe haben. I grob von der Form {ϕ{~ x,~y 7→ ~t,~z}} q(~t; ~z) {ψ{~x,~y 7→ ~t,~z}}. I Details recht kompliziert: Globale Variablen, lokale Bindungen zwischendurch, logische Hilfsvariablen I Rechtfertigung: Innere Aufrufe haben (implizit) geringere Rekursionstiefe. I Aber: genügt nur für partielle Korrekheit, für totale Korrektheit wird auch noch eine noethersche Ordnung ≺ benötigt. I In dynamischer Logik entfallen diese Probleme: einfache explizite Induktion über die Rekursionstiefe bzw. noethersche Induktion. A. Knapp, G. Schellhorn: Formale Methoden 353 Kontrakte Ein Kontrakt für eine Prozedur q (oder auch für eine Methode) besteht (mindestens) aus I einer Vorbedingung ϕ I einer Nachbedingung ψ I der Angabe der Eingabe-Parameter (und evtl. gelesene globale Variablen) I der Angabe der Ausgabe-Parameter (und evtl. geschriebene globale Variablen) I Weiters informelle Beschreibung: u. a. Name und Zweck der Prozedur, Querverweise zu Anwendungsfällen, etc. A. Knapp, G. Schellhorn: Formale Methoden 354 Kontrakte: Semantik Eine Implementierung mit Rumpf p erfüllt einen Kontrakt, falls der Rumpf total korrekt bzgl. der Vor- und Nachbedingungen ist, falls also [ϕ] p [ψ] (Hoare) bzw. ϕ → hpiψ (dynamische Logik) gilt. I Diese Interpretation von Kontrakten ist sehr stark. Man hätte gerne eine interne Datenrepräsentation. I Wenn die Vorbedingung nicht eingehalten wird, darf Beliebiges passieren: Absturz, Exception, Nichtterminierung, reguläres Ergebnis, illegaler Speicher etc. A. Knapp, G. Schellhorn: Formale Methoden 355 Kontrakte für Java/C# I Für Java oder C# sind die Argumente Eingabeparameter und das Ergebnis der einzige Ausgabeparameter. I Es gibt immer genau einen I/O-Parameter: den Speicher. I Der Speicher wird gelesen/modifiziert“ ist unnötig (und zu schwach); ” deshalb genauere Angaben, welche Objekte/Assoziationen gelesen/geschrieben/erzeugt werden, sind in Vor- und Nachbedingung erforderlich. I Die Nachbedingung kann auch: löst für bestimmte Eingaben eine ” bestimmte Ausnahme aus“ lauten. Sinnvollerweise teilt man die Nachbedingung deshalb in einen regulären und einen Exception-Teil. A. Knapp, G. Schellhorn: Formale Methoden 356 Vollständigkeit der dynamischen Logik (1) In dynamischer Logik kann man (im Gegensatz zu Hoare-Kalkül) Programme vergleichen: I I hpitrue → hp0 itrue für Wenn p terminiert, so auch p0“. ” Sei ~x = var(p) ∪ var(p0 ) und ~x0 neue Variablen: hpi~x = ~x0 ↔ hp0 i~x = ~x0 für p und p0 berechnen dasselbe (Ergebnis ~x0 )“; oder äquivalent: die ” ” Semantik von p und p0 ist gleich (RJpK A = RJp0 K A)“. Auch bei Induktionsbeweisen für totale/partielle Korrektheit von rekursiven Prozeduren entstehen nach Anwendung der Induktionshypothese: I eine Programmformel im Antezedent mit nur dem rekursiven Aufruf und der Nachbedingung (aus der Induktionshypothese) I eine Programmformel im Sukzedent (durch Ausführen entstanden). Sie beginnt mit einem rekursiven Aufruf, für den man die Induktionshypothese benötigt. Deshalb benötigt man in dynamischer Logik noch Regeln für zwei Programme. A. Knapp, G. Schellhorn: Formale Methoden 357 Vollständigkeit der dynamischen Logik (2) Dynamische Logik kann vollständig axiomatisiert werden modulo der Unvollständigkeit der natürlichen Zahlen. Die Axiome sind (im wesentlichen) die bisherigen Regeln und die Axiome I I (ϕ → ψ) → (hpiϕ → hpiψ) Wenn ϕ ψ impliziert, und ϕ nach p gilt, dann auch ψ“. ” Sei ~x = lvar(p) und ~x0 neue Variablen: hpihp0 iϕ ↔ ∃~x0 . hpi~x = ~x0 ∧ hp0 {~x 7→ ~x0 }iϕ{~x 7→ ~x0 } Damit nach p und p0 ϕ gilt, muß es einen Zwischenzustand ~x0 geben, der ” nach p erreicht wird; wenn man auf diesem p0 rechnen läßt, ergibt sich zum Schluß ϕ für ~x0“. Dabei sind lvar(p) die (potentiell) von p modifizierten Variablen (= linke Seiten von Zuweisungen + I/O-Parameter von Aufrufen). A. Knapp, G. Schellhorn: Formale Methoden 358 DL-Kalkül: Einführung von Zwischenzuständen (Lhspliti) hpi~x = ~x0 , ϕ{~x 7→ ~x0 }, Γ ⇒ ∆ hpiϕ, Γ ⇒ ∆ wobei ~x = lvar(p), ~x0 neue Variablen I Die Regel wird meist angewendet, wenn p ein Prozeduraufruf (geht aber nie fehl). I Führt einen Zustand ~x0 am Ende von p ein; der Zwischenzustand wird explizit gebraucht, wenn man Lemmas hat (z. B. zwei Aufrufe sequentiell, Lemma macht Aussage über den zweiten). A. Knapp, G. Schellhorn: Formale Methoden 359 Semantik von Programmiersprachen Behandlung verschiedener Konzepte von Programmiersprachen I Schleifen und Rekursion, Terminierung I Parameterübergabe-Mechanismen: call-by-value, call-by-reference oder call-by-name I Nichtdeterminismus: (un-)beschränkt, dämonisch, erratisch oder angelisch I Kopiersemantik vs. Pointersemantik I Semantik von Sprüngen: Exceptions, breaks, returns, gotos I Higher-Order-Funktionen: lazy vs. strikte Semantik I Typsysteme: Polymorphie, Overloading, Casts, dynamische Bindung etc. I Parallelität: Interleaving, synchron, asynchron, Fairness I Übergang von Semantik zu Kalkül A. Knapp, G. Schellhorn: Formale Methoden 360 Programmiersprachensemantik in Theorembeweisern (1) Semantikdefinition in Theorembeweisern wie KIV kann auf zwei Ebenen erfolgen: Ebene 1 (die Meta-Ebene“): Semantik für die in KIV eingebauten Programme p ” I Semantik J−K von Programmen ist außerhalb von KIV spezifiziert. I JpK arbeitet auf logischen Variablenbelegungen und spezifizierten Datenstrukturen (Algebren), genau wie die Semantik von Prädikatenlogik. I Semantik wird benutzt, um Sinnhaftigkeit von Hoare-Kalkül und dynamischer Logik zu zeigen. I Verwendet wird zum Schluß nur der Kalkül, um Eigenschaften von programmierten/spezifizierten Anwendungen nachzuweisen. I Der implementierte Kalkül hat das Risiko, Fehler zu enthalten, wenn die (informellen) mathematischen Beweise fehlerhaft sind. Das Risiko ist gering für Standard-while-Programme“, größer für Java oder Statecharts. ” A. Knapp, G. Schellhorn: Formale Methoden 361 Programmiersprachensemantik in Theorembeweisern (2) Ebene 2 (die Objekt-Ebene“): Semantik für in KIV spezifizierte Programme ” I p ist Variable eines spezifizierten Datentyps Prog. I J . K : Prog → State × State → bool ist in KIV definierte Funktion. I Zweck: präzise Semantikdefinition und Validierung für eine Programmieroder Spezifikationssprache I I I I Korrektheitsbeweise, systematische Tests für Compiler Aufdecken von Fehlern (z. B. im Java-Compiler) Korrektheitsbeweise für Kalkülregeln Aber auf dieser Grundlage ist es schwierig, effizient Anwendungen in der Programmier- und Spezifikationssprache zu verifizieren (z. B. Substitutionsfunktion programmiert (Ebene 1) vs. spezifiziert (Ebene 2)). A. Knapp, G. Schellhorn: Formale Methoden 362 Zustände Semantischer Bereich State = Id → N I Abbildungen σ von Programmvariablen Id auf natürliche Zahlen I Variablenzugriff σ(x), Variablenmodifikation σ{x 7→ n} Formalisierung in KIV I Sorte Id mit Variablen id I Sorte Idxnat der Paare aus Id und nat mit Konstruktor . <- . I Sorte State mit Variablen st I . [ . ] : State × Id → nat für Variablenzugriff I . [ . ] : State × Idxnat → State für Variablenmodifikation A. Knapp, G. Schellhorn: Formale Methoden 363 Ausdrücke Syntaktische Bereiche I AExp 3 t für arithmetische Ausdrücke I BExp 3 b für boolesche Ausdrücke Semantische Funktionen I I J−K : AExp → State → N J−K : BExp → State → B Formalisierung in KIV I Sorten AExp und BExp I . +_ . : AExp × AExp → AExp etc. I Für arithmetische und boolesche Ausdrücke zwei Funktionen J . K : AExp → State → nat; J . K : BExp → State → bool; I Verwendung bereits spezifizierter Funktionen auf nat und bool A. Knapp, G. Schellhorn: Formale Methoden 364 Programme Syntaktischer Bereich I Prog 3 p für Programme über AExp und BExp I Vereinfachung: keine simultanen Zuweisungen Semantische Funktion I J−K : Prog → ℘(State × State) I aus relationaler Semantik Formalisierung in KIV I I Sorte Prog mit Variable α (statt p) Für relationale Semantik Funktion höherer Ordnung J . K : Prog → State × State → bool I I I Relationsvariable R : State × State → bool Relationsiteration durch rekursiv definierte Funktion . ˆ . : (State × State → bool) × nat → (State × State → bool) JαK ˆ n ist Semantik von αn A. Knapp, G. Schellhorn: Formale Methoden 365 Natürliche Semantik (1) Definition Natürliche Semantik (engl. natural semantics) definiert eine “big-step”-Semantik eines Programms p ∈ Prog durch die Ableitbarkeit von hp, σi → σ 0 für σ, σ 0 ∈ State im folgenden Regelsystem Rns . (skipns ) (assignns ) (seqns ) hskip, σi → σ hx := t, σi → σ{x 7→ JtK σ} hp1 , σi → σ1 hp2 , σ1 i → σ2 hp1 ; p2 , σi → σ2 A. Knapp, G. Schellhorn: Formale Methoden 366 Natürliche Semantik (2) (ifttns ) (ifffns ) (whilettns ) (whileffns ) hp1 , σi → σ1 hif b then p1 else p2 , σi → σ1 hp2 , σi → σ2 hif b then p1 else p2 , σi → σ2 , falls JbK σ = tt , falls JbK σ = ff hp, σi → σ 0 hwhile b do p, σ 0 i → σ 00 hwhile b do p, σi → σ 00 hwhile b do p, σi → σ , , falls JbK σ = tt falls JbK σ = ff I Keine Regel für abort I Bedeutung des Regelsystems analog zur Definition von Ableitungsbäumen für Prädikatenlogik A. Knapp, G. Schellhorn: Formale Methoden 367 Formalisierung natürlicher Semantik I Gibt es immer eine wohldefinierte Menge ableitbarer Konklusionen? Welche Prämissen sind in Ordnung? I Alternative 1: Explizite Bäume tree mit Tripeln aus (p, σ, σ 0 ) als Inhalt der Knoten und Prädikat ok(tree), das feststellt, ob die Regeln korrekt angewendet wurden: aufwendig, interessant ist nur die Menge möglicher Tripel in der Konklusion. I Alternative 2: Die ableitbaren Tripel sind die kleinste unter Regelanwendung abgeschlossene Menge: Definiere zu einer Menge T von schon abgeleiteten Tripeln die mit einer Regelanwendung daraus ableitbaren Tripel R̂ns (T). Dann sollte gelten: hp, σi → σ 0 ist mit Rns T ableitbar genau dann, wenn (p, σ, σ 0 ) ∈ {T | R̂ns (T) ⊆ T}. I Alternative 3: Definiere die Menge der mit einem Baum der Höhe n herleitbaren Tripel: Das ist gerade R̂nns (∅). Semantik ist also: hp, σi → σ 0 ist mit Rns ableitbar genau dann, wenn es ein n ∈ N mit (p, σ, σ 0 ) ∈ R̂nns (∅) gibt. A. Knapp, G. Schellhorn: Formale Methoden 368 Ableitungsoperator R̂ns Informell: (p, σ, σ 0 ) ∈ R̂ns (T) gdw. (p, σ, σ 0 ) ist Konklusion einer Regel mit ” Prämissen aus T“ Damit: (p, σ, σ 0 ) ∈ R̂ns (T) genau dann, wenn p = skip und σ = σ 0 oder ex. x, t mit p = x := t, σ 0 = σ{x 7→ JtK σ} oder ex. p1 , p2 , σ 00 mit p = p1 ; p2 , (p1 , σ, σ 00 ) ∈ T und (p2 , σ 00 , σ 0 ) ∈ T oder ex. b, p1 , p2 mit p = if b then p1 else p2 , JbK σ = tt und (p1 , σ, σ 0 ) ∈ T oder ex. b, p1 , p2 mit p = if b then p1 else p2 , JbK σ = ff und (p2 , σ, σ 0 ) ∈ T oder ex. b, p0 , σ 00 mit p = while b do p0 , JbK σ = tt und (p0 , σ, σ 00 ) ∈ T und (while b do p0 , σ 00 , σ 0 ) ∈ T 0 oder ex. b, p mit p = while b do p0 , JbK σ = ff und σ = σ 0 Formalisierung in KIV: I Datentypspezifikation Prog für Programme I Funktion REC : (Prog × State × State → bool) → Prog × State × State → bool A. Knapp, G. Schellhorn: Formale Methoden 369 Regelsysteme Nur positive Prämissen I Ableitungsbäume lassen sich mit Regeln der Form hp0 , σ1 i 6→ σ2 hp, σi → σ 0 nicht immer fortsetzen. Nur endlich viele Prämissen I Für Regeln der Form (hpn , σn i → σn0 )n∈N hp, σi → σ 0 gibt es nicht notwendig ein k ∈ N, sodaß der Ableitungsbaum aus Unterbäumen der Höhe k − 1 gebildet werden kann (Prämisse l benötige l Ableitungsschritte). I Damit werden Alternative 1 und Alternative 3 zur Interpretation ausgeschlossen. A. Knapp, G. Schellhorn: Formale Methoden 370 Fixpunkte monotoner Funktionen (1) Menge U , Funktion f : ℘(U) → ℘(U) I f monoton, wenn für alle M1 , M2 ⊆ U : ist M1 ⊆ M2 , dann f (M1 ) ⊆ f (M2 ) I M ⊆ U Fixpunkt von f , wenn f (M) = M I M ⊆ U kleinster Fixpunkt von f , wenn M Fixpunkt von f und für jeden Fixpunkt M 0 von f : M ⊆ M 0 Satz Sei U eine Menge und f : ℘(U) → ℘(U) eine monotone Funktion. T Dann ist die durch f induktiv definierte Menge µ(f ) = {M ⊆ U | f (M) ⊆ M} der kleinste Fixpunkt von f . I Fixpunktsatz von Knaster und Tarski für Mengen I Anwendung: Setze U zu Menge der Tripel (p, σ, σ 0 ) und f = R̂ns . µ(R̂ns ) ist die Menge der ableitbaren Konklusionen. I Monotonie entspricht positiven (nicht notwendigerweise endlich vielen) Prämissen. A. Knapp, G. Schellhorn: Formale Methoden 371 Fixpunkte monotoner Funktionen (2) Beweisskizze Sei F = {M ⊆ U | f (M) ⊆ M}, also µ(f ) = T F. f (µ(f )) ⊆ µ(f ). Sei dazu M ∈ F : f (M) ⊆ M nach Definition von F T µ(f ) ⊆ M , da jedes Element von F Obermenge des Durchschnitts F Wegen der Monotonie von f gilt f (µ(f )) ⊆ f (M) Also f (µ(f )) ⊆ M . Da das für jedes M ∈ F gilt, ist f (µ(f )) ⊆ µ(f ). I Es gilt I I I I I I Es gilt I I µ(f ) ⊆ f (µ(f )): Wegen f (µ(f )) ⊆ µ(f ) und der Monotonie von f gilt f (f (µ(f ))) ⊆ f (µ(f )), also f (µ(f )) ∈ F . Also µ(f ) ⊆ f (µ(f )), da jedes Element Obermenge des Durchschnitts f (µ(f )) ⊆ µ(f ) und µ(f ) ⊆ f (µ(f )) ist µ(f ) Fixpunkt. M von f ist wegen f (M) = M in F und damit µ(f ) ⊆ M nach Definition von µ(f ). I Wegen I Jeder andere Fixpunkt A. Knapp, G. Schellhorn: Formale Methoden 372 Fixpunkte monotoner Funktionen (3) Formalisierung in KIV: I Allgemeine Fixpunkttheorie mit Sorte elem für die Elemente von U I Teilmengen von U : boolesche Funktionen S : elem → bool I Mengen von Teilmengen von U : SS : (elem → bool) → bool I Statt x ∈ S und S ∈ SS also S(x) und SS(S) I S ⊆ S0 definiert als ∀ x . S(x) → S0(x) T Die Elemente x ∈ SS sind die x mit ∀ S . SS(S) → S(x) I I Zur Anwendung des generischen Theorems wird eine Instanz der Theorie mit Prog × State × State für elem und REC für f zu bilden (instantiated specification). A. Knapp, G. Schellhorn: Formale Methoden 373 Fixpunkte für R̂ns I Der Operator R̂ns ist monoton. I Hinreichendes Kriterium für Monotonie: Alle Vorkommen von T in der Definition von R̂ns unter einer geraden Zahl von Negationen (wobei Implikation eine Negation für die Vorbedingung addiert, und Äquivalenz verboten ist). Formalisierung in KIV (für REC): I Argument im wesentlichen, daß alles, was in der REC-Definition an Operatoren vorkommt: Konjunktion, Disjunktion (keine Negation) sowie Quantoren, monotone Operatoren sind. A. Knapp, G. Schellhorn: Formale Methoden 374 Eigenschaften der Definition der natürlichen Semantik I Nach dem Fixpunktsatz von Knaster-Tarski ist die kleinste Menge der unter Regelanwendung abgeschlossenen Tripel (p, σ, σ 0 ) wohldefiniert T und gleich µ(R̂ns ) = {T | R̂ns (T) ⊆ T}. I Die Definition (σ, σ 0 ) ∈ JpK ⇔ (p, σ, σ 0 ) ∈ µ(R̂ns ) gibt also eine formale Definition der natürlichen Semantik. I I Formalisierung in KIV J . K : Prog → State × State → bool Es gilt R̂ns (µ(R̂ns )) = µ(R̂ns ), was informell bedeutet: Nochmaliges ” Anwenden einer Regel auf die mit den Regeln gewinnbaren Konklusionen (= µ(R̂ns )) gibt nichts Neues mehr“. A. Knapp, G. Schellhorn: Formale Methoden 375 Bedeutung von R̂ns (µ(R̂ns )) = µ(R̂ns ) (1) Intuitiv: Die Konklusion ist genau dann ableitbar, wenn es alle Prämissen sind“. ” Ausgeschrieben: (σ, σ 0 ) ∈ JpK genau dann, wenn p = skip und σ = σ 0 oder ex. x, t mit p = x := t, σ 0 = σ{x 7→ JtK σ} oder ex. p1 , p2 , σ 00 mit p = p1 ; p2 , (σ, σ 00 ) ∈ Jp1 K und (σ 00 , σ 0 ) ∈ Jp2 K oder ex. b, p1 , p2 mit p = if b then p1 else p2 , JbK σ = tt und (σ, σ 0 ) ∈ Jp1 K oder ex. b, p1 , p2 mit p = if b then p1 else p2 , JbK σ = ff und (σ, σ 0 ) ∈ Jp2 K oder ex. b, p0 , σ 00 mit p = while b do p0 , JbK σ = tt und (σ, σ 00 ) ∈ Jp0 K und (σ 00 , σ 0 ) ∈ Jwhile b do p0 K 0 oder ex. b, p mit p = while b do p0 , JbK σ = ff und σ = σ 0 A. Knapp, G. Schellhorn: Formale Methoden 376 Bedeutung von R̂ns (µ(R̂ns )) = µ(R̂ns ) (2) Durch Einsetzen einer Regelkonklusion bekommt man Äquivalenzen zwischen Konklusion und der Konjunktion der Prämissen für jede Regel (falls Seitenbedingung gilt): I I Einsetzen von p1 ; p2 für p: (σ, σ 0 ) ∈ Jp1 ; p2 K ⇔ es gibt σ 00 mit (σ, σ 00 ) ∈ Jp1 K und (σ 00 , σ 0 ) ∈ Jp2 K Einsetzen von while b do p0 für p ergibt Abwickeln und Verlassen einer Schleife: Wenn JbK σ = tt, dann: (σ, σ 0 ) ∈ Jwhile b do p0 K ⇔ es gibt σ 00 mit (σ, σ 00 ) ∈ Jp0 K und (σ 00 , σ 0 ) ∈ Jwhile b do p0 K Wenn JbK σ = ff , dann: (σ, σ 0 ) ∈ Jwhile b do p0 K ⇔ σ = σ0 I Zusammenfassung zu einem Theorem möglich A. Knapp, G. Schellhorn: Formale Methoden 377 Stetige mengenwertige Funktionen Menge U I I ω -Kette in U : M0 ⊆ M1 ⊆ . . . mit Mi ⊆ U für i ∈ N Kette (engl. chain) für Indexmenge I : (Mi )i∈I mit Mi ⊆ U und für alle i, j ∈ I : Mi ⊆ Mj oder Mj ⊆ Mi I In KIV: Ketten für N statt ω -Ketten Definition Sei U eine Menge. Eine Funktion f : ℘(U) → ℘(U) ist stetig, wenn für alle ω -Ketten M0 ⊆ M1 ⊆ . . . gilt: S S f ( n∈N Mn ) = n∈N f (Mn ) I Wenn f monoton, gilt ⊇. A. Knapp, G. Schellhorn: Formale Methoden 378 Stetigkeit für natürliche Semantik I Sei f wieder R̂ns und M0 = ∅, Mi+1 = R̂ns (Mi ) I Mn enthält genau die mit einem Baum der Höhe n erhaltbaren Konklusionen. I Wegen der Monotonie von R̂ns wachsen die Mengen, bilden also eine ω -Kette. S S S Stetigkeit fordert: R̂ns ( n∈N Mn ) ⊆ n∈N R̂ns (Mn ) = n∈N Mn I Stetigkeit sagt also: Wenn man alle mit irgendeiner endlichen Zahl S erhaltbaren Konklusionen nimmt (= n∈N Mn ) und auf diese noch einmal eine Regel anwendet, kommt nichts Neues dazu. I I Stetigkeit gilt nicht für unendlich viele Prämissen; dort gibt es legale Bäume unbeschränkter Höhe; sie gilt immer, wenn man endlich viele Prämissen hat: dann gibt es keine Bäume unbeschränkter Höhe. A. Knapp, G. Schellhorn: Formale Methoden 379 Stetigkeit und Monotonie Satz Jede stetige Funktion f : ℘(U) → ℘(U) ist monoton. Beweisskizze Sei M0 ⊆ M1 . ω -Kette durch M2 = M3 = · · · = M1 . S S I Dann n∈N Mn = M1 , also f ( n∈N Mn ) = f (M1 ) S I Andererseits n∈N f (Mn ) = f (M0 ) ∪ f (M1 ). I Bilde I Wegen Stetigkeit I Also f (M1 ) = f (M0 ) ∪ f (M1 ). f (M0 ) ⊆ f (M1 ). A. Knapp, G. Schellhorn: Formale Methoden 380 Stetigkeit von R̂ns R̂ns ist stetig. Satz Sei M0 ⊆ M1 ⊆ . . . eine ω -Kette. S (p, σ, σ 0 ) ∈ R̂ns ( n∈N Mn ). Beweisskizze I Sei (p, σ, σ 0 ) mit einer Regel und m Prämissen (pk , σk , σk0 ) entstanden. S I Alle Prämissen sind in n∈N Mn . I Dann ist I Also gibt es für jedes I Sei n0 k ∈ {1, . . . , m} ein nk , sodaß (pk , σk , σk0 ) ∈ Mnk . = max({n1 , . . . , nm }). I Dann sind alle Prämissen der Regeln in I Somit ist die Konklusion in I M n0 . R̂ns (Mn0 ) und also auch in S n∈N R̂ns (Mn ). Allgemein gilt: Regelsysteme mit nur endlich vielen, sämtlich positiven Prämissen ergeben stetige Operatoren. A. Knapp, G. Schellhorn: Formale Methoden 381 Fixpunkte stetiger Funktionen (1) Satz Sei U eine Menge und f : ℘(U) → ℘(U) eine monotone Funktion. Dann gilt: 1. Die Mengen f n (∅) bilden eine ω -Kette in U . 2. Für alle n ist f n (∅) ⊆ µ(f ). 3. Falls f stetig ist, gilt der Fixpunktsatz von Kleene (für mengenwertige Funktionen): µ(f ) = S n∈N f n (∅) Beweisskizze I Offenbar ∅ ⊆ f (∅). Wegen Monotonie gilt f (∅) ⊆ f 2 (∅), f 2 (∅) ⊆ f 3 (∅), . . . ; also induktiv Behauptung (1). ∅ ⊆ µ(f ). Wegen Monotonie gilt f (∅) ⊆ f (µ(f )) = µ(f ), f 2 (∅) ⊆ f (µ(f )) = µ(f ), . . . ; also induktiv Behauptung (2). I Offenbar A. Knapp, G. Schellhorn: Formale Methoden 382 Fixpunkte stetiger Funktionen (2) Beweisskizze I Sei F= S n∈N I Wegen (2) gilt f n (∅); zu zeigen ist F = µ(f ). F ⊆ µ(f ); also bleibt zu zeigen µ(f ) ⊆ F . f (F) = F zu zeigen, da µ(f ) der kleinste Fixpunkt ist. S S f (F) = f ( n∈N f n (∅)) = n∈NSf n+1 (∅), wegen Stetigkeit; und S S n+1 (∅) = ∅ ∪ 1≤n∈N f n (∅) = n∈N f n (∅) = F . n∈N f I Es genügt I Es gilt: I Für stetige Funktion muß man nur endlich oft iterieren, um die Menge der ableitbaren Konklusionen zu bekommen. I Für nur monotone Funktionen kann man weiteriterieren und bleibt immer unterhalb des Fixpunkts. Sobald irgendeine Iteration nicht mehr größer wird, hat man den Fixpunkt. Mit Theorie der Ordinalzahlen: Wenn man genügend unendlich oft“ iteriert, erreicht man µ(f ). ” A. Knapp, G. Schellhorn: Formale Methoden 383 Äquivalenz der natürlichen zur relationalen Semantik Satz Wenn eine Ableitung für hp, σi → σ 0 in der natürlichen Semantik existiert, dann ist (σ, σ 0 ) ∈ JpK in der relationalen Semantik, und umgekehrt. Formalisierung in KIV: I ⇒“ durch Induktion über n in REC ˆ n (Zahl der angewandten Regeln) ” ⇐“ durch strukturelle Induktion über den Aufbau des Programms ” I Beides hat dieselbe Struktur, einzige Ausnahme ist die Schleife I I Benötigt wird als Lemma, daß in der natürlichen Semantik (while b do p, σ, σ 0 ) genau dann ableitbar ist, wenn es ein n gibt, sodaß ((if b then p else abort)n , σ, σ 0 ) ableitbar ist und JbK σ 0 = ff . I Beweis ⇒“ wieder durch Induktion über Zahl der angewandten Regeln. ” I Beweis ⇐“ durch Induktion über n. ” A. Knapp, G. Schellhorn: Formale Methoden 384 Prozeduren: Natürliche Semantik Natürliche Semantik für Prozeduraufrufe (callns ) hp, σ{~x,~y 7→ J~tK σ, σ(~z)}i → σ 00 hq(~t; ~z), σi → σ 00 {~x,~y 7→ σ(~x), σ(~y)}{~z 7→ σ 00 (~y)} wobei q(~x; ~y) p ∈ Decl , I Die formalen Parameter ~x, ~y an die ausgewertete Argumente ~t, ~z binden; I p ausführen, ergibt σ 00 ; I für die formalen Parameter wieder die Ausgangswerte nehmen; I die Output-Parameter ~z mit den Ergebniswerten σ 00 (~y) überschreiben; I nicht umgekehrt, wenn ~ z und ~y gemeinsame Variablen haben I falls keine globalen Variablen vorhanden sind, kann man als Endzustand einfacher σ{~z 7→ σ 00 (~y)} nehmen. A. Knapp, G. Schellhorn: Formale Methoden 385 Prozeduren: Formalisierung in KIV I Sorte Proc für Prozedurnamen mit Variable q I Für Deklarationen Vereinfachung: nur ein Eingabe-, und ein I/O-Parameter I allgemeiner: Listen und Test auf Duplikatfreiheit I Spezifikation Decl mit drei Funktionen (einfacher zu spezifizieren als eine Funktion, die ein Tripel liefert): I inparam : Proc → Id I ioparam : Proc → Id I body : Proc → Prog I Jedes q hat dadurch die Deklaration q(inparam(q); ioparam(q)). body(q) A. Knapp, G. Schellhorn: Formale Methoden 386 Speicher: Kopiersemantik Funktionale Programmiersprachen haben ebenso wie Prädikatenlogik und die abstrakte KIV-Programmiersprache Kopiersemantik. I Bei Kopiersemantik ändert eine Zuweisung an eine Variable einfach die Belegung (den Wert) der Variable. I Die Zuweisung hat keinen Effekt auf den Inhalt anderer Variablen (referentielle Transparenz). I Einfachere Semantik, damit leichter verständlich und einfacher zu verifizieren. A. Knapp, G. Schellhorn: Formale Methoden 387 Speicher: Pointersemantik Imperative (und objektorientierte) Programmiersprachen haben aus Effizienzgründen meistens Pointersemantik. I Die Belegung σ(x) einer Variable x ist immer I eine Referenz vom Typ ref (Compilerbau: “boxed objects”) oder I von einem primitiven Typ wie bool oder int (“unboxed objects”). I Es gibt immer einen globalen Speicher (engl. heap) h : ref * data. I Schlüssel sind vom Typ ref mit einer Konstante null. I Werte sind vom Typ data mit ref ⊆ data I Eine Zuweisung an x ändert (wenn boxed) den Speicher, nicht die Referenz in der Belegung. A. Knapp, G. Schellhorn: Formale Methoden 388 Speicher: Formalisierung in KIV (1) Einfache Sprache mit Speicher I Nur eine Sorte Objekte: NatxRef mit zwei Feldern vom Typ nat und Ref I Zugriff per o.val und o.next I Speichermodifikationen nur auf Programm-, nicht auf Ausdrucksebene (Semantik von Ausdrücken kann Funktion mit Wert bleiben). I Variablen für Objektreferenzen oid : OId I Zustände st speichern jetzt: I I I natürliche Zahlen für Identifikatoren: st[id] : nat Referenzen für Objekte: st[oid] : Ref Speicher Instanz des nicht-freien Datentyps Store(loc, data) I Schlüssel (loc) vom Typ Ref I Werte (data) vom Typ NatxRef (mit Selektoren .nat und .ref) I Heapzugriff hp[r] : NatxRef I Heapmodifikation hp[r, n0 × r0] A. Knapp, G. Schellhorn: Formale Methoden 389 Speicher: Formalisierung in KIV (2) Neue Ausdrücke o : OExp für Objekte (genauer: Referenzen auf Objekte) bestehend aus: I v(oid) (Variable für Objekt) I o.next (Zugriff auf next-Feld) I null Neue arithmetische und boolesche Ausdrücke: I neuer arithmetischer Ausdruck: o.val (val-Feld) I neuer boolescher Ausdruck: o = o’ (Referenzvergleich) A. Knapp, G. Schellhorn: Formale Methoden 390 Speicher: Formalisierung in KIV (3) Auf Programmebene gibt es jetzt vier verschiedene Zuweisungsarten: 1 id _:= e wie bisher (Zuweisung an lokale Variable) 2a oid .val _:= e Zuweisung an val-Feld 2b oid .next _:= o Zuweisung an next-Feld 3 oid _:=new neues Objekt erzeugen (mit 0 × null als Inhalt) I Zuweisung (1) und (2a–b) sind auch in Java unterschiedlich. I Zuweisung (3) ist Ersatz dafür, daß keine Seiteneffekte (hier: Allokation) auf Termebene vorhanden sind. I Vereinfachung: eigentlich OExp’s auf der linken Seite, hier nur OId’s A. Knapp, G. Schellhorn: Formale Methoden 391 Seiteneffekte Ausdrücke mit Seiteneffekten auf den Zustand Formalisierung in KIV: I Neue Expression id ++ (Postinkrement) I Ergebnis ist aktueller Wert von id, id wird als Seiteneffekt erhöht I Auswirkungen auf Semantik: JeK(st) muß jetzt Paar aus Wert und neuem Zustand zurückgeben I J . K : AExp → State → pair(State, nat) I Zustand muß propagiert werden, z. B. Je +_ e0K(st) = (st’ × n) ↔ ∃ st0, n0, n1. JeK(st) = (st0 × n0) ∧ Je0K(st0) = (st’ × n1) ∧ n = n0 + n1 I st: Anfangszustand; st0: Zustand nach Auswertung von e; st’: Endzustand A. Knapp, G. Schellhorn: Formale Methoden 392 Nichtterminierung Nichtterminierende Ausdrücke Formalisierung in KIV: I neuer Ausdruck nonterm I Ausdruckssemantik muß Relation statt Funktion werden (Alternative: Funktion mit ⊥-Ergebnis) J . K : AExp → State |{z} → bool | {z } × nat | {z } × State Startzustand | Endzustand Ergebnis {z } Prädikat kann auf (st, st’, n) zutreffen oder nicht I I I Axiom: ¬ JnontermK(st, st’, n) Axiom für Addition lautet jetzt: Je +_ e0K(st, st’, n) ↔ ∃ st0, n0, n1. JeK(st, st0, n0) ∧ Je0K(st0, st’, n1) ∧ n = n0 + n1 muß jetzt auch bei booleschen Ausdrücken beachtet werden: J . K : BExp → State × State × bool → bool A. Knapp, G. Schellhorn: Formale Methoden 393 Ausnahmen (1) Ein Ausdruck kann eine Ausnahme auslösen. Formalisierung in KIV: I Minus auf natürlichen Zahlen: underflowexception (Konstante einer Datenstruktur) I Berechnung erhält ein neues Ergebnis, den Ausführungsmodus mo : Mode mit Mode = ok | underflowexception I mo = ok bedeutet normale Beendigung I mo = underflowexception bedeutet Sprung bis zum nächsten Catch für diese Exception I Java Manual spricht informell von “normal completion” vs. “abrupt completion” (mit einer “reason”, i. e. der Exception); für Java damit, da auch break’s und return’s Sprünge sind: Mode = ok | Exception(. . .) | Return | Break | Continue A. Knapp, G. Schellhorn: Formale Methoden 394 Ausnahmen (2) I J . K : AExp → State | {z } × State | {z } × Startzustand I Endzustand Mode | {z } Ergebnismodus × nat |{z} → bool Ergebnis, falls Modus ok Analog für BExp und Prog: J . K : BExp → State × State × Mode × bool → bool J . K : Prog → State × State × Mode → bool I Neues Programmkonstrukt: try(p : Prog; mo : Mode; p’ : Prog) I Führt p aus I mo ist die Ausnahme die abgefangen wird I I eigentlich nur vom Typ Exception, einfachheitshalber ein Modus Wenn Ergebnismode von p gleich mo, dann wird p’ ausgeführt A. Knapp, G. Schellhorn: Formale Methoden 395 Erweiterungen für Java I Einige Datentypen (byte, short, . . . ) mit vielen Funktionen I Algebraische Spezifikation der Klassenhierarchie c1 ≤ c2 (inkl. Interfaces) I body : Type → Prog für dynamischen Methodenlookup I Semantik eines Methodenaufrufs mit dynamischem Lookup I Statische Typisierungsfunktion: class : Id → Class I Damit: Wohlgetypte Programme (rekursiv definiertes Prädikat) I Speicher mit Paaren aus Referenz und Feldname oder Array-Index als Schlüssel; Werte nur primitive Datentypen oder Referenzen I Wohlgetypte Speicher h mit class(h(i.f )) ≤ class(i.f ) I Beweis, dass während des Ablaufs eines wohlgetypten Programms ein wohlgetypter Speicher wohlgetypt bleibt I Für Verifikation (z. B. in KIV) : Parser, Kalkül A. Knapp, G. Schellhorn: Formale Methoden 396 Zusammenfassung I Semantik von Programmen I Relationale und natürliche Semantik I I I I Fixpunktsätze von Knaster-Tarski und Kleene Äquivalenz der Semantiken Lokale Variablen, Prozeduren, Speicher, Ausnahmen Programmkorrektheit I I I partielle und totale Korrektheit Hoare-Kalkül Dynamische Logik A. Knapp, G. Schellhorn: Formale Methoden 397 Interpreter aus natürlicher Semantik (1) REC#(p; st) begin if p = mkskip else if p = mkabort else if assignp(p) else if compp(p) else if ifp(p) else if whilep(p) then then then then then skip abort st := st[p.id <- Jp.eK(st)] REC#(p.p1; st); REC#(p.p2; st) if Jp.bK(st) then REC#(p.p1; st) else REC#(p.p2; st) then if Jp.bK(st) then REC#(p.p; st); REC#(p; st) else skip end I I/O-Parameter st entspricht globaler Variable. I Selektoren .p1, .p2 für sequentielle Komposition, etc. I Es gilt: hREC#(p; st)ist = st’ ↔ JpK(st, st’) A. Knapp, G. Schellhorn: Formale Methoden 398 Monotonie von Programmen Kontexte C(X) I Programme mit Löchern“ X , z. B. ” C(X) = if x = 3 then X; let y = 5 in X; y = x + 3 I Einsetzen von Programm p in Kontext C(X): Ersetzung aller Vorkommen von X durch p. Sei C(X) ein Kontext. Wenn RJp1 K A ⊆ RJp2 K A, dann RJC(p1 )K A ⊆ RJC(p2 )K A. Satz Beweisskizze Strukturelle Induktion über C(X). Ein rekursiv definierter Interpreter ergibt also automatisch eine monotone Funktion (man kann eine Prozedur gar nicht rekursiv nicht aufrufen“). ” I Deshalb werden in KIV rekursive Programme gegenüber induktiven Definitionen bevorzugt (kein Monotonie-Beweis erforderlich). I I Andere Systeme (Isabelle, HOL, Coq etc.) haben Unterstützung für die Automatisierung des Monotoniebeweises (direkte Eingabe der Regeln). A. Knapp, G. Schellhorn: Formale Methoden 399 Interpreter aus natürlicher Semantik (2) I Die KIV-Programmiersprache kann sich selbst interpretieren (aber: Zirkelschluss, wenn nicht einmal direkt eine Semantik definiert ist). I Die KIV-Programmiersprache kann auch für beliebige andere Programmiersprachen die Semantik liefern (etwa Java, Prolog). I Wenn mehrere Regeln auf dasselbe Programmkonstrukt anwendbar sind, wird das Programm indeterministisch. I Der rekursive Interpreter ist für den Compilerbau ungeeignet, da man Rekursion beim Compilieren loswerden will. A. Knapp, G. Schellhorn: Formale Methoden 400 Iterative Programmauswertung Small-Step-Semantik I hp, σi ⇒ hp0 , σ 0 i bedeutet: p geht vom Zustand σ in einem Schitt nach σ 0 ” und das dann übrigbleibende Restprogramm ist p0“ I Die Granularität der Schritte ist frei wählbar. I gut geeignet für Interleaving-Parallelität Abläufe entstehen durch Aneinanderhängen von Einzelschritten: hp0 , σ0 i ⇒ hp1 , σ1 i ⇒ hp2 , σ2 i ⇒ . . . I Leeres Programm ε für Endzustände mit ε ; p = p ; ε = p I Ablauf terminiert, wenn Ablauf endlich lang und Ablauf endet mit dem leeren Programm ε A. Knapp, G. Schellhorn: Formale Methoden 401 Strukturell-operationelle Semantik (1) Definition Strukturell-operationelle Semantik (engl. structural operational semantics, SOS) definiert eine “small-step”-Semantik eines Programms p ∈ Prog durch die Ableitbarkeit von hp, σi ⇒ hp0 , σ 0 i für σ, σ 0 ∈ State im folgenden Regelsystem Rsos . (skipsos ) hskip, σi ⇒ hε, σi (skipsos ) habort, σi ⇒ habort, σi (assignsos ) h~x := ~a, σi ⇒ hε, σ{~x 7→ T J~aK σ}i (seqsos ) hp1 , σi ⇒ hp01 , σ 0 i hp1 ; p2 , σi ⇒ hp01 ; p2 , σ 0 i A. Knapp, G. Schellhorn: Formale Methoden 402 Strukturell-operationelle Semantik (2) (ifttsos ) hif b then p1 else p2 , σi ⇒ hp1 , σi, falls JbK σ = tt (ifffsos ) hif b then p1 else p2 , σi ⇒ hp2 , σi, falls JbK σ = ff (whilettsos ) hwhile b do p, σi ⇒ hp ; while b do p, σi, (whileffsos ) hwhile b do p, σi ⇒ hε, σi, falls JbK σ = tt falls JbK σ = ff Satz Die strukturell-operationelle Semantik und die relationale Semantik sind äquivalent: I hp, σi ⇒ · · · ⇒ hε, σ 0 i gdw. (σ, σ 0 ) ∈ RJpK. I hp, σi ⇒ hp1 , σ1 i ⇒ hp2 , σ2 i ⇒ . . . A. Knapp, G. Schellhorn: Formale Methoden gdw. ¬∃σ 0 . (σ, σ 0 ) ∈ RJpK. 403 Strukturell-operationelle Semantik: Lokale Variablen Lokale Variablen komplexer als in natürlicher Semantik I Zusätzlich zum Zustand Stack, der lokalen Variablen Werte zuordnet und die globalen Werte überlagert. I Der Stack kann in den Zustand integriert werden: I push(λ, σ) legt die Variablenzuordnung λ = {~ x 7→ ~n} auf den Stack I Pseudoprogramm pop(σ) deallokiert Variablenzuordnung I Variablenzugriff push({~ x 7→ ~n}, σ)(x) = (σ{~x 7→ ~n})(x) I Damit Regel (letsos ) I hlet ~x = ~a in p, σi ⇒ hp ; pop(σ), push({~x 7→ T J~aK σ}, σ)i Die Prozeduraufrufsregel wird nach demselben Prinzip definiert. A. Knapp, G. Schellhorn: Formale Methoden 404 Strukturell-operationelle Semantik: Interleaving Interleaving-Parallelität mit Konvention (ε k p) = (p k ε) = p: (par1sos ) (par2 sos ) hp1 , σi ⇒ hp01 , σ 0 i hp1 k p2 , σi ⇒ hp01 k p2 , σ 0 i hp2 , σi ⇒ hp02 , σ 0 i hp1 k p2 , σi ⇒ hp1 k p02 , σ 0 i A. Knapp, G. Schellhorn: Formale Methoden 405 Strukturell-operationelle Semantik: Sequentielle Komposition Das zur Small-Step-Semantik gehörige Programm ist fast tail-rekursiv (i. e. fast eine Schleife). Einzige Ausnahme ist die sequentielle Komposition. Dieses Problem läßt sich beseitigen, indem statt eines Programms ein Stack von Programmen ps abgearbeitet wird: Statt hp, σi ⇒ hp0 , σ 0 i also hp + ps, σi ⇒ hp0 + ps, σ 0 i Das leere Programm kann entfallen (stattdessen leere Liste) und die seq-Regel lautet einfach: (seqsos ) hp ; p0 + ps, σi ⇒ hp + p0 + ps, σi A. Knapp, G. Schellhorn: Formale Methoden 406 Interpreter aus strukturell-operationeller Semantik (1) while ps 6= [] do do let p = ps.first in begin ps := ps.rest; ASTEP#(p; ps, st) end ASTEP#(p; if else if else if else if else if ps, st) begin p = mkskip then p = mkabort then assignp(p) then compp(p) then ifp(p) then else if whilep(p) skip ps := p + ps st := st[p.id <- Jp.eK(st)] ps := p.p1 + p.p2 + ps if Jp.bK(st) then ps := p.p1 + ps else ps := p.p2 + ps then if Jp.bK(st) then ps := p.p + p + ps else skip end A. Knapp, G. Schellhorn: Formale Methoden 407 Interpreter aus strukturell-operationeller Semantik (2) Die while-Schleife ist ein Interpreter mit einem abstrakten Schritt ASTEP#(ainstr) pro abstrakter Instruktion ainstr (sequentielle Komposition, if, while etc.), der die Instruktion ausführt. Verwaltet wird ein globaler Zustand aus Restprogramm (die Liste ps) und momentaner Belegung. Äquivalente Sichtweise: Automat mit abstrakter Zustandsmenge Q (hier: Prog∗ × State) und einer Regelmenge für die Zustandsübergänge. Die operationale Definition derartiger programmhafter“ Automaten ist eine ” Grundidee von Abstract State Machines. A. Knapp, G. Schellhorn: Formale Methoden 408 Compilation I Jede Instruktion ainstr wird compiliert: cinstrs = compile(ainstr). I Resultat ist eine Sequenz cinstrs von konkreten Maschineninstruktionen (Bytecode/Assemblercode). I Benötigt wird dann ein konkreter Interpreter für diesen Code, ähnlich zum Interpreter für abstrakte Anweisungen, mit einem CStep. Es sollte (in etwa) für cinstrs = compile(ainstr) gelten: I Wenn AStep(ainstr) von einem Zustand as zum nächsten Zustand as0 führt, I dann führt auch CStep(cinstrs) von as zu as0 . Probleme: I Meist mehrere konkrete Schritte für eine Instruktion. I Der Zustand cs des Maschinencode-Interpreters ist meist anders als eine Liste von Programmen. A. Knapp, G. Schellhorn: Formale Methoden 409 Indeterminismus Indeterminismus (engl. non-determinism) ist oft nützlich und elegant für Spezifikationen: I Ein Scheduler wählt einen Prozeß für den nächsten Schritt aus. Man will aber davon abstrahieren, wie er genau implementiert ist. I Security: Irgendeine Smartcard soll einen nächsten Protokollschritt machen. I Safety (Elbtunnel-Fallstudie): Das Fahrzeug fährt auf der rechten oder linken Spur. I Der Benutzer macht irgendeine Eingabe. I Eine Zufallszahl wird gewählt. I Graph azyklisch gdw. ein Programm, das (indeterministisch) immer eine der Kanten entlanggeht, terminiert immer. I Komplexitätstheorie: Eine Belegung von Variablen soll gefunden werden, die einen booleschen Ausdruck wahrmacht: Man rate eine. (vgl. P vs. NP) Beispiele subsumiert durch: Wähle irgendein Element aus einer Menge. A. Knapp, G. Schellhorn: Formale Methoden 410 Indeterministische Auswahl: Syntax Neues Programmkonstrukt choose ~x with b in p ifnone p0 für indeterministische Auswahl I Wenn eine Belegung ~k für ~x existiert, die b im momentanen Zustand erfüllt, dann binde die lokalen Variablen ~x an solche ~k und führe p aus. I Wenn b im momentanen Zustand für alle Belegungen von ~x falsch ist, führe stattdessen p0 aus. I Konvention: ifnone wird weggelassen, wenn irrelevant (= abort gesetzt). I Konstruktive Implementierung nur, wenn endlich viele ~x in Frage kommen. A. Knapp, G. Schellhorn: Formale Methoden 411 Indeterministische Auswahl: Semantik Natürliche Semantik (choosettns ) (chooseffns ) hp, σ{~x 7→ ~k}i → σ 0 hchoose x with b in p ifnone p0 , σi → σ 0 {~x 7→ σ(~x)} falls JbK σ{~x 7→ ~k} = tt hp0 , σi → σ 0 hchoose x with b in p ifnone p0 , σi → σ 0 falls ∀~k . JbK σ{~x 7→ ~k} = ff , , Relationale Semantik RJchoose x with b in p ifnone p0 K A = {(v, v0 ) | ((∀~k . T JbK A v{~x 7→ ~k} = ff ) ∧ (v, v0 ) ∈ RJp0 K A) ∨ (∃~k . T JbK A v{~x 7→ ~k} = tt ∧ (v, v00 ) ∈ RJpK A v{~x 7→ ~k} ∧ v0 = v00 {~x 7→ v(~x)})} A. Knapp, G. Schellhorn: Formale Methoden 412 Indeterministische Auswahl: Spezialfälle Zwei typische Spezialfälle lassen sich als Abkürzungen definieren: I Indeterministische Auswahl zwischen zwei Programmen (mit b neu) p1 or p2 für choose b with true in if b then p1 else p2 I Zufallszuweisung (mit x0 neu) x := ? für choose x0 with true in x := x0 Die Semantik von p1 or p2 ergibt sich zu (or1ns ) hp1 , σi → σ 0 hp1 or p2 , σi → σ 0 (or2ns ) hp2 , σi → σ 0 hp1 or p2 , σi → σ 0 bzw. RJp1 or p2 K A = RJp1 K A ∪ RJp2 K A A. Knapp, G. Schellhorn: Formale Methoden 413 Beschränkter Indeterminismus Satz Wenn man in Programmen zwar or, aber kein choose erlaubt, erhält man beschränkten Indeterminismus: jedes solche Programm kann nur endlich viele Endzustände erreichen. Beweisskizze Zuerst Nachweis für p ↓ n durch Induktion über n; damit hat man eine Induktionsvoraussetzung für Aufrufe. Dann Induktion über die Struktur von Programmen. I Mit Hilfe von n := 0 or n := 1 or . . . or n := k Auswahl aus k Elementen. I Beschränkter Indeterminismus ist gutartiger“ als unbeschränkter. ” A. Knapp, G. Schellhorn: Formale Methoden 414 Indeterminismus: Terminierungsproblem (1) Beobachtung: RJskip or abortK A = RJskipK A ∪ ∅ = RJskipK A. I angelische Semantik (engl. angelic semantics) Unter welchen Umständen ist es sinnvoll, daß skip und skip or abort gleichwertig sind? I Für partielle Korrektheit ist die angelische Semantik ausreichend: Es gilt {ϕ} skip or abort {ψ} gdw. {ϕ} skip {ψ} gdw. ϕ → ψ . I Für Komplexitätstheorie auch ausreichend: das Richtige kann geraten werden. I Für garantierte Terminierung (und totale Korrektheit) nicht das Richtige. Für totale Korrektheit sind mögliche und sichere Nichtterminierung gleich. Damit dämonische Semantik (engl. demonic semantics), in der RJskip or abortKdem A = RJabortKdem A. A. Knapp, G. Schellhorn: Formale Methoden 415 Indeterminismus: Terminierungsproblem (2) I Dämonische Semantik sehr verbreitet in der Literatur; auch auch für parallele Syteme verwendet (CSP). I Volle Freiheit gibt erratische Semantik (engl. erratic semantics). I Genügt allerdings für parallele Programme oft auch nicht: evtl. wird Fairness (jede Wahl kommt mindestens irgendwann dran) relevant. I Grundlage sowohl der dämonischen als auch der erratischen Semantik: Die Menge der Zustände für die ein Programm garantiert terminiert. Das Terminierungsproblem ist nur relevant für indeterministische Programme. Wenn man nur deterministische Programme hat, ist Nichterminierung äquivalent dazu, daß es keinen erreichbaren Endzustand gibt. A. Knapp, G. Schellhorn: Formale Methoden 416 Garantierte Terminierung (1) Definition Der (garantierte) Terminierungsbereich eines Programms p ist die durch die folgenden Regeln beschriebene Menge RJpK↓ A: v ∈ RJskipK↓ A v ∈ RJp1 K↓ A (v0 ∈ RJp2 K↓ A)(v,v0 )∈RJp1 K A v ∈ RJp1 K↓ A v ∈ RJif b then p1 else p2 K↓ A v ∈ RJp1 ; p2 K↓ A , T JbK A v = tt v ∈ RJpK↓ A (v0 ∈ RJwhile b do pK↓ A)(v,v0 )∈RJpK A v ∈ RJwhile b do pK↓ A v{~x,~y 7→ T J~tK A v, v(~z)} ∈ RJpK↓ A v ∈ RJq(~t; ~z)K↓ A , , T JbK A v = tt q(~x; ~y) p ∈ Decl (und analoge Regeln für if und while, wenn b falsch) A. Knapp, G. Schellhorn: Formale Methoden 417 Garantierte Terminierung (2) (v{~x 7→ ~k} ∈ RJpK↓ A)~k∈K , v ∈ RJchoose ~x with b in p ifnone p0 K↓ A wobei K = {~k | T JbK A v{~x 7→ ~k} = tt}, falls K 6= ∅ v ∈ RJp0 K↓ A v ∈ RJchoose ~x with b in p ifnone p0 K↓ A falls {~k | T JbK A v{~x 7→ ~k} = tt} = ∅ , I Die Regeln für sequentielle Komposition und while haben soviele Prämissen, wie p1 bzw. p Ergebniszustände liefert. Die Regel für choose hat soviele Prämissen, wie es Auswahlmöglichkeiten für ~k gibt; bei unbeschränktem Indeterminismus gibt es also evtl. unendlich viele. I Abgeleitete Regel: v ∈ RJp1 K↓ A v ∈ RJp2 K↓ A A. Knapp, G. Schellhorn: Formale Methoden v ∈ RJp1 or p2 K↓ A 418 Monotonie und Stetigkeit des Terminierungsbereichs Satz Die induktive Definition des Terminierungsbereichs definiert einen monotonen Operator. Wenn jedes choose nur eine endliche Auswahl trifft, so ist der Operator stetig. Beweisskizze Nur positive Aufrufe in den Prämissen. Wenn choose nur eine endliche Auswahl trifft, hat jedes Programm nur endlich viele Endzustände, also hat jede Regel nur endlich viele Prämissen. I Damit ist der Terminierungsbereich nach dem Satz von Knaster-Tarski wohldefiniert. I Die Nicht-Stetigkeit macht den Satz von Kleene nicht anwendbar. Insbesondere ist der Terminierungsbereich nicht einfach (per Iteration über Schleifenzahl oder Rekursionstiefe) axiomatisierbar. A. Knapp, G. Schellhorn: Formale Methoden 419 Unbeschränkter Indeterminismus: Beispiel while m 6= 1 do if m = 0 then choose m’ with m’ > 0 in m := m’ else m := m -1 I Wenn mit m > 0 gestartet, zählt die Schleife bis 1 herunter. I Für m = 0 setzt der erste Durchlauf m auf einen beliebigen Wert > 0. I Also: Die Schleife terminiert immer: RJwhile . . . K↓ A = SA (alle Zustände). I Aber: Es gibt kein n, sodaß die Schleife nach höchstens n Schritten terminiert. I Das erste Abwickeln für m = 0 ergibt unendlich viele Prämissen (eine mit m = 1, eine mit m = 2 usw.). Die erste Prämisse braucht 0 Regelanwendungen, die nächste 1 usw. zum Beweis, daß Terminierung gilt. A. Knapp, G. Schellhorn: Formale Methoden 420 Erratische Semantik (1) Definition Die erratische Semantik RJpK⊥ A eines Programms p ist eine Relation auf (SA ∪ {⊥}) × (SA ∪ {⊥}), wobei ⊥ für Nichtterminierung steht. Sie ist gegeben durch RJpK⊥ A = RJpK A ∪ (((SA ∪ {⊥}) \ RJpK↓ A) ×{⊥}) . | {z } Nichtterminierung möglich I Das Paar (⊥, ⊥) ist immer in der Semantik: Wenn schon vorher nicht ” terminiert, dann kommt das Programm nicht dran, und es bleibt bei Nichtterminierung“. A. Knapp, G. Schellhorn: Formale Methoden 421 Erratische Semantik (2) I Für die meisten Programmkonstrukte gelten die alten Gesetze, es kommt immer nur (⊥, ⊥) hinzu. Beispiele: I RJp ; p K A = RJp K A ; RJp K A 1 2 ⊥ 1 ⊥ 2 ⊥ I Für v 6= ⊥ gilt: (v, v0 ) ∈ RJif b then p else p K A gdw. 1 2 ⊥ Wenn T JbK A v = tt, dann (v, v0 ) ∈ RJp1 K⊥ A, sonst (v, v0 ) ∈ RJp2 K⊥ A. I Deshalb sind die Kalkülregeln fast dieselben wie für Diamonds. I Nur für Schleifen und Rekursion gibt es keine einfache Definition: man braucht separate Definitionen. A. Knapp, G. Schellhorn: Formale Methoden 422 Dämonische Semantik Das Element ⊥ drückt Unkenntnis über das Ergebnis des Programmlaufs aus (i.e. Unspezifiziertheit des Endzustands, kann Nichtterminierung, aber auch etwas anderes sein). Definition Die dämonische Semantik RJpKdem A eines Programms p ist eine Relation auf (SA ∪ {⊥}) × (SA ∪ {⊥}), gegeben durch RJpKdem A = RJpK A ∪ ((SA ∪ {⊥}) \ RJpK↓ A) × (SA ∪ {⊥}) . {z } | {z } | Nichtterminierung möglich jedes Ergebnis I Recht unintuitiv ist, daß in RJpKdem A immer alle Paare (⊥, v0 ) enthalten sind. I Für beschränkten Indeterminismus direkt als induktive Relation definierbar. I Es gilt RJabortKdem A = (SA ∪ {⊥}) × (SA ∪ {⊥}) und damit wie gewünscht: RJskip or abortKdem A = RJskipKdem A ∪ RJabortKdem A = RJabortKdem A. A. Knapp, G. Schellhorn: Formale Methoden 423 wp-Kalkül Wir addieren einen neuen Operator h|p|iϕ zur Logik mit der Bedeutung: p terminiert immer und es gilt anschließend ϕ: A, v |= h|p|iϕ ⇔ v ∈ RJpK↓ A ∧ ∀(v, v0 ) ∈ RJpK A . A, v0 |= ϕ I Damit befinden wir uns nicht mehr in der dynamischen Logik, sondern im wp-Kalkül (Edsger W. Dijkstra). I Den Operator findet man häufig als wp(p, ϕ) geschrieben, da er die schwächste Vorbedingung (engl. weakest precondition) beschreibt, sodaß nach p ϕ gilt. I [p]ϕ findet man auch als die schwächste liberale Vorbedingung (engl. weakest liberal precondition) wlp(p, ϕ). A. Knapp, G. Schellhorn: Formale Methoden 424 Kalkülregeln für totale Korrektheit I Für deterministische Konstrukte (Zuweisung, sequentielle Komposition, if, let) gelten dieselben Kalkülregeln für wp wie für Diamonds. I Für Schleifen und Aufrufe weiterhin noethersche Induktion, insbesondere ist die Invariantenregel für totale Korrektheit immer noch korrekt (die Größe der Variable x muß jetzt für jeden Durchlauf durch den Schleifenrumpf abnehmen). Korrektheitsnachweis: Es gelten im wesentlichen dieselben Semantikregeln für RJpK⊥ A wie für RJpK A. A. Knapp, G. Schellhorn: Formale Methoden 425 Kalkülregel für Schleifen I Für unbeschränkt indeterministische Programme gelten nur noch die Implikationen ∃n . h|loop if b then p times n|i(¬b ∧ ϕ) → h|while b do p|iϕ ∃n . h|q(~x; ~y) : n|iϕ → h|q(~x; ~y)|iϕ und nicht mehr die Äquivalenzen. I Die Regel (Lh()i2 ) wäre für wp inkorrekt. I Nur relevant, wenn man als Voraussetzung in einer Aussage die Terminierung eines unbeschränkt indeterministischen Programms hat (sollte man vermeiden, praktisch fast nicht relevant). I Nicht mehr vollständig: ein für den Zustand σ terminierendes Programm p definiert eine (beliebige) noethersche Ordnung (über die man induzieren müßte) durch die Small-Step-Semantik: σ 00 ≺ σ 0 ⇔ hp, σi ⇒ · · · ⇒ hp0 , σ 0 i ⇒ · · · ⇒ hp00 , σ 00 i ⇒ . . . A. Knapp, G. Schellhorn: Formale Methoden 426 Kalkülregeln für or (R[or]) (Rhori) (Rh|or|i) Γ ⇒ [p1 ]ϕ, ∆ Γ ⇒ [p2 ]ϕ, ∆ Γ ⇒ [p1 or p2 ]ϕ, ∆ Γ ⇒ hp1 iϕ, hp2 iϕ, ∆ Γ ⇒ hp1 or p2 iϕ, ∆ Γ ⇒ h|p1 |iϕ, ∆ Γ ⇒ h|p2 |iϕ, ∆ Γ ⇒ h|p1 or p2 |iϕ, ∆ Definitionen von (L . . . or . . . ) analog A. Knapp, G. Schellhorn: Formale Methoden 427 Kalkülregeln für choose (R[choose]) (Rhchoosei) (Rh|choose|i) b{~x 7→ ~y}, Γ ⇒ [p{~x 7→ ~y}]ϕ, ∆ ∀~x . ¬b, Γ ⇒ [p0 ]ϕ, ∆ Γ ⇒ [choose ~x with b in p ifnone p0 ]ϕ, ∆ Γ ⇒ ∃~y . b{~x 7→ ~y} ∧ hp{~x 7→ ~y}iϕ, (∀~x . ¬b) ∧ hp0 iϕ, ∆ Γ ⇒ hchoose ~x with b in p ifnone p0 iϕ, ∆ b{~x 7→ ~y}, Γ ⇒ h|p{~x 7→ ~y}|iϕ, ∆ ∀~x . ¬b, Γ ⇒ h|p0 |iϕ, ∆ Γ ⇒ h|choose ~x with b in p ifnone p0 |iϕ, ∆ Die Variablen ~y sind neu; Definitionen von (L. . . choose . . . ) analog A. Knapp, G. Schellhorn: Formale Methoden 428 Induktive Semantik und Programmsemantik Auch indeterministische Interpreter sind sinnvolle Definitionen: Satz Sei C(X) ein Kontext. Dann gilt: I Wenn RJp1 K A ⊆ RJp2 K A, dann RJC(p1 )K A ⊆ RJC(p2 )K A. I Wenn alle Ergebnisse (i. e. Endzustände) von p auch Ergebnisse von p 1 2 sind, so sind alle Ergebnisse von C(p1 ) auch Ergebnisse von C(p2 ). I Wenn RJp1 K↓ A ⊆ RJp2 K↓ A, dann RJC(p1 )K↓ A ⊆ RJC(p2 )K↓ A. I Wenn p häufiger terminiert als p , so terminiert auch C(p ) häufiger als 2 1 2 ” C(p1 )“. Korollar Die durch die induktiven Relationen definierte Programmsemantik stimmt mit der des rekursiven Interpreters REC# (erweitert um choose) überein. Es gilt: hREC#(p; st)ist = st’ ↔ JpK(st, st’) h|REC#(p; st)|itrue ↔ JpK ↓(st) A. Knapp, G. Schellhorn: Formale Methoden 429 Zusammenfassung I Semantik von Programmen I Relationale, natürliche und strukturell-operationelle Semantik I I I I Lokale Variablen, Prozeduren, Speicher, Ausnahmen Programmkorrektheit I I I I Fixpunktsätze von Knaster-Tarski und Kleene Äquivalenz der Semantiken partielle und totale Korrektheit Hoare-Kalkül Dynamische Logik Indeterminismus I I angelische, dämonische, erratische Semantik wp-Kalkül A. Knapp, G. Schellhorn: Formale Methoden 430 Motivation: Datentypen mit Zuständen Bisher: Datenstrukturen werden als algebraische Datentypen spezifiziert. Diese sind zustandslos (bzw. haben einen Zustand als Argument/Resultat, der damit immer auch sichtbar ist). Andere Sichtweise: Ein abstrakter Datentyp bietet Funktionalität (z. B. durch Methoden) nach außen an, hat aber einen impliziten internen Zustand, der nur über die Funktionen zugänglich ist (information hiding). Die Funktionen sind durch Kontrakte spezifiziert. Die algebraische Sichtweise entspricht stärker der Sicht funktionaler Programmiersprachen, die zweite Sichtweise eher der objektorientierten Sicht (aber auch dort gibt es zustandslose Interfaces). Auch für die zweite Sicht werden zur Definition des Zustands algebraische Datentypen benötigt. A. Knapp, G. Schellhorn: Formale Methoden 431 Spezifikation von Kontrakten Es gibt drei Möglichkeiten einen Kontrakt zu definieren: I per Vorbedingung ϕ und Nachbedingung ψ ; I in einer gemeinsamen relationalen Spezifikation Op; I als Programm mit einem choose. Beispiel (Revertieren einer Liste): I Eingabevariable: x I Ausgabevariable: x I Vorbedingung: x = x0 I Nachbedingung: x = reverse(x0 ) A. Knapp, G. Schellhorn: Formale Methoden 432 Kontrakt als Relation: Beispiel Spezifikation als Relation: Op(x, x0 ) = ∃x0 . x = x0 ∧ x0 = reverse(x0 ) I Benötigt wird Konvention für Start- und Endwert einer Variable: I Hier wie in Z: x bezeichnet den Startwert, x0 den Endwert I VDM: pre(x) für den alten, x für den neuen I JML: \old(x) und x für den neuen I Die Relation ist die Konjunktion von Vor- und Nachbedingung, wobei in der Nachbedingung x0 statt x genommen wird. I In der Relation stehen nur die Programmvariablen. I Hilfsvariable x0 wird existenzquantifiziert, fällt weg. Im Beispiel kann zu x0 = reverse(x) vereinfacht werden. I Relationale Spezifikation ist etwas eleganter als getrennte Vor- und Nachbedingung (Programmvariablen klar, keine Hilfsvariablen). A. Knapp, G. Schellhorn: Formale Methoden 433 Kontrakte als Relationen I Allgemeine Definition einer Relation für Vorbedingung ϕ und Nachbedingung ψ also: Op(~x,~x0 ) = ∃~x0 . ϕ ∧ ψ{~x 7→ ~x0 } wobei ~x0 alle Nicht-Programmvariablen sind. I Die (implizite) Vorbedingung ist jetzt pre(Op) = ∃~x0 . Op(~x,~x0 ) Schreibweise in der Spezifikationssprache Z: Op ∆~x ϕ ψ{~x 7→ ~x0 } A. Knapp, G. Schellhorn: Formale Methoden 434 Kontrakt mit choose Beobachtung: Mit folgendem indeterministischen Programm kann man den Kontrakt trivial erfüllen: Op(x; x0 ) choose x0 with x0 = reverse(x) in x := x0 ifnone chaos(x) Dabei ist chaos(~x) ein Programm, das irgendetwas tut, wenn die Vorbedingung nicht erfüllt ist: chaos(~x) = choose ~x0 , boolvar with true in if boolvar then abort else ~x := ~x0 Das choose-Program ist also so etwas wie die allgemeinste ” Implementierung“. Im Beispiel wird chaos(x) nie aufgerufen, da jede Liste revertiert werden kann; das Programm kann vereinfacht werden zu Op(; x) x := reverse(x) A. Knapp, G. Schellhorn: Formale Methoden 435 Operationale Definition von Kontrakten Ein Kontrakt, der gegeben ist durch I eine Relation Op oder I Vor- und Nachbedingungen ϕ, ψ mit Variablen ~x kann auch operational spezifiziert werden als Op(~x; ~x0 ) choose ~x0 with Op(~x,~x0 ) in ~x := ~x0 ifnone chaos(~x) bzw. als Op(~x; ~x0 ) choose ~x0 with ∃~x0 . ϕ ∧ ψ{~x 7→ ~x0 } in ~x := ~x0 ifnone chaos(~x) A. Knapp, G. Schellhorn: Formale Methoden 436 Operationale und relationale Spezifikationen (1) Operationale Spezifikationen I Vorteil: Ein abstraktes Programm muß bei falscher Vorbedingung nicht mit chaos reagieren. Alternativen z. B. abort oder “contract exception”. Spezifikation mit Programmen ist etwas mächtiger als mit Kontrakten. I Vorteil: Spezifikation kann Kontrollstruktur haben (sequentielle Komposition, Fallunterscheidung etc.) I Vorteil (?): x := reverse(x) ist für Informatiker natürlicher“ als ” 0 x = reverse(x) I Nachteil: Die allgemeine Übersetzung eines Kontrakts in ein choose-Programm ist recht konkret: Relationen abstrakter A. Knapp, G. Schellhorn: Formale Methoden 437 Operationale und relationale Spezifikationen (2) Relationale Spezifikationen I Vorteil: Reine Prädikatenlogik (keine Big-Step-Semantik etc.) I Nachteil: Frameproblem: Der Zustand sei x1 , x2 , . . . , xn , Operation Op1 verdoppele x1 : I operational x1 := 2 ∗ x1 I relational Op1 (x1 , . . . , xn , x01 , . . . , x0n ) ↔ x01 = 2 ∗ x1 ∧ x02 = x2 ∧ . . . ∧ x0n = xn A. Knapp, G. Schellhorn: Formale Methoden 438 Abstrakte Datentypen Definition I Ein abstrakter Datentyp (St, Init, (Opi )i∈I ) besteht aus einer Zustandsmenge St; I Typischerweise besteht St aus der Belegung eines Vektors von Variablen mit algebraisch spezifizierten Datentypen. I einer Menge von Initialzuständen Init ⊆ St; I Einer Familie (für i ∈ I ) von Operationen Opi ⊆ Ini × St × St × Outi . I I Operationen entsprechen (relational definierten) Kontrakten. Jede Operation I I I hat Eingaben aus Ini (kann für einzelne Operationen wegfallen); modifiziert den Zustand aus St; und hat eine Ausgabe aus Outi (kann für einzelne Operationen wegfallen). A. Knapp, G. Schellhorn: Formale Methoden 439 Abstrakte Datentypen: Beispiele (1) Ein Java-Objekt kann als abstrakter Datentyp aufgefaßt werden: I St ist die Menge der möglichen Belegungen der Felder. I Init sind die Ergebnisse der Konstruktoren. I Opi sind Kontrakte für die Methoden des Objekts. I Die Felder des Objekts sind privat (nur über die Methoden zugänglich). Ein Java-Klasse kann als abstrakter Datentyp aufgefasst werden: I St ist die Menge der möglichen Objektmengen einer Klasse. I Init (einelementig) ist das Ergebnis der statischen Initialisierung. I Opi sind Kontrakte für die Methoden der Klasse. A. Knapp, G. Schellhorn: Formale Methoden 440 Abstrakte Datentypen: Beispiele (2) Ein ganzes Softwaresystem kann als abstrakter Datentyp aufgefaßt werden. I St ist die Menge der Systemzustände (z. B. die Menge der möglichen Instanzen eines Konzeptmodells). I Init sind die Initialzustände. I Opi sind Kontrakte für die Systemoperationen. Ein Programmierspracheninterpreter kann als abstrakter Datentyp aufgefaßt werden. I St besteht aus Variablenbelegung und dem abzuarbeitendem Restprogramm. I Init legt das Gesamtprogramm fest, das zu bearbeiten ist (ein Initalzustand pro Programm). I Opi verarbeitet eine Instruktion. A. Knapp, G. Schellhorn: Formale Methoden 441 Algebraischer Datentyp queue Gegeben seien algebraisch spezifizierte Queues von Integers (hier als Instanz von Listen, es geht auch direkt) mit Operationen: I Sorte intqueue I Konstante emq (die leere Queue) I Funktion enq : queue × int → queue (hinten an die Queue anfügen) I Funktion deq : queue × queue (vorne wegnehmen) I Funktion hd : queue × int (vorderstes Element) A. Knapp, G. Schellhorn: Formale Methoden 442 Abstrakter Datentyp queue I Zustand = eine Variable q vom Typ queue I Initialzustand: q = emq I int⊥ = mki⊥( . .i : int) | ⊥ I (freier Datentyp für das Resultat von DEQ) Zwei Operationen: I ENQ ⊆ int × queue × queue mit Kontrakt: ENQ(i, q, q’) ↔ q’ = enq(i, q) I DEQ ⊆ queue × queue × int⊥ mit Kontrakt: DEQ(q, q’, i⊥) ↔ (q 6= [] ⊃ q’ = deq(q) ∧ i⊥ = mki⊥(hd(q)); q’ = q ∧ i⊥ = ⊥) I ⊥ könnte in einer Implementierung eine Exception werden, aber auch ein Spezialwert bleiben. Wenn der Zustand einfach eine Variable eines Datentyps ist, ergibt sich fast eine Duplikation des algebraischen Datentyps. A. Knapp, G. Schellhorn: Formale Methoden 443 Abstrakte Datentypen: Verwendung I Ein abstrakter Datentyp wird immer innerhalb einer Umgebung verwendet. I Die Umgebung kann sehr verschieden sein: I I I I I ein Programm, wenn ein Objekt oder eine Klasse definiert wird; eine einfache Kontrollschleife für einen Interpreter; Benutzer, die die Operationen per Knopfdruck aufrufen; für ein System: eine beliebige Systemumgebung aus anderen Rechnern (Clients, die auf einen Server zugreifen, etc.) Zwei Grundannahmen: I I Operationen sind atomar ( Transaktionscharakter“); ” beobachtet werden nur Eingabe und Ausgabe, der Zustand ist unsichtbar. A. Knapp, G. Schellhorn: Formale Methoden 444 Ablauf eines abstrakten Datentyps Definition Ein (endlicher) Ablauf eines abstrakten Datentyps (St, Init, (Opi )i∈I ) ist eine Folge k ,in ,out kn−1 ,inn−1 ,outn−1 k ,in ,out 1 1 1 0 0 0 −− −−→ σ2 −→ . . . −→ σn−1 −−−−−−−−−−→ σn −− −−→ σ1 −− σ0 −− mit I σ0 ∈ Init I (ini , σi , σi+1 , outi ) ∈ Opki für 0 ≤ i < n. I Der letzte Schritt kann auch σn−1 −−−−−−→ ⊥ sein, falls die Vorbedingung verletzt wurde, i. e. falls kn−1 ,inn−1 ¬∃outn−1 , σn . (inn−1 , σn−1 , σn , outn−1 ) ∈ OPkn−1 gilt. A. Knapp, G. Schellhorn: Formale Methoden 445 Abstract State Machines (1) Definition Eine Abstract State Machine (ASM) (Σ, Init, (Rulei )i∈I , Fin) besteht aus I einer (endlichen) prädikatenlogischen Signatur Σ; I Daraus ergibt sich die Zustandsmenge als alle Σ-Algebren St = Alg(Σ). I einer Menge von Anfangszuständen Init ⊆ St; I einer Menge von Regeln Rulei , die den Zustand modifizieren; I Regeln sind Programme mit choose und Funktionsmodifikation f (t) := t0 . I einer Menge Fin ⊆ St von Endzuständen. I Beobachtung des Endzustands A. Knapp, G. Schellhorn: Formale Methoden 446 Abstract State Machines (2) Entwickelt von Yuri Gurevich (1984) I ASMs sind eine Instanz der operationalen Idee für Kontrakte. I Algebren als Zustände sind so allgemein wie möglich I Theoretische Untersuchungen zur Frage: Was ist ein Algorithmus? I Ein-/Ausgabe muß in den Zustand integriert werden. I Eine Σ-Algebra belegt jetzt modifizierbare Funktionen (endlich viele). I Eine modifizierbare Konstante ist dasselbe wie eine Programmvariable. I Eine modifizierbare Funktion entspricht einer (second-order) Variable für Funktionen. I Funktionsmodifikation f (t) := t0 entspricht f := (λ x . x = t ⊃ t0 ; f (x)). I f (t) := t 0 kann man auch so in KIV eintippen. I Es gibt Erweiterungen von ASMs für Parallelität: forall x with b do p A. Knapp, G. Schellhorn: Formale Methoden 447 Verfeinerung Die Grundfrage, auf die Verfeinerung (engl. refinement) eine Antwort gibt, ist: Gegeben eine abstrakte Beschreibung eines Systems. Wie kommt man systematisch und schrittweise zu einer korrekten Implementierung? Verfeinerung gibt es in einer großen Zahl von Varianten: I für algebraische (zustandslose) Systeme (algebraisches Refinement, Moduln) I für parallele (ereignisbasierte) Systeme (CSP-Refinement/(Bi-)Simulation) I für zustandsbasierte Datentypen: I I I relational: Data Refinement operational: ASM Refinement für Automaten: IO-Automata Refinement A. Knapp, G. Schellhorn: Formale Methoden 448 Data Refinement (1) Grundidee: I Gegeben sei der ADT (ASt, AInit, (AOpi )i∈I ). I Der Zustand in ASt ist nach außen hin unsichtbar. Er kann deshalb durch einen konkreten Zustand ersetzt werden, wenn sich die Funktionalität nach außen hin nicht ändert. Sei also ein konkreterer Datentyp“ (CSt, CInit, (COpi )i∈I ) gegeben. ” I Der konkrete Datentyp ist eine korrekte Verfeinerung des abstrakten, wenn jede Umgebung, die annimmt, den abstrakten Datentyp zu verwenden, es nicht bemerken kann, daß sie in Wirklichkeit den konkreten verwendet. I I Es gilt also das Substitutionsprinzip, daß alle abstrakten durch konkrete Operationen ersetzt werden können. I Das Verfahren kann iteriert werden und damit ein schrittweiser Übergang von abstrakter Spezifikation zu konkreter Implementierung erreicht werden. A. Knapp, G. Schellhorn: Formale Methoden 449 Data Refinement (2) Definition Gegeben seien zwei abstrakte Datentypen ADT = (ASt, AInit, (AOpi )i∈I ) und CDT = (CSt, CInit, (COpi )i∈I ). Dann heißt CDT eine korrekte Verfeinerung von ADT , wenn für jeden Ablauf von CDT ein passender abstrakter Ablauf existiert: Wenn k ,in ,out k ,in ,out kn−1 ,inn−1 ,outn−1 1 1 1 0 0 0 −− −−→ cσ2 −→ . . . −→ cσn−1 −−−−−−−−−−→ cσn −− −−→ cσ1 −− cσ0 −− ein Ablauf von CDT ist, dann gibt es Zustände aσ0 , . . . , aσn ∈ ASt, sodaß k ,in ,out k ,in ,out kn−1 ,inn−1 ,outn−1 0 0 0 1 1 1 aσ0 −− −− −−→ cσ1 −− −− −−→ aσ2 −→ . . . −→ aσn−1 −−−−−−−−−−→ aσn (mit denselben Ein- und Ausgaben) ein Ablauf von ADT ist. I Der konkrete Datentyp kann durchaus weniger Abläufe haben: Er ist dann weniger indeterministisch. A. Knapp, G. Schellhorn: Formale Methoden 450 Data Refinement (3) I Bei Data Refinement müssen beide Datentypen dieselbe Granularität der Operationen und dieselben Ein-/Ausgaben haben. I Erweiterungen betreffen also: I I I Verkleinerung (oder allgemeiner: Wechsel) der Granularität Wechsel der Datenrepräsentation für Ein-/Ausgaben. Andere Fragestellungen sind: I I Was ist mit unendlichen Abläufen? (relevant?) Will man auch Deadlocks modellieren? A. Knapp, G. Schellhorn: Formale Methoden 451 Data Refinement: Beispiel queue wird durch einen Speicher st und einen Zeiger r, der auf den Anfang der Liste zeigt, repräsentiert. Der konkrete Datentyp wird gleich durch ein Programm implementiert, nicht zuerst spezifiziert. I Der Speicher hat als Schlüssel References (Typ ref) mit null : ref. I Der Speicher enthält als Daten (freier Datentyp): conscell = . × . (. .1 : int; . .2 : ref) I Die null-Referenz entspricht einer leeren Queue. I enq# relativ einfach I deq# muß die Verkettung bis zum Ende ablaufen, dann hinten anhängen. A. Knapp, G. Schellhorn: Formale Methoden 452 Data Refinement: Repräsentationsrelation Benötigt wird eine Repräsentationsrelation (oder auch eine Simulation, Kopplungsinvariante, Abstraktionsrelation engl. simulation, representation relation, coupling invariant) R ⊆ ASt × CSt zwischen den beiden Zuständen. R(aσ, cσ) besagt: Der Zustand cσ repräsentiert den abstrakten Zustand aσ . Die Relation ist meist eine partielle Funktion (deshalb auch Abstraktionsfunktion): ein konkretes Datum repräsentiert höchstens ein abstraktes. A. Knapp, G. Schellhorn: Formale Methoden 453 Repräsentationsrelation: Beispiel (1) Im Speicher st steht unter r eine lineare, nichtzyklische Kette von Zellen, deren Inhalte die Inhalte der Queue q sind. abs(r, st, q) besagt Speicherinhalt unter r in st repräsentiert die Queue ” q“. Formale Definition: abs(r, st, q) ↔ (r = null ⊃ q = emq; ( r ∈ st (: r ist allokiert :) ∧ ¬ cyclic(r, st) (: kein zyklischer Pfad von r aus :) ∧ q 6= emq ∧ hd(q) = st[r].1 (: erstes Datum paßt :) ∧ abs(st[r].2, st, deq(q)))); (: Rest paßt :) A. Knapp, G. Schellhorn: Formale Methoden 454 Repräsentationsrelation: Beispiel (2) cyclic(r, st) bedeutet, daß es einen Pfad im Speicher gibt mit erstes Element = r, in dem sich ein Element wiederholt. Für die formale Definition werden Listen von Referenzen x benötigt. Damit rekursive Definition von path(x, st) ( x ist ein Pfad im Speicher st“): ” path-empty: ¬ path([], st); path-one: path(r ’, st) ↔ r ∈ st ∧ r 6= null; path-cons: path(r + r0 + x, st) ↔ r ∈ st ∧ r 6= null ∧ st[r].2 = r0 ∧ path(r0 + x, st); Damit cyclic-def: cyclic(r, st) ↔ ∃ x. r = x.first ∧ path(x, st) ∧ dups(x); Dabei bedeutet dups(x), daß x Duplikate hat: dups: dups(x) ↔ ∃ a, x0, y, z. x = x0 + a + y + a + z; A. Knapp, G. Schellhorn: Formale Methoden 455 Data Refinement: Korrektheitsnachweis (1) Hinreichendes Kriterium: Die Repräsentationsrelation ist eine Vorwärtssimulation (engl. forward/downward simulation). Informell muß gelten: I Zu jedem konkreten Initialzustand cσ gibt es einen passenden Initialzustand aσ mit R(aσ, cσ). I Wenn die Vorbedingung von AOpi wahr ist, und R(aσ, cσ) gilt, dann ist auch die Vorbedingung von COpi wahr. I Wenn R(aσ, cσ) gilt, beide Vorbedingungen wahr sind, COpi bei Eingabe in und Startzustand cσ Endzustand cσ 0 mit Ausgabe out hat, dann gibt es einen passenden Endzustand aσ 0 von AOpi für dieselbe Ein- und Ausgabe, der wieder R(aσ 0 , cσ 0 ) erfüllt. in, aσ AOpi R in, cσ aσ 0 , out R COpi A. Knapp, G. Schellhorn: Formale Methoden cσ 0 , out in, aσ AOpi ⊥ R in, cσ COpi ⊥ 456 Data Refinement: Korrektheitsnachweis (2) Satz Die Verfeinerung ist korrekt, wenn eine Vorwärtssimulation R gefunden werden kann, für die gilt: I Initialisierung: Init(cσ) → ∃aσ . R(aσ, cσ) I Anwendbarkeit: R(aσ, cσ) ∧ pre(AOpi )(in, aσ) → pre(COpi )(in, cσ) I Korrektheit: R(aσ, cσ) ∧ pre(AOpi )(in, aσ) ∧ COpi (in, cσ, cσ 0 , out) → ∃aσ 0 . AOpi (in, aσ, aσ 0 , out) ∧ R(aσ 0 , cσ 0 ) wobei pre(Opi )(in, σ) ↔ ∃σ 0 , out . Opi (in, σ, σ 0 , out). Für das Queue-Beispiel sind alle Teile mit pre irrelevant, da alle Vorbedingungen wahr sind. A. Knapp, G. Schellhorn: Formale Methoden 457 Korrektheitsnachweis: Beispiel Im Queue-Beispiel sind die Vorbedingungen (pre) immer wahr. Damit ist die Verfeinerung von Queues zur Implementierung korrekt, wenn folgende Sequenzen bewiesen werden können: I Initialisierung: ` h|emq#(; r, st)|iabs(r, st, emq) I Korrektheit für enq#: abs(r,st,q) ` h|enq#(i; r, st)|iabs(r, st, enq(q,i)) I Korrekhteit für deq# (Fall: nichtleeres q): abs(r, st, q), q 6= emq ` h|deq#(; r, st, i⊥)|i(abs(r, st, deq(q)) ∧ i⊥ = mki⊥(hd(q))) I Korrekheit für deq# (Fall: leeres q): abs(r, st, emq) ` h|deq#(; r, st, i⊥)|i(abs(r, st, emq) ∧ i⊥ = ⊥) A. Knapp, G. Schellhorn: Formale Methoden 458 Zusammenfassung I Relationale und operationale Kontrakte I Abstrakte Datentypen I I Abstract State Machines Data Refinement I I Repräsentationsrelation Vorwärtssimulation A. Knapp, G. Schellhorn: Formale Methoden 459