Zeigen Sie durch einen Induktionsbeweis,
dass für alle Listen xs und ys gilt:
length(xs++ys)=lengthxs+lengthys
Aufgabe 2
Duale Listen
Eine duale Sicht auf Listen ist die, Elemente an das Ende
einer Liste anzuhängen. Folgender Datentyp ist dafür
geeignet (Snoc = Cons rückwärts gelesen).
dataRLista=Nil
|Snoc(RLista)a
Schreiben Sie Konversionsfunktionen, die normale Listen in diese
Struktur überführen und umgekehrt und die
elementaren Zugriffsfunktionen rHead, rTail,
rInit, rLast:
Entwickeln Sie eine Implementierung, die die beiden Teillisten
mit einem Durchlauf durch die Argumentliste direkt berechnet.
Aufgabe 4
Mengen als Listen von Intervallen
Motivation
Mengen von Zahlen können durch
aufsteigend sortierte Listen von Intervallen repräsentiert werden.
typeNumSet=[Interval]
typeInterval=(Int,Int)
Invarianten
Für die Intervalle soll gelten, dass sie abgeschlossene Intervalle der
natürlichen Zahlen repräsentieren. Es muss also gelten dass die untere Grenze
kleiner oder gleich der oberen Grenze ist.
Für die Listen soll gelten, dass die Intervalle aufsteigend sortiert
sind und dass sich keine benachbarten Intervalle überlappen oder aneinander
stoßen. Es soll also immer nur die minimale Anzahl von Intervallen zur
Repräsentation einer Menge verwendet werden.
Aufgabe
Schreiben sie zwei Funktionen zur Überprüfung,
ob diese Bedingungen für einen Wert eingehalten werden.
invNumSet::NumSet->Bool
invInterval::Interval->Bool
Aufgabe
Entwickeln Sie Funktionen zum Testen, ob ein Element
in einer Menge enthalten ist, zum Einfügen eines Elements, zum Einfügen eines
Intervalls
und zur Mengenvereinigung.