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.

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!