Universität Bielefeld Technische Fakultät AG Praktische Informatik Übung zu den Vorlesungen Algorithmen & Datenstrukturen Programmieren in Haskell Wintersemester 2011/2012 Allgemeiner Hinweis: Geben Sie bei allen Haskell-Funktionen die Signatur mit an. Aufgabe 7.1 (1). Schreiben Sie eine Funktion cart :: [ a ] -> [ b ] -> [ (a , b ) ] cart x y = ... die alle Kombinationen der Listenelemente in folgender Reihenfolge erzeugt: [(x0 , y0 ), (x0 , y1 ), . . . , (x0 , yn ), . . . , (xm , y0 ), . . . , (xm , yn )] (1) Aufgabe 7.2 (3). Implementieren Sie eine Funktion diag :: [ a ] -> [ b ] -> [ (a , b ) ] diag x y = ... die alle Kombinationen der Listenelemente in folgender Reihenfolge erzeugt: [(x0 , y0 ), (x1 , y0 ), (x0 , y1 ), . . . , (xm , y0 ), (xm−1 , y1 ), . . . , (xm , y1 ), . . . , (xm , y2 ), . . . , (xm , yn )] (2) (Wenn man für xi , yi die Indices i, j als Indices in eine Matrix interpretiert, dann würde diese Aufzählung der Kombinationen eine Aufzählung der Matrix-Elemente entlang aller Diagonalen entsprechen — “von unten links nach oben rechts”.) Aufgabe 7.3 (3). Gegeben ist folgende Sequenz von Zeichen aus dem Alphabet {1, 0, s, S}: 100000s11010s10100s1111s1010s110s11s1S Diese Sequenz kodiert eine Liste von Zahlen, die jeweils mit einem Trennzeichen s voneinander getrennt sind. Die Zahlenwerte sind binärkodiert. Man liest die Liste von links nach rechts und das Ende der Liste ist mit einem S markiert. Jede Zahl gibt an, wieviel Zeichen die Restliste enthält. Die Liste, die die Beispielsequenz kodiert, ist: [ 32 , 26 , 20 ,15 , 10 , 6 , 3 , 1 ] Implementieren Sie eine Funktion iscoded :: String -> Bool die die beschriebenen Eigenschaften solcher Sequenzen überprüft. Schreiben Sie eine Funktion tobinseq :: Integral a = > [ a ] -> String die eine Liste von Zahlen in eine Zeichensequenz, wie beschrieben, kodiert. 1 Universität Bielefeld Technische Fakultät AG Praktische Informatik Aufgabe 7.4 (3). Reduzieren Sie schrittweise folgende Ausdrücke in ihre Normalform jeweils mit Leftmost-Innermost-, Leftmost-Outermost- und Leftmost-Outermost+GraphReduction. 1. square (square 42) 2. take (36-2*23) (map square [10..15]) 3. length [23, 2*23, 1+2*3+4] Aufgabe 7.5 (3). Gegeben ist folgende Implementation der Potenzierungsfunktion: > power > power x n > | n == 0 > | n ‘mod ‘ 2 == 0 > | otherwise > where y :: ( Num a , Integral b ) = > a -> b -> a = = = = 1 y y * x power ( x * x ) ( n ‘div ‘ 2) Reduzieren Sie schrittweise den Ausdruck power 2 5 in seine Normalform jeweils mit Leftmost-Innermost-, Leftmost-Outermost- und Leftmost-Outermost+Graph-Reduction. Aufgabe 7.6 (4). In Aufgabe 6.6 sollten Sie die notwendigen Datentypen und Typdeklarationen zur Implementierung einer Registermaschine in Haskell entwickeln. • Implementieren Sie eine Funktion rm::Program->Config->Config, die ein gegebenes Programm ausgehend von der Startkonfiguration verarbeitet und (falls das Programm terminiert) das Ergebnis in Form der Endkonfiguration der Maschine liefert. • Testen Sie ihre Implementierung der Registermaschine mit Beispiel-Programmen aus der Vorlesung. Abgabe: Dienstag, 29.11.2011. Bearbeitung in 2er oder 3er Gruppen (alle Namen und Tutor auf die Abgabe schreiben). 2