Technische Universität München WiSe 2014/15 Fakultät für

Werbung
Technische Universität München
Fakultät für Informatik
Prof. Dr. A. Pretschner
F. Kelbert, Dr. A. Malkis
WiSe 2014/15
Lösungsblatt 5
Ausgabe: 4. November 2014
Besprechung: 11. November 2014
Abgabe: 11. November 2014, 13:00 Uhr
Übungen zu den „Grundlagen der Programm- und Systementwicklung“
Bitte geben Sie Ihre Lösung vor der Übung in Papierform ab. Notieren Sie auf Ihrer
Lösung Ihren Namen und Ihre Matrikelnummer und lassen Sie einen ca. 4–5 cm
breiten Rand.
You can hand in your solutions in English, if you wish. In any case, the handing
in should be written in one single language.
Aufgabe 1
Binäre und unäre natürliche Zahlen
(10 Punkte)
Sei Σ = ({Nat}, {zero, succ}) mit zero : Nat und succ : Nat → Nat eine vereinfachte Signatur für natürliche Zahlen. Definieren Sie die Σ-Rechenstruktur natürlicher
Zahlen in
• binärer
• unärer (Strichdarstellung)
Darstellung. Geben Sie einen Isomorphismus zwischen den beiden Rechenstrukturen
mit Beweis an.
Hinweis: Für diese Aufgabe können Sie die Existenz eines unbekannten, festen Modells
natürlicher Zahlen mit Peanoschen Axiomen voraussetzen:
• 0 ist eine natürliche Zahl.
• Jede natürliche Zahl hat eine natürliche Zahl als eindeutigen Nachfolger.
• 0 ist kein Nachfolger einer natürlichen Zahl.
• Natürliche Zahlen mit gleichem Nachfolger sind gleich.
• Enthält eine Menge X die 0 und mit jeder natürlichen Zahl auch deren Nachfolger,
so bilden die natürlichen Zahlen eine Teilmenge von X.
Sie dürfen auch voraussetzen, dass Zeichenketten mithilfe dieses Modells definiert sind.
Lösung der Aufgabe 1
Rechenstruktur für unäre Darstellung:
U = ((X U )X∈{Nat} , (f U )f ∈{zero,succ} )
NatU = 1∗
zero U = ε
succ U = λw ∈ 1∗ . 1w
Seite 1 von 12
Rechenstruktur für binäre Darstellung:
B = ((X B )X∈{Nat} , (f B )f ∈{zero,succ} )
NatB = {0} ∪ {1w|w ∈ {0, 1}∗ }
zero B = 0
succ B (w0) = w1 (w ∈ {0, 1}∗ \ {0}+ )
succ B (1) = 10
succ B (w1) = succ B (w)0 (w ∈ {0, 1}∗ \ {0}∗ )
Isomorphismus - Beweis
Schritt 1: Wir geben einen Isomomorphismus ϕ von U nach B wie folgt an:
ϕ = {(Nat, ϕNat )}
ϕNat : NatU → NatB
ϕNat (ε) = 0
ϕNat (1w) = succ B (ϕNat (w))
Schritt 2: Wir zeigen, dass ϕNat bijektiv (injektiv und surjektiv) ist:
Schritt 2a: Beweis, dass succ B injektiv ist:
Mit Induktion über das Produkt der Unterzeichenketten-Halbordnungen (alternativ
ginge es etwa über die Summe der Länge der Zeichenketten).
Seien a, b ∈ NatB mit succ B (a) = succ B (b). Unsere Induktionsvoraussetzung ist, dass
für alle a0 , b0 ∈ NatB mit a0 eine Teilzeichenkette von a und b0 eine Teilzeichenkette
von b, aber (a0 , b0 ) 6= (a, b), aus succ B (a0 ) = succ B (b0 ) die Aussage a0 = b0 folgt.
Fallunterscheidung:
1. Fall: a = c0, b = d0 mit c, d ∈
/ {0}+ . Dann c1 = d1. Dann c = d. Dann a = b.
2. Fall: a = c0, b = 1 mit c ∈
/ {0}+ . Dann c1 = 10. Widerspruch!
3. Fall: a = c0, b = d1 mit c ∈
/ {0}+ , d ∈
/ {0}∗ . Dann c1 = succ B (d)0. Widerspruch!
4. Fall: a = 1, b = 1. Dann a = b.
5. Fall: a = 1, b = d1 mit d ∈
/ {0}∗ . Dann 10 = succ B (d)0, also 1 = succ B (d), also
d = 0. Widerspruch!
6. Fall: a = c1, b = d1 mit c, d ∈
/ {0}∗ . Dann succ B (c)0 = succ B (d)0. Dann
B
B
succ (c) = succ (d). Nach Induktionsvoraussetzung ist c = d. Also a = b.
Andere Fälle sind symmetrisch zu den betrachteten; man vertauscht die Rollen von
a und b.
Schritt 2b: Beweis, dass ϕNat injektiv ist. Wir führen den Beweis per Induktion
über die Substring-Halbordnung.
Seite 2 von 12
Sei w ∈ NatU beliebig, fest. Unsere Induktionsvoraussetzung ist, dass für alle w0 , so
dass w0 eine echte Teilzeichenkette von w ist, gilt ∀ υ ∈ NatU : ϕNat (w0 ) = ϕNat (υ) ⇒
w0 = υ. Wir zeigen, dass ∀ υ ∈ NatU : ϕNat (w) = ϕNat (υ) ⇒ w = υ.
Sei also υ ∈ NatU mit ϕNat (w) = ϕNat (υ). Fallunterscheidung:
1. Fall: υ = ε, w = ε. Dann υ = w.
2. Fall: w = ε, υ = 1υ 0 . Dann ϕNat (w) = 0, aber ϕNat (υ) = succ B (ϕNat (υ 0 )) 6= 0.
Widerspruch!
3. Fall: w = 1w0 , υ = 1υ 0 . Da succ B injektiv ist, ist ϕNat (w0 ) = ϕNat (υ 0 ). Nach Induktionsvoraussetzung (über die Substring-Halbordnung) ist w0 = υ 0 , also w = υ.
Schritt 2c: Beweis, dass succ B fast surjektiv ist (0 ist kein Nachfolger):
Hilfslemma: ∀ a ∈ NatB \ {0} ∃ b ∈ NatB : succ B (b) = a.
Sei a ∈ NatB \ {0}.
Fallunterscheidung:
1. Fall: a = b1. Dann succ B (b0) = b1 = a.
2. Fall: a = b0. Da b Teilzeichenfolge von a ist, existiert ein c mit succ B (c) = b. Dann
succ B (c1) = succ B (c)0 = b0 = a.
Schritt 2d: Beweis ϕNat surjektiv: zu zeigen ist ∀a ∈ NatB ∃w ∈ 1∗ : ϕNat (w) = a.
Wir benutzen eine Hilfsfunktion f : NatB → N, mit 0 7→ 0, 1 7→ 1, wx 7→
2f (w) + x (w ∈ NatB , x ∈ {0, 1}).
Beachte: f (succ B (w)) ≥ f (w) + 1 (w ∈ NatB ).
Beweis per Induktion über Teilzeichenketten-Halbordnung; sei w ∈ NatB beliebig.
Fall w = 0: f (succ B (0)) = f (1) = 1 = 0 + 1 = f (0) + 1.
Fall w = v0: f (succ B (v0)) = f (v1) = 2f (v) + 1 = 2f (v) + 0 + 1 = f (v0) + 1.
Fall w = 1: f (succ B (1)) = f (10) = 2f (1) + 0 = 2f (1) = 2 ≥ 1 + 1 = f (1) + 1.
Fall w = v1: f (succ B (v1)) = f (succ B (v)0) = 2f (succ B (v)) ≥ 2(f (v) + 1) =
(2f (v) + 1) + 1 = f (v1) + 1.
Wir zeigen die Surjektivität von ϕNat mit Induktion über f (a).
Zu zeigen: ∀c ∈ N ∀a ∈ NatB : (f (a) = c ⇒ ∃ w ∈ NatU : ϕNat (w) = a). Sei c ∈ N,
beliebig, aber fest.
Induktionsvoraussetzung: ∀c0 ∈ N : (c0 < c ⇒ ∀b ∈ NatB : (f (b) = c0 ⇒ ∃w ∈ NatU :
ϕNat (w) = b)).
Sei a ∈ NatB mit f (a) = c.
Fall 1: f (a) = 0. Dann a = 0. Dann ϕNat (ε) = 0 = a.
Fall 2: f (a) > 0. Dann a 6= 0. Nach dem Hilfslemma existiert ein b mit a = succ B (b).
Seite 3 von 12
Dann f (a) > f (b).
Nach Induktionsvoraussetzung existiert ein w mit ϕNat (w) = b. Dann ϕNat (1w) = a.
Es bleibt zu zeigen, dass ϕNat ein Homomorphismus ist.
Zu zeigen:
• „ϕNat (succ U (w)) = succ B (ϕNat (w))“ (w ∈ 1∗ )
Wegen succ U (w) = 1w trifft dies nach Definition von ϕNat zu.
• „ϕNat (zero U ) = zero B “. Beide Seiten sind gleich 0.
Aufgabe 2
(40 Punkte)
NAT und INT
Betrachte die algebraischen Spezifikationen NAT und INT wie auf den Folien oder
im Skript. Zeigen Sie:
(a) NAT ist konsistent,
(b) NAT ist nicht monomorph,
(c) NAT ist nicht vollständig,
(d) INT ist konsistent,
(e) INT ist monomorph,
(f) INT ist vollständig.
Um Konsistenz zu zeigen, konstruieren Sie die entsprechenden Modelle aus anderen
grundlegenden Konzepten, ohne bekannte N oder Z auszunutzen. Sie haben die Wahl
der grundlegenden Begriffe bei der Konstruktion.
Hinweis: Informieren Sie sich über die Konstruktion von N aus dem Unendlichkeitsaxiom
des ZFC bzw. als die Menge der Church-Numerals. Um die ganzen Zahlen zu konstruieren,
benutzen Sie die natürlichen.
Lösung der Aufgabe 2
(a) Wir benutzen eine Konstruktion aus der reinen wohlfundierten Mengenlehre
mit ZF-Axiomen.
Eine Menge z heiße induktiv, wenn
∅ ∈ z ∧ ∀ x : x ∈ z ⇒ x ∪ {x} ∈ z .
Das Unendlichkeitsaxiom besagt, dass eine induktive Menge existiert. Sei
N := {x | ∀ z : (z induktiv ⇒ x ∈ z)}
die bzgl. der Teilmengenrelation kleinste induktive Menge. Die Nachfolgeroperation sei definiert als
NF : N → N \ {∅} ,
x 7→ x ∪ {x} .
Seite 4 von 12
NF ist injektiv: Seien x, y ∈ N, x 6= y und NF(x) = NF(y). Dann x ∪ {x} =
y ∪ {y}, also x ∈ y ∈ x. Dann hat die Menge {x, y} kein kleinstes Element bzgl.
„∈“. Das Fundiertheitsaxiom besagt aber, dass jede nichtleere Menge ein bzgl.
„∈“ kleinstes Element enthält. Widerspruch!
NF ist surjektiv als Abbildung N → N \ {∅}: Sei y ∈ (N \ {∅}) \ (Bild NF). Sei
z := N \ {y}. Dann ist ∅ ∈ z und für jedes x ∈ z gilt x ∪ {x} = NF(x) 6= y,
also x ∪ {x} ∈ z. Also ist z induktiv und daher N ⊆ z. Aber y ∈ N und y ∈
/ z.
Widerspruch!
Also ist NF : N → N \ {∅} bijektiv als Abbildung N → N \ {∅} und hat daher
eine Inverse VG : N \ {∅} → N, genannt Vorgängeroperation.
Wir fangen an, ein Modell N von NAT zu konstruieren:
BoolN = {O, L},
trueN = L logisches Ja,
falseN = O
logisches Nein,
and = ∧ logische Konjukntion,
N
orN = ∨ logische Disjunktion,
notN = ¬ logische Negation,
NatN = N,
0N = ∅,
succ N = NF (als Abbildung N → N),
(
∅,
falls x = ∅ ,
pred N = λx ∈ N.
VG(x) , sonst,
(
L , falls x = ∅ ,
iszero N = λx ∈ N.
O , sonst.
Bemerke, dass N mit ∅ als Null und NF als Nachfolgeroperation nach Konstruktion alle Peano-Axiome erfüllt:
•
•
•
•
•
Die Null ist eine natürliche Zahl.
Jede natürliche Zahl hat eine natürliche Zahl als eindeutigen Nachfolger.
Die Null ist kein Nachfolger einer natürlichen Zahl.
Natürliche Zahlen mit gleichem Nachfolger sind gleich.
Enthält eine Menge z die Null und mit jeder natürlichen Zahl auch deren
Nachfolger, so bilden die natürlichen Zahlen eine Teilmenge von z.
Seite 5 von 12
Ab jetzt kann man übliche natürliche Induktion auf N als Beweisprinzip nutzen.
Die Addition definieren wir als
\
∀ y ∈ N : ((0N , y), y) ∈ R ∧
. (1)
add =
R ⊆ (N×N)×N
∀((x,y),z) ∈ R : ((NF(x),y),NF(z)) ∈ R
Die Menge, über die der Schnitt gebildet wird, enthält (N × N) × N, ist also
nichtleer, also ist der Schnitt wohldefiniert. Bemerke, dass
(∀y∈N : ((0N ,y),y)∈add ) ∧ (∀((x,y),z)∈add : ((NF(x),y),NF(z))∈add ).
(2)
Erstens zeigen wir, dass π1 (add ) = N × N. Dafür sei D := {x ∈ N | {x}×N ⊆
π1 (add )}. Dann ist 0N ∈ D. Sei nun x ∈ D. Sei y ∈ N. Dann gibt es ein z mit
((x, y), z) ∈ add . Dann ((NF(x), y), NF(z)) ∈ add . Also (NF(x), y) ∈ π1 (add ).
Da y beliebig war, zeigten wir, dass {NF(x)}×N ⊆ π1 (add ) gilt. Also NF(x) ∈
D. Daher ist D induktiv, also N ⊆ D und somit N = D.
Nun zeigen wir, dass add eine Funktion ist. Dafür sei D := {x ∈ N | ∀ y, z, w ∈
N : ((x, y), z), ((x, y), w) ∈ add ⇒ z = w}. Wäre 0N ∈
/ D, so gäbe es y, z, w ∈ N
mit ((0N , y), z), ((0N , y), w) ∈ add und z 6= w. Eins von z, w ist ungleich
y; OBdA w 6= y. Sei R := add \ {((0N , y), w)}. Dann erfüllt R die Forderungen an die Menge R aus (1). Also add ⊆ R, ein Widerspruch. Also
0N ∈ D. Sei nun x ∈ D. Wäre NF(x) ∈
/ D, so gäbe es y, z, w ∈ N mit
((NF(x), y), z), ((NF(x), y), w) ∈ add und z 6= w. Da x ∈ D, gibt es ein eindeutiges u mit ((x, y), u) ∈ add . Nach Minimalität von add müssen z und w
Nachfolger sein, etwa von ẑ und ŵ, entsprechend. Eins von ẑ, ŵ ist ungleich
u, etwa ŵ 6= u. Sei R := add \ {((NF(x), y), w)}. Nach Eindeutigkeit von u ist
((x, y), ŵ) nicht in add , also auch nicht in R. Dann erfüllt R die Forderungen
an die Menge R aus (1). Also add ⊆ R, ein Widerspruch. Also NF(x) ∈ D. Wir
zeigten, dass D induktiv ist. Daher ist D = N. Somit ist add eine Funktion.
Wir definieren x +N y als das eindeutige z mit ((x, y), z) ∈ add .
Sei
mult =
\
∀ y ∈ N : ((0N , y), 0N ) ∈ R
R ⊆ (N × N) × N
∧ ∀ ((x, y), z) ∈ R : ((NF(x), y), y +N z) ∈ R
Bemerke, dass der Durchschnitt wohldefiniert ist und
(∀y∈N:((0N ,y),0N )∈mult) ∧ (∀((x,y),z)∈mult:((NF(x),y),y+N z)∈mult). (3)
Seite 6 von 12
Analog zu oben können wir zeigen, dass π1 (mult) = N×N ist und dass mult eine
Funktion ist. Wir definieren x ∗N y als das eindeutige z mit ((x, y), z) ∈ mult.
Die Menge, die von 0N = ∅ aus mit Anwendungen von succ N = NF konstruieren
kann, ist per Definition induktiv, enthält also N, und ist somit gleich N = NatN .
Daher gilt
Nat generated_by 0, succ .
Die Eigenschaft
iszero(0) = true
ist in N per Definiton erfüllt. Die Eigenschaft
iszero(succ(x)) = false
ist in N erfüllt, da ∅ ∈
/ (Bild NF). Die Eigenschaft
pred (succ(x)) = x
ist in N erfüllt, da VG und NF zueinander invers sind. Die Eigenschaften
0+y =y
succ(x) + y = succ(x + y)
sind in N nach (2) erfüllt.
0 ∗ y = 0,
succ(x) ∗ y = y + (x ∗ y)
sind in N nach (3) erfüllt.
(b) Ein weiteres Modell M ergibt sich aus einem beliebigen Modell N durch eine
einzige Änderung:
pred M = pred N [0N 7→ succ N (pred N (0N ))] .
Die restlichen Trägermengen und Funktionen bleiben die gleichen. Die einzige
pred betreffende Eigenschaft ist
pred (succ(x)) = x ,
die weiterhin gilt, da in jedem Modell
iszero(0) 6= iszero(succ(x))
gilt. Alle sonstigen axiomatische Eigenschaften bleiben erfüllt, denn sie betreffen pred nicht.
Seite 7 von 12
Lemma 1. ∀x ∈ Nat : x 6= succ(x) in jedem Modell von NAT.
Beweis. Fixiere ein Modell von NAT. Die Eigenschaft gilt für x = 0 wegen iszero. Gelte nun die Eigenschaft für ein Element t. Wäre succ(t) =
succ(succ(t)), so wäre t = pred (succ(t)) = pred (succ(succ(t))) = succ(t), ein
Widerspruch zur Annahme über t. Also gilt die Eigenschaft für succ(t). Da Nat
durch 0 und succ erzeugt ist, gilt die Eigenschaft für alle x ∈ Nat.
Angenommen, es gäbe einen Isomorphismus ϕ von M nach N . Für jeden
Grundterm t : Nat über Σ gilt wegen Termerzteugtheit ϕNat (tM ) = tN . Da
Nat in M durch die Funktionen 0, succ erzeugt ist, gibt es einen Grundterm t über 0, succ, so dass tM = pred M (0M ). Sei p = pred N (0N ). Dann
p = pred N (ϕNat (0M )) = ϕNat (pred M (0M )) = ϕNat (tM ) = tN = [da 0M = 0N
und succ N = succ M ] tM = pred M (0M ) = succ N (pred N (0N )) = succ N (p). Widerspruch zu Lemma 1.
(c) Es gibt ein Modell, in dem pred (0) = 0 erfüllt ist, und ein anderes, in dem
pred (0) 6= 0 erfüllt ist. Also gibt es keinen Verfahren, der aus den Axiomen die
Gültigkeit der Formel pred (0) = 0 herleiten kann.
(d) Seien N und N wie oben. Sei Z = N ∪ {(0N , x) | x ∈ N \ {0N }}. Beachte: mit
Kuratowski-Paaren (y, x)K = {{y}, {y, x}} ist die Vereinigung disjunkt, da die
einzige Menge, die N∩{(0N , x) | x ∈ N\{0N }} liegen könnte, zweielementig wäre, also höchstens NF(NF(0N )) = {NF(0N ), {NF(0N )}} = {{0N }, {{0N }}} 6=
{{0N }, {0N , x}} = (0N , x) für alle x ∈ N \ {0N }. Die Paare (0N , x) für x 6= 0N
stehen für negative Zahlen.
Wie definieren ein Modell I von INT wie folgt. Sei dazu der boolesche Anteil derselbe wie in N (also die einfachste Boolesche Algebra über {O, L} mit
Seite 8 von 12
L=„Ja“) und
IntI = Z
0I = 0N

N

wenn n ∈ N ,
succ (n) ,
I
N
succ = λn ∈ Z. 0 ,
wenn n = (0, 1) ,

 N
N
(0 , pred (m)) , wenn n = (0N , m)

N

wenn n ∈ N \ {0N } ,
pred (n) ,
pred I = λn ∈ Z. (0N , succ N (0N )) , wenn n = 0N ,

 N
(0 , succ N (n)) ,
wenn n = (0N , m)
\
S ist Halbordnung auf Z
R=
S ⊆ Z×Z
∧ ∀(x, y)∈S : (x, succ I (y)) ∈ S
(
L , falls (x, y) ∈ R
≤I = λx, y ∈ Z.
O , sonst
==I = λx, y ∈ Z. andI (x ≤I y, y ≤I x)
\
∀y ∈ Z : ((0, y), y) ∈ S
I
+ =
S ⊆ (Z×Z)×Z
∧∀((x, y), z) ∈ S : ((succ I (x), y), succ I (z)) ∈ S
−I = {((x, y), z) | x = y +I z}



∀y ∈ Z : ((0, y), 0) ∈ S

\
I
I
I


∗ =
S ⊆ (Z×Z)×Z ∧∀((x, y), z) ∈ S : ((x, succ (y)), z + x) ∈ S

∧∀((x, y), z) ∈ S : ((x, pred I (y)), z −I x) ∈ S 
(e) Die Spezifikation INT ist monomorph, da man aus den Axiomen über pred , succ
und ≤ herleiten kann, dass die Grundterme 0, pred i (0) und succ i (0) für i ∈ N+
paarwise verschieden sind, und da die Axiome die Funktionswerte eindeutig
festlegen. (Ohne formalen Beweis.)
(f) Die Spezifikation INT ist vollständig, da man jeden Grundterm der Sorte Int
mit Axiomen zu einem Grundterm der Form 0, pred i (0) oder succ i (0) für ein
i ∈ N+ umformen kann. (Ohne formalen Beweis.)
Aufgabe 3
Fehlermodellierung
Seite 9 von 12
(10 Punkte)
Gegeben ist folgende algebraische Spezifikation TREE für Binärbäume, welche Werte
an allen Knoten tragen. Ein Binärbaum ist also entweder leer (etree) oder besteht
aus zwei Unterbäumen l, r und einem Wert v (conc(l, v, r)).
(a) Identifizieren Sie die Fehlerfälle.
(b) Passen Sie obige Spezifikation so an, dass auch die Fehlerfälle berücksichtigt
werden.
SPEC TREE = {
based_on BOOL,
sort Tree α,
etree : Tree α,
conc : Tree α, α, Tree α → Tree α,
left, right : Tree α → Tree α,
isetree : Tree α → Bool,
value : Tree α → α,
Tree α generated_by etree, conc,
isetree(x) = true ⇐⇒ x = etree,
value(conc(l, v, r)) = v,
left(conc(l, v, r)) = l,
right(conc(l, v, r)) = r
}
Lösung der Aufgabe 3
Die Spezifikation in der Angabe behandelt die problematischen Fälle nicht, sondern
bleibt hier unterspezifiziert. Die Problemfälle sind
value(etree),
left(etree).
right(etree)
und
Mit der ersten Lösung TREE_F1 weisen wir, wenn möglich, den Termen Werte aus
den vorhandenen Sorten zu. Wenn dies nicht möglich oder nicht sinnvoll ist, greifen
wir wie auch in der zweiten Lösung TREE_F2 auf ein universelles Fehlerelement ⊥
zurück.
Seite 10 von 12
SPEC TREE_F1/_F2 = {
based_on BOOL,
sort Tree α,
etree : Tree α,
conc : Tree α, α, Tree α → Tree α,
left, right : Tree α → Tree α,
isetree : Tree α → Bool,
value : Tree α → α,
Tree α generated_by etree, conc,
isetree(x) = true ⇐⇒ x = etree,
value(conc(l, v, r)) = v,
left(conc(l, v, r)) = l,
right(conc(l, v, r)) = r,
left(etree) = etree,
left(etree) =⊥,
oder
right(etree) = etree,
right(etree) =⊥,
value(etree) =⊥,
isetree(x) 6=⊥
}
Zur Wiederholung: Wenn wir ⊥ verwenden, werden alle freien Variablen der Axiome
implizit weiterhin über ihre Sorte ausschließlich ⊥ allquantifiziert. Außerdem verlangen wir von allen Funktionen, dass sie strikt sind.
Problematik: Ist grundsätzlich erlaubt, dass Funktionen ⊥ liefern dürfen, dann
stellt in obiger Spezifikation das erste Axiom alleine nicht sicher, dass isetree(conc(l, v, r)) =
false gilt! Auch isetree(conc(l, v, r)) =⊥ erfüllt das erste Axiom. Daher fordern wir
mit der letzten Ungleichung explizit die Definiertheit von isetree.
Die dritte Lösung TREE_F3 verwendet kein universelles Fehlerelement, das ja
in der Semantik der Spezifikationen gesondert berücksichtigt werden muss, sondern
führt in jeder Sorte jeweils ein weiteres Fehlerelement ein. Entsprechend wird es recht
aufwändig alle Axiome zu definieren, die das Verhalten bei Fehlerargumenten erklären. Das, was in den vorherigen Lösungen implizit vereinbart war, muss hier explizit
genannt werden. Dies ermöglicht es dann allerdings auch nicht strikte Funktionen zu
Seite 11 von 12
verwenden, also z.B. Fehlerbehandlungen wie isetree(errorTree ) = false.
SPEC TREE_F3 = {
based_on BOOL,
sort Tree α,
etree : Tree α,
conc : Tree α, α, Tree α → Tree α,
left, right : Tree α → Tree α,
isetree : Tree α → Bool,
value : Tree α → α,
errorTree : Tree α,
errorα : α,
errorBool : Bool,
Tree α generated_by etree, conc, errorTree ,
isetree(x) = true ⇐⇒ x = etree,
value(conc(l, v, r)) = v,
left(conc(l, v, r)) = l,
right(conc(l, v, r)) = r,
value(etree) = errorα ,
left(etree) = errorTree ,
right(etree) = errorTree ,
conc(l, v, r) = errorTree ⇐⇒ l = errorTree ∨ v = errorα ∨ r = errorTree ,
isetree(x) = errorBool ⇐⇒ x = errorTree ,
value(errorTree ) = errorα ,
left(errorTree ) = errorTree ,
right(errorTree ) = errorTree
}
Seite 12 von 12
Herunterladen