Einführung in die funktionale Programmierung Aufgabenblatt Nr. 5

Werbung
Prof. Dr. Manfred Schmidt-Schauß
Institut für Informatik
Fachbereich Informatik und Mathematik/ Institut für Informatik
Johann Wolfgang Goethe-Universität Frankfurt am Main
Einführung in die funktionale Programmierung
Wintersemester 2011/2012
Aufgabenblatt Nr. 5
Abgabe: Montag 21. November 2011 vor der Vorlesung
Senden Sie bitte Ihren Quellcode auch per Email an [email protected]
Aufgabe 1 (20 Punkte)
Wir betrachten quadratische Matrizen, deren Einträge entweder belegt, oder nicht belegt sind
(ein Beispiel ist in Abbildung (a) zu sehen). Ein Eintrag an Position (i, j) in einer Matrix wird
durch seine Zeile i und sein Spalte j bezeichnet, wobei die Zählung der Zeilen und Spalten bei
0 beginnt (wie für ein Beispiel in Abbildung (b) zu sehen ist).
Solche Matrizen lassen sich in Haskell durch folgende Datenstruktur darstellen:
data Matrix = Matrix [[Bool]]
Ist in der i-ten Liste der Matrix der j-te Eintrag True, so gilt der Eintrag (i, j) der Matrix als
belget. Beispielsweise entspricht
Matrix [[True,False,False],[False,True,False],[False,False,True]]
der Matrix aus Abbildung (a).
(0,0) (0,1) (0,2)
(1,0) (1,1) (1,2)
(2,0) (2,1) (2,2)
(a)
(b)
a) Implementieren Sie in Haskell eine Show-Instanz für den Typ Matrix, so dass solche Matrizen gut lesbar angezeigt werden.
(4 Punkte)
b) Implementieren Sie in Haskell eine Funktion des Typs: Matrix -> (Int, Int) -> Bool,
die eine Matrix und eine Matrix-Position als Eingabe erwartet und die Belegung des durch
die Koordinate gegebenen Matrix-Eintrages berechnet.
(3 Punkte)
c) Implementieren Sie in Haskell eine Funktion nachbarn :: (Int, Int) -> Int ->
[(Int, Int)] mit Hilfe einer List-Comprehension, die eine Matrix-Position und
die Dimension einer Matrix erwartet und die Positionen aller benachbarten Felder berechnet. Beispielsweise liefert nachbarn (1,1) 3 als Resultat die Liste
[(0,0),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1),(2,2)].
(7 Punkte)
1
d) Implementieren Sie in Haskell eine Funktion anzahlBelegterNachbarn :: (Int, Int)
-> Matrix -> Int, die in einer gegebenen Matrix zu einem durch seine Position gegebenen
Feld die Anzahl seiner belegten Nachbarn berechnet. Beispielsweise liefert der Aufruf von
anzahlBelegterNachbarn mit der Koordinate (1,1) und der Matrix aus Abbildung (a),
als Resultat 2.
(6 Punkte)
Aufgabe 2 (20 Punkte)
a) Definieren Sie in Haskell eine Konstruktorklasse Tree, die Operationen für Baum-artige
Datentypen überlädt. Als Klassenmethoden sollen dabei zur Verfügung stehen:
– subtrees liefert die Liste der Unterbäume der Wurzel.
– isLeaf testet, ob ein Baum nur aus einem Blatt besteht und liefert dementsprechend
True oder False.
(8 Punkte)
b) Definieren Sie eine Unterklasse LabeledTree von Tree, die Operatoren für Bäume mit
Knotenmarkierungen überlädt. Die Klassenmethoden sind:
– label liefert die Beschriftung der Wurzel.
– nodes liefert alle Knotenmarkierungen eines Baums als Liste.
– edges liefert alle Kanten des Baumes, wobei eine Kante als Paar von Knotenmarkierungen dargestellt wird.
Geben Sie dabei Default-Implementierungen für nodes und edges innerhalb der Klassendefinition an.
(12 Punkte)
Aufgabe 3 (10 Punkte)
Polymorphe n-äre Bäume können in Haskell wie folgt definiert werden:
data NTree a = NLeaf a
| NNode a [NTree a]
-- Blatt mit Markierung
-- Knoten mit Markierung und Liste der Kinder
Implementieren Sie Instanzen der Klasse Tree und LabeledTree aus der vorherigen Aufgabe
für den Datentyp NTree.
2
Herunterladen