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