Konzepte der Programmierung Programmierkurs 2 Sommer 2016 Universität Konstanz Informatik & Informationswissenschaft Marc Scholl, Stefan Klinger 5. Übungsblatt (Ausgabe: 9. Mai 2016 — Abgabe bis: 17. Mai 2016, 15:00 Uhr) Hinweis: Abgabe diesmal bis Dienstag, 15:00 Uhr. Aufgabe 1 (6 Punkte) Der naive Ansatz eine rekursive Funktion im λ-Kalkül zu realisieren scheitert. Betrachten wir die Fakultätsfunktion: ( 1 für n = 0 n! := n · (n − 1)! für n ≥ 1 Eine erste Umsetzung in den λ-Kalkül würde wahrscheinlich zu λn.if (= n 0) 1 (× n (f (− n 1))) führen. Das Problem ist, daß an der Stelle, wo f steht, der gesamte Funktionstext wieder eingesetzt werden müßte, der wiederum ein f enthielte und so weiter, was schließlich einen unendlich langen Ausdruck ergeben würde, der im λ-Kalkül nicht zulässig ist. Man kann aber dennoch eine endliche Repräsentation der rekursiv definierten Fakultätsfunktion bekommen. Dazu bedient man sich des sogenannten Y-Combinators (Kombinatoren sind Ausdrücke im λ-Kalkül ohne freie Variablen): Y = λx. (λy. x (y y)) (λy. x (y y)) und einer modifizierten Definition der Fakultät: f = λg. λn. if (= n 0) 1 (× n (g (− n 1))) Nun entspricht Y f der Fakultätsfunktion. Vollziehen Sie dies nach, indem Sie die wohlbekannte Reduktion mit dem Argument 2 durchführen. Vereinfachen Sie also den Ausdruck Yf 2 des λ-Kalküls! Sie können dabei wiederkehrende Teilausdrücke abkürzen. Aufgabe 2 (2 Punkte) Schreiben Sie eine Funktion middle :: [a] -> a die das mittlere Element der übergebenen Liste zurückgibt (bei einer ungeraden Anzahl von Elementen). Hat die Liste 2p Elemente für ein p ∈ N, so soll das p-te Element zurückgegeben werden. Aufgabe 3 (2 Punkte) sind: Schreiben Sie eine Funktion, die überprüft ob alle Listenelemente gleich allEqual :: [Integer] -> Bool 1 Aufgabe 4 (4 Punkte) Schreiben Sie eine Funktion gaps :: Double -> [Double] -> [(Double, Double)] so dass gaps delta xs die Paare aller aufeinander folgenden Zahlen in xs ausgibt, die weiter als delta voneinander entfernt sind. Nehmen Sie dabei an dass delta immer größer oder gleich Null ist. Beispiel: *Main> gaps 2.2 [1.2, 3.4, 12.5, 6.14, 8, 11] [(3.4,12.5),(12.5,6.14),(8.0,11.0)] Aufgabe 5 (5 Punkte) Schreiben Sie eine Funktion insSort :: (a -> a -> Bool) -> [a] -> [a] die eine Ordnung r :: a -> a -> Bool und eine Liste ` als Argument bekommt. Die Ausgabe soll die bezüglich der Ordnung r mit Insertion Sort sortierte Liste ` sein. Dabei funktioniert Insertion Sort wie folgt: Die zu sortierenden Elemente werden der Reihe nach in eine (dann bereits sortierte) Ergebnisliste eingefügt. Schreiben Sie also zunächst eine Hilfsfunktion insert :: (a -> a -> Bool) -> a -> [a] -> [a] die dieses erledigt. Beispiel: Main> insert (<) 3 [1,2,5,7,9] [1,2,3,5,7,9] Main> insSort (>) [7,9,1,2,5] [9,7,5,2,1] Aufgabe 6 (6 Punkte) Die folgenden neun Ausdrücke zeigen alle Möglichkeiten, drei Variablen f, g, und h • mit Anwendung durch Juxtaposition, • durch den Anwendungsoperator $, oder • mit der Komposition . zu kombinieren. Teilen Sie diese in Gruppen äquivalenter Ausdrücke ein. f g h f g . h f g $ h -- 1 -- 2 -- 3 f . g h f . g . h f . g $ h -- 4 -- 5 -- 6 f $ g h f $ g . h f $ g $ h -- 7 -- 8 -- 9 Tip: Entfernen Sie zunächst alle Vorkommen von . und $, indem Sie Klammern und ggf. λAbstraktionen mit neuen Variablen einführen.