Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Informatik und Mathematik/ Institut für Informatik Goethe-Universität Frankfurt am Main Grundlagen der Programmierung 2 Sommersemester 2017 Aufgabenblatt Nr. 4 Abgabe: Mittwoch 17. Mai 2017 vor! der Vorlesung Aufgabe 1 (20 Punkte) Berechnen Sie (Rechenweg erforderlich!) jeweils die Menge der freien Variablen FV (si ) und der gebundenen Variablen GV (si ) für die folgenden Ausdrücke s1 und s2 : (jeweils 10 Punkte) a) s1 := \x -> if y then \z -> (x \y -> y) else (\z -> w) x b) s2 := let f x1 x2 = y1 (\x -> x2 ) in let y1 = f w (f y2 y2 ), y2 = y1 in f Aufgabe 2 (50 Punkte) Geben Sie jeweils List Comprehensions in Haskell an, welche die folgenden Listen erzeugen. a) Die unendliche Liste aller Zahlen n ∈ N>0 , die ungerade sind, durch 7 ohne Rest teilbar sind und geteilt durch 9 den Rest 3 ergeben, d.h. [21,147,273,399,525,651,777,903,1029,1155,... Die Funktion take kann beim Testen nützlich sein. (5 Punkte) b) Die unendliche Liste aller Zahlen der Form a2 + b2 + c2 mit a ∈ {1, 3, 5, . . . }, b ∈ {2, 4, 6, . . . }, c ∈ {1, 2, . . . } und c > b > a, d.h. [14,21,30,41,54,69,86,105,126,149,... (6 Punkte) c) Aus einer gegebenen Liste xs von Listen von Zahlen sollen aus den inneren Listen alle Zahlen entfernt werden, die echt kleiner als 6 sind und anschließend alle Listen entfernt werden, die weniger als 2 Elemente enthalten. Tipp: Geben Sie eine Funktion mit Parameter xs an, deren Rumpf eine List Comprehension ist. (7 Punkte) d) Die endliche Liste aller Tupel (a, b, c, d) für alle a ∈ {0, 50, 100, 150, 200}, b ∈ {’a’,’b’,’c’}, c ∈ {True, False} und d ∈ {’A’,’B’}, und zwar in der Reihenfolge, sodass zunächst die Großbuchstaben wechseln, danach die Kleinbuchstaben, dann die Wahrheitswerte und zuletzt die Zahlen, d.h. die Ausgabe beginnt mit: [(0,’a’,True,’A’),(0,’a’,True,’B’),(0,’b’,True,’A’),(0,’b’,True,’B’), (0,’c’,True,’A’),(0,’c’,True,’B’),(0,’a’,False,’A’),(0,’a’,False,’B’)... (8 Punkte) e) Die Liste xs aller Tupel (x, y, z) mit x, y, z ∈ N, so dass die Tupel in einer fairen Reihenfolge erzeugt werden. Fair bedeutet hierbei, dass (a,b,c) ‘elem‘ xs für jedes Tupel von Zahlen (a,b,c) nach endlicher Zeit terminiert. (10 Punkte) 1 f) Lara Croft ist in Patagonien am Cerro lambda auf der Suche nach der ältesten funktionalen Perle. Sie hat auf dem Weg zur Schatzkammer schon zahlreiche Fallen entschärft und komplizierte Rätsel gelöst, steht jetzt allerdings vor 3 Druckplatten, die den Raum zur Schatzkammer öffnen sollen. Die Druckplatten sind von 1 bis 3 durchnummeriert und in den Felswänden der Kammer sind zahlreiche Bildnisse eingemeißelt, die sie wie folgt interpretiert: – Man darf niemals die zweite Druckplatte vor der ersten betätigen, da sonst die Decke einstürzt und man sofort erschlagen wird. – Falls die erste Druckplatte als erste gedrückt wird, bricht diese weg und man fällt sofort in eine Stachelgrube. – Keine der Druckplatten darf zweimal betätigt werden, sonst wird man von allen Seiten mit Giftpfeilen beschossen. – Falls man zuerst die dritte, dann die zweite und zum Schluss die erste Druckplatte betätigt, wird Lava in die Kammer geleitet. Lara hat den ghci auf Ihrem Smartphone installiert und weiß, dass sie die Anzahl der möglichen Lösungen mit einer List Comprehension sehr gut einschränken kann. Leider kann Sie sich nicht mehr genau erinnern, wie man so etwas programmiert und kam bisher nur auf den folgenden unvollständigen Ausdruck: [(x,y,z) | x <- [1..3], ] Helfen Sie Lara, indem Sie die List Comprehension vervollständigen. Ist die Lösung für das Rätsel eindeutig, kann Lara also, wenn sie alles richtig interpretiert hat, gefahrlos die Schalter betätigen? (14 Punkte) Aufgabe 3 (30 Punkte) Ein Objekt in Lara Crofts Inventar sei durch die folgenden Attribute dargestellt: • Art des Objekts: Pistole, Tagebuch, Smartphone, Medipack oder Fackel • Gewicht in Gramm • Preis in Pfund 2 In Haskell sei ein Objekt dementsprechend durch den Datentyp Objekt1 , den Datentyp Art und die Typsynonyme Gewicht und Preis dargestellt: data Objekt = Objekt Art Gewicht Preis deriving(Eq,Show) data Art = Pistole | Tagebuch | Smartphone | Medipack | Fackel deriving(Eq,Show) type Gewicht = Float type Preis = Float Außerdem sei das Inventar in Haskell durch den folgenden Datentyp Inventar dargestellt: data Inventar = Inventar [Objekt] deriving(Eq,Show) a) Die folgenden Objekte befinden sich in Laras Inventar: – 2 Pistolen je 710g/£395.00 – Tagebuch, 450g/£30.99 – Smartphone, 360g/£140.00 – 2 Medipacks je 350g/£6.99 – 2 Fackeln je 857g/£2.99 Geben Sie Laras Inventar unter Verwendung der Datentypen Objekt, Art und Inventar an. (5 Punkte) b) Implementieren Sie Zugriffsfunktionen – getArt :: Objekt -> Art – getGewicht :: Objekt -> Gewicht – getPreis :: Objekt -> Preis die für ein Objekt dessen Art, Gewicht und Preis extrahieren. (6 Punkte) c) Implementieren Sie in Haskell eine Funktion basisAusruestung :: Inventar -> Bool, welche überprüft, ob Lara eine Basisausrüstung bestehend aus einer Pistole, einem Medipack und einer Fackel im Inventar hat. (10 Punkte) d) Implementieren Sie in Haskell eine Funktion gewichtMedipacks :: Inventar -> Gewicht, die das Gesamtgewicht aller Medipacks von Laras Inventar berechnet. (9 Punkte) 1 Die Zeile deriving(Eq,Show) führt dabei dazu, dass Objekte des entsprechenden Datentyps angezeigt und verglichen werden können. 3