Algorithmen und Datenstrukturen

Werbung
Logische Strukturen
13.+14. Vorlesung
Martin Dietzfelbinger
29. Juni/13. Juli 2010
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
Kapitel 3
Spezifikation von Datentypen
Hintergrund: Behandlung des Bereichs in der AuP-Vorlesung.
Wollen (z.B.) spezifizieren: Stack/Keller of N.
Operationen: new, push, pop, top, isempty,
wie in der AuD-Vorlesung.
Exemplarisch für Softwareentwurf “im Kleinen“.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
1
3.1 Einführung, Beispiele, Grundbegriffe
Spezifikationsmethoden:
Wir verwenden immer Trennung von Syntax und Semantik.
1. Teil einer Spezifikation ist immer die Signatur.
Auflistung der Namen aller Sorten.
Auflistung der Namen aller Operationen sowie der Sorten der
Eingabekomponenten und der Ausgabe.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
2
Beispiel aus der AuD-Vorlesung:
1. Signatur:
Sorten:
Elements
Stacks
Boolean
Operationen: new : → Stacks
push: Stacks × Elements → Stacks
pop: Stacks → Stacks
top: Stacks → Elements
isempty : Stacks → Boolean
Rein syntaktische Vorschriften! Verhalten (noch) ungeklärt!
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
3
Wie Verhalten“ spezifizieren? Welche Ziele sind zu erreichen?
”
• Korrektheit der Spezifikation überprüfbar
(Entspricht sie dem, was man sich vorstellt, was der Kunde“
”
wünscht . . . ?)
• Korrektheit eine Implementierung überprüfbar
• Automatische Entwurfshilfen einsetzbar (schnelle Generierung von Prototypen etc.)
Eigenschaften:
• Verständlichkeit (für eingearbeiteten Experten)
• Eindeutige Semantik
• Abstraktion keine irrelevanten Details, keine frühe Festlegung auf
konkrete Implementierung
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
4
• umgangssprachlich: zu unpräzise
• Exemplarische imperative Spezifikation“:
”
Konkrete Implementierung.
Zu wenig abstrakt, keine Flexibilität, Korrektheitsbeweise alternativer Implementierungen praktisch unmöglich,
Verständlichkeit fraglich.
• Axiomatische imperative Spezifikation“:
”
Zusicherungskalkül (Vorbedingung/Nachbedingung), z.B.:
{true} push(s, x) {s 6= Λ ∧ top(s) = x}
{s = s0} push(s, x); pop(s){s = s0}
mächtig, interessant, anderes Thema
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
5
• Exemplarische applikative Spezifikation“:
”
das mathematische Modell“ aus der AuD-Vorlesung
”
Stacks: Die Menge der Tupel (a1, . . . , an) ∈ Seq(D).
push((a1, . . . , an), a) = (a, a1, . . . , an) usw.
Boolean: {w , f }.
Idee: Eine Implementierung ist dann korrekt, wenn ihr E/AVerhalten zu dem des mathematischen Modells identisch
ist.
Im Prinzip gut verständlich.
Korrektheitsbeweise eher umständlich und nicht automatisierbar.
(Benötige geschickte Induktionsbehauptung.)
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
6
• Axiomatische applikative Spezifikation“:
”
Gleichungen beschreiben das Verhalten der Objekte.
(Für weitere Beispiele siehe AuP-Vorlesung!)
isempty(push(s, x)) = f
isempty(new ) = w
top(push(s, x)) = x
pop(push(s, x)) = s
Dieser Ansatz führt zu einem Gleichungskalkül.
Die Implementierung ist völlig frei. Für die Korrektheit wird
nur verlangt, dass die Axiome erfüllt“ werden.
”
Übung: Zeige dies für die beiden geläufigen Implementierungen von
Stacks, mit Listen und mit Arrays.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
7
Hier soll geklärt werden, was eine Spezifikation eigentlich
bedeuten“ soll.
”
Ein Modell für eine Spezifikation besteht aus Mengen, die
die Sortennamen interpretieren sowie aus Funktionen (mit
den korrekten und Eingabesorten), die die Operationsnamen
interpretieren.
Im Zusammenhang von Datentypen spricht man nicht von
einem Modell, sondern von einer Algebra.
Man verlangt, dass die Spezifikation erfüllt“ ist.
”
Aber das ist nicht alles: Es kann viele Algebren geben, die eine
Spezifikation erfüllen. Welche ist gemeint?
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
8
Beispiel:
Bei Stacks könnte man folgendes mathematische Modell betrachten:
new () = () (leere Folge, ∅)
push(s, x) = (s, x) (geordnetes Paar)
top((s, x)) = x, top(()) = undefiniert
pop((s, x)) = s, top(()) = undefiniert
isempty((s, x)) = f , isempty(()) = w .
Als Interpretation der Sorte stacks hätte man die Menge aller
geschachtelten Paare
(((. . . (((), an), an−1), . . . ), a2), a1), für n ≥ 0, a1, . . . , an ∈ D
Auch dies liefert eine Algebra, die die Axiome erfüllt, und die
das gleiche E/A-Verhalten hat wie unser Standardmodell.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
9
Fragen:
• Widerspruchsfreiheit – Gibt es überhaupt eine Algebra zu
einer axiomatischen Spezifikation?
• Vollständigkeit – Lassen sich alle vom Datentypen
gewünschten Eigenschaften folgern, d.h. gelten sie immer,
wenn die Axiome gelten?
• Eindeutigkeit – Sind alle Modelle im wesentlichen“ gleich?
”
(Nein!)
• Kann man eine Klasse von relevanten“ Modellen finden,
”
die man durch Axiome eindeutig beschreiben kann?
(Oft ja, manchmal nein.)
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
10
Mittel der Logik:
• Funktionszeichen (kennen wir)
• Terme (kennen wir)
• Gleichungen (neu!)
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
11
Definition 3.1.1
Eine Signatur Σ besteht aus einer endlichen Liste von Sor”
ten“ (d.h. Sortennamen)
und einer endlichen Liste von Operationen“
”
(d.h. Operationsnamen mit Angabe von Definitionsbereich
und Wertebereich; Definitionsbereich: kartesisches Produkt
von Sortennamen; Wertebereich: ein Sortenname)
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
12
Beispiel Boolean“:
”
bool
sorts bool
ops
true : → bool (nullstellig)
false : → bool (nullstellig)
neg : bool → bool (einstellig)
and : bool × bool → bool (2-stellig)
or : bool × bool → bool (2-stellig)
ite : bool × bool × bool → bool (3-stellig)
Nur eine Sorte: einsortig“.
”
ite“: if a then b else c, für Wahrheitswerte: (a ∧ b) ∨ (¬a ∧ c).
”
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
13
Beispiel Natürliche Zahlen“, ebenfalls einsortig:
”
nat
sorts nat
ops
null : → nat
succ : nat → nat
Mit Import“:
”
nat1
bool + nat + (gemeint: Sorten und Operationen abschreiben“)
”
ops
add : nat × nat → nat
le : nat × nat → bool
Mehrsortig“
”
le“: Wird später als ≤“ interpretiert.
”
”
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
14
Stacks über natürlichen Zahlen“
”
natstacks
nat1 +
sorts
stack
ops
new : → stack
push : stack × nat → stack
pop : stack → stack
top : stack → nat
isempty : stack → bool
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
15
Queues über natürlichen Zahlen“
”
natqueues
nat1 +
sorts
queue
ops
new : → queue
enq : queue × nat → queue
deq : queue → queue
first : queue → nat
isempty : queue → bool
Strukturell identisch zur Signatur von Stacks!
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
16
Definition 3.1.1
Gegeben sei eine Signatur Σ.
Die Menge T (Σ) der Terme über Σ (mit/ohne Variable) und
die Ausgabesorte dieser Terme ist wie folgt induktiv definiert:
(i) Konstante (nullstellige Operationsnamen) op sind Terme, ihre Ausgabesorte s ergibt sich aus der Signaturzeile
op : · · · → s.
(i’) [in der Version mit Variablen“: Variable x1, x2, . . . sind
”
Terme, jeder Variablen ist eine Sorte zugeordnet.]
(ii) Wenn op : s1 × · · · × sk → sk+1 eine Zeile in Σ ist und
t1, . . . , tk Terme mit Ausgabesorten s1, . . . , sk sind, dann
ist op(t1, . . . , tk ) Term mit Ausgabesorte sk+1.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
17
Beispiele:
nat-Terme: null , succ(null ), succ(succ(null )) usw.
natstack -Terme:
Term
new
push(new , null )
push(new , succ(null ))
pop(push(new , succ(null )))
top(push(new , succ(null )))
isempty(push(new , succ(null )))
Ausgabesorte
stack
stack
stack
stack
nat
bool
Beachte: Terme sind Texte, sie bedeuten (bisher jedenfalls)
nichts. Idee (neu im Vergleich zur Prädikatenlogik): Wir beabsichtigen: top(push(new , succ(null ))) = “ succ(null ).
”
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
18
Spezifikation des Verhaltens durch Gleichungen
( Axiome“):
”
Beispiel Boolean“:
”
bool
vars p, q : bool (Variable der Sorte bool )
axs ite(true, p, q) = p
ite(false, p, q) = q
neg(p) = ite(p, false, true)
and (p, q) = ite(p, q, false)
or (p, q) = ite(p, true, q)
Nur eine Sorte: einsortig“.
”
ite“: if a then b else c, für Wahrheitswerte: (a ∧ b) ∨ (¬a ∧ c).
”
Implizit: Die freien Variablen sind ∀-quantifiziert.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
19
Beispiel Natürliche Zahlen“:
”
nat1
bool + nat+ (gemeint: auch Variable und Axiome abschreiben“)
”
vars
n, m : nat
axs
le(null , n) = true
le(succ(n), null ) = false
le(succ(n), succ(m)) = le(n, m)
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
20
Beispiel Stacks über den natürlichen Zahlen“:
”
natstacks
nat1 +
vars
s : stack ; n : nat
axs
pop(push(s, n)) = s
top(push(s, n)) = n
pop(new ) = new
In Implementierung: Fehler!
top(new ) = null
In Implementierung: Fehler!
Das Unterdrücken des Ergebnisses undefiniert“ vermeidet
”
Komplikationen und Fallunterscheidungen. Könnte aber im
Prinzip hier ebenfalls benutzt werden.
Partiell definierte Operationen“.
”
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
21
Beispiel Queues über den natürlichen Zahlen“:
”
natqueues
nat1 +
vars
q : queue; n : nat
axs
deq(new ) = new
In Implementierung: Fehler!
deq(enq(new , n)) = new
deq(enq(enq(q, n), m)) = enq(deq(enq(q, n)), m)
first(new ) = null
In Implementierung: Fehler!
first(enq(new , n)) = n
first(enq(enq(q, n), m)) = first(enq(q, n))
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
22
Definition 3.1.2
Eine Signatur Σ, eine Liste X von Variablennamen (mit Sorten) und eine Liste axs von Gleichungen t1 = t2 zwischen
Termen der gleichen Sorte heißt eine
Spezifikation (eines Datentyps).
Wir schreiben (Σ, X, axs) oder (Σ, axs) (wenn es keine Variablen gibt oder ihre Namen nicht wichtig sind).
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
23
Wir definieren die Semantik für Spezifikationen.
Wann passt eine Struktur zu einer Signatur?
Definition 3.1.3
Sei Σ eine Signatur. Eine Σ-Algebra A (eine zu Σ passende
Struktur) ist definiert durch eine Liste (sA, s Sorte in Σ, von
nichtleeren Mengen, und für jeden in Σ angegebenen Operator
op : s1 × · · · × sk → sk+1 eine Funktion
opA : (s1)A × · · · × (sk )A → (sk+1)A.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
24
Beispiel: bool .
Σ-Algebren:
1) {0, 1} mit true A, false A, and A, or A, ite A, neg A in der
Standard-Weise definiert.
2) {0, 1}n mit true A = (1, . . . , 1) und false A = (0, . . . , 0),
sowie and A, or A, ite A, neg A komponentenweise definiert.
3) ( die triviale Algebra“)
”
{0}, alle Funktionen haben als Wert 0.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
25
Um zu sehen, ob in A Axiome erfüllt“ sind, müssen wir
”
Σ-Terme auswerten.
Für die Variablen benötigen wir wieder Belegungen ξ.
Beispiel: bool mit Variablen p, q.
Als Σ-Algebra betrachten wir {0, 1}n mit komponentenweisen
Operationen.
ξ(p) = (0, 1, 0, 1, 0, . . . , 0), ξ(q) = (1, 1, 0, 0, 0, . . . , 0).
α(or (q, p)) soll or A(ξ(p), ξ(q)) = (1, 1, 0, 1, 0, . . . , 0) sein.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
26
Definition 3.1.4
(a) Eine Σ-Struktur α = (A, ξ) für eine Spezifikation
(Σ, X, axs) besteht aus einer Σ-Algebra A und einer Funktion
ξ, die jede Variable x ∈ X von der Sorte s auf ein Element
der Menge sA abbildet.
(b) Dann definieren wir induktiv:
(i) α(op) = op A ∈ sA, für nullstellige Operatoren op der Sorte
s.
(ii) α(x) = ξ(x), für Variable x ∈ X.
(iii) α(op(t1, . . . , tk )) = op A(α(t1), . . . , α(tk )).
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
27
Definition 3.1.4 (Forts.)
(c) Eine Gleichung t1 = t2 zwischen zwei Termen von derselben
Ausgabesorte gilt in A, wenn für alle Strukturen α = (A, ξ),
die die Variablen belegt, die in t1 und t2 vorkommen, gilt:
α(t1) = α(t2).
(Freie Variable sind hier stillschweigend mit ∀ quantifiziert.)
Wir schreiben dann: A |= t1 = t2.
Man kann in solchen Strukturen auch allgemeinere Formeln betrachten,
mit Gleichungen als Primformeln und darauf aufgebauten komplexeren
Formeln wie in der Prädikatenlogik. Wird hier nicht betrachtet.
(d) (Σ, X, axs) sei eine Spezifikation.
Eine Σ-Algebra A erfüllt (Σ, X, axs), wenn A |= t1 = t2 für
alle Gleichungen t1 = t2 in axs gilt.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
28
Beispiel: natstack . Wir beschreiben die Standard-Algebra.
Sorten: bool A = {w , f }
true A = w , false A = f
neg A(w ) = f , neg A(f ) = w ; andere boolesche Operationen
wie üblich.
nat A = N
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
29
Operationen:
null A = 0
succ A(n) = n + 1 für n ∈ N
add A(n, m) = n + m für n, m ∈ N
le A(n, m) = w falls n ≤ m, sonst le A(n, m) = f
natstack A = {(a1, . . . , ak ) | k ≥ 0, a1, . . . , ak ∈ N}
new A() = ()
(leere Folge)
push A((a1, . . . , ak ), a) = (a, a1, . . . , ak )
pop A((a1, . . . , ak )) = (a2, . . . , ak ), falls k ≥ 1, bzw.= () falls
k=0
top A((a1, . . . , ak )) = a1, falls k ≥ 1, bzw. = 0 falls k = 0
isempty A((a1, . . . , ak )) = f , falls k ≥ 1, bzw. = w falls k = 0
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
30
Proposition 3.1.5
Die eben beschriebene Σ-Algebra erfüllt alle Axiome für die
Spezifikation natstack .
(Simples Nachkontrollieren!)
Gibt es andere Strukturen für natstack ?
Ja!
(Zum Beispiel die triviale Algebra, in der jede Sortenmenge
die Menge {0} ist.)
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
31
(1) Implementierung in Programmiersprachen durch Listen.
Sorten: bool A = {0, 1}
nat A = Menge der Binärdarstellungen der natürlichen Zahlen
(etwas idealisiert: keine Längenbeschränkung)
natstack A = Menge aller linearen Listen mit Einträgen aus
nat A.
(Abstrakt gedacht: Die konkrete Lage im Speicher spielt keine
Rolle.)
Operationen:
true A, false A, neg A etc.: wie üblich.
null A = 0
succ A(w) = w+ für w eine Binärdarstellung, w+ die BinärdarFG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
32
stellung des Nachfolgers.
add A(w, v) = u für Binärdarstellungen w, v, u, wobei u die
Summe von w und v darstellt.
le A(w, v) entsprechend.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
33
new A() = leere Liste
push A(L, a) = Resultat, wenn a vorne an Liste L angefügt
wird
pop A(L) = Resultat, wenn aus L das erste Listenelement
gestrichen wird;
wenn L leer ist: die leere Liste.
top A(L) = Eintrag im ersten Element von L, wenn dieses
existiert;
wenn L leer ist: 0.
isempty A(L) = 1, falls L leer, bzw. = 0 falls L nichtleer.
Es ist leicht, nachzukontrollieren, dass die Stack-Axiome durch
diese Algebra erfüllt sind.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
34
(2) Implementierung in Programmiersprachen durch Arrays.
Idealisiert: Arrays sind unendlich lange, Einträge sind Binärdarstellungen
beliebiger Länge, alle bis auf endlich viele Arrayeinträge sind 0.
new A() = (T, p), Array T mit lauter Null-Einträgen,
Indexmenge N+, Pegel p = 0.
push A((T, p), a) = Resultat, wenn man p++; T [p] ← a ausführt.
pop A((T, p)) = (T, p − 1), falls p > 0. Falls p = 0: (T, 0).
top A((T, p)) = T [p], falls p > 0, bzw. = 0, falls p = 0.
isempty A((T, p)) = 1, falls p > 0, bzw. = 0, falls p = 0.
Besonderheit: Bei pop werden Einträge nicht gestrichen.
Das führt dazu, dass in T die Historie (teilweise) aufbewahrt wird.
Dennoch: Korrektheit bezüglich der Axiome gilt, wenn man stets nur das
Teilarray T [1..p] betrachtet.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
35
(3) Legal, aber unerwünscht:
bool A = nat A = natstack A = {0}
Alle Operationen liefern stets den Wert 0.
Das triviale Modell“.
”
Beobachtung: Jede Spezifikation mit Axiomen, die nur aus
Gleichungen bestehen, wird durch ein solches triviales Modell
erfüllt.
Vermengt, was es unterscheiden sollte: confusion“.
”
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
36
3.2 Das initiale Modell
Bei Stacks und Queues glauben wir zu wissen, was gemeint
”
ist“. Hier wird dies präzise gefasst.
(Σ, X, axs) sei eine Spezifikation.
TΣ0 := Menge der variablenfreien Terme zu Σ. ( Grundterme“).
”
Wenn es für eine Sorte keinen Grundterm gibt, erfindet man
eine neue nullstellige Funktion für eine solche Sorte, und bildet
damit neue Grundterme. Gegebenenfalls wiederholen.
Jede Algebra A für Σ gibt jedem Grundterm t ∈ TΣ0 (Sorte s)
einen Wert α(t) in seiner Sortenmenge sA.
(Genauer: α = (A, ξ) wobei ξ die leere Funktion ist.)
s0A := {α(t) | α = (A, ∅), t Grundterm der Sorte s}
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
37
A0 ist die Σ-Algebra, die diese Mengen als Sortenmengen hat,
die Operationen werden von sA übernommen.
Es ist klar, dass Anwenden von Operationen auf beliebige
Elemente der Sortenmengen s0A immer wieder solche Elemente
liefert. Also ist A0 tatsächlich selber eine Σ-Algebra.
Man kann zeigen: A0 ist die kleinste Unteralgebra“ von A.
”
(Operationen aus A übernommen, Sortenmengen möglichst
klein.)
Alle Objekte in A werden durch einen Term beschrieben!
Weiter gilt: Aus A |= (Σ, axs) folgt A0 |= (Σ, axs).
(In den Axiomen werden Allquantoren ergänzt, und wenn etwas für alle
Elemente in A gilt, dann erst recht für alle Elemente in A0.)
Beachte: Für die Definition von A0 |= (Σ, axs) werden selbstverständlich
Variable und Belegungen benötigt!
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
38
Beispiel: Die Algebra A mit Grundmenge bool A = {0, 1}n ist
zwar interessant, aber nicht minimal.
Grundterme: true, false
bool 0A = {α(true), α(false)} = {(0, . . . , 0), (1, . . . , 1)}.
Elemente von bool A = {0, 1}n, für die es keinen Grundterm
gibt, zählen als junk“ und fallen in der kleinsten Unteralgebra
”
heraus.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
39
Die initiale Σ-Algebra zu (Σ, axs):
Jedes Element in einer Sortenmenge soll durch einen Term beschrieben werden, das Modell soll minimal“ sein ( no junk“).
”
”
Erinnerung: Herbrand-Modelle hatten als Elemente genau die
Grundterme, dabei stand jeder Term für sich selbst.
Da aber (z.B.)
top(push(push(new , null ), succ(null ))) und succ(null ) doch
irgendwie gleich“ sein sollen, ist dieser Ansatz hier nicht
”
ausreichend.
Durch verschiedene Terme beschriebene Objekte sollen dann,
aber auch nur dann gleich“ sein, wenn dies aus den Axiomen
”
beweisbar“ ist ( no confusion“).
”
”
??? Wir brauchen einen Term-Transformationskalkül.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
40
Definition 3.2.1
Gegeben sei eine Spezifikation (Σ, X, axs).
Für Terme t1 und t2 schreiben wir t1 → t2, falls es ein Axiom
t01 = t02 gibt, das freie Variable x1, . . . , xk ∈ X enthält, und
wenn es Grundterme t01, . . . , t0k gibt, so dass
t1 = t01[x1|t01, . . . , xk |t0k ] und t2 = t02[x1|t01, . . . , xk |t0k ].
Beispiel:
top(push(push(new , null ), succ(null ))) → succ(null )
pop(push(push(new , null ), succ(null ))) → push(new , null )
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
41
Definition 3.2.2
Gegeben sei eine Spezifikation (Σ, X, axs). Wir definieren
induktiv eine Relation ≡ auf der Menge TΣ0 der Grundterme,
wie folgt:
(i) t1 ≡ t2, falls t1 → t2 oder t2 → t1 oder t1 = t2.
(ii) Wenn t1 ≡ t2 und t2 ≡ t3, dann t1 ≡ t3.
( Transitiver Abschluss“.)
”
(iii) Wenn t1 ≡ t01,. . . , tk ≡ t0k für Termpaare der Sorten
s1, . . . , sk und op : s1 × · · · × sk → sk+1 Operation in Σ ist,
dann
op(t1, . . . , tk ) ≡ op(t01, . . . , t0k ).
( Einsetzungs-Abschluss“.)
”
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
42
Beispiel:
Aus Axiom: pop(push(push(new , null ), succ(null )))
push(new , null )
≡
Einsetzen: top(pop(push(push(new , null ), succ(null )))) ≡
top(push(new , null ))
Aus Axiom: top(push(new , null )) ≡ null .
Transitivität: top(pop(push(push(new , null ), succ(null )))) ≡
null
Man erhält einen Termersetzungskalkül“.
”
Grundregel: Wenn ein Teilterm das Muster eines Axioms
erfüllt, darf man ihn durch den entsprechend dem Axiom
transformierten Term ersetzen, wie in Definition 3.2.1.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
43
Beobachtung: ≡ ist Äquivalenzrelation auf TΣ0 .
(Transitivität und Reflexivität erzwungen, Symmetrie leicht
nachzuweisen, mit Regel (i) als Induktionsanfang.)
Klar: Wenn t ≡ t0, dann haben t und t0 dieselbe Sorte.
Wir bilden Äquivalenzklassen [t] = {t0 | t0 ≡ t}.
Dadurch wird jede Teilmenge von TΣ0 , die zu einer Sorte
gehört, in Klassen zerlegt.
Idee: Mache diese Äquivalenzklassen zu Objekten einer ΣAlgebra.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
44
Häufig: Durch systematische Transformation kann man Grundterme in eine Normalform“ bringen – nicht für jede Spezifi”
kation, aber in wichtigen Fällen.
(Unsere Spezifikationen gehören alle dazu.)
Beispiel: neg(or(true, neg(and(true, false))))
Oder im Fall der Queue: Abkürzungen 0, 1, 2, . . . für null,
succ(null), . . .
enq(new, first(deq(enq(enq(enq(new, 5), 3), 6))))
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
45
Definition 3.2.3
Gegeben sei eine Spezifikation (Σ, X, axs).
A∗Σ ist die folgende Algebra
(auch TΣ0 / ≡ genannt; der Vorgang heißt Quotientenbildung):
Für jede Sorte s definiere sA∗Σ := {[t] | t Term der Sorte s}.
Für jede Operation op : s1 × · · · × sk → sk+1 und alle Terme
t1, . . . , tk der Sorten s1, . . . , sk definiere
op A∗ ([t1], . . . , [tk ]) := [op(t1, . . . , tk )].
Σ
Wohldefiniertheit“: Muss checken:
”
t1 ≡ t01, . . . , tk ≡ t0k ⇒ op(t1, . . . , tk ) ≡ op(t01, . . . , t0k ).
Dies gilt direkt nach der Definition von ≡.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
46
Satz 3.2.4
Für jede Spezifikation (Σ, X, axs) gilt: A∗Σ |= (Σ, X, axs).
Beweis: t1 = t2 sei Axiom mit Variablen x1, . . . , x` ∈ X.
S
ξ : X → s Sorte sA∗Σ sei Belegung.
Jedes ξ(xj ) ist eine Klasse [t0j ] (der richtigen Sorte).
Zu zeigen: α(t1[x1|t01, . . . , x`|t0`]) = α(t2[x1|t01, . . . , x`|t0`]).
Dazu zeigt man, ähnlich wie beim Substitutionslemma:
α(t1[x1|t01, . . . , x`|t0`]) = [t1[x1|t01, . . . , x`|t0`], analog für t2,
und verwendet, dass
t1[x1|t01, . . . , x`|t0`] ≡ t2[x1|t01, . . . , x`|t0`].
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
47
Zusätzliche spezielle Eigenschaft: Initialität“.
”
Behauptung 3.2.5
Wenn A |= (Σ, X, axs), dann existiert eine Familie Φ =
(Φs)s Sorte mit:
Φs : sA∗ → sA,
so dass Φ ein Σ-Algebra-Homomorphismus ist, d. h. für
Operationen op : s1 × · · · × sk → sk+1 in Σ und Grundterme
t1, . . . , tk gilt:
Φsk+1 (opA∗ ([t1], . . . , [tk ])) = opA(Φs1 ([t1]), . . . , Φsk ([tk ])).
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
48
Vorsicht:
Die Abbildungen Φs müssen nicht surjektiv sein, sie erfassen
nur den durch Terme benannten Teil von sA, also A0.
Restlicher Teil von sA: junk“.
”
Die Abbildungen Φs müssen auch nicht injektiv sein. In diesem
Fall werden in A Terme identifiziert, ohne dass dies von den
Axiomen erzwungen wird
( confusion“).
”
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
49
Beweis der Behauptung:
Man definiert
Φs([t]) := α(t)
für Grundterme t der Sorte s. Für die HomomorphieEigenschaft zeigt man:
t ≡ t0 ⇒ α(t) = α(t0).
(Methode: Induktion über die Definition von ≡. Hier nicht
ausgeführt.)
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
50
Definition 3.2.6
Eine Σ-Algebra A∗ heißt initial für die Spezifikation
(Σ, X, axs), falls für jedes Modell A von (Σ, X, axs) ein eindeutig bestimmter Σ-Algebra-Homomorphismus Φ : A∗ → A
existiert.
Haben: A∗Σ ist initial.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
51
Satz 3.2.7
Wenn A∗ und A∗∗ beide initial für (Σ, X, axs) sind, dann sind
sie strukturell gleich“, d. h. es existiert eine strukturerhaltende
”
Bijektion zwischen den beiden Algebren.
D. h.: Alle initialen Algebren für (Σ, X, axs) sehen praktisch
gleich aus,
nämlich so wie A∗Σ.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
52
Definition 3.2.8
Die Menge der initialen Algebren zu (Σ, X, axs) (alle strukturell gleich) heißt der durch (Σ, X, axs) spezifierte abstrakte
Datentyp.
ADT
( abstract data type“).
”
Die durch eine (beliebige) initiale Σ-Algebra gegebene Semantik ist die durch die Axiome gegebene.
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
53
Beispiel: Spezifikation bool.
bool
vars
axs
p, q : bool (Variable der Sorte bool )
ite(true, p, q) = p
ite(false, p, q) = q
neg(p) = ite(p, false, true)
and (p, q) = ite(p, q, false)
or (p, q) = ite(p, true, q)
Wie sieht die Quotienten-Termalgebra aus?
Wie sieht die Standard-Algebra“ aus?
”
Was ist der Isomorphismus?
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
54
Beispiel: Spezifikation nat.
nat
sorts
ops
nat
null : → nat
succ : nat → nat
Wie sieht die Quotienten-Termalgebra aus?
Wie sieht die Standard-Algebra“ aus?
”
Was ist der Isomorphismus?
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
55
Beispiel: Spezifikation natstack.
natstacks
nat1 +
sorts
ops
axs
stack
new : → stack
push : stack × nat → stack
pop : stack → stack
top : stack → nat
isempty : stack → bool
pop(push(s, n)) = s
top(push(s, n)) = n
pop(new ) = new
top(new ) = null
Wie sieht die Quotienten-Termalgebra aus?
Wie sieht die Standard-Algebra“ aus?
”
Was ist der Isomorphismus?
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
56
Beispiel: Spezifikation natqueue.
natqueues
nat1 +
vars
axs
q : queue; n : nat
deq(new ) = new
deq(enq(new , n)) = new
deq(enq(enq(q, n), m)) = enq(deq(enq(q, n)), m)
first(new ) = null
first(enq(new , n)) = n
first(enq(enq(q, n), m)) = first(enq(q, n))
Wie sieht die Quotienten-Termalgebra aus?
Wie sieht die Standard-Algebra“ aus?
”
Was ist der Isomorphismus?
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
57
Das war’s!
Viel Erfolg in der Klausur!
Schöne Semesterferien!
FG KTuEA, TU Ilmenau
LS – 29.06.+13.07.2010
58
Herunterladen