Serie 6 - AG Programmiersprachen und Übersetzerkonstruktion

Werbung
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.
Herunterladen