(* Title: ZF/ex/Limit.thy Author: Sten Agerholm Author: Lawrence C Paulson
A formalization of the inverse limit construction of domain theory.
The following paper comments on the formalization:
"A Comparison of HOL-ST and Isabelle/ZF" by Sten Agerholm In Proceedings of the First Isabelle Users Workshop, Technical Report No. 379, University of Cambridge Computer Laboratory, 1995.
This is a condensed version of:
"A Comparison of HOL-ST and Isabelle/ZF" by Sten Agerholm Technical Report No. 369, University of Cambridge Computer Laboratory, 1995.
*)
theory Limit imports ZF begin
definition
rel :: "[i,i,i]\o" where "rel(D,x,y) \ \x,y\:snd(D)"
definition
projpair :: "[i,i,i,i]\o" where "projpair(D,E,e,p) \
e \<in> cont(D,E) \<and> p \<in> cont(E,D) \<and>
p O e = id(set(D)) \<and> rel(cf(E,E),e O p,id(set(E)))"
definition
emb :: "[i,i,i]\o" where "emb(D,E,e) \ \p. projpair(D,E,e,p)"
definition
Rp :: "[i,i,i]\i" where "Rp(D,E,e) \ THE p. projpair(D,E,e,p)"
definition (* Twice, constructions on cpos are more difficult. *)
iprod :: "i\i" where "iprod(DD) \
<(\<Prod>n \<in> nat. set(DD`n)),
{x:(\<Prod>n \<in> nat. set(DD`n))*(\<Prod>n \<in> nat. set(DD`n)). \<forall>n \<in> nat. rel(DD`n,fst(x)`n,snd(x)`n)}>"
definition
mkcpo :: "[i,i\o]\i" where (* Cannot use rel(D), is meta fun, need two more args *) "mkcpo(D,P) \
<{x \<in> set(D). P(x)},{x \<in> set(D)*set(D). rel(D,fst(x),snd(x))}>"
definition
e_less :: "[i,i,i,i]\i" where (* Valid for m \<le> n only. *) "e_less(DD,ee,m,n) \ rec(n#-m,id(set(DD`m)),\x y. ee`(m#+x) O y)"
definition
e_gr :: "[i,i,i,i]\i" where (* Valid for n \<le> m only. *) "e_gr(DD,ee,m,n) \
rec(m#-n,id(set(DD`n)), \<lambda>x y. y O Rp(DD`(n#+x),DD`(succ(n#+x)),ee`(n#+x)))"
definition
eps :: "[i,i,i,i]\i" where "eps(DD,ee,m,n) \ if(m \ n,e_less(DD,ee,m,n),e_gr(DD,ee,m,n))"
lemma set_I: "x \ fst(D) \ x \ set(D)" by (simp add: set_def)
lemma rel_I: "\x,y\:snd(D) \ rel(D,x,y)" by (simp add: rel_def)
lemma rel_E: "rel(D,x,y) \ \x,y\:snd(D)" by (simp add: rel_def)
(*----------------------------------------------------------------------*) (* I/E/D rules for po and cpo. *) (*----------------------------------------------------------------------*)
lemma po_refl: "\po(D); x \ set(D)\ \ rel(D,x,x)" by (unfold po_def, blast)
lemma po_trans: "\po(D); rel(D,x,y); rel(D,y,z); x \ set(D);
y \<in> set(D); z \<in> set(D)\<rbrakk> \<Longrightarrow> rel(D,x,z)" by (unfold po_def, blast)
lemma po_antisym: "\po(D); rel(D,x,y); rel(D,y,x); x \ set(D); y \ set(D)\ \ x = y" by (unfold po_def, blast)
lemma poI: "\\x. x \ set(D) \ rel(D,x,x); \<And>x y z. \<lbrakk>rel(D,x,y); rel(D,y,z); x \<in> set(D); y \<in> set(D); z \<in> set(D)\<rbrakk> \<Longrightarrow> rel(D,x,z); \<And>x y. \<lbrakk>rel(D,x,y); rel(D,y,x); x \<in> set(D); y \<in> set(D)\<rbrakk> \<Longrightarrow> x=y\<rbrakk> \<Longrightarrow> po(D)" by (unfold po_def, blast)
(*----------------------------------------------------------------------*) (* Theorems about isub and islub. *) (*----------------------------------------------------------------------*)
lemma islub_isub: "islub(D,X,x) \ isub(D,X,x)" by (simp add: islub_def)
lemma islub_in: "islub(D,X,x) \ x \ set(D)" by (simp add: islub_def isub_def)
lemma islub_ub: "\islub(D,X,x); n \ nat\ \ rel(D,X`n,x)" by (simp add: islub_def isub_def)
lemma islub_least: "\islub(D,X,x); isub(D,X,y)\ \ rel(D,x,y)" by (simp add: islub_def)
lemma isubI: "\x \ set(D); \n. n \ nat \ rel(D,X`n,x)\ \ isub(D,X,x)" by (simp add: isub_def)
lemma isubE: "\isub(D,X,x); \x \ set(D); \n. n \ nat\rel(D,X`n,x)\ \ P \<rbrakk> \<Longrightarrow> P" by (simp add: isub_def)
lemma isubD1: "isub(D,X,x) \ x \ set(D)" by (simp add: isub_def)
lemma isubD2: "\isub(D,X,x); n \ nat\\rel(D,X`n,x)" by (simp add: isub_def)
lemma islub_unique: "\islub(D,X,x); islub(D,X,y); cpo(D)\ \ x = y" by (blast intro: cpo_antisym islub_least islub_isub islub_in)
(*----------------------------------------------------------------------*) (* lub gives the least upper bound of chains. *) (*----------------------------------------------------------------------*)
lemma chain_rel [simp,TC]: "\chain(D,X); n \ nat\ \ rel(D, X ` n, X ` succ(n))" by (simp add: chain_def)
lemma chain_rel_gen_add: "\chain(D,X); cpo(D); n \ nat; m \ nat\ \ rel(D,X`n,(X`(m #+ n)))" apply (induct_tac m) apply (auto intro: cpo_trans) done
lemma chain_rel_gen: "\n \ m; chain(D,X); cpo(D); m \ nat\ \ rel(D,X`n,X`m)" apply (frule lt_nat_in_nat, erule nat_succI) apply (erule rev_mp) (*prepare the induction*) apply (induct_tac m) apply (auto intro: cpo_trans simp add: le_iff) done
(*----------------------------------------------------------------------*) (* Theorems about pcpos and bottom. *) (*----------------------------------------------------------------------*)
lemma pcpoI: "\\y. y \ set(D)\rel(D,x,y); x \ set(D); cpo(D)\\pcpo(D)" by (simp add: pcpo_def, auto)
lemma pcpo_cpo [TC]: "pcpo(D) \ cpo(D)" by (simp add: pcpo_def)
lemma bot_unique: "\pcpo(D); x \ set(D); \y. y \ set(D) \ rel(D,x,y)\ \ x = bot(D)" by (blast intro: cpo_antisym pcpo_cpo bot_in bot_least)
(*----------------------------------------------------------------------*) (* Constant chains and lubs and cpos. *) (*----------------------------------------------------------------------*)
(*----------------------------------------------------------------------*) (* Taking the suffix of chains has no effect on ub's. *) (*----------------------------------------------------------------------*)
lemma isub_suffix: "\chain(D,X); cpo(D)\ \ isub(D,suffix(X,n),x) \ isub(D,X,x)" apply (simp add: isub_def suffix_def, safe) apply (drule_tac x = na in bspec) apply (auto intro: cpo_trans chain_rel_gen_add) done
lemma matrix_chainI: assumes xprem: "\x. x \ nat\chain(D,M`x)" and yprem: "\y. y \ nat\chain(D,\x \ nat. M`x`y)" and Mfun: "M \ nat->nat->set(D)" and cpoD: "cpo(D)" shows"matrix(D,M)" proof -
{ fix n m assume"n \ nat" "m \ nat" with chain_rel [OF yprem] have"rel(D, M ` n ` m, M ` succ(n) ` m)"by simp
} note rel_succ = this show"matrix(D,M)" proof (simp add: matrix_def Mfun rel_succ, intro conjI ballI) fix n m assume n: "n \ nat" and m: "m \ nat" thus"rel(D, M ` n ` m, M ` n ` succ(m))" by (simp add: chain_rel xprem) next fix n m assume n: "n \ nat" and m: "m \ nat" thus"rel(D, M ` n ` m, M ` succ(n) ` succ(m))" by (rule cpo_trans [OF cpoD rel_succ],
simp_all add: chain_fun [THEN apply_type] xprem) qed qed
lemma lemma2: "\x \ nat; m \ nat; rel(D,(\n \ nat. M`n`m1)`x,(\n \ nat. M`n`m1)`m)\ \<Longrightarrow> rel(D,M`x`m1,M`m`m1)" by simp
lemma isub_lemma: "\isub(D, \n \ nat. M`n`n, y); matrix(D,M); cpo(D)\ \<Longrightarrow> isub(D, \<lambda>n \<in> nat. lub(D,\<lambda>m \<in> nat. M`n`m), y)" proof (simp add: isub_def, safe) fix n assume DM: "matrix(D, M)"and D: "cpo(D)"and n: "n \ nat" and y: "y \ set(D)" and rel: "\n\nat. rel(D, M ` n ` n, y)" have"rel(D, lub(D, M ` n), y)" proof (rule matrix_chain_left [THEN cpo_lub, THEN islub_least], simp_all add: n D DM) show"isub(D, M ` n, y)" proof (unfold isub_def, intro conjI ballI y) fix k assume k: "k \ nat" show"rel(D, M ` n ` k, y)" proof (cases "n \ k") case True hence yy: "rel(D, M`n`k, M`k`k)" by (blast intro: lemma2 n k y DM D chain_rel_gen matrix_chain_right) show"?thesis" by (rule cpo_trans [OF D yy],
simp_all add: k rel n y DM matrix_in) next case False hence le: "k \ n" by (blast intro: not_le_iff_lt [THEN iffD1, THEN leI] nat_into_Ord n k) show"?thesis" by (rule cpo_trans [OF D chain_rel_gen [OF le]],
simp_all add: n y k rel DM D matrix_chain_left) qed qed qed moreover have"M ` n \ nat \ set(D)" by (blast intro: DM n matrix_fun [THEN apply_type]) ultimatelyshow"rel(D, lub(D, Lambda(nat, (`)(M ` n))), y)"by simp qed
lemma matrix_chain_lub: "\matrix(D,M); cpo(D)\ \ chain(D,\n \ nat. lub(D,\m \ nat. M`n`m))" proof (simp add: chain_def, intro conjI ballI) assume"matrix(D, M)""cpo(D)" thus"(\x\nat. lub(D, Lambda(nat, (`)(M ` x)))) \ nat \ set(D)" by (force intro: islub_in cpo_lub chainI lam_type matrix_in matrix_rel_0_1) next fix n assume DD: "matrix(D, M)""cpo(D)""n \ nat" hence"dominate(D, M ` n, M ` succ(n))" by (force simp add: dominate_def intro: matrix_rel_1_0) with DD show"rel(D, lub(D, Lambda(nat, (`)(M ` n))),
lub(D, Lambda(nat, (`)(M ` succ(n)))))" by (simp add: matrix_chain_left [THEN chain_fun, THEN eta]
dominate_islub cpo_lub matrix_chain_left chain_fun) qed
lemma isub_eq: assumes DM: "matrix(D, M)"and D: "cpo(D)" shows"isub(D,(\n \ nat. lub(D,\m \ nat. M`n`m)),y) \ isub(D,(\n \ nat. M`n`n),y)" proof assume isub: "isub(D, \n\nat. lub(D, Lambda(nat, (`)(M ` n))), y)" hence dom: "dominate(D, \n\nat. M ` n ` n, \n\nat. lub(D, Lambda(nat, (`)(M ` n))))" using DM D by (simp add: dominate_def, intro ballI bexI,
simp_all add: matrix_chain_left [THEN chain_fun, THEN eta] islub_ub cpo_lub matrix_chain_left) thus"isub(D, \n\nat. M ` n ` n, y)" using DM D by - (rule dominate_isub [OF dom isub],
simp_all add: matrix_chain_diag chain_fun matrix_chain_lub) next assume isub: "isub(D, \n\nat. M ` n ` n, y)" thus"isub(D, \n\nat. lub(D, Lambda(nat, (`)(M ` n))), y)" using DM D by (simp add: isub_lemma) qed
(*----------------------------------------------------------------------*) (* I/E/D rules for mono and cont. *) (*----------------------------------------------------------------------*)
lemma monoI: "\f \ set(D)->set(E); \<And>x y. \<lbrakk>rel(D,x,y); x \<in> set(D); y \<in> set(D)\<rbrakk> \<Longrightarrow> rel(E,f`x,f`y)\<rbrakk> \<Longrightarrow> f \<in> mono(D,E)" by (simp add: mono_def)
lemma mono_fun: "f \ mono(D,E) \ f \ set(D)->set(E)" by (simp add: mono_def)
lemma mono_map: "\f \ mono(D,E); x \ set(D)\ \ f`x \ set(E)" by (blast intro!: mono_fun [THEN apply_type])
lemma mono_mono: "\f \ mono(D,E); rel(D,x,y); x \ set(D); y \ set(D)\ \ rel(E,f`x,f`y)" by (simp add: mono_def)
lemma contI: "\f \ set(D)->set(E); \<And>x y. \<lbrakk>rel(D,x,y); x \<in> set(D); y \<in> set(D)\<rbrakk> \<Longrightarrow> rel(E,f`x,f`y); \<And>X. chain(D,X) \<Longrightarrow> f`lub(D,X) = lub(E,\<lambda>n \<in> nat. f`(X`n))\<rbrakk> \<Longrightarrow> f \<in> cont(D,E)" by (simp add: cont_def mono_def)
lemma cont2mono: "f \ cont(D,E) \ f \ mono(D,E)" by (simp add: cont_def)
(*----------------------------------------------------------------------*) (* I/E/D rules about (set+rel) cf, the continuous function space. *) (*----------------------------------------------------------------------*)
(* The following development more difficult with cpo-as-relation approach. *)
lemma cf_cont: "f \ set(cf(D,E)) \ f \ cont(D,E)" by (simp add: set_def cf_def)
lemma cont_cf: (* Non-trivial with relation *) "f \ cont(D,E) \ f \ set(cf(D,E))" by (simp add: set_def cf_def)
(* rel_cf originally an equality. Now stated as two rules. Seemed easiest. *)
lemma rel_cfI: "\\x. x \ set(D) \ rel(E,f`x,g`x); f \ cont(D,E); g \ cont(D,E)\ \<Longrightarrow> rel(cf(D,E),f,g)" by (simp add: rel_I cf_def)
lemma rel_cf: "\rel(cf(D,E),f,g); x \ set(D)\ \ rel(E,f`x,g`x)" by (simp add: rel_def cf_def)
(*----------------------------------------------------------------------*) (* Theorems about the continuous function space. *) (*----------------------------------------------------------------------*)
lemma chain_cf_lub_cont: assumes ch: "chain(cf(D,E),X)"and D: "cpo(D)"and E: "cpo(E)" shows"(\x \ set(D). lub(E, \n \ nat. X ` n ` x)) \ cont(D, E)" proof (rule contI) show"(\x\set(D). lub(E, \n\nat. X ` n ` x)) \ set(D) \ set(E)" by (blast intro: lam_type chain_cf [THEN cpo_lub, THEN islub_in] ch E) next fix x y assume xy: "rel(D, x, y)""x \ set(D)" "y \ set(D)" hence dom: "dominate(E, \n\nat. X ` n ` x, \n\nat. X ` n ` y)" by (force intro: dominateI chain_in [OF ch, THEN cf_cont, THEN cont_mono]) note chE = chain_cf [OF ch] from xy show"rel(E, (\x\set(D). lub(E, \n\nat. X ` n ` x)) ` x,
(\<lambda>x\<in>set(D). lub(E, \<lambda>n\<in>nat. X ` n ` x)) ` y)" by (simp add: dominate_islub [OF dom] cpo_lub [OF chE] E chain_fun [OF chE]) next fix Y assume chDY: "chain(D,Y)" have"lub(E, \x\nat. lub(E, \y\nat. X ` x ` (Y ` y))) =
lub(E, \<lambda>x\<in>nat. X ` x ` (Y ` x))" using matrix_lemma [THEN lub_matrix_diag, OF ch chDY] by (simp add: D E) alsohave"... = lub(E, \x\nat. lub(E, \n\nat. X ` n ` (Y ` x)))" using matrix_lemma [THEN lub_matrix_diag_sym, OF ch chDY] by (simp add: D E) finallyhave"lub(E, \x\nat. lub(E, \n\nat. X ` x ` (Y ` n))) =
lub(E, \<lambda>x\<in>nat. lub(E, \<lambda>n\<in>nat. X ` n ` (Y ` x)))" . thus"(\x\set(D). lub(E, \n\nat. X ` n ` x)) ` lub(D, Y) =
lub(E, \<lambda>n\<in>nat. (\<lambda>x\<in>set(D). lub(E, \<lambda>n\<in>nat. X ` n ` x)) ` (Y ` n))" by (simp add: cpo_lub [THEN islub_in] D chDY
chain_in [THEN cf_cont, THEN cont_lub, OF ch]) qed
(*----------------------------------------------------------------------*) (* Theorems about projpair. *) (*----------------------------------------------------------------------*)
lemma projpairI: "\e \ cont(D,E); p \ cont(E,D); p O e = id(set(D));
rel(cf(E,E))(e O p)(id(set(E)))\<rbrakk> \<Longrightarrow> projpair(D,E,e,p)" by (simp add: projpair_def)
lemma projpair_e_cont: "projpair(D,E,e,p) \ e \ cont(D,E)" by (simp add: projpair_def)
lemma projpair_p_cont: "projpair(D,E,e,p) \ p \ cont(E,D)" by (simp add: projpair_def)
lemma projpair_ep_cont: "projpair(D,E,e,p) \ e \ cont(D,E) \ p \ cont(E,D)" by (simp add: projpair_def)
lemma projpair_eq: "projpair(D,E,e,p) \ p O e = id(set(D))" by (simp add: projpair_def)
lemma projpair_rel: "projpair(D,E,e,p) \ rel(cf(E,E))(e O p)(id(set(E)))" by (simp add: projpair_def)
(*----------------------------------------------------------------------*) (* NB! projpair_e_cont and projpair_p_cont cannot be used repeatedly *) (* at the same time since both match a goal of the form f \<in> cont(X,Y).*) (*----------------------------------------------------------------------*)
(*----------------------------------------------------------------------*) (* Uniqueness of embedding projection pairs. *) (*----------------------------------------------------------------------*)
lemma projpair_unique_aux1: "\cpo(D); cpo(E); projpair(D,E,e,p); projpair(D,E,e',p');
rel(cf(D,E),e,e')\ \ rel(cf(E,D),p',p)" apply (rule_tac b=p' in
projpair_p_cont [THEN cont_fun, THEN id_comp, THEN subst], assumption) apply (rule projpair_eq [THEN subst], assumption) apply (rule cpo_trans) apply (assumption | rule cpo_cf)+ (* The following corresponds to EXISTS_TAC, non-trivial instantiation. *) apply (rule_tac [4] f = "p O (e' O p')"in cont_cf) apply (subst comp_assoc) apply (blast intro: cpo_cf cont_cf comp_mono comp_pres_cont
dest: projpair_ep_cont) apply (rule_tac P = "\x. rel (cf (E,D),p O e' O p',x)" in projpair_p_cont [THEN cont_fun, THEN comp_id, THEN subst],
assumption) apply (rule comp_mono) apply (blast intro: cpo_cf cont_cf comp_pres_cont projpair_rel
dest: projpair_ep_cont)+ done
text\<open>Proof's very like the previous one. Is there a pattern that
could be exploited?\<close> lemma projpair_unique_aux2: "\cpo(D); cpo(E); projpair(D,E,e,p); projpair(D,E,e',p');
rel(cf(E,D),p',p)\ \ rel(cf(D,E),e,e')" apply (rule_tac b=e in projpair_e_cont [THEN cont_fun, THEN comp_id, THEN subst],
assumption) apply (rule_tac e1=e' in projpair_eq [THEN subst], assumption) apply (rule cpo_trans) apply (assumption | rule cpo_cf)+ apply (rule_tac [4] f = "(e O p) O e'"in cont_cf) apply (subst comp_assoc) apply (blast intro: cpo_cf cont_cf comp_mono comp_pres_cont
dest: projpair_ep_cont) apply (rule_tac P = "\x. rel (cf (D,E), (e O p) O e',x)" in projpair_e_cont [THEN cont_fun, THEN id_comp, THEN subst],
assumption) apply (blast intro: cpo_cf cont_cf comp_pres_cont projpair_rel comp_mono
dest: projpair_ep_cont)+ done
(* Considerably shorter, only partly due to a simpler comp_assoc. *) (* Proof in HOL-ST: 70 lines (minus 14 due to comp_assoc complication). *) (* Proof in Isa/ZF: 23 lines (compared to 56: 60% reduction). *)
(*----------------------------------------------------------------------*) (* The notion of subcpo. *) (*----------------------------------------------------------------------*)
lemma subcpoI: "\set(D)<=set(E); \<And>x y. \<lbrakk>x \<in> set(D); y \<in> set(D)\<rbrakk> \<Longrightarrow> rel(D,x,y)\<longleftrightarrow>rel(E,x,y); \<And>X. chain(D,X) \<Longrightarrow> lub(E,X) \<in> set(D)\<rbrakk> \<Longrightarrow> subcpo(D,E)" by (simp add: subcpo_def)
lemma subcpo_subset: "subcpo(D,E) \ set(D)<=set(E)" by (simp add: subcpo_def)
lemma subcpo_rel_eq: "\subcpo(D,E); x \ set(D); y \ set(D)\ \ rel(D,x,y)\rel(E,x,y)" by (simp add: subcpo_def)
(*----------------------------------------------------------------------*) (* Making subcpos using mkcpo. *) (*----------------------------------------------------------------------*)
lemma mkcpoI: "\x \ set(D); P(x)\ \ x \ set(mkcpo(D,P))" by (simp add: set_def mkcpo_def)
lemma mkcpoD1: "x \ set(mkcpo(D,P))\ x \ set(D)" by (simp add: set_def mkcpo_def)
(*----------------------------------------------------------------------*) (* Generalising embedddings D_m -> D_{m+1} to embeddings D_m -> D_n, *) (* defined as eps(DD,ee,m,n), via e_less and e_gr. *) (*----------------------------------------------------------------------*)
lemma comp_mono_eq: "\f=f'; g=g'\ \ f O g = f' O g'" by simp
(* Note the object-level implication for induction on k. This must be removed later to allow the theorems to be used for simp.
Therefore this theorem is only a lemma. *)
lemma e_less_split_add: "\n \ k; emb_chain(DD,ee); m \ nat; n \ nat; k \ nat\ \<Longrightarrow> e_less(DD,ee,m,m#+k) = e_less(DD,ee,m#+n,m#+k) O e_less(DD,ee,m,m#+n)" by (blast intro: e_less_split_add_lemma)
lemma eps_e_less_add: "\m \ nat; n \ nat\ \ eps(DD,ee,m,m#+n) = e_less(DD,ee,m,m#+n)" by (simp add: eps_def add_le_self)
lemma eps_e_less: "\m \ n; m \ nat; n \ nat\ \ eps(DD,ee,m,n) = e_less(DD,ee,m,n)" by (simp add: eps_def)
lemma eps_e_gr_add: "\n \ nat; k \ nat\ \ eps(DD,ee,n#+k,n) = e_gr(DD,ee,n#+k,n)" by (simp add: eps_def e_less_eq e_gr_eq)
lemma eps_e_gr: "\n \ m; m \ nat; n \ nat\ \ eps(DD,ee,m,n) = e_gr(DD,ee,m,n)" apply (erule le_exists) apply (simp_all add: eps_e_gr_add) done
lemma eps_succ_ee: "\\n. n \ nat \ emb(DD`n,DD`succ(n),ee`n); m \ nat\ \<Longrightarrow> eps(DD,ee,m,succ(m)) = ee`m" by (simp add: eps_e_less le_succ_iff e_less_succ_emb)
lemma eps_succ_Rp: "\emb_chain(DD,ee); m \ nat\ \<Longrightarrow> eps(DD,ee,succ(m),m) = Rp(DD`m,DD`succ(m),ee`m)" by (simp add: eps_e_gr le_succ_iff e_gr_succ_emb)
lemma eps_cont: "\emb_chain(DD,ee); m \ nat; n \ nat\ \ eps(DD,ee,m,n): cont(DD`m,DD`n)" apply (rule_tac i = m and j = n in nat_linear_le) apply (simp_all add: eps_e_less e_less_cont eps_e_gr e_gr_cont) done
(* Theorems about splitting. *)
lemma eps_split_add_left: "\n \ k; emb_chain(DD,ee); m \ nat; n \ nat; k \ nat\ \<Longrightarrow> eps(DD,ee,m,m#+k) = eps(DD,ee,m#+n,m#+k) O eps(DD,ee,m,m#+n)" apply (simp add: eps_e_less add_le_self add_le_mono) apply (auto intro: e_less_split_add) done
lemma eps_split_add_left_rev: "\n \ k; emb_chain(DD,ee); m \ nat; n \ nat; k \ nat\ \<Longrightarrow> eps(DD,ee,m,m#+n) = eps(DD,ee,m#+k,m#+n) O eps(DD,ee,m,m#+k)"
--> --------------------
--> maximum size reached
--> --------------------
¤ Dauer der Verarbeitung: 0.63 Sekunden
(vorverarbeitet)
¤
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.