Formale Spezifikation und Induktion 1 Was ist ein SW-System mathematisch? 1. Sicht: operational Ein SW-System ist ein Automat • mit Zustand, • Zustandsübergängen und • mit Abläufen. 2. Sicht: algebraisch Ein SW-System ist eine Algebra = Datenstruktur, d. h. ein System von Daten und Operationen (vgl. auch (zustandslose) API in Java) 2 Was ist spezieller? Einen Automaten kann man als spezielle Algebra auffassen: • Zustand = Element einer Datenstruktur ⇒ Algebra! • Sorten = State, Input, Output mit Operationen ⋆ Anfangszustände: isinitial: State → Bool ⋆ Zustandsübergangsfunktion (oder auch Relation): exec: Input × State → State × Output (→ Bool) • z. Bsp. Zustand eines Programms: Programm + Programmzähler + Speicherbelegung • theoretisch: algebraische Sicht genügt • praktisch: Automatensicht hat viele Spezialeigenschaften. (u.a. ist eine Idee von „Zeit“ damit verbunden.) Deshalb Codierung oft nicht die beste Idee 3 SW-Beschreibungsformalismen SW-System ist Datentyp: • modellorientierte Spezifikation (Z,VDM): alle Datentypen sind mit Mengenlehre gebildet (Tupel und Mengen z.B. für UML-Klassendiagramme) • algebraische Spezifikation SW-System ist Menge von Abläufen: • algorithmische Spezifikation, z. Bsp. Programmiersprachen • Programme über algebraischen/modellorientierten Datentypen • Automaten, Harel/UML Statecharts, Abstract State Machines (ASMs) Eignung hängt von den Zielen ab (Was will ich beschreiben? Was beweisen?) 4 Spezifikation Ziel: Ein bestimmter Datentyp (Algebra) soll spezifiziert werden. Fragen: 1. Was für Operationen brauche ich? 2. Welche Axiome brauche ich? 3. Welche Datentypen kann ich überhaupt spezifizieren? 4. Kann ich alle wahren Aussagen über dem Datentyp auch beweisen? Zunächst: Fragen 3 + 4 speziell für die natürlichen Zahlen 5 Natürliche Zahlen: Die Peano-Axiome • Es gibt eine ausgezeichnete Zahl 0 ∈ IN. • Jede Zahl n ∈ IN hat einen Nachfolger succ(n) ∈ IN. • Zu zwei Zahlen gibt es Summe m + n und Produkt m ∗ n • Axiom 1: 0 ist kein Nachfolger. • Axiom 2: Die Nachfolgerfunktion ist injektiv. • Axiom 3: m + 0 = m, m + succ(n) = succ(m + n) • Axiom 4: m ∗ 0 = m, m ∗ succ(n) = m ∗ n + n • Axiom 5: IN ist die kleinste Menge M mit: 0 ∈ M und: wenn n ∈ M, dann succ(n) ∈ M Aus dem letzten Axiom folgt das Induktionsprinzip: Wenn ϕ(0) gilt, und sich ϕ von n auf n +1 vererbt, dann ist ϕ für alle n wahr Begründung: M := {n : ϕ(n)} ist mindestens so groß wie IN. 6 Natürliche Zahlen: mit PL nicht spezifizierbar! Satz (Charakterisierung der natürlichen Zahlen) Die Peano-Axiome charakterisieren ein Modell (eben die natürlichen Zahlen) bis auf Isomorphie (= Umbenennung). Aber: Satz von Skolem Es gibt keine Menge Ax-Nat von prädikatenlogischen Formeln, die als einziges Modell (modulo Umbenennung) nur die natürlichen Zahlen hat Beweis mit Endlichkeitssatz: M erfüllbar ⇔ jedes endl. M’ ⊆ M erfüllbar. Betrachte Ax-Nat ∪ {c 6= 0, c 6= succ(0), . . . } Intuition: Prädikatenlogische Axiome können nicht ausdrücken, dass es neben den „echten“ natürlichen Zahlen keine weiteren Zahlen gibt 7 Natürliche Zahlen: Ein schwächeres Ziel Wir wissen schon: Jede Axiomenmenge hat auch andere Modelle als IN mit zusätzlichen Elementen Wir versuchen es schwächer: Suche Axiomenmenge, mit der alle über IN wahren Formeln bewiesen werden können (dass sie auch über anderen Modellen gelten, könnte uns ja egal sein). Die Axiomenmenge sollte entscheidbar sein, d.h. es gibt Programm, das immer terminiert und sagt: “ja, ist Axiom” oder “nein, ist kein Axiom”. Problem beim Finden der Axiomenmenge ist Peano-Axiom 5: IN ist kleinste Menge mit 0 ∈ M und n ∈ M ⇒ succ(n) ∈ M Versuchen wir Mengen M durch Formeln zu beschreiben: Die Formel ϕ(n) mit freier Variable n beschreibt {n : ϕ(n)} 8 Natürliche Zahlen: Versuch der Spezifikation specification peano-ax sorts nat; constants 0 : nat; functions . +1 : nat → nat; . + . : nat × nat → nat; . ∗ . : nat × nat → nat; axioms 0 6= n +1; m 6= n → m +1 6= n +1; m + 0 = m; m + (n +1) = (m + n) +1; m ∗ 0 = 0; m ∗ (n +1) = m ∗ n + m; ϕ0n ∧ (∀ n. ϕ → ϕnn +1 ) → ∀ n. ϕ; (: für jedes ϕ ∈ For(Σ,X) :) end specification Unendlich viele Axiome, aber entscheidbar! 9 Natürliche Zahlen: Unvollständigkeit Problem: Alle Formeln (abzählbar viele) beschreiben nicht alle Mengen (überabzählbar viele)! Es gilt leider: Gödelscher Unvollständigkeitssatz Es gibt keine entscheidbare Menge von Formeln über (0, succ, +, ∗), die die ersten 4 Peano-Axiome und n 6= 0 → ∃ n. n = succ(m) enthält oder impliziert, mit der sich alle in IN wahren Aussagen ableiten lassen (insbesondere ist peano-ax auch unvollständig). Der Trick zum Beweis ist das Lügnerparadoxon: Es gibt eine Formel, die sagt: „Ich bin nicht beweisbar“ 10 Natürliche Zahlen: Unvollständigkeit Intuition: • Leider findet man auch keine „gute“ Axiomenmenge, mit der die wahren Aussagen herleitbar sind • Alle wahren Aussagen könnte man als Axiome trivialerweise nehmen. • Die Menge der wahren Aussagen ist also nicht entscheidbar. • Wahre Aussagen für die natürlichen Zahlen zu beweisen, ist kreativ. • Verursachte ziemlich viel Wirbel in den 30er Jahren: Die Idee, Mathematik auf ganz einfachen Grundlagen aufzubauen (Hilbert’sches Programm) zu definieren, war gescheitert • heute: komplizierte Mengenlehre (Zermelo-Fränkel, Gödel-Bernays) als Grundlage für Mathematik 11 Natürliche Zahlen ohne Multiplikation Satz Für Aussagen über natürlichen Zahlen mit 0, +, −, <, ≤ (aber keine Multiplikation) lässt sich mit dem Entscheidungsverfahren von Nelson und Oppen automatisch entscheiden, ob sie wahr oder falsch sind. Der Aufwand ist allerdings doppelt exponentiell. Intuition: • Mal was positives: solange man kein ∗ hat, ist keine Kreativität, nur viel Rechenpower erforderlich. • Entscheidungsprozeduren gibt es auch für andere „einfache“ Datentypen (und Aussagenlogik!), werden auch verwendet (z.B. SAL, automatische Beweiser, abstrakte Interpretation) • Kombination mehrerer Entscheidungsprozeduren und mit zus. Funktionen schwierig (wann was versuchen?) 12 Problem: Prädikatenlogik reicht nicht Problem: Prädikatenlogik kann nicht ausdrücken, dass es ausser den Zahlen 0, 1, 2 (= die aus 0 und +1 gebildeten Terme 0, 0 +1, 0 +1 +1, . . .) keine weiteren Elemente gibt. Dasselbe Problem gibt es auch für andere Datentypen: • alle ganzen Zahlen sind mit 0, +1, −1 gebildet • alle Listen sind die aus [] und + gebildeten Terme: [], a + [], a + b + [], . . . • bei Listen: Terme dürfen Elementvariablen enthalten • alle (endlichen) Graphen bekommt man aus dem leeren ∅, durch Addieren von Knoten addnode und Kanten addedge • alle Arrays bekommt man durch: mkarray(n) (erzeugt Array der Grösse n) put(a, i, d) (schreibt an Position i das Datum d) 13 Generiertheitsklauseln: Syntax Deshalb Idee: Wir definieren ein “Spezialaxiom”, genannt Generiertheitsklausel das aussagt: Die Daten eines Datentyps sind genau die mit bestimmten Konstruktoren gebildeten Terme. Syntax s generated by C ist Termerzeugtheitsklausel (∈ Gen(Σ)) ⇔ • s ∈ S , C = {f1 , . . . , fn } ⊆ OP , • die Konstruktoren fi haben die Ergebnissorte s • Konstanten sind also Konstruktoren erlaubt • für wenigstens ein fi sind alle Argumentsorten ungleich s (sonst gibt es keine Konstruktorterme!) Ein Konstruktorterm t hat die Sorte s, ist mit Konstruktoren gebildet und enthält nur Variablen anderer Sorten, ist also aus Ts ((S, C), X \ Xs ). 14 Generiertheitsklauseln: Semantik Idee: Jedes Element der generierten Sorte ist der Wert eines Konstruktorterms, wenn man die (Parameter)-Variablen geeignet belegt. Semantik A |= s generated by C :⇔ für jedes a ∈ As gibt es ein v und t ∈ Ts ((S, C), X \ Xs ) mit a = [[t]]A,v . Beispiel: Zur Liste [2,5] gibt es den Konstruktorterm a + b + []. Mit einer Belegung v der Variablen a, b als v(a) = 2 und v(b) = 5 gilt: [[a + b + []]]A,v = [2,5]. 15 Elementare Spezifikation Elementare Spezifikation Eine Spezifikation SP = (Σ, Ax , Gen ) ist ein Tripel mit: • Σ = (S , OP ) • Ax ⊆ For(Σ, X ) endlich • Gen ⊆ Gen (Σ) endlich Modell A ist Modell von SP (A |= SP , A ∈ Mod(SP )) A |= SP :⇔ A ∈ Alg(Σ), A |= Gen und A |= Ax . Gültigkeit SP |= ϕ :⇔ für alle A in Mod(SP ): A |= ϕ 16 Konsistenz und Monomorphie Definition Eine Spezifikation ist konsistent :⇔ Axiome nicht widersprüchlich ⇔ kein Beweis von false möglich ⇔ es gibt ein Modell A der Spezifikation ⇒ Das muss sein! Definition Eine Spezifikation ist monomorph :⇔ Axiome legen Verhalten eindeutig fest ⇔ je zwei Modelle sind bis auf Umbenennung (Isomorphie) gleich ⇒ Sollte für Datentypen wie natürliche Zahlen etc. so sein (die Axiome sollten ja nicht versehentlich auch reelle Zahlen erlauben) ⇒ Für Systembeschreibungen oft nicht erforderlich bzw. wünschenswert. Man will ja gerade Details offenlassen 17 minimale Spez. der natürlichen Zahlen in KIV specification sorts nat; constants 0 : nat; functions . +1 : nat → nat; induction nat generated by 0, +1; variables m, n : nat; axioms 0 6= n +1; m 6= n → m +1 6= n +1; end specification ist konsistent und mononorph 18 Spez. der natürlichen Zahlen mit Add. und Mult. specification sorts nat; constants 0 : nat; functions . +1 : nat → . + . : nat × nat → . ∗ . : nat × nat → induction nat generated by 0, +1; variables m, n : nat; axioms 0 6= n +1; m 6= n → m +1 6= n +1; m + 0 = m; m + n +1 = (m + n) +1; m ∗ 0 = 0; m ∗ n +1 = m * n + m; end specification ist konsistent und mononorph 19 nat; nat; nat; minimale Spez. der Listen in KIV specification sorts elem; list; constants [] : list; functions . + . : 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; end specification ist konsistent und mononorph 20 → list; Kalkül mit struktureller Induktion Strukturelle Induktion Sorte s erzeugt von Konstruktoren c, f ⇒ Jedes Element der Trägermenge ist darstellbar als Konstruktorterm f (f (. . . f (c))) Induktionsformeln: ⊢ ϕ(c) Induktionsregel: ϕ = ∀ y. V Γ→ W ϕ(c) ∧ (∀ x. ϕ(x) → ϕ(f (x))) → ∀ x. ϕ(x) ∆, ϕ(x) ⊢ ϕ(f (x)) Γ⊢∆ y = free(Γ → ∆) \ {x} Ableitung Wenn man aus der Spezifikation SP durch Anwendung von Sequenzenkalkül + Induktions-Regel die Formel ϕ ableiten kann, dann schreibt man SP ⊢IND ϕ. 21 Kalkül mit struktureller Induktion: Korrektheit und Unvollständigkeit Satz (Korrektheit) Es gilt SP ⊢IND ϕ ⇒ SP |= ϕ Satz (Unvollständigkeit) Es gibt Spezifikationen und Theoreme mit SP |= ϕ, die aber mit Induktion nicht beweisbar sind SP ⊢IND ϕ 22 Ein Beispiel für Unvollständigkeit (1) x from a = die Liste ab dem erstem Vorkommen des Elements a (exklusiv). Falls das Element nicht vorkommt, die leere Liste. specification sorts elem; list; constants [] : list; functions .+. : elem × list . from . : list × elem 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 23 → → list; list; Ein Beispiel für Unvollständigkeit (2) • Die Spezifikation ist monomorph: Sie hat Listen als einziges Modell A. • Für die Funktion from gilt das Theorem ϕ (x) := x 6= [] → x from a 6= x • Es lässt sich ϕ ([]), ϕ (b + []), . . . beweisen: [] 6= [] → [] from a 6= [] b + [] 6= [] → (b + []) from a 6= [] b + c + [] 6= [] → (b + c + []) from a 6= [] b + c + d + [] 6= [] → (b + c + d + []) from a 6= [] ... • Induktionsschluss klappt nicht: x from a 6= x → (b + x) from a 6= b + x • man muss die Aussage für Induktion verallgemeinern: x 6= [] → x from a < x x 6= [] → # (x from a) < # x • aber: das braucht ein neues Prädikat < (ist Endstück) oder # (Länge) • beide können rekursiv definiert werden 24 Wie schlimm ist Unvollständigkeit? • Der Kalkül mit der Induktions-Regel ist „fast vollständig“: Wenn SP |= ϕ, dann gibt es eine Erweiterung SP ′ von SP um neue rekursiv definierte Funktionen, so dass SP ′ ⊢IND ϕ gilt. • Praktisch gesehen: Mit den zusätzlichen Symbolen in SP ′ wird eine passend (verallgemeinerte) Induktionshypothese für den Beweis von ϕ ausdrückbar • Die Induktionsregel wird auf neue Formeln anwendbar • SP ′ ist je nach ϕ verschieden (kein uniformes SP ′ ) • In jedem SP ′ gibt es neue Formeln ψ , die wahr aber nicht ableitbar sind • Kreativitität also für Verallgemeinerung und passende Hilfsfunktionen 25