21.11.2013 Aufrufe

Verifikations- und Spezifikationsmethoden

Verifikations- und Spezifikationsmethoden

Verifikations- und Spezifikationsmethoden

MEHR ANZEIGEN
WENIGER ANZEIGEN

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 />

}

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!