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