Funktionales Programmieren
Teil 10
Carl Philipp Reh
Universit¨at Siegen
23. Juli 2020
Domains f¨ ur rekursive Data-Deklarationen
Wir m¨ ussen nun noch rekursiven Data-Deklarationen und
Data-Deklarationen mit Typparametern Domains zuordnen. Diese Konstruktionen sind mathematisch sehr aufw¨ andig und k¨ onnen hier leider nur angedeutet werden.
Betrachten wir wieder
d a t a Nat = Z e r o | S u c c Nat Dies f¨ uhrt zu der Gleichung
D(Nat) = {Zero}
⊥⊕ ({Succ} × D(Nat))
⊥. Ahnlich wie bei rekursiv definierten Funktionen l¨ ¨ osen wir diese Gleichung, indem wir nach einem Fixpunkt suchen. Wir fangen mit {⊥} f¨ ur D(Nat) an und wenden dann wiederholt die folgende Operation an:
λD.{Zero} ⊕ ({Succ} × D)
Domains f¨ ur rekursive Data-Deklarationen
Wie bei D(Bool) lassen wir wieder die Tags weg. Im ersten Schritt erhalten wir also
{Zero}
⊥⊕ ({Succ} × {⊥})
⊥= {⊥, Zero, (Succ, ⊥)}
Setzen wir dies wieder ein, erhalten wir
{Zero}
⊥⊕ ({Succ} × {⊥, Zero, (Succ, ⊥)})
⊥= {⊥, Zero, (Succ, ⊥), (Succ, Zero), (Succ, (Succ, ⊥))}
Grafisch ergibt sich folgende Ordnung:
⊥
Zero (Succ, ⊥)
(Succ, Zero) (Succ, (Succ, ⊥))
Domains f¨ ur rekursive Data-Deklarationen
Wir schreiben nun Succ
n(x) statt (Succ, · · · (Succ,
| {z }
nmal (Succ,
x ) · · · )
| {z }
nmal )