Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Informatik und Mathematik/ Institut für Informatik Johann Wolfgang Goethe-Universität Frankfurt am Main Grundlagen der Programmierung 2 Sommersemester 2008 Aufgabenblatt Nr. 9 Abgabe: Mittwoch 11. Juni 2008 vor! der Vorlesung Bitte beachten Sie, dass zu Ihrer Lösung zugehöriger Quellcode sowohl gedruckt abgegeben als auch per Email an den entsprechenden Tutor gesendet werden muss!. Für zu implementierende Programme/Funktionen sind stets auch Testaufrufe mit geeigneten Werten der Lösung beizufügen! Aufgabe 1 (24 Punkte) Berechnen (Rechenweg erforderlich!) Sie die freien und gebundenen Variablen des Ausdrucks. let x = (\u -> u) x f b = (\a -> a c) in \w -> if x then g u else w (f 20) Aufgabe 2 (12 Punkte) Für diese Aufgabe ist die Verwendung von pattern-matching auf Listen verboten. Benutzen Sie außer den fold-Funktionen möglichst keine anderen vordefinierten Funktionen auf Listen. a) Geben Sie in Haskell mithilfe von foldl oder foldr eine Funktion an, die für eine Liste von Zahlen prüft, ob sie mindestens eine Zahl enthält die größer als 50 ist. (6 Punkte) b) Geben Sie in Haskell mithilfe von foldl oder foldr eine Funktion an, die für eine Liste von Zahlen prüft, ob alle Elemente größer als 50 sind. (6 Punkte) 1 Aufgabe 3 (22 Punkte) Ein häufiger Fehler beim Schreiben und Editieren von langen Texten besteht darin, dass manche Wörter doppelt hintereinander vorkommen, wie z.B. in dem Text Haskell is an advanced purely functional programming language. The product of more than twenty years of cutting edge research, research it it allows rapid development of robust, concise, correct software. With strong support for integration with other languages, built-in concurrency and parallelism, debuggers, profilers, rich libraries and an an active community, Haskell makes it easier to to produce flexible, maintainable high-quality software. a) Implementieren Sie in Haskell eine Funktion, die einen Text dahingehend prüft, ob doppelte Wörter vorkommen, und dem entsprechend entweder True (doppelte Wörter kommen vor) oder False als Ergebnis liefert. (8 Punkte) Hinweise: Verwenden Sie die vordefinierte Funktion words, die einen String1 in eine Liste von Wörtern zerlegt. b) Erweitern Sie die Funktionalität ihres Programms, so dass als Rückgabe kein Boolescher Wert, sondern eine Liste aller doppelten Wörter zurück gegeben wird. Die Rückgabe für obigen Beispieltext soll ["it","an","to"] sein. (6 Punkte) c) Da Satzzeichen, wie Kommata, Punkte, usw. die doppelte-Worte-Erkennung stören können, passen Sie ihre Funktion aus dem vorherigen Aufgabenteil so an, dass zunächst alle Satzzeichen (“.”, “,”, “!”, “?”, “;”, “:”) im Eingabetext mithilfe von map durch Leerzeichen ersetzt werden. Das Programm sollte nun für den Beispieltext als Ergebnis ["research","it","an","to"] liefern. (8 Punkte) Aufgabe 4 (42 Punkte) a) Definieren Sie in Haskell eine List Comprehension, die – gegeben eine Liste xs von Ganzzahlen – sowohl alle negativen als auch alle ungeraden Zahlen entfernt und die verbleibenden Zahlen halbiert. Z. B. lautet für die Liste xs = [-5,-2,0,1,3,4,5,6] das Ergebnis [0,2,3]. (8 Punkte) b) Eine Harshadzahl ist eine natürliche Zahl, die durch ihre Quersumme teilbar ist. Beispielsweise ist 777 eine Harshadzahl, da 7+7+7 = 21 und 777 = 21 * 37. Geben Sie eine List Comprehension in Haskell an, die die Liste aller Harshadzahlen berechnet. (10 Punkte) c) Definieren Sie in Haskell eine List Comprehension, die – gegeben eine Liste xs von Listen von Zahlen – alle Zahlen verdreifacht, jedoch die Struktur der Liste nicht ändert. Z. B. lautet für xs =[[1,2],[3,6,9],[10]] das Ergebnis [[3,6],[9,18,27],[30]]. (10 Punkte) d) Geben Sie eine List Comprehension in Haskell an, die die unendliche Liste aller Paare (a, b) generiert, wobei a eine durch 5 teilbare Zahl und b eine ungerade Zahl ist. Die Elemente sollen hierbei 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 a, b mit a durch 5 teilbar, b ungerade. (14 Punkte) 1 In Haskell sind Strings nichts anderes als Listen von Zeichen 2