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