Einführung in die funktionale Programmierung Aufgabenblatt Nr. 1

Werbung
Prof. Dr. Manfred Schmidt-Schauß
Künstliche Intelligenz/Softwaretechnologie
Fachbereich Informatik und Mathematik/ Institut für Informatik
Johann Wolfgang Goethe-Universität Frankfurt am Main
Einführung in die funktionale Programmierung
Wintersemester 2008/2009
Aufgabenblatt Nr. 1
Abgabe: Dienstag 21. Oktober 2008 vor! der Vorlesung
Aufgabe 1 (20 Punkte)
Betrachten Sie folgende Konstrukte:
1.
2.
3.
4.
5.
6.
7.
8.
((\x -> (Cons True)) y)
(if True then (Paar True True) else (Paar False False))
(caseList ((\z -> z) Nil) of {Nil -> (Paar a b); (Cons a b) -> ((\x -> (Paar x x)) b)})
(Cons ((\x -> (x x)) (\y -> (y y))) (((\u -> (\z -> u)) Nil) True))
(casePaar x of {(Paar y y) -> True})
(caseList Nil of {(Cons x y) -> Nil; Nil -> Nil; (Cons a b) -> Nil})
((\z -> (z x)) (casePaar a of {(Paar a b) -> ((\x -> (x y)) a)}))
((\x -> x) (caseList (Cons True Nil) of {(Cons a Nil) -> a; Nil -> False}))
Wir nehmen an, dass die Menge der Konstruktoren von KFPT u.a. die folgenden Konstruktoren
mit den zugehörigen Typen und den folgenden Stelligkeiten besitzt. Des weiteren nehmen wir
an, dass die Typen List, P aar und Bool keine weiteren Konstruktoren als die in der Tabelle
aufgelisteten enthalten.
Konstruktor
Cons
Nil
Paar
True
False
Typ
List
List
P aar
Bool
Bool
Stelligkeit
2
0
2
0
0
a) Welche der Konstrukte sind KFPT-Ausdrücke? Begründen Sie, warum die übrigen Konstrukte keine KFPT-Ausdrücke sind.
(8 Punkte)
b) Welche der KFPT-Ausdrücke sind geschlossen? Begründen Sie Ihre Antwort kurz.
(2 Punkte)
c) Angenommen wir erweitern die Sprache KFPT um Fallunterscheidungen der Form
if e1 then e2 else e3 als auch um let-Ausdrücke der Form let x = e1 in e2 zur Sprache
KFPTil .
– Geben Sie die kontextfreie Grammatik zur Erzeugung der Syntax von KFPTil im
Stil von Definition 2.1.1 des Skriptes an.
– Überlegen Sie sich eine sinnvolle Erweiterung der Bindungsbereiche für KFPTil .
Wann ist ein KFPTil -Ausdruck geschlossen?
(10 Punkte)
1
Aufgabe 2 (15 Punkte)
Gegeben sei der folgende KFPT-Ausdruck t:




caseBool (((\x -> ((\z -> z) (\y -> y))) False) True)
 (\b -> b) False
t =  of {False -> (\a -> a);
True -> ((\u -> (\v -> v)) True)}
a) Zeichnen Sie den zum Ausdruck t zugehörigen Termgraphen, wobei:
– Abstraktionen werden durch einen mit λ“ markierten Knoten dargestellt, der zwei
”
Kinder besitzt: Das linke Kind ist die durch die Abstraktion gebundene Variable, das
zweite Kind entspricht dem Rumpf der Abstraktion.
– Applikationen werden durch einen mit @“ markierten Knoten dargestellt, der zwei
”
Kinder für den Ausdruck an Funktionsposition und dem Argument besitzt.
– Konstruktoranwendungen haben als Knotenbeschriftung den Konstruktornamen, und
n Kinder, wenn der Konstruktor Stelligkeit n besitzt.
– case-Ausdrücke haben n+1 Kinder, wenn n die Anzahl der Alternativen ist: Das erste
Kind ist das erste Argument des case-Ausdrucks, die anderen Kinder entsprechen den
Alternativen.
– eine case-Alternative Pattern“ -> Ausdruck“ wird durch einen mit -> markierten
”
”
Knoten dargestellt, der zwei Kinder besitzt: einen für das Pattern und einen für die
rechte Seite der Alternativen.
(10 Punkte)
b) Geben Sie alle Reduktionskontexte R mit ∃s : R[s] = t an.
(5 Punkte)
Aufgabe 3 (15 Punkte)
Üben Sie die Benutzung des Interpreters GHCi, nachdem Sie diesen installiert bzw. auf den
Rechnern der RBI gestartet haben.
a) Implementieren Sie in Haskell eine Funktion fac zur Berechnung der Fakultät einer nichtnegativen Ganzzahl. Speichern Sie Ihre Definition in einer Datei (Endung .hs) und laden
Sie sie in den Interpreter (mittels :load Dateiname). Testen Sie Ihre Implementierung mit
einigen Werten.
(5 Punkte)
b) Implementieren Sie eine Funktion comb in Haskell, die eine binäre Operation bop,
zwei einstellige Operationen uop1, uop2 sowie zwei Ausdrücke a1 , a2 erwartet und
zunächst uop1 auf a1 und uop2 auf a2 anwendet und schließlich diese Ergebnisse mittels der binären Operation bop zum Gesamtergebnis verbindet. Z.B. ergibt
comb (+) (\x -> x*3) (\x -> x ‘div‘ 2) 10 20 den Wert 40.
(6 Punkte)
c) Welche Funktionalität versteckt sich hinter der Funktion fun, die definiert sei als:
fun n k = comb (/) fac id n (comb (*) fac fac k (comb (-) id id n k))
Betrachten Sie nur den Fall, dass fun auf zwei natürliche Zahlen n, k mit n ≥ k anwendet
wird.
(4 Punkte)
2
Herunterladen