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.

8.3. KONSTRUKTORFUNKTIONEN 173<br />

8.3 Konstruktorfunktionen<br />

Für die Erklärung des Law-Mechanismus und die Verifikation von algebraischen Datentypen mit<br />

Laws wird in [Tho86] und [Tho90] zwischen den Konstruktorsymbolen, die auf linken, und denen,<br />

die auf rechten Gleichungsseiten stehen, unterschieden. In [Bur&Cam93] werden anstelle dieser Unterscheidung<br />

in der Metasprache sogar zwei verschiedene Sätze von Operationssymbolen verwendet.<br />

Dies gibt die Anregung zu einer einfachen Methode, die die adäquate Darstellung nicht-freier Datentypen<br />

auch mit unseren Programmen zusammen mit den ς-Semantiken ermöglicht (vgl. auch<br />

32.4 in [MirMan89]).<br />

Beispiel 8.6 Konstruktorfunktionen, Test auf 0 und Addition für ganze Zahlen<br />

zero → Zero<br />

succ(Zero) → Succ(Zero)<br />

succ(Succ(x)) → Succ(Succ(x))<br />

succ(Pred(x)) → x<br />

pred(Zero) → Pred(Zero)<br />

pred(Succ(x)) → x<br />

pred(Pred(x)) → Pred(Pred(x))<br />

isZero(Zero) → succ(zero)<br />

isZero(Succ(x)) → zero<br />

isZero(Pred(x)) → zero<br />

add(x,Zero) → zero<br />

add(x,Succ(y)) → succ(add(x,y))<br />

add(x,Pred(y)) → pred(add(x,y))<br />

Zu jedem Konstruktorsymbol existiert ein Funktionssymbol, das wir Konstruktorfunktionssymbol<br />

nennen. Die Konstruktorsymbole werden nur in den Pattern und in den rechten Seiten der<br />

Regeln der Konstruktorfunktionssymbole verwendet. Diese speziellen Regeln bestimmen den nichtfreien<br />

Datentyp. Sie sind übrigens leicht aus den Datenregeln bzw. den Laws von Miranda automatisch<br />

generierbar (vgl. 32.4 in [MirMan89]). Auf den rechten Seiten der Regeln der ” normalen“<br />

Funktionssymbole müssen anstelle der Konstruktorsymbole die Konstruktorfunktionssymbole verwendet<br />

werden. Auf diese Weise wird erreicht, daß die Funktionsoperationen immer Elemente des<br />

nicht-freien Datentyps als Ergebnis lieferen, wenn auch die übergebenen Argumente Elemente des<br />

nicht-freien Datentyps sind.<br />

Natürlich stellt die Verwendung von Konstruktorfunktionen nur einen Programmierstil dar. Die<br />

ς-Datentypen sind und bleiben frei. Aber die Definition einer neuen, komplexen Semantik wird auf<br />

diese Weise überflüssig, und wir erhalten trotzdem die praktischen Vorteile nicht-freier Datentypen.<br />

Der nicht-freie Datentyp wäre sogar noch als die durch die Konstruktorfunktionsoperationen<br />

erzeugte Unteralgebra der ς-Datentypen definierbar.<br />

Mit dieser Betonung der Praxis unter Vernachlässigung der semantischen Spezifizierung der nichtfreien<br />

Datentypen steht das Konzept der Konstruktorfunktionen in einem gewissen Gegensatz zu<br />

dem der Datenregeln.<br />

8.4 Weitere Beobachtungen<br />

Die Laws von Miranda und die Konstruktorfunktionen sind beide ausdrucksstärker als die Datenregeln<br />

oder auch beliebige Konstruktorgleichungen. Geordnete Listen sind beispielsweise nicht durch<br />

terminierende Datenregeln spezifizierbar. Hierfür werden schon bedingte Termersetzungssysteme<br />

([Der&Jou90], [Ber&Klop86]) benötigt, wie sie die Laws im Prinzip darstellen.<br />

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!