iterate
näher betrachtet werden.
iterate :: (α -> α) -> α -> [α] iterate f x = x : iterate f (f x)
iterate f x = x : map f (iterate f x)
iterate
das
gleiche Ergebnis liefert. Es muss also überprüft
werde, ob die beiden unenendlichen Listen gleich sind. Allerdings kann diese
Behauptung hier nicht mit Hilfe der der Induktion bewiesen werden, da kein geeignetes
Argument zur Anwendung des Induktionsbeweises zur Verfügung steht. xs !! n = ys !! n
xs = ⊥
und ys = [⊥]
deutlich. Diese beiden Listen sind unterschiedlich, liefern beim Indizieren mit natürlichen Zahlen jedoch das gleiche Ergebnis und zwar das undefinierte
Element ⊥.approx
. Für diese Funktion gilt:approx n xs = xs für
alle Listen xs.approx n xs = approx n ys für alle n
auch xs = ys gilt.
xs ⊆ ys
dadurch bewiesen werden, dass gezeigt wird, dass
approx n xs ⊆ approx n ys für alle n gilt.
iterate
kann folgende Gleichung definiert werden:
iterate f (f x) = map f (iterate f x)
Beweis:
approx n (iterate f (f x)) = approx n (map f (iterate f x))
Fall (0) : Es gilt: approx 0 xs = ⊥ für alle Listen xs
Fall (n + 1): linke Seite: approx (n +1) (iterate f (f x)) = {Definition von iterate} approx (n + 1) (f x : iterate f (f (f x))) = {Definition von approx} f x : approx n (iterate f (f (f x))) = {Induktionshypothese} f x : approx n (map f (iterate f (f x)))
rechte Seite: approx (n + 1) (map f (iterate f x)) = {Definition von iterate} approx (n + 1) (map f (x : iterate f (f x))) = {Definition von map} approx (n + 1) (f x : map f ( iterate f (f x))) = {Definition von approx} f x : approx n (map f (iterate f (f x)))