Verifikations- und Spezifikationsmethoden

Werbung
Was bisher geschah
I
Formale Methoden in der Informatik
I
Wiederholung klassische Logik
I
Konkrete Datentypen (algebraische Strukturen)
Abstrakte Datentypen
I
I
I
Syntax: Signatur
Semantik: Axiome (FOL-Formeln, meist allquantifizierte
Gleichungen zwischen Termen)
I
Zusammenhang abstrakte – konkrete Datentypen
I
interaktive Beweise mit Coq
59
Wiederholung ADT
Beispiel: ADT für natürliche Zahlen (unvollständig)
Sorten S: Nat, Bool
Signatur Σ :
→ Nat
0:
+, · : Nat × Nat
→ Nat
=, ≤ : Nat × Nat
→ Bool
Axiome Φ : ∀x, y , z ∈ Nat:
0·x
= 0=x ·0
x · (y + z) = (x · y ) + (x · z)
Halbring-Axiome für (N, +, ·, 0, 1)
Äquivalenzrelation-Axiome für =
Halbordungs-Axiome für ≤
Axiom für totale Ordnung ≤
Axiome der Booleschen Algebra
60
ADT NatStack
Abstrakter Datentyp:
I
Sorten: Nat, NatStack, Bool
I
Signatur: Signatur von Nat und

new
: NatStack




push
: NatStack × Nat → NatStack



pop
: NatStack → NatStack
ΣNatStack =
top
: NatStack → Nat




t,
f
: Bool



isempty : NatStack → Bool
I















(einige) Axiome: ∀s ∈ NatStack, e ∈ Nat :
pop(push(s, e))
= s
top(push(s, e))
= e
isempty(new)
= t
isempty(push(s, e))
= f
pop(new)
= ...
top(new)
= ...
61
Beispiel: konkreter Datentyp zum ADT NatStack
Konkreter Datentyp (algebraische Struktur) A:
Trägermengen (Nat), ∗ (NatStack) mit
J·KA ordnet jedem Funktionssymbol aus ΣNatStack
eine Funktion entsprechenden Typs auf ∪ ∗ zu:
N
N
N N
→ NatStack
= ()
new :
JnewKA
push :
NatStack × Nat → NatStack
JpushKA ((x1 , . . . , xn ), m) = (m, x1 , . . . , xn )
pop :
NatStack
JpopKA
(s)
top :
JtopKA
NatStack
(x1 , . . . , xn )
top(new) = ?
→
NatStack
()
falls s = ()
=
(x2 , . . . , xn ) falls s = (x1 , . . . , xn )
→ Nat
= x1
pop(new) = ?
62
ADT NatList
Abstrakter Datentyp:
I Sorten: Nat, NatList
I Signatur: Signatur von Nat und

Nil
:




cons
:
Nat × NatList




reverse
:
NatList

append : NatList × NatList
ΣNatList =


insert
: Nat × NatList





delete
: Nat × NatList


length
: NatList
I
→ NatList
→ NatList
→ NatList
→ NatList
→ NatList
→ NatList
→ Nat



















Axiome, z.B. ∀k , l ∈ NatList, e ∈ Nat:
append(cons(e, k ), l) = cons(e, append(k , l))
length(Nil) = 0
reverse(reverse(l)) = l
63
Beispiel: Sortierte NatList
SNatList wie NatList
zusätzliche Sorte: Bool
zusätzliche Operationen:
<
: Nat × Nat → Bool
sortiert : NatList
→ Bool
zusätzliche Axiome: ∀l ∈ NatList, e, f ∈ Nat:
sortiert(Nil)
=
t
sortiert(cons(e, Nil))
=
t
sortiert(cons(e, cons(f , l)))
=
t falls e ≤ f ∧ sortiert(cons(f , l))
f sonst
sortiert(l) → sortiert(insert(e, l))
64
Rekursive Datentypen
induktive Definition eines rekursiven Datentyps T :
IA: direkte Definition eine Menge von Basiselementen
{b1 , . . . , bn }
IS: Methode zur Konstruktion komplexer Elemente
C(x1 , . . . , xm ) aus Elementen x1 , . . . , xm
(Baumstruktur)
rekursive Definition von Funktionen f : T → . . . auf diesem
Datentyp:
IA: Definition der Funktionswerte f (x) für alle
Basiselemente x ∈ {b1 , . . . , bn }
IS: Definition des Funktionswertes f (C(x1 , . . . , xm ))
(evtl.) aus den gegebenen Werten f (x1 ), . . . , f (xm )
65
Beispiel Peano-Zahlen
Peano-Axiome:
Die Menge N aller natürlichen Zahlen ist die kleinste Menge mit
den folgenden Eigenschaften
1. Z (Zero für 0) ist eine natürliche Zahl.
(Z ∈ N)
2. Jeder Nachfolger einer natürlichen Zahl ist eine natürliche
Zahl.
(∀x : x ∈ N → S(x) ∈ N)
mathematisch:N = {Z } ∪ {S(x) | x ∈ N}
Coq:
Inductive N : Set :=
| Z : N
| S : N -> N.
Haskell: data N = Z | S N
66
Beispiel Listen
Listen (polymorph, Elementtyp a)
1. nil ∈ Listh a i
2. xs ∈ Listh a i ∧ x∈a → cons(x,xs) ∈ Listh a i
Coq:
Inductive List (a: Set) : Set :=
| nil : List a
| cons : a -> List a -> List a.
Haskell:
data List a = Nil
| Cons { head :: a, tail :: List a}
Haskell kurz: data [a] = [] | a : [a]
67
Beispiel Binärbäume
Binärbäume (polymorph, Elementtyp a)
1. Leaf ∈ bintreeh a i
2. l, r∈ bintreeh a i ∧ x∈a → Branch(l,x,r) ∈ bintreeh a i
Coq:
Inductive bintree (a: Type): Type :=
| Leaf : bintree a
| Branch : bintree a -> a -> bintree a
-> bintree a.
Haskell:
data BinTree a = Leaf
| Branch { left :: BinTree a,
key
:: a,
right :: BinTree a}
oder kurz
data BinTree a = Leaf
| Branch ( BinTree a ) a ( BinTree a )
68
Funktionen auf Peano-Zahlen
Addition: (induktiv nach x)
y
falls x = Z
x +y =
S(x 0 + y ) falls x = S(x 0 )
in Coq:
Fixpoint plus (x : N) (y : N) { struct x } : N :=
match x with
| Z
=> y
| S x’ => S (plus x’ y)
end.
Multiplikation:
Fixpoint mal (x : N) (y : N) { struct x } : N :=
match x with
| Z
=> ...
| S x’ => ...
end.
gewünschte Eigenschaften (Spezifikation), z.B.:
Assoziativität, Kommutativität, neutrale Elemente
69
Herunterladen