Aufgabe 2 (50 Punkte) - Goethe

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 2016
Aufgabenblatt Nr. 4
Abgabe: Mittwoch 11. Mai 2016 vor! der Vorlesung
Aufgabe 1 (20 Punkte)
Berechnen Sie (Rechenweg erforderlich!) jeweils die Menge der freien sowie die Menge der gebundenen
Variablen für die folgenden Ausdrücke:
a) \z -> z (y 5) (y (let y = 2 in y))
(10 Punkte)
b) x (\w -> w) (let f a b = a in f)
(10 Punkte)
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 ∈ N>0 ), die gerade sind, geteilt durch 7 den Rest 2 ergeben
und durch 5 ohne Rest teilbar sind, d.h. [30,100,170,240,310,380,450,520,590,660,...
Die Funktion take kann beim Testen nützlich sein.
(5 Punkte)
b) Die unendliche Liste aller Zahlen der Form 3 · x2 · y mit x ∈ {2, 4, 6, . . . }, y ∈ {1, 3, 5, . . . } und
x + y > 10, d.h. [108,132,156,180,204,228,252,276,300,324,...
(6 Punkte)
c) Zu einer gegebenen endlichen Liste [e1 , e2 , . . . , en ] die Liste der Teillisten von folgender Form: [[e1 ],[e1 , e2 ], . . .,[e1 ,. . .,en ]]. D.h. für [’a’,’b’,’c’] ist die Ergebnisliste
["a","ab","abc"].
(7 Punkte)
d) Die unendliche Liste aller Primzahlen. Zur Prüfung, ob eine Zahl n > 1 eine Primzahl ist, reicht
es vollkommen aus, zu prüfen, ob es ein k mit 2 ≤ k ≤ n − 2 gibt, das n teilt: Gibt es kein solches
k, so ist n prim.
(11 Punkte)
e) Die endliche Liste aller Tripel (x, y, z) für alle x ∈ {’a’,’b’,’c’,’d’,’e’}, y ∈ {0, 5, 10, 15, 20}
und z ∈ {True, False} und zwar in der Reihenfolge, sodass zunächst die Zahlen wechseln,
danach die Wahrheitswerte und zuletzt die Buchstaben, d.h. die Ausgabe beginnt mit:
[(’a’,0,True),(’a’,5,True),(’a’,10,True),(’a’,15,True),(’a’,20,True),(’a’,0,False),
(’a’,5,False),(’a’,10,False),(’a’,15,False),(’a’,20,False),(’b’,0,True),(’b’,5,True)...
(8 Punkte)
f) Die unendliche Liste aller Paare (a, b) von natürlichen Zahlen a und b, wobei a durch drei teilbar
ist und b eine Quadratzahl ist. Hierbei sollen die Paare in einer fairen Reihenfolge generiert
werden. Fair bedeutet: Jedes Element wird in endlicher Zeit generiert, oder auch: Wenn xs die
Liste der Paare ist, dann terminiert (a,b) ‘elem‘ xs für alle Zahlen a, b mit a ist durch drei
teilbar und b ist eine Quadratzahl.
(13 Punkte)
1
Aufgabe 3 (30 Punkte)
Ein Berg sei durch die folgenden Attribute repräsentiert
•
•
•
•
Name als Zeichenkette
Höhe in Metern über Normalnull
Dominanz in Kilometern
Prominenz (auch bekannt als Schartenhöhe) in Metern
In Haskell sei ein Berg dementsprechend durch den folgenden Datentyp Berg1 und die Typsynonyme
Name, Hoehe, Dominanz und Prominenz dargestellt:
data Berg = Berg Name Hoehe Dominanz Prominenz
deriving(Eq,Show)
type Name
= String
type Hoehe
= Float
type Dominanz = Float
type Prominenz = Float
Außerdem sei ein Gebirge in Haskell durch den folgenden Datentyp Gebirge repräsentiert:
data Gebirge = Gebirge Name [Berg]
deriving(Eq,Show)
a) Geben Sie ein Gebirge Ihrer Wahl unter Verwendung der Datentypen Berg und Gebirge an.
Dabei genügt es nur drei Berge zu berücksichtigen.
(5 Punkte)
b) Implementieren Sie Zugriffsfunktionen
– getName :: Berg -> Name
– getHoehe :: Berg -> Hoehe
– getDominanz :: Berg -> Dominanz
– getProminenz :: Berg -> Prominenz
die für einen Berg dessen Name, Höhe, Dominanz und Prominenz extrahieren.
(6 Punkte)
c) Implementieren Sie in Haskell eine Funktion maxHoehe :: Gebirge -> Hoehe, welche die Höhe
des höchsten Berges eines Gebirges berechnet.
(9 Punkte)
d) Implementieren Sie in Haskell eine Funktion hoechsterBerg :: Gebirge -> Name, die den Namen des höchsten Berges eines Gebirges berechnet.
(10 Punkte)
1
Die Zeile deriving(Eq,Show) führt dabei dazu, dass Objekte des entsprechenden Datentyps angezeigt und verglichen
werden können.
2