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