Einführung in die funktionale Programmierung Aufgabenblatt Nr. 3

Werbung
Prof. Dr. Manfred Schmidt-Schauß
Institut für Informatik
Fachbereich Informatik und Mathematik/ Institut für Informatik
Johann Wolfgang Goethe-Universität Frankfurt am Main
Einführung in die funktionale Programmierung
Wintersemester 2013/2014
Aufgabenblatt Nr. 3
Abgabe: Montag, 4. November 2013 vor der Vorlesung
Bitte schicken Sie die Haskell-Quelltexte auch per Email an
[email protected]
Aufgabe 1 (15 Punkte)
Die folgenden KFPT-Ausdrücke seien gegeben:
a) (λy.((λx.x) True))
b) ((λy.caseList y of {Nil → Nil; (Cons a b) → b}) True)
c) ((λz.caseBool z of {True → (Cons True True); False → (True Nil)}) True)
d) (caseList (Cons True (λz.(z z))) of {Nil → Nil; (Cons a b) → (b b)})
e) (caseBool (λx.True) 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:
1
2
3
4
5
6
7
8
9
10
a)
b)
c)
d)
e)
Dabei sollte angekreuzt sein, welche Ausdrücke die entsprechende Eigenschaft erfüllen.
1
Aufgabe 2 (35 Punkte)
Der folgenden Datentyp stellt KFPT-Ausdrücke dar, die die Typen List und Bool verwenden:
data KFPTAusdruck =
Variable String
| Applikation KFPTAusdruck KFPTAusdruck
| Lambda String KFPTAusdruck
| ListCons KFPTAusdruck KFPTAusdruck
| ListNil
| BoolTrue
| BoolFalse
| CaseList KFPTAusdruck AltNil AltCons
---------| CaseBool KFPTAusdruck AltTrue AltFalse ---
data
data
data
data
AltNil
AltCons
AltTrue
AltFalse
=
=
=
=
x
= Variable "x"
(e1 e2) = Applikation e1 e2
\x.e
= Lambda "x" e
a:as
= ListCons a as
[]
= ListNil
True
= BoolTrue
False
= BoolFalse
case_List e of {[] -> e1; (x:xs) -> e2)
= CaseList e (AltNil e1) (AltCons "x" "xs" e2)
case_Bool e of {True -> e1; False -> e2)
= CaseBool e (AltTrue e1) (AltFalse e2)
AltNil KFPTAusdruck
AltCons String String KFPTAusdruck
AltTrue KFPTAusdruck
AltFalse KFPTAusdruck
Auf der Webseite zur Vorlesung finden Sie den Haskell-Quellcode für den Datentyp, einige Beispiele und eine Funktion substitute, welche die Substitution durchführt (substitute e1 e2 x
berechnet gerade e1[e2/x]).
Implementieren Sie in Haskell
a) drei Funktionen istFWHNF, istCWHNF und istWHNF, die einen KFPT-Ausdruck erwarten
und prüfen, ob dieser eine FWHNF, eine CWHNF bzw. eine WHNF ist. (Jede der
Funktionen hat den Typ KFPTAusdruck -> Bool).
(5 Punkte)
b) die Funktion betaReduktion :: KFPTAusdruck -> KFPTAusdruck, die einen KFPTAusdruck erwartet und diesen – falls möglich – unmittelbar β-reduziert. Ist dies nicht
möglich, so soll die Eingabe unverändert zurück gegeben werden.
(5 Punkte)
c) die Funktion caseReduktion :: KFPTAusdruck -> KFPTAusdruck, die einen KFPTAusdruck erwartet und diesen – falls möglich – unmittelbar case-reduziert. Ist dies nicht
möglich, so soll die Eingabe unverändert zurück gegeben werden.
(5 Punkte)
d) die Funktion istDirektDynamischUngetypt :: KFPTAusdruck -> Bool, die einen
KFPT-Ausdruck erhält und prüft, ob dieser direkt dynamisch ungetypt ist.
(7 Punkte)
e) die Funktion einSchrittNormalordnung :: KFPTAusdruck -> KFPTAusdruck, die einen
KFPT-Ausdruck erhält und einen Normalordnungsreduktionsschritt für den Ausdruck
ausführt. Ist kein solcher Schritt möglich, so soll die Eingabe unverändert zurück gegeben
werden.
(8 Punkte)
f) die Funktion berechneErgebnis :: KFPTAusdruck -> Ergebnis, die einen KFPTAusdruck erhält und diesen solange in Normalordnung auswertet, bis feststeht, ob der
Ausdruck eine WHNF hat oder dynamisch ungetypt ist und das entsprechende Ergebnis
zurück liefert. Dabei sei Ergebnis der folgende Datentyp:
data Ergebnis = HatWHNF | DynamischUngetypt
Die Funktion berechneErgebnis darf für getypte divergierende Ausdrücke nichtterminieren.
(5 Punkte)
2
Herunterladen