Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Biologie und Informatik / Institut für Informatik Johann Wolfgang Goethe-Universität Frankfurt am Main Funktionale Programmierung Sommersemester 2003 Aufgabenblatt Nr. 1 Abgabe: Dienstag, 06. Mai 2003 vor der Vorlesung Aufgabe 1 (15 Punkte) Betrachten Sie folgende Konstrukte: 1. ((\x -> (Cons True)) y) 2. (if True then (Paar True True) else (Paar False False)) 3. (caseList ((\z -> z) Nil) of {Nil -> (Paar a b); (Cons a b) -> ((\x -> (Paar x x)) b)}) 4. (Cons ((\x -> (x x)) (\y -> (y y))) (((\u -> (\z -> u)) Nil) True)) 5. (casePaar x of {(Paar y y) -> True; (Paar y z) -> False}) 6. ((\x -> (Cons True x True)) True) 7. ((\z -> (z x)) (casePaar a of {(Paar a b) -> ((\x -> (x y)) a)})) 8. ((\x -> x) (caseList (Cons True Nil) of {(Cons a Nil) -> a; Nil -> False})) a) Welche der Konstrukte sind KFPT-Ausdrücke? Begründen Sie, warum die übrigen Konstrukte keine KFPT-Ausdrücke sind. (9 Punkte) b) Berechnen Sie für die KFPT-Ausdrücke, jeweils die gebundenen und freien Variablen. Welche der KFPT-Ausdrücke sind geschlossen? (6 Punkte) Aufgabe 2 (20 Punkte) Betrachten Sie folgenden 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) Geben Sie alle Reduktionskontexte R mit ∃s : R[s] = t an. (5 Punkte) b) Werten Sie t in Normalordnung aus und geben Sie für jede Ein-Schritt-Reduktion die verwendete Reduktionsregel an. (5 Punkte) 1 c) Werten Sie nun t in einer anderen Reihenfolge als in Normalordnung aus. Geben Sie wiederum für jede Reduktion die verwendete Regel an. (5 Punkte) d) Lassen Sie den Ausdruck vom Haskell-Interpreter HUGS auswerten und schalten Sie dabei die Statistikanalyse ein – dies ist möglich mit der Option :s +s. Wie viele Reduktionen werden für die Auswertung benötigt? Beachten Sie, dass Sie den Ausdruck direkt im Interpreter eingeben können, wenn Sie das Konstrukt case_Bool durch case ersetzen. (5 Punkte) Aufgabe 3 (15 Punkte) a) Definieren Sie in KFPTS einen Superkombinator first_and_last, der als Argument ein Tripel erwartet und ein Paar bestehend aus der ersten und dritten Komponente des Tripels liefert. Sie können dabei annehmen, dass die Konstruktoren Tripel mit Stelligkeit 3 und Paar mit Stelligkeit 2 vorhanden sind. (5 Punkte) b) Werten Sie den Ausdruck first and last (Tripel ((\x -> x) 0 a0 ) ((\y -> 0 a0 ) True) 0 b0 ) aus, wobei Sie für jeden Reduktionsschritt die verwendete Regel angeben. Haben Sie dabei Normalordnung verwendet? (5 Punkte) c) Definieren Sie nun den Superkombinator first_and_last in Haskell. Dafür müssen Sie eine Datei mit der Endung .hs anlegen in der Sie zusätzlich zur Definition des Superkombinators die Datentypen für das Paar und das Tripel wie folgt definieren können: data Paar = Paar Char Char deriving(Show) data Tripel = Tripel Char Char Char deriving(Show) Testen Sie Ihre Implementierung wahlweise mit dem HUGS oder GHCi und führen Sie einige Aufrufe der Funktion first_and_last durch, insbesondere mit dem selben Argument wie in Aufgabenteil b). (5 Punkte) 2