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.
172 KAPITEL 8. NICHT-FREIE DATENTYPEN<br />
Der Vorteil der Datenregeln sollte vielmehr darin bestehen, daß Funktionen nur noch mit Argumenten<br />
in Normalform ” rechnen“ müßten, und spezielle Eigenschaften dieser Normalform ” ausnützen“<br />
könnten. So sollte der Test auf 0 wie in Beispiel 8.3 spezifizierbar sein, und in einer Spezifikation<br />
der rationalen Zahlen sollten Funktionen davon ” ausgehen“ können, daß Zähler und Nenner der<br />
als Argumente übergebenen rationalen Zahlen keine gemeinsamen Faktoren mehr besitzen. Dagegen<br />
müßten die Funktionen selber nicht den Erhalt der Normalformeigenschaft sicherstellen; dafür<br />
wären die Datenregeln zuständig (siehe die Einleitung von [Tho90] bezüglich dieser Aufgabenteilung).<br />
Auf diese Weise würden nicht-freie Datentypen wirklich zu eleganteren und unter Umständen<br />
auch effizienteren Programmen führen.<br />
8.2 Laws in Miranda<br />
Genau dies ermöglichen die in früheren Versionen von Miranda vorhandenen Laws ([MirMan89],<br />
[Tho86], [Tho90]).<br />
Beispiel 8.5 Laws und Test auf 0 für ganze Zahlen in Miranda<br />
integer ::= Zero | Succ(integer) | Pred(integer)<br />
Succ(Pred(x)) => x<br />
Pred(Succ(x)) => x<br />
isZero(Zero) = Succ(Zero)<br />
isZero(Succ(x)) = Zero<br />
isZero(Pred(x)) = Zero<br />
Abgesehen von syntaktischen Unterschieden 2 entspricht dieses Miranda-Programm genau dem Programm<br />
mit Datenregeln in Beispiel 8.3. Dennoch ist das Programm sehr wohl konsistent. Eine<br />
spezielle Reduktionsstrategie, eine Mischung aus leftmost-outermost und leftmost-innermost, die<br />
in [Tho86] lazy innermost genannt wird, garantiert, daß die Argumente einer Funktion vor dem<br />
Funktionsaufruf soweit ausgewertet sind, wie zum beabsichtigen Patternmatching erforderlich ist.<br />
Daher ist diese Reduktionsstrategie jedoch äußerst komplex und die zugehörige denotationelle Semantik<br />
ebenso. Insbesondere sind die die Funktion definierenden Gleichungen (nicht nur aufgrund<br />
des in 7.2 betrachteten, speziellen Patternmatchings) keinesfalls im Datentyp allgemein gültig, und<br />
Schlußfolgerungen wie die schon bei Beispiel 8.3 gemachte<br />
Succ(Zero) ∼ isZero(Zero) ∼ isZero(Succ(Pred(Zero))) ∼ Zero,<br />
sind somit falsch (dies ist für die Konsistenz selbstverständlich notwendig), obwohl sie leider auch<br />
sehr naheliegend sind. Diese kontraintuitive Semantik erschwert daher das Verständnis und auch<br />
die Verifikation von algebraischen Datentypen mit Laws (siehe [Tho86], [Tho90]). Deshalb wurde<br />
der Law-Mechanismus wieder aus Miranda entfernt.<br />
2 Bezüglich der Schreibweise der Miranda-Programme beachte man die Fußnote auf Seite 39.<br />
✷