Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Biologie und Informatik/ Institut für Informatik Johann Wolfgang Goethe-Universität Frankfurt am Main Praktische Informatik 1 Wintersemester 2004/2005 Aufgabenblatt Nr. 7 Abgabe: Mittwoch 15. Dezember 2004 vor! der Vorlesung Aufgabe 1 (30 Punkte) Das (8+3)-Prinzip für DOS-Dateinamen lautet: Der Dateiname besteht aus maximal 8 Zeichen, dem eigentlichen Namen, einem Trennpunkt und nochmals maximal 3 Zeichen, der Erweiterung. Gegeben sei eine Liste von DOS-Dateinamen (ein Dateiname sei als ein String repräsentiert). Hierbei dürfen Sie für Aufgabe a) und b) annehmen, dass sowohl der eigentliche Name als auch die Erweiterung jedes Dateinamens nur aus Buchstaben besteht. a) Definieren Sie eine Funktion onlyWithHS :: [String] -> [String], die ausschließlich diejenigen Dateinamen liefert (als Liste), die mit der Erweiterung hs enden. (12 Punkte) b) Definieren Sie eine Funktion onlyWith :: String -> [String] -> [String], die ausschließlich diejenigen Dateinamen liefert (als Liste), die mit der Erweiterung, welche durch den ersten Parameter übergeben wird, enden. (8 Punkte) c) Erweitern Sie Ihre Funktion aus Aufgabenteil b), sodass sie für beliebige Dateinamen, d.h. Dateinamen beliebiger Länge und bestehend aus beliebigen (insbesondere auch Sonderzeichen) Zeichen funktioniert. (10 Punkte) Hinweis: Eventuell können Sie nützliche Funktionen in der Bibliothek Data.List finden, die Bibliothek kann mittels import Data.List in ihr Programm eingebunden werden1 . 1 Die Dokumentation dieser Bibliothek findet sich z.B. unter http://www.haskell.org/ghc/docs/6.2.1/html/libraries/base/Data.List.html 1 Aufgabe 2 (30 Punkte) Führen Sie die Musteranpassung für die folgenden Paare, bestehend aus einem Muster und einem Ausdruck, per Hand durch, indem Sie sie mithilfe der rekursiven Definition aus dem Skript für anpassen berechnen. a) Muster: Ausdruck: (x:(y:zs)) [’A’, ’B’, ’C’, ’D’] (7 Punkte) b) Muster: Ausdruck: (x:((a:b):[])) [[1,2],[2,3]] (9 Punkte) c) Muster: Ausdruck: Strecke p1 (Punkt a2 b2) Strecke (Punkt 2 4) 5 (7 Punkte) d) Muster: Ausdruck: Strecke p1 (Punkt a2 b2) Strecke (Punkt 2 4) (Punkt 1 3) (7 Punkte) Beachten Sie, dass Sie Listenausdrücke zunächst in die interne Darstellung überführen müssen, bevor Sie die Definition von anpassen anwenden können. Aufgabe 3 (40 Punkte) Geben Sie List Comprehensions in Haskell an, die folgende Listen darstellen: a) Die unendliche Liste aller Zweierpotenzen 1, 2, 4, 8, 16 . . .. (4 Punkte) b) Die Liste aller Teiler einer gegebenen Zahl n, z.B. soll für n = 12 die Liste [1,2,3,4,6,12] generiert werden. (8 Punkte) c) Die unendliche Liste aller perfekten Zahlen, für die Sie u.a. das Ergebnis von Aufgabenteil b) verwenden sollten. Eine Zahl m heißt perfekt, wenn die Summe aller ihrer Teiler, die ungleich m sind, wiederum m ergibt. Beispielsweise ist 6 eine perfekte Zahl, denn 1 + 2 + 3 = 6. (8 Punkte) d) Die unendliche Liste aller Paare (a, b), wobei a eine ungerade Zahl und b eine gerade Zahl ist. (6 Punkte) e) Die Liste mit den selben Elementen wie in Aufgabenteil d), jedoch sollen die Elemente in einer fairen Reihenfolge generiert werden. Hierbei bedeutet fair: 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 ungerade, b gerade. (14 Punkte) 2