Aufgabe 2 (15 Punkte) - Goethe

Werbung
PD Dr. David Sabel
Institut für Informatik
Fachbereich Informatik und Mathematik
Johann Wolfgang Goethe-Universität Frankfurt am Main
Einführung in die funktionale Programmierung
Wintersemester 2015/2016
Aufgabenblatt Nr. 3
Abgabe: Montag, 2. November vor der Vorlesung
Bitte schicken Sie die Haskell-Quelltexte auch an [email protected]
Aufgabe 1 (15 Punkte)
Gegeben sei der folgende KFPT-Ausdruck t:
t = (((λx.caseList x of {Nil → Nil; (Cons y ys) → (y y)}) (Cons (λz.z) Nil)) True)
a) Zeichnen Sie den Termgraphen für t gemäß der Darstellung im Skript.
(7 Punkte)
b) Reduzieren Sie t in Normalordnung bis zur WHNF.
(8 Punkte)
Aufgabe 2 (15 Punkte)
Die folgenden KFPT-Ausdrücke seien gegeben:
a) ((λy.caseList y of {Nil → Nil; (Cons x xs) → xs}) True)
b) ((λx.caseBool x of {True → (Cons True True); False → (True Nil)}) True)
c) (λx.((λy.y y) (λz.z z)))
d) (caseList (Cons (λx.(x x)) True) of {Nil → Nil; (Cons y z) → (y y)})
e) (caseBool (λx.False) of {True → False; False → True})
Geben Sie für jeden der obigen Ausdrücke an, welche der folgenden Aussagen auf ihn zutreffen.
1.
Der Ausdruck ist eine FWHNF.
6.
Der Ausdruck hat eine WHNF.
2.
Der Ausdruck ist eine CWHNF.
7.
Der Ausdruck ist direkt dynamisch ungetypt.
3.
Der Ausdruck ist eine WHNF.
8.
Der Ausdruck ist dynamisch ungetypt.
4.
Der Ausdruck hat eine FWHNF.
9.
Der Ausdruck terminiert.
5.
Der Ausdruck hat eine CWHNF.
10.
Der Ausdruck divergiert.
Für die Lösung der Aufgabe reicht eine Tabelle von folgender Form aus, wobei angekreuzt ist,
welche Ausdrücke die entsprechende Eigenschaft erfüllen:
1
2
3
4
5
a)
b)
c)
d)
e)
1
6
7
8
9
10
Aufgabe 3 (20 Punkte)
Der folgende Datentyp Expression stellt KFPT-Ausdrücke dar, die die Typen List und Bool
verwenden:
data Expression =
Variable String
| Lambda String Expression
| Application Expression Expression
| CaseBool Expression Expression Expression
| CaseList Expression Expression (String,String,Expression)
| CONS Expression Expression
| NIL
| TRUE
| FALSE
deriving(Eq,Show)
Die Darstellung für Lambda-Ausdrücke ist analog zur Darstellung von Blatt 2. Konstruktoren des Typs
Bool sind TRUE und FALSE, ein case-Ausdruck caseBool e1 of {True → e2 ; False → e3 } wird als
CaseBool e1 e2 e3 dargestellt. Konstruktoren des Typs List sind NIL für die leere Liste und CONS
für den Listen-Konstruktor, ein case-Ausdruck caseList e1 of {Nil → e2 ; (Cons x y) → e3 } wird als
CaseList e1 e2 ("x","y",e3 ) dargestellt.
Auf der Webseite zur Vorlesung finden Sie den Haskell-Quellcode für den Datentyp, einige Beispiele und eine Funktion substitute, welche die parallele Substitution durchführt
(substitute [(x1,t1),...,(xn,tn)] s berechnet s[t1/x1, . . . , tn/xn]).
Implementieren Sie in Haskell
a) drei Funktionen isFWHNF, isCWHNF und isWHNF, die einen KFPT-Ausdruck erwarten und prüfen,
ob dieser eine FWHNF, eine CWHNF bzw. eine WHNF ist. (Jede der Funktionen hat den Typ
Expression -> Bool).
(3 Punkte)
b) die Funktion betaReduce :: Expression -> Maybe Expression einen KFPT-Ausdruck s erwarβ
tet und diesen – falls möglich – unmittelbar (β)-reduziert und Just t liefert, wobei s −
→ t. Ist dies
nicht möglich, so wird Nothing zurück gegeben.
(5 Punkte)
c) die Funktion caseReduce :: Expression -> Maybe Expression einen KFPT-Ausdruck s erwarcase
tet und diesen – falls möglich – unmittelbar (case)-reduziert und Just t liefert, wobei s −−−→ t. Ist
dies nicht möglich, so wird Nothing zurück gegeben.
(5 Punkte)
d) die Funktion oneStepNormalOrder :: Expression -> Maybe Expression die für einen KFPTAusdruck s versucht einen Normalordnungsreduktionsschritt durchzuführen. Ist dieser nicht reduzibel in Normalordnung, so wird Nothing als Ergebnis geliefert, anderenfalls wird Just t geliefert,
no
wobei s −→ t.
(7 Punkte)
2
Herunterladen