Verifikations- und Spezifikationsmethoden
Verifikations- und Spezifikationsmethoden
Verifikations- und Spezifikationsmethoden
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Was bisher geschah<br />
◮ Formale Methoden in der Informatik<br />
◮ sicherheitskritische Anwendungen<br />
◮ Spezifikation: mathematisch korrekte Beschreibung von<br />
Anforderungen an Software <strong>und</strong> Systeme<br />
◮ Verifikation: Nachweis der Korrektheit von Entwürfen,<br />
Software <strong>und</strong> Systemen relativ zu einer Spezifikation<br />
◮ Sematik von Programmen (operational, axiomatisch,<br />
algebraisch)<br />
◮ Wiederholung klassische Logik<br />
◮ Beweise in klassischer Logik (Resolution)
ADT – Motivation<br />
Algebraische Spezifikation abstraker Datentypen:<br />
Formale Methode zur Spezifikation <strong>und</strong> zum Nachweis der<br />
Korrektheit von Programmen (Schnittstellen).<br />
axiomatisch Menge von Axiomen definiert den Datentyp<br />
(als Klasse aller Strukturen, die diese Axiome<br />
erfüllen)<br />
applikativ basiert auf einfachen mathematischen<br />
Gr<strong>und</strong>konzepten: Mengen, Funktionen<br />
(keine Programmlogik, Ablaufsteuerung)<br />
◮ Beschreibung der beabsichtigten Funktionalität<br />
◮ keine Beschreibung der Repräsentation der Daten
Datentypen<br />
(Konkreter) Datentyp:<br />
◮ (nichtleere) Menge A von Werten<br />
◮ Menge von auf A definierten Operationen<br />
Beispiel:<br />
◮ Wertebereich bool = {t, f}<br />
mit den Operationen<br />
AND : bool × bool → bool<br />
OR : bool × bool → bool,<br />
XOR : bool × bool → bool,<br />
NOT : bool → bool,<br />
true : bool,<br />
false : bool,<br />
◮ Wertebereich string mit<br />
den Operationen reverse, ++ usw.<br />
◮ Wertebereich int mit<br />
den Operationen +, ·, 0, 1 usw.
Algebraische Strukturen<br />
Algebraische Struktur A = (A, Ω) mit<br />
◮ Trägermenge A<br />
◮ Menge Ω = {f 1 , f 2 , . . .} von Operationen (mit fester<br />
Stelligkeit)<br />
Beispiele:<br />
◮ (N, +, 0) mit den üblichen Rechenregeln<br />
◮ (N, +, 27) mit den üblichen Rechenregeln<br />
◮ ({t, f}, ∨, ∧, t)<br />
◮ ({0, 1}, max, min, 1)<br />
◮ ({0, 1, 2}, +( mod 3), 0)<br />
◮ (A ∗ , ◦, ε) (◦ Verkettung, ε leeres Wort)<br />
◮ (2 X , ∪, ∩, ∅)
Signaturen<br />
Signatur Σ:<br />
◮ Menge von Sorten (Mengen von Werten)<br />
◮ Menge von Funktionssymbolen mit Typdeklaration<br />
Beispiel:<br />
Signatur Σ:<br />
◮ eine Sorte A,<br />
◮ zwei Funktionssymbole f : A × A → A <strong>und</strong> c : A
Beispiele: Signaturen<br />
◮ Signatur für Halbgruppen:<br />
◮ eine Sorte A<br />
◮ Funktionssymbol · : A × A → A<br />
◮ Signatur für Monoide:<br />
◮ eine Sorte A<br />
◮ Funktionssymbole · : A × A → A <strong>und</strong> e : A<br />
◮ Signatur für Boolesche Algebren:<br />
◮ eine Sorte B<br />
◮ Funktionssymbole ∨ : B × B → B, ∧ : B × B → B,<br />
¬ : B → B, true : B, false : B<br />
Signatur sagt nichts über die Bedeutung der<br />
Funktionssysmbole.
Σ-Strukturen<br />
Wann passt eine algebraische Struktur zu einer Signatur?<br />
gegeben: Signatur Σ<br />
Algebraische Struktur A heißt genau dann Σ-Struktur, wenn<br />
sich jedem Funktionssysmbol aus der Signatur genau eine<br />
Funktion auf A zuordnen lässt.<br />
Beispiele:<br />
◮ Signatur für Monoide:<br />
◮ eine Sorte A<br />
◮ zwei Funktionssymbole · : A × A → A <strong>und</strong> e : A<br />
passende Strukturen: (N, +, 0), (N, +, 12), (2 X , ∪, ∅),<br />
({0, 1, 2}, +( mod 3), 0), . . .<br />
◮ Signatur für Boolesche Algebren<br />
◮ eine Sorte B<br />
◮ Funktionssymbole ∨ : B × B → B, ∧ : B × B → B,<br />
¬ : B → B t : B f : B<br />
passende Strukturen: ({0, 1}, max, min, x ↦→ 1 − x, 1, 0),<br />
(2 X , ∪, ∩, , X, ∅), (R, +, ·, √ , 12, 27), . . .
Axiome<br />
Bedeutung der Funktionssysmbole wird durch Axiome<br />
(Bedingungen) bestimmt.<br />
Darstellung der Axiome als<br />
◮ logische Formeln<br />
◮ Gleichungen zwischen Termen<br />
Beispiele:<br />
◮ Assoziativität<br />
◮ Rechenregeln<br />
◮ Gesetze der Booleschen Algebra
Beispiel: Kommutative Monoide<br />
Signatur: Sorte A, Operationen · : A × A → A, e : A<br />
Axiome:<br />
(1) ∀a, b ∈ A : a + b = b + a<br />
(2) ∀a, b, c ∈ A : (a + b) + c = a + (b + c)<br />
(3) ∀a ∈ A : a + 0 = a<br />
Beispiele:<br />
◮ (N, +, 0) erfüllt Signatur <strong>und</strong> Axiome<br />
◮ (N, +, 3) erfüllt Signatur, aber Axiom (3) nicht<br />
◮ (A ∗ , ◦, ε) erfüllt Signatur, aber Axiom (1) nicht<br />
◮ (2 X , ∪, ∅) erfüllt Signatur <strong>und</strong> Axiome<br />
◮ (2 X , ∪, , ∅) erfüllt Signatur nicht
Abstrakte Datentypen<br />
Spezifikation eines abstrakten Datentyps:<br />
◮ Signatur Σ (Syntax) <strong>und</strong><br />
◮ Menge von Axiomen (Semantik)<br />
Beispiele:<br />
◮ Bool<br />
◮ Nat<br />
Jeder ADT repräsentiert eine Menge konkreter Datentypen<br />
(genau die Menge aller Strukturen passender Signatur, die alle<br />
Axiome erfüllen)
ADT Bool<br />
◮ Signatur<br />
⎧<br />
⎨ ∨, ∧ : Bool × Bool → Bool<br />
Σ Bool = ¬ : Bool → Bool<br />
⎩<br />
f, t : Bool<br />
◮ Menge von Axiomen<br />
¬t = f<br />
∀x, y ∈ Bool : x ∨ y = y ∨ x<br />
⎫<br />
⎬<br />
∀x, y, z ∈ Bool : x ∨ (y ∨ z) = (x ∨ y) ∨ z<br />
∀x ∈ Bool : ¬¬x = x<br />
∀x ∈ Bool : f ∧ x = f<br />
∀x ∈ Bool : t ∧ x = x<br />
∀x, y ∈ Bool : x ∨ y = ¬(¬x ∧ ¬y)<br />
⎭
ADT Nat<br />
◮ eine Sorte Nat<br />
◮ Signatur<br />
⎧<br />
null<br />
⎪⎨<br />
succ<br />
Σ Nat =<br />
plus ⎪⎩<br />
mult<br />
⎫<br />
: Nat<br />
⎪⎬<br />
: Nat → Nat<br />
: Nat × Nat → Nat ⎪⎭<br />
: Nat × Nat → Nat<br />
◮ Menge von Axiomen, z.B. ∀x, y, z ∈ Nat:<br />
plus(x, null) = x<br />
plus(null, x) = x<br />
plus(x, y) = plus(y, x)<br />
plus(x, plus(y, z)) = plus(plus(x, y), z)<br />
mult(x, succ(null)) = x<br />
mult(x, y) = mult(y, x)
Konkrete Datentypen<br />
Abstrakter Datentyp:<br />
◮ Signatur Σ<br />
◮ Menge Φ von Axiomen<br />
passender konkreter Datentyp:<br />
Σ-Struktur A,<br />
in welcher alle Axiome aus Φ erfüllt sind<br />
Beispiel: Abstrakter Datentyp Bool<br />
◮ Σ Bool<br />
◮ Axiome der Booleschen Algebra<br />
Konkrete Datentypen:<br />
◮ ({0, 1}, max, min, x ↦→ 1 − x, 0, 1)<br />
◮ (2 X , ∪, ∩, , ∅, X)
Zusammengesetze Datentypen<br />
Konstruktion neuer Datentypen aus (A, Ω A ) <strong>und</strong> (B, Ω B )<br />
Kreuzprodukt der Trägermengen A × B:<br />
C: struct, Pascal: record, Java: Object<br />
Konstruktor A × B → C<br />
Zugriff C → A, C → B<br />
Beispiel: Student mit Name, Vorname,<br />
Studentennummer<br />
Vereinigung der Trägermengen A ∪ B:<br />
C: union, Pascal: record (nur Variantenteil), Java:?<br />
typisches Beispiel: Aufzählungstypen (z.B.<br />
Wochentage)<br />
Zugriff durch Fallunterscheidung<br />
Interface repräsentiert disjunkte Summe aller<br />
Typen, die es implementieren<br />
Potenz der Trägermengen A → B:<br />
Funktionen<br />
Konstruktion je nach Realisierung<br />
Zugriff: Funktionsanwendung
Mehrsortige Strukturen<br />
Abstrakter zusammengesetzter Datentyp:<br />
◮ Vereinigung der Signaturen<br />
evtl. neue Symbole für Operationen mit Parametern <strong>und</strong><br />
Werten aus mehreren Signaturen<br />
◮ Vereinigung der Axiommengen<br />
<strong>und</strong> Axiome für Operationen auf verschiedenen<br />
Wertemengen<br />
Konkreter zusammengesetzter Datentyp:<br />
Mehrsortige Algebra:<br />
◮ Trägermengen zu jeder Signatur (Sorten)<br />
◮ Operationen
Beispiel: Geordnete Menge<br />
Abstrakter Datentyp:<br />
◮ Sorten: M, Bool<br />
◮ Signatur<br />
⎧<br />
⎪⎨<br />
Σ NB =<br />
⎪⎩<br />
∨, ∧ : Bool × Bool → Bool<br />
¬ : Bool → Bool<br />
f, t : Bool<br />
≤ : M × M → Bool<br />
◮ Axiome der Booleschen Algebra<br />
Eigenschaften von Ordnungsrelationen<br />
Konkrete Datentypen:<br />
◮ Trägermengen N, {0, 1} mit Booleschen Operationen auf<br />
{0, 1} <strong>und</strong> ≤ auf N<br />
◮ Trägermengen 2 X , {0, 1} mit Booleschen Operationen auf<br />
{0, 1} <strong>und</strong> ⊆ auf 2 X<br />
⎫<br />
⎪⎬<br />
⎪⎭
Beispiel: NatStack<br />
Abstrakter Datentyp:<br />
◮ Sorten: Nat, NatStack<br />
◮ Signatur: Signatur von Nat <strong>und</strong><br />
⎧<br />
⎫<br />
new : NatStack<br />
⎪⎨<br />
⎪⎬<br />
push : NatStack × Nat → NatStack<br />
Σ NatStack =<br />
pop : NatStack → NatStack<br />
⎪⎩<br />
⎪⎭<br />
top : NatStack → Nat<br />
◮ Axiome: ∀s ∈ NatStack, e ∈ Nat :<br />
pop(push(s, e)) = s<br />
top(push(s, e)) = e<br />
pop(new) = new<br />
top(new) = 0
Beispiel: NatStack<br />
Konkreter Datentyp:<br />
Trägermengen N (Nat), N ∗ (NatStack) mit<br />
V ordnet jedem Funktionssymbol aus Σ NatStack eine Funktion<br />
auf N ∪ N ∗ zu:<br />
V (new) = (0)<br />
V (push)((x 1 , . . . , x n ), m) =<br />
{<br />
(m, x 1 , . . . , x n )<br />
(0) falls s = (0)<br />
V (pop)(s) =<br />
(x 2 , . . . , x n ) falls s = (x 1 , . . . , x n )<br />
V (top)(x 1 , . . . , x n ) = x 1
Beispiel: NatList<br />
Abstrakter Datentyp:<br />
◮ Sorten: Nat, NatList<br />
◮ Signatur: Signatur von Nat <strong>und</strong><br />
⎧<br />
⎪⎨<br />
Σ NatList =<br />
⎪⎩<br />
Nil<br />
cons<br />
reverse<br />
append<br />
insert<br />
deleteFrom<br />
length<br />
: NatList<br />
: Nat × NatList → NatList<br />
: NatList → NatList<br />
: NatList × NatList → NatList<br />
: Nat × NatList → NatList<br />
: Nat × NatList → NatList<br />
: NatList → Nat<br />
⎫<br />
⎪⎬<br />
⎪⎭<br />
◮ Axiome, z.B. ∀k, l ∈ NatList, e ∈ Nat:<br />
append(cons(e, k), l) = cons(e, append(k, l))<br />
length(Nil) = 0<br />
reverse(reverse(l)) = l
Beispiel: Sortierte NatList<br />
SNatList wie NatList<br />
zusätzliche Sorte: Bool<br />
zusätzliche Operation (Prädikat):<br />
sortiert : NatList → Bool<br />
zusätzliche Axiome:<br />
sortiert(Nil) = t<br />
sortiert(cons(e, Nil)) = t<br />
{ t falls e ≤ f ∧ sortiert(cons(f , l))<br />
sortiert(cons(e, cons(f , l))) =<br />
f sonst<br />
sortiert(l) → sortiert(insert(e, l))<br />
}