Aufgabe 2 - Goethe

Werbung
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
Herunterladen