WS 97/98: Algorithmen und Programmierung III - Übungsblatt 8
Abgabe bis 8.1., 12.30 Uhr
Aufgabe 8.1 (8 Punkte)
Unter Verwendung von
tree * ** ::= Leaf* | Node** (tree * **)(tree * **)
seien Operatorbäume wie folgt spezifiziert:
operator == char
operand == num
abstype optree
with atom :: operand -> optree
expr :: operator -> optree -> optree -> optree
eval :: optree -> operand
optree == tree operand operator || MODELL
atom o = Leaf o || SEMANTIK
expr o e1 e2 = Node o e1 e2
eval(Leaf o) = o
eval(Node o e1 e2) = (func o)(eval e1)(eval e2)
func '+' = +
func '-' = -
func '*' = *
func '/' = div
a) Entwickle ein entsprechendes Definitionsmodul Optrees
für den imperativen Umgang mit Operatorbäumen!
b) Entwickle ein zugehöriges Implementierungsmodul, das die Bäume
als Geflechte verwaltet!
Aufgabe 8.2 (4 Punkte)
Bäume des folgenden Typs person stellen den Stammbaum
einer Person dar:
person ::= Unbekannt | Kind name person person
Entwickle eine Funktion
stammbaum :: person -> [char]
mit der man den Stammbaum einer Person auf dem Bildschirm mit geeigneten
Einrückungen (rekursiv) und Beschriftung anzeigen kann, z.B. so:
Anna
Mutter: Eva
Vater : Dirk
Vater : Sven
Aufgabe 8.3 (5 Punkte)
Aus einem Baum wird eine Liste gewonnen mittels Traversieren:
list :: tree* -> [*]
Syntaxanalyse ist ein "konstruierendes Traversieren" - aus einer
Liste wird eine syntaktische Struktur herauspräpariert und in einem Baum
festgehalten:
parse :: [*] -> tree*
Wir betrachten eine Sprache mit folgender Syntax (Startsymbol ist Pedigree):
Pedigree = ? | Letter Pedigree Pedigree .
Letter = a | b | ..... | z .
a) Verfasse eine Funktion parse für diese Sprache! Beachte, daß
nicht jede Zeichenkette aus Buchstaben und Fragezeichen syntaktisch
korrekt ist; z.B. ist nur die erste dieser drei Zeichenketten korrekt:
a?bc??? ab?c? a??b
b) Verfasse eine Funktion list zur Ausgabe der erzeugten Bäume
in Anlehnung an Aufgabe 2!
Aufgabe 8.4 (3 Punkte)
Ein Wald von Bäumen sei wie folgt definiert:
forest* ::= F[(*,forest*)]
Verfasse eine Funktion list :: forest* -> [*], die einen Wald mit
Breitensuche traversiert und die in den besuchten Knoten aufgefundene
Information in einer Liste zusammenstellt!
16.12.1997