¨Ubungsblatt 7

Werbung
Theorie der Programmierung
SS 2016
Übungsblatt 7
Rev.12442
Abgabe der Lösungen: Tutorien zwischen 08.06. und 13.06.
Aufgaben mit Punktangaben sind Hausaufgaben, mit ? gekennzeichnete Aufgaben eignen sich gut zum Vorrechnen an der Tafel
Ü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
folgende Abschwächung der Subjektexpansion in λ→ nicht gilt:
Wenn Γ ` t : α, Γ ` s : α0 und s →∗β t, dann auch Γ ` s : α.
ThProg, SS 2016
Übung 3
Folds über Datentypen II
?
(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
Quiz
(10 Punkte)
Entscheiden Sie, ob die folgenden Aussagen zutreffend sind, und begründen Sie Ihre Antworten!
Führen Sie wenn nötig einen formalen Beweis!
1. Es existiert ein Fixpunkt-Kombinator fix (d.h. ein λ-Term fix , so dass für alle Terme f
gilt: fix f = f ( fix f )) für den der Typ ((a → a) → a → a) → a → a hergeleitet werden
kann.
2. Es existiert ein Typ int , sodass für alle Church-Numerale dne gilt: ` dne : int (vgl. Blatt 5,
Übung 8.1)
3. Der Term dne K, wobei K = λxy.x, ist typisierbar in λ→.
2
Herunterladen