Lehrstuhl für Programmiersprachen und Übersetzerkonstruktion Institut für Informatik, CAU Kiel Dr. Frank Huch, Sebastian Fischer Christan-Albrechts-Platz 4 Tel.: 0431 / 880-7277 0431 / 880-7267 {fhu,sebf}@informatik.uni-kiel.de 6. Übung Funktionale Programmierung“ ” Besprechung am 30. November 2006 Aufgabe 19 Formalisieren Sie die Übersetzung der do-Notation für Monaden. Gehen Sie von einer Folge do a1;...;an aus und geben Sie Ihre Definition induktiv über die Aktionen a1 bis an an. Unterscheiden Sie alle Möglichkeiten für die auftretenden ai. Übersetzen Sie folgende Listcomprehension zunächst in die do-Notation und anschließend in einen Ausdruck, der explizite Binds ((>>=)) enthält. [ (x,y,z) | x <- [1..],let y = [1..x], z <- map (+1) y, 2*x>=z ] Aufgabe 20 a) Implementieren Sie Addition, Multiplikation und Exponentiation für Church Numerals. b) Beweisen Sie den in der Vorlesung vorgestellten Fixpunktsatz für den reinen λ-Kalkül. c) Verwenden Sie den Fixpunktkombinator Y zur Definition der Fakultätsfunktion auf Church Numerals. Dabei dürfen Sie zusätzlich zu den in der Vorlesung eingeführten Funktionen die Vorgängerfunktion pre benutzen, die wie folgt definiert werden kann: pre = \n.\f.\x.n (\g.\h.h (g f)) (\u.x) (\u.u) Aufgabe 21 Implementieren Sie einen Interpreter für den (reinen) λ-Kalkül. Entwerfen Sie zunächst einen Datentyp Exp für λ-Ausdrücke – also Variablen, Abstraktionen und Applikationen. Schreiben Sie dann eine Funktion reduce :: Exp -> Maybe Exp, die einen leftmost-outermost Schritt ausführt und Nothing zurückliefert, wenn dies nicht möglich ist, also eine Normalform vorliegt. Verwenden Sie reduce, um eine Funktion eval :: Exp -> Exp zu implementieren, die so viele leftmost-outermost Schritte ausführt wie möglich. Testen Sie Ihren Interpreter mit den Beispielen aus der Vorlesung und den Funktionen aus Aufgabe 20.