Formale Spezifikation und Induktion 91 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. 92 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. B. 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. 93 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. B. 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?) 94 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 95 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 = 0, m ∗ succ(n) = m ∗ n + m • 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. 96 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). Beachte dabei: Peano-Axiom 5 ist kein prädikatenlogisches Axiom! 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. Beweisbar mit Vollständigkeitssatz Intuition: Prädikatenlogische Axiome können nicht ausdrücken, dass es neben den „echten“ natürlichen Zahlen keine weiteren Zahlen gibt. 97 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”. Sonst Triviallösung: Nehme als Axiome sämtliche wahren Aussagen. Zum Beispiel: Nehme Induktionsschema zu den Axiomen dazu: ϕ0n ∧ (∀ n. ϕ → ϕnn +1 ) → ∀ n. ϕ; (: für jedes ϕ ∈ For(Σ,X) :) Die Formel ϕ(n) mit freier Variable n beschreibt die Menge {n : IN |= ϕ(n)}. Das Induktionsschema für ϕ entspricht Peano-Axiom 5 für diese Menge 98 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 das Induktionsschema auch unvollständig). Der Trick zum Beweis ist das Lügnerparadoxon („ich lüge jetzt“) in Form einer Formel, die sagt: „Ich bin nicht beweisbar“. Indem man die Formeln durchnumeriert (z.B. ASCII-Codierung), wird das „Ich“ durch „Meine Nummer“ ausdrückbar. 99 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. 100 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) 101 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 als 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 aus C gebildet und enthält nur Variablen anderer Sorten, ist also aus Ts ((S, C), X \ Xs ). 102 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]. 103 Basisspezifikation Basisspezifikation 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 |= ϕ 104 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. 105 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 106 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 107 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; a 6= b ∨ x 6= y → a + x 6= b + y; end specification → list; ist konsistent und mononorph,wenn die Trägermenge für die Elemente vorgegeben ist (“monomorph modulo Parameter”) 108 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 = f ree(Γ → ∆) \ {x} Ableitung Wenn man aus der Spezifikation SP durch Anwendung von Sequenzenkalkül + Induktions-Regel die Formel ϕ ableiten kann, dann schreibt man SP ⊢IN D ϕ. 109 Kalkül mit struktureller Induktion: Korrektheit und Unvollständigkeit Satz (Korrektheit) Es gilt SP ⊢IN D ϕ ⇒ SP |= ϕ Satz (Unvollständigkeit) Es gibt Spezifikationen und Theoreme mit SP |= ϕ, die aber mit Induktion nicht beweisbar sind (SP 6⊢IN D ϕ). 110 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 Hilfsfunktionen, so dass SP ′ ⊢IN D ϕ gilt. • Praktisch gesehen: Mit den zusätzlichen Symbolen in SP ′ wird eine passend (verallgemeinerte) Induktionshypothese für den Beweis von ϕ ausdrückbar. • Beachte: Mit der Generiertheitsklausel ist die Induktionsregel auch auf Formeln mit den Hilfsfunktionen anwendbar (die Menge der möglichen Ind. hypothesen wächst!) • 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. 111 Strukturierte Spezifikation: Freie Datentypen 112 Wie spezifiziert man Datentypen? Vorgehen: • Schritt 1: Definiere benötigte Sorten • Schritt 2: Datentypen auf Rechnern sind generiert ⇒ Definiere Konstruktoren und Generiertheitsklauseln • Schritt 3(?): Definiere weitere Operationen und ihre Axiome Problem: Wie geeignete, „richtige“ Axiome finden? Formal „richtig“: Sie sollten für den gewünschten Datentyp stimmen (keine Inkonsistenz!), und sollten ihn möglichst eindeutig charakterisieren. 113 Freie und nichtfreie Datentypen nat nat integer set set stack bintree graph ???? by list ???? by ???? by ???? by ???? by ???? by ???? by ???? by ???? by 114 Freie und nichtfreie Datentypen Manche Datentypen sind frei (erzeugt): Zwei verschiedene Konstruktorterme repräsentieren auch immer zwei verschiedene Elemente. Beobachtung: nat nat integer set set stack bintree graph 0, +1 0, 1, + 0, +1, −1 ∅, ins ∅, {.}, ∪ empty, push mkleaf, mkbranch ∅, +node, +edge list [], + 114 Freie und nichtfreie Datentypen Manche Datentypen sind frei (erzeugt): Zwei verschiedene Konstruktorterme repräsentieren auch immer zwei verschiedene Elemente. Beobachtung: nat nat integer set set stack bintree graph list generated by 0, +1 0, 1, + 0, +1, −1 ∅, ins ∅, {.}, ∪ empty, push mkleaf, mkbranch ∅, +node, +edge freely generated by [], + freely generated by generated by generated by generated by generated by freely generated by freely generated by 114 0+0=0 0 +1 −1 = 0 ins(a,ins(a,∅)) = ins(a,∅) {a} ∪ {a} = {a} ∅ +node n +node n = ∅ +node n Axiome für freie Datentypen Beispiel: Konstante c, einstellige Funktion f , zweistellige Funktion g • Verschiedenheit der Konstruktoren c, f und g : c 6= f (x), f (x) 6= g(y, z), c 6= g(x, y) • Injektivität der Konstruktoren: f (x) = f (y) ↔ x = y , g(x, y) = g(u, v) ↔ x = u ∧ y = v Satz: Die Spezifikation mit diesen Axiomen ist monomorph und konsistent, sie charakterisiert also genau einen Datentyp. KIV: Schreibe freely generated by, Axiome werden generiert. 115 Freie Erzeugtheitsklauseln Freie Erzeugtheitsklauseln A |= S ′ freely generated by C :⇔ • A |= S ′ generated by C • Für 2 Konstruktorterme t, t′ ∈ T s ((S, C), X \ Xs ) mit s ∈ S ′ gilt nur dann [[t]] A,v = [[t′ ]] A,v′ wenn sie mit den exakt gleichen Konstruktoren gebildet sind, und die Variablen an gleichen Positionen gleich belegt sind. Beispiel Listen: • [[[]]] A,v , [[a + []]] A,v′ , [[a + b + []]] A,v′′ sind auf jeden Fall verschiedene Listen (egal wie die Belegungen v , v ′ , v ′′ sind) • [[a + []]] A,v = [[b + []]] A,v′ gdw. wenn v (a) = v ′ (b). 116 Natürliche Zahlen als freier Datentyp Beispiel: Die natürlichen Zahlen Nat3 = specification sorts nat; constants 0 : nat; functions +1 : nat → nat; variables n : nat; induction nat freely generated end specification by 0, +1; ⇒ Neu: Axiome jetzt generiert. 117 Listen als freier Datentyp Beispiel: Listen als freier Datentyp List2 = specification sorts list, elem; functions : → list; : elem × list → list; variables a, b: elem; l, l1 , l2 : list; induction list freely generated by [], +; [] .+. end specification 118 Generierte Axiome für Listen Generierte Axiome Spezifikation generiert: [] 6= a + l, a + l1 = b + l2 ↔ a = b ∧ l1 = l2 Induktionsregel für die Sorte list ∀ y. V Γ→ W a+l ⊢ ∆ ∆, Γa+l l l Γ⊢∆ y = f ree(Γ ⊢ ∆) \ {l} 119 [] [] Γl ⊢ ∆l Datentyp-Definion (Motivation) Häufige Situation: • Freie Erzeugbarkeit mit Konstruktoren c • Selektoren, die aus c(x1 , . . . xn ) die xi selektieren • Testprädikate „ist mit Konstruktor c gebildet“ • Ordnung: „ist Unterterm von“ • Größenfunktion: „Anzahl nichtkonstanter Konstruktoren“ ⇒ Eigenes Syntaxkonstrukt data specification vermeidet unnötige Schreibarbeit. In KIV typischerweise nie freely generated, sondern gleich data specification 120 Data Specification (Beispiel 1) Beispiel 1: Wochentage Weekday2 = data specification weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun; variables w : weekday; end data specification Die Konstanten sind paarweise verschieden: Mon 6= Tue, Mon 6= Wed, Mon 6= Thu, Mon 6= Fri, . . . Generierte Axiome: Induktionsregel: Mon ΓMon ⊢ ∆ w w Sun . . . ΓSun ⊢ ∆ w w Γ⊢∆ ⇒ Beweis durch Fallunterscheidung nach dem Tag Verallgemeinerung: Aufzählungstypen 121 Data Specification (Beispiel 2) Beispiel 2: Paare Pair = data specification using Elem1, Elem2; pair = mkpair ( . .1 : elem1; . .2 : elem2 ) variables p : pair; end data specification Generierte Axiome: mkpair(a, b).1 = a; mkpair(a, b).2 = b Induktionsregel: mkpair(a,b) Γp ⇒ Expandiert Variable p zu mkpair(a, b) Verallgemeinerung: mkpair(a,b) ⊢ ∆p Γ⊢∆ Tupel 122