¨Ubungsblatt 8

Werbung
Theorie der Programmierung
SS 2017
Übungsblatt 8
Rev.17146
Abgabe der Lösungen: Tutorien zwischen 03.07. und 07.07.
Präsenzaufgaben
Übung 1
Folds über Datentypen
1. Einer der grundlegendsten Datentypen sind die booleschen Wahrheitswerte:
data Bool where
True: () → Bool
False : () → Bool
Geben Sie die zu diesem Typ gehörige fold -Funktion an; welchen Typ hat die Funktion?
Welche wohlbekannte Kontrollstruktur wird durch die Funktion realisiert?
2. Betrachten wir nun den Datentyp der natürlichen Zahlen wie in der Vorlesung:
data Nat where
0: () → Nat
Suc: Nat → Nat
Geben Sie erneut die zugehörige fold -Funktion (die wir ab jetzt mit foldn bezeichnen) und
ihren Typ an; implementieren Sie nun die Funktionen add, mult, und exp zur Addition,
Multiplikation und Exponentiation von natürlichen Zahlen mittels foldn .
3. Gegeben seien die Datentypen von einfachen binären Bäumen mit Blättern über einem
beliebigen Typ a, gegeben durch die Signatur
data Tree a where
Leaf: a → Tree a
Node: Tree a → Tree a → Tree a
sowie allgemeiner Listen vom vorigen Übungsblatt und deren zugehörige fold -Funktionen
(von nun an foldt und foldL). Definieren Sie eine Funktion front , die die Blätter eines
Baumes in einer Liste speichert.
Übung 2
Subjektexpansion
Aus der Vorlesung ist bekannt, dass das System λ→ die Eigenschaft der Subjektreduktion hat:
wenn Γ ` t : α und t →∗β s, dann auch Γ ` s : α. Wir wissen ebenfalls, dass die Umkehrung,
auch bekannt als Subjektexpansion, nicht gilt:
Wenn Γ ` t : α und s →∗β t, dann auch Γ ` s : α.
Als Gegenbeispiel wurden in der Vorlesung die Terme s = (λxy. y)(λx. xx) und t = λy.y angeführt. Subjektexpansion schlägt hier fehl, da s nicht typisierbar ist. Zeigen Sie, dass auch die
ThProg, SS 2017
folgende Abschwächung der Subjektexpansion in λ→ nicht gilt:
Wenn Γ ` t : α, Γ ` s : α0 und s →∗β t, dann auch Γ ` s : α.
Hausaufgaben
Übung 3
Folds über Natürlichen Zahlen
(10 Punkte)
Viele Funktionen über den natürlichen Zahlen lassen sich mittels foldn im folgenden Schema
implementieren:
f = g ◦ foldn c h
wobei foldn nicht in g vorkommt und ◦ : (b → c) → (a → b) → a → c die Komposition von
Funktionen bezeichnet (d.h. f ◦ g = λx. f (gx)). Geben Sie die entsprechenden g, c und h für die
folgenden Funktionen an:
1. die Funktion sqr, die eine natürliche Zahl quadriert; Hinweis: Verwenden Sie einen ähnlichen
Trick wie bei der Fakultätsfunktion aus der Vorlesung und finden Sie eine geeignete Darstellung des Quadrats einer Zahl!
2. last p für ein Prädikat p vom Typ Nat → Bool, wobei wir annehmen, dass p 0 = True;
last p n berechnet die größte Zahl m ≤ n, für die p m = True; Hinweis: Sie dürfen die Notation if a then b else c für die Funktion foldb von Bool verwenden.
Übung 4
Folds über Listen
(10 Punkte)
Wir erinnern uns an den Datentyp allgemeiner Listen vom vorigen Übungsblatt. In Übung 1
haben wir die zugehörige Funktion f oldL ohne Definition verwendet.
1. Geben Sie explizit die Definition von f oldL und ihren Typ an.
2. Drücken Sie die folgenden Funktionen aus Übung 7, Blatt 7 mittels f oldL aus:
• length
• reverse (Hinweis: verwenden Sie erneut snoc)
3. Die Funktion nes gibt eine Liste aller nichtleeren Teillisten einer Liste zurück. Beispielsweise ist nes [x, y, z] = [[x], [y], [x, y], [z], [x, z], [y, z], [x, y, z]]. Definieren Sie nes mittels
f oldL.
2
Herunterladen