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