Aufgabenblatt 7 (Listen, Rechenstrategien, Registermaschinen)

Werbung
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
Herunterladen