Download (1405Kb)
Download (1405Kb)
Download (1405Kb)
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
174 KAPITEL 8. NICHT-FREIE DATENTYPEN<br />
Beispiel 8.7 Laws und geordnete Listen (S. 187 in [Tho90])<br />
orderedList ::= ONil | OCons(num,orderedList)<br />
OCons(x,OCons(y,z)) => OCons(y,OCons(x,z)), if y < x<br />
Da wir unsere Programme mit Pattern ohne Sorten definiert haben, können wir das entsprechende<br />
Programm, welches Konstruktorfunktionen verwendet, nur skizzieren.<br />
Beispiel 8.8 Konstruktorfunktionen und geordnete Listen<br />
oNil → ONil<br />
oCons(x,ONil) → OCons(x,ONil)<br />
oCons(x,OCons(y,z)) → if y < x<br />
then OCons(y,oCons(x,z))<br />
else OCons(x,OCons(y,z))<br />
fi<br />
Für die Spezifikation der rationalen Zahlen wird eine Funktion zur Berechnung des größten gemeinsamen<br />
Teilers benötigt. Da Datenregeln und Konstruktorgleichungen jedoch Paare von Konstruktortermen<br />
sind, ist die Spezifikation rationaler Zahlen durch sie unmöglich.<br />
Beispiel 8.9 Laws und rationale Zahlen (S.188 in [Tho90])<br />
rational ::= Rat(num,num)<br />
Rat(x,y) => error("zero denominator"), if y = 0<br />
=> Rat(-x,-y), if y < 0<br />
=> Rat(x’,y’), if g > 1<br />
where<br />
x’ = x div g<br />
y’ = y div g<br />
g = gcd x y<br />
Während bei freien Datentypen die Wahl geeigneter Konstruktorsymbole meistens einfach ist,<br />
bieten sich bei nicht-freien Datentypen oft unterschiedliche Möglichkeiten an. So können die<br />
ganzen Zahlen nicht nur durch C = {Zero (0) ,Succ (1) ,Pred (1) }, sondern auch durch C =<br />
{Zero (0) ,Succ (1) ,Minus (1) } aufgebaut werden.<br />
Beispiel 8.10 Datenregeln für ganze Zahlen, II<br />
Succ(Minus(Succ(x))) → Minus(x)<br />
Minus(Zero) → Zero<br />
Minus(Minus(x)) → x<br />
✷<br />
✷<br />
✷<br />
✷