08.10.2013 Aufrufe

Download (1405Kb)

Download (1405Kb)

Download (1405Kb)

MEHR ANZEIGEN
WENIGER ANZEIGEN

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 />

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!