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 2011 Aufgabenblatt Nr. 4 Abgabe: Mittwoch 11. Mai 2011 vor! der Vorlesung Aufgabe 1 (20 Punkte) Gegeben Sie die folgenden mathematischen Funktionen als anonyme Funktionen in Form von Lambda-Ausdrücken in Haskell Notation an. a) f1 (a, b) = 2a2 + 2ab + 2b2 q b) f2 (p, q) = −( p2 ) + ( p2 )2 − q Zur Wurzelberechnung steht in Haskell die Funktion sqrt bereit. c) f3 (f, g, h, x) = h(f (g(x)), g(f (x))) Aufgabe 2 (50 Punkte) Geben Sie List Comprehensions in Haskell an, die folgende Listen darstellen: a) Die unendliche Liste aller Zahlen der Form 3n + 4, wobei n eine natürliche Zahl ist, d.h. [7,13,31,85,247,... (10 Punkte) b) Die unendliche Liste aller natürlichen Quadratzahlen, die durch 5 ohne Rest teilbar sind, aber nur mit Rest durch 20 teilbar sind, d.h. [25,225,625,1225,2025,3025,... (10 Punkte) c) Die Liste aller echten Teiler einer gegebenen Zahl n, z.B. soll für n = 18 die Liste [1,2,3,6,9] generiert werden. (10 Punkte) d) Die unendliche Liste der perfekten Zahlen, wobei eine natürliche Zahl n perfekt heißt, wenn die Summe aller ihrer Teiler, die ungleich n sind, wiederum m ergibt. Z.B. ist 6 perfekt, denn 1 + 2 + 3 = 6. (10 Punkte) e) 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. (10 Punkte) Aufgabe 3 (30 Punkte) Folgende polymorphe Datenstruktur beschreibt einen binären Baum mit Knoten- und Blattmarkierungen in Haskell: 1 data Baum a b = Blatt a | Knoten b (Baum a b) (Baum a b) deriving(Show,Eq) Ein Turnierbaum ist ein binärer Baum, der an jedem Blatt mit den Namen einer Mannschaft und an jedem inneren Knoten mit einem Tupeln von (natürlichen) Zahlen markiert ist. type Turnierbaum = Baum String -- Mannschaftsname (Int,Int) -- Spielergebnis Zu Beginn (in der ersten Runde) eines Turniers spielen die beiden Mannschaften, die einen gemeinsamen Elternknoten besitzen gegeneinander. Das Spielergebnis wird in der Markierung des Elternknoten notiert, wobei die Punkte des rechten Kindes im rechten Element des Markierungstupels und die Punkte des linken Kindes im linken Element des Tupels gespeichert werden. In der i-ten Runde des Turniers spielen die beiden Gewinner der (i−1)-ten Runde gegeneinander, die einen gemeinsamen Elternknoten besitzen. In folgendem Beispiel spielt in der ersten Runde Mannschaft A gegen Mannschaft B und Mannschaft C gegen D. In der zweiten Runde spielen die Gewinner der beiden Spiele gegeneinander (Mannschaft A gegen Mannschaft C). (1, 0) A zz zz z z zz mm mmm m m m mmm mmm (4, 7) Q QQQ QQQ QQQ QQQ Q (2, 1) DD DD DD DD B C zz zz z z zz DD DD DD DD D a) Geben Sie den Beispielbaum als Instanz des Typs Turnierbaum in Haskell an. (10 Punkte) b) Implementieren Sie eine Funktion alleMannschaften :: Turnierbaum -> [String] in Haskell, die alle an dem Turnier teilnehmenden Mannschaften berechnet. (10 Punkte) c) Implementieren Sie eine Funktion gewinner :: Turnierbaum -> String in Haskell, die anhand eines gegebenen Turnierbaums den Gewinner des Turniers berechnet. Im Beispiel ist Mannschaft C der Gewinner. (10 Punkte) 2