5.¨Ubungsblatt - Universität Konstanz

Werbung
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.
Herunterladen