Download (1405Kb)
Download (1405Kb)
Download (1405Kb)
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
170 KAPITEL 8. NICHT-FREIE DATENTYPEN<br />
DP,ς bzw. deren Basisdatentypen zu der Konstruktorsignatur C = {Zero (0) ,Succ (1) ,Pred (1) } kommt<br />
dies überhaupt nicht zum Ausdruck, während nicht-freie Datentypen gerade dies ermöglichen<br />
(sollen).<br />
Derartige nicht-freie Datentypen betrachten wir in diesem Kapitel. Da wir dieses komplexe Gebiet<br />
nur kurz anreißen wollen, verzichten wir ganz auf formale Definitionen und beschäftigen uns mit den<br />
neu auftretenden Phänomenen in allgemeiner und intuitiver Weise. Auf die Darstellung der speziell<br />
durch partielle und unendliche Datenstrukturen verursachten Probleme verzichten wir ganz, und<br />
wir betrachten auch keine Hilfsfunktionen, sondern nur Abwandlungen unserer Programme mit<br />
Pattern.<br />
8.1 Datenregeln<br />
Es liegt nahe, die semantische Gleichheit unterschiedlicher Konstruktorgrundterme durch Gleichungen<br />
von Konstruktortermen zu spezifizieren. Der Basisdatentyp ist dann die Quotientenalgebra der<br />
Konstruktorgrundtermalgebra modulo der durch diese Gleichungen bestimmten Kongruenz. Da<br />
sich, wie wir schon in 7.1 bezüglich des initialen Modells eines Programms anmerkten, nicht auf<br />
beliebigen Äquivalenzklassen rechnen läßt, verwenden wir anstelle von Gleichungen ein konfluentes,<br />
terminierendes Termersetzungssystem. Damit sind dann die Konstruktornormalformen die<br />
eindeutigen Repräsentanten der Datenelemente. Die Konstruktorsymbole zusammen mit den Regeln<br />
dieses Termersetzungssystems, den Datenregeln, spezifizieren den nicht-freien Basisdatentyp.<br />
Ein einen nicht-freien Basisdatentyp spezifizierendes Programm besteht damit aus Datenregeln und<br />
Programmregeln.<br />
Beispiel 8.2 Datenregeln für ganze Zahlen<br />
Datenregeln:<br />
Programmregeln für die Addition:<br />
Succ(Pred(x)) → x<br />
Pred(Succ(x)) → x<br />
add(x,Zero) → x<br />
add(x,Succ(y)) → Succ(add(x,y))<br />
add(x,Pred(y)) → Pred(add(x,y))<br />
Diese Spezifikationsmethode bringt aber mehrere Probleme mit sich.<br />
Erstens ist es nicht entscheidbar, ob die Datenregeln tatsächlich ein konfluentes und terminierendes<br />
Termersetzungssystem bilden. Wir haben jedoch gefordert, daß die syntaktische Korrektheit<br />
eines Programms entscheidbar sein und jedem syntaktisch korrektem Programm eine Semantik<br />
zugeordnet werden soll.<br />
Das folgende Beispiel verdeutlicht ein zweites, fundamentales Problem.<br />
Beispiel 8.3 Datenregeln und Test auf 0 für ganze Zahlen, I<br />
Die Datenregeln seien die gleichen wie in Beispiel 8.2.<br />
Programmregeln:<br />
isZero(Zero) → Succ(Zero)<br />
isZero(Succ(x)) → Zero<br />
isZero(Pred(x)) → Zero<br />
✷<br />
✷