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