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 2014
Aufgabenblatt Nr. 4
Abgabe: Mittwoch 14. Mai 2014 vor! der Vorlesung
Aufgabe 1 (20 Punkte)
Berechnen (Rechenweg erforderlich!) Sie 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 := \y -> if (x y) then ((\w -> w) y) else ((\z -> z) z)
b) s2 := let g x = (\x -> \y -> (g y)) in let w = g u (g y), z = w in g
Aufgabe 2 (30 Punkte)
Geben Sie jeweils List Comprehensions in Haskell an, welche die folgenden Listen erzeugen:
a) Die unendliche Liste aller Zahlen n (n ∈ N), die durch 8, aber nicht durch 3 teilbar sind.
(6 Punkte)
b) Die drei RGB-Farben seien durch folgenden Datentyp in Haskell definiert:
data RGB = R | G | B
deriving(Eq,Show)
Geben Sie drei List Comprehensions an, die alle die (endliche) Liste aller 3-Tupel (x, y, z) für
alle x ∈ {1, 2, . . . , 1000}, y ∈ {True, False} und z ∈ {R, G, B} erzeugen, jedoch in den folgenden
drei verschiedenen Reihenfolgen:
(je 4 Punkte)
– Zähle erst alle Farben durch, dann die Wahrheitswerte und danach die Zahlen, d.h. die
Ausgabe beginnt wie folgt:
[(1,True,R), (1,True,G), (1,True,B), (1,False,R), (1,False,G), (1,False,B),
(2,True,R), (2,True,G), ...
– Zähle erst die Wahrheitswerte durch, dann die Farben und danach die Zahlen, d.h. die
Ausgabe beginnt wie folgt:
[(1,True,R), (1,False,R), (1,True,G), (1,False,G), (1,True,B), (1,False,B),
(2,True,R), (2,False,R), ...
– Zähle erst die Zahlen durch, dann die Farben und danach die Wahrheitswerte, d.h. die
Ausgabe hat die Form:
[(1,True,R), (2,True,R), ..., (1000,True,R),
(1,True,G), (2,True,G), ..., (1000,True,G),
(1,True,B), (2,True,B), ..., (1000,True,B),
(1,False,R), (2,False,R), ..., (1000,False,R),
(1,False,G), (2,False,G), ..., (1000,False,G),
(1,False,B), (2,False,B), ..., (1000,False,B)]
c) Die unendliche Liste xs aller 4-Tupel (a, b, c, d) mit a, b, c, d ∈ N, so dass die Tupel in einer fairen
Reihenfolge erzeugt werden. Fair bedeutet hierbei, dass (a,b,c,d) ‘elem‘ xs für jedes Tupel
von Zahlen (a,b,c,d) nach endlicher Zeit terminiert.
(12 Punkte)
1
Aufgabe 3 (20 Punkte)
Implementieren Sie die folgenden Funktionen in Haskell im Wesentlichen unter Verwendung von List
Comprehensions, d.h. die entsprechende Implementierung sollte von der Form f xs = e sein, wobei e
eine List Comprehension ist, die xs verwendet. Die Verwendung von Pattern Matching in Funktionsargumenten und den Listenfunktionen map, filter und concat ist dabei verboten!
a) Eine Funktion f1, die eine Liste xs von Paaren (a, bs) erhält, wobei jeweils a eine Ganzzahl und
bs eine Liste von Zahlen ist. Die Funktion f1 erstellt daraus die Liste von Paaren (a, a + b), für
alle Elemente b aus bs, sodass nur solche Paare in der Ausgabe erscheinen, wenn a echt größer
als das Doppelte von b ist.
Z.B. soll f1 [(10,[1,2,3]), (6,[2,3,4]), (30,[10,20])]
[(10,11),(10,12),(10,13),(6,8),(30,40)] liefern.
als
Ergebnis
die Liste
(8 Punkte)
b) Eine Funktion f2, die eine Liste xs von Listen von Zahlen erhält, und zunächst in den inneren
Listen alle geraden Zahlen entfernt, danach alle inneren Listen entfernt, die noch mehr als 2
Elemente enthalten und anschließend alle verbleibenden Zahlen in den maximal zweielementigen
Listen in eine (flache) Liste einfügt.
Z.B. soll f2 [[1,2,3,4,5],[6,7,8,9],[10,11,12]] als Ergebnis die Liste [7,9,11] erzeugen.
(12 Punkte)
Aufgabe 4 (30 Punkte)
Ein Computer sei durch die Attribute Gerätetyp (Server,Desktop,Laptop oder Tablet), Hauptspeicher
(als Ganzzahl in GB), Prozessoren (als Liste, die für jeden Prozessor dessen Taktfrequenz als Ganzzahl
in MHz angibt) und seinen Wert (als Kommazahl in EUR) charakterisiert.
Computer können daher in Haskell durch die folgenden Datentypen modelliert werden1 :
data Computer
= Computer Geraet Speicher [Taktfrequenz] Wert
deriving(Eq,Show)
data Geraet
= Server | Desktop | Laptop | Tablet
deriving(Eq,Show)
type Speicher
= Integer
type Taktfrequenz = Integer
type Wert
= Double
Z.B. wird ein Laptop mit 4 GB Hauptspeicher einem Doppelkernprozessor mit jeweils 2000 MHz Taktfrequenz im Wert von 399,99 EUR als (Computer Laptop 4 [2000,2000] 399.99) dargestellt.
a) Implementieren Sie Zugriffsfunktionen
– getTyp :: Computer -> Geraet
– getSpeicher :: Computer -> Speicher
– getProzessoren :: Computer -> [Taktfrequenz]
– getWert :: Computer -> Wert
1
Die Zeile deriving(Eq,Show) führt dabei dazu, dass Objekte des entsprechenden Datentyps angezeigt und verglichen
werden können.
2
die für einen Computer dessen Gerätetyp, Speichergröße, Prozessorenbeschreibung bzw. Wert
extrahieren.
(6 Punkte)
b) Ein Computerladen hat als Attribute einen Inhaber (als String) und eine Liste von Computern:
data Computerladen = Computerladen Inhaber [Computer]
deriving(Eq,Show)
type Inhaber = String
Implementieren Sie die folgenden Funktionen für Computerläden:
– wert :: Computerladen -> Wert, welche die Summe der Werte aller im Laden
verfügbaren Computer berechnet.
(4 Punkte)
– anzahlServerMitVierProzessoren :: Computerladen -> Integer, die ausrechnet wievele Server mit genau vier Prozessoren im Laden verfügbar sind.
(6 Punkte)
– liefere :: Computerladen -> [Computer] -> Computerladen, die einen Computerladen und eine Lieferung von Computern erhält und den Computerladen aktualisiert, so dass
die neuen Computer hinzugefügt werden.
(6 Punkte)
c) Ein Monitor sei durch die Attribute Diagonale (als Integer-Zahl in Zoll) und Wert (als Kommazahl) charakterisiert.
Entwerfen Sie einen Datentyp für Monitore in Haskell. Erweitern
ßend den Datentyp Computerladen derart, dass auch Monitore neben
tern erfasst werden. Implementieren Sie für den erweiterten Datentyp
wertDerMonitore :: Computerladen -> Wert, die den Gesamtwert der
Laden berechnet.
3
Sie anschlieden Compueine Funktion
Monitore im
(8 Punkte)
Herunterladen