(* Title: CCL/ex/Stream.thy Author: Martin Coen, Cambridge University Computer Laboratory Copyright 1993 University of Cambridge
*)
section \<open>Programs defined over streams\<close>
theory Stream imports List begin
definition iter1 :: "[i\i,i]\i" where"iter1(f,a) == letrec iter x be x$iter(f(x)) in iter(a)"
definition iter2 :: "[i\i,i]\i" where"iter2(f,a) == letrec iter x be x$map(f,iter(x)) in iter(a)"
(* Proving properties about infinite lists using coinduction: Lists(A) is the set of all finite and infinite lists of elements of A. ILists(A) is the set of infinite lists of elements of A.
*)
subsection \<open>Map of composition is composition of maps\<close>
lemma append_assoc: assumes"k:Lists(A)" and"l:Lists(A)" and"m:Lists(A)" shows"k @ l @ m = (k @ l) @ m" apply (eq_coinduct3 "{p. EX x y. p= \ (EX k:Lists (A). EX l:Lists (A). EX m:Lists (A). x=k @ l @ m \ y= (k @ l) @ m) }") apply (blast intro: assms) apply safe apply (drule ListsXH [THEN iffD1]) apply EQgen prefer 2 apply blast apply (tactic \<open>DEPTH_SOLVE (eresolve_tac \<^context> [XH_to_E @{thm ListsXH}] 1 THEN EQgen_tac \<^context> [] 1)\<close>) done
subsection \<open>Appending anything to an infinite list doesn't alter it\<close>
lemma ilist_append: assumes"l:ILists(A)" shows"l @ m = l" apply (eq_coinduct3 "{p. EX x y. p= \ (EX l:ILists (A) .EX m. x=l@m \ y=l)}") apply (blast intro: assms) apply safe apply (drule IListsXH [THEN iffD1]) apply EQgen apply blast done
(*** The equivalance of two versions of an iteration function ***) (* *) (* fun iter1(f,a) = a$iter1(f,f(a)) *) (* fun iter2(f,a) = a$map(f,iter2(f,a)) *)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.