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