(* 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. *)
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) ≡ <(∏n ∈ nat. set(DD`n)), {x:(∏n ∈ nat. set(DD`n))*(∏n ∈ nat. set(DD`n)). ∀n ∈ 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 ∈ set(D). P(x)},{x ∈ 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)), λx y. y O Rp(DD`(n#+x),DD`(succ(n#+x)),ee`(n#+x)))"
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 ∈ set(D); z ∈ set(D)]==> 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); ∧x y z. [rel(D,x,y); rel(D,y,z); x ∈ set(D); y ∈ set(D); z ∈ set(D)] ==> rel(D,x,z); ∧x y. [rel(D,x,y); rel(D,y,x); x ∈ set(D); y ∈ set(D)]==> x=y] ==> 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 \==> 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)] ==> 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)] ==> isub(D, λn ∈ nat. lub(D,λm ∈ 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); ∧x y. [rel(D,x,y); x ∈ set(D); y ∈ set(D)]==> rel(E,f`x,f`y)] ==> f ∈ 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); ∧x y. [rel(D,x,y); x ∈ set(D); y ∈ set(D)]==> rel(E,f`x,f`y); ∧X. chain(D,X) ==> f`lub(D,X) = lub(E,λn ∈ nat. f`(X`n))] ==> f ∈ 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)] ==> 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, (λx∈set(D). lub(E, λn∈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, λx∈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, λx∈nat. lub(E, λn∈nat. X ` n ` (Y ` x)))" . thus"(λx∈set(D). lub(E, λn∈nat. X ` n ` x)) ` lub(D, Y) = lub(E, λn∈nat. (λx∈set(D). lub(E, λn∈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)))]==> 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‹Proof's very like the previous one. Is there a pattern that could be exploited?› 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); ∧x y. [x ∈ set(D); y ∈ set(D)]==> rel(D,x,y)⟷rel(E,x,y); ∧X. chain(D,X) ==> lub(E,X) ∈ set(D)]==> 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] ==> 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] ==> 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] ==> 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] ==> 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] ==> eps(DD,ee,m,m#+n) = eps(DD,ee,m#+k,m#+n) O eps(DD,ee,m,m#+k)" apply (simp add: eps_e_less_add eps_e_gr add_le_self add_le_mono) apply (auto intro: e_less_e_gr_split_add) done
lemma eps_split_add_right: "[m ≤ k; emb_chain(DD,ee); m ∈ nat; n ∈ nat; k ∈ nat] ==> eps(DD,ee,n#+k,n) = eps(DD,ee,n#+m,n) O eps(DD,ee,n#+k,n#+m)" apply (simp add: eps_e_gr add_le_self add_le_mono) apply (auto intro: e_gr_split_add) done
lemma eps_split_add_right_rev: "[m ≤ k; emb_chain(DD,ee); m ∈ nat; n ∈ nat; k ∈ nat] ==> eps(DD,ee,n#+m,n) = eps(DD,ee,n#+k,n) O eps(DD,ee,n#+m,n#+k)" apply (simp add: eps_e_gr_add eps_e_less add_le_self add_le_mono) apply (auto intro: e_gr_e_less_split_add) done
(*----------------------------------------------------------------------*) (* That was eps: D_m -> D_n, NEXT rho_emb: D_n -> Dinf. *) (*----------------------------------------------------------------------*)
(* Considerably shorter. *)
lemma rho_emb_fun: "[emb_chain(DD,ee); n ∈ nat] ==> rho_emb(DD,ee,n): set(DD`n) -> set(Dinf(DD,ee))" apply (simp add: rho_emb_def) apply (assumption |
rule lam_type DinfI eps_cont [THEN cont_fun, THEN apply_type])+ apply simp apply (rule_tac i = "succ (na) "and j = n in nat_linear_le) apply blast apply assumption apply (simplesubst eps_split_right_le) 🍋‹Subst would rewrite the lhs. We want to change the rhs.› prefer 2 apply assumption apply simp apply (assumption | rule add_le_self nat_0I nat_succI)+ apply (simp add: eps_succ_Rp) apply (subst comp_fun_apply) apply (assumption |
rule eps_fun nat_succI Rp_cont [THEN cont_fun]
emb_chain_emb emb_chain_cpo refl)+ (* Now the second part of the proof. Slightly different than HOL. *) apply (simp add: eps_e_less nat_succI) apply (erule le_iff [THEN iffD1, THEN disjE]) apply (simp add: e_less_le) apply (subst comp_fun_apply) apply (assumption | rule e_less_cont cont_fun emb_chain_emb emb_cont)+ apply (subst embRp_eq_thm) apply (assumption |
rule emb_chain_emb e_less_cont [THEN cont_fun, THEN apply_type]
emb_chain_cpo nat_succI)+ apply (simp add: eps_e_less) apply (simp add: eps_succ_Rp e_less_eq id_conv nat_succI) done
lemma eps1: "[emb_chain(DD,ee); x ∈ set(Dinf(DD,ee)); m ∈ nat; n ∈ nat] ==> rel(DD`n,eps(DD,ee,m,n)`(x`m),x`n)" apply (simp add: eps_def) apply (blast intro: eps1_aux1 not_le_iff_lt [THEN iffD1, THEN leI, THEN eps1_aux2]
nat_into_Ord) done
(* The following theorem is needed/useful due to type check for rel_cfI, but also elsewhere. Look for occurrences of rel_cfI, rel_DinfI, etc to evaluate the problem. *)
lemma rho_projpair: "[emb_chain(DD,ee); n ∈ nat] ==> projpair(DD`n,Dinf(DD,ee),rho_emb(DD,ee,n),rho_proj(DD,ee,n))" apply (simp add: rho_proj_def) apply (rule projpairI) apply (assumption | rule rho_emb_cont)+ (* lemma used, introduced because same fact needed below due to rel_cfI. *) apply (assumption | rule lam_Dinf_cont)+ (*-----------------------------------------------*) (* This part is 7 lines, but 30 in HOL (75% reduction!) *) apply (rule fun_extension) apply (rule_tac [3] id_conv [THEN ssubst]) apply (rule_tac [4] comp_fun_apply [THEN ssubst]) apply (rule_tac [6] beta [THEN ssubst]) apply (rule_tac [7] rho_emb_id [THEN ssubst]) apply (assumption |
rule comp_fun id_type lam_type rho_emb_fun Dinf_prod [THEN apply_type]
apply_type refl)+ (*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*) apply (rule rel_cfI) (* ----------------\<longrightarrow>>>Yields type cond, not in HOL *) apply (subst id_conv) apply (rule_tac [2] comp_fun_apply [THEN ssubst]) apply (rule_tac [4] beta [THEN ssubst]) apply (rule_tac [5] rho_emb_apply1 [THEN ssubst]) apply (rule_tac [6] rel_DinfI) apply (rule_tac [6] beta [THEN ssubst]) (* Dinf_prod bad with lam_type *) apply (assumption |
rule eps1 lam_type rho_emb_fun eps_fun
Dinf_prod [THEN apply_type] refl)+ apply (assumption |
rule apply_type eps_fun Dinf_prod comp_pres_cont rho_emb_cont
lam_Dinf_cont id_cont cpo_Dinf emb_chain_cpo)+ done
lemma emb_rho_emb: "[emb_chain(DD,ee); n ∈ nat]==> emb(DD`n,Dinf(DD,ee),rho_emb(DD,ee,n))" by (auto simp add: emb_def intro: exI rho_projpair)
lemma rho_proj_cont: "[emb_chain(DD,ee); n ∈ nat] ==> rho_proj(DD,ee,n) ∈ cont(Dinf(DD,ee),DD`n)" by (auto intro: rho_projpair projpair_p_cont)
(*----------------------------------------------------------------------*) (* Commutivity and universality. *) (*----------------------------------------------------------------------*)
lemma commuteI: "[∧n. n ∈ nat ==> emb(DD`n,E,r(n)); ∧m n. [m ≤ n; m ∈ nat; n ∈ nat]==> r(n) O eps(DD,ee,m,n) = r(m)] ==> commute(DD,ee,E,r)" by (simp add: commute_def)
lemma commute_emb [TC]: "[commute(DD,ee,E,r); n ∈ nat]==> emb(DD`n,E,r(n))" by (simp add: commute_def)
lemma commute_eq: "[commute(DD,ee,E,r); m ≤ n; m ∈ nat; n ∈ nat] ==> r(n) O eps(DD,ee,m,n) = r(m) " by (simp add: commute_def)
lemma theta_proj_chain: (* similar proof to theta_chain *) "[commute(DD,ee,E,r); commute(DD,ee,G,f); emb_chain(DD,ee); cpo(E); cpo(G)] ==> chain(cf(G,E),λn ∈ nat. r(n) O Rp(DD`n,G,f(n)))" apply (rule chainI) apply (blast intro: lam_type cont_cf comp_pres_cont commute_emb Rp_cont
emb_cont emb_chain_cpo, simp) apply (rule_tac r1 = r and m1 = n in commute_eq [THEN subst]) apply (rule_tac [5] r1 = f and m1 = n in commute_eq [THEN subst]) apply (assumption | rule le_succ nat_succI)+ apply (subst Rp_comp) apply (assumption | rule emb_eps commute_emb emb_chain_cpo le_succ nat_succI)+ apply (rule comp_assoc [THEN subst]) (* comp_assoc is simpler in Isa *) apply (rule_tac r1 = "r (succ (n))"in comp_assoc [THEN ssubst]) apply (rule comp_mono) apply (blast intro: comp_pres_cont eps_cont emb_eps commute_emb Rp_cont
emb_cont emb_chain_cpo le_succ)+ apply (rule_tac b="r(succ(n))"in comp_id [THEN subst]) (* 1 subst too much *) apply (rule_tac [2] comp_mono) apply (blast intro: comp_pres_cont eps_cont emb_eps emb_id commute_emb
Rp_cont emb_cont cont_fun emb_chain_cpo le_succ)+ apply (subst comp_id) (* Undoes "1 subst too much", typing next anyway *) apply (blast intro: cont_fun Rp_cont emb_cont commute_emb cont_cf cpo_cf
emb_chain_cpo embRp_rel emb_eps le_succ)+ done
(* Simplification with comp_assoc is possible inside a \<lambda>-abstraction, because it does not have assumptions. If it had, as the HOL-ST theorem too strongly has, we would be in deep trouble due to HOL's lack of proper conditional rewriting (a HOL contrib provides something that works). *)
lemma lub_universal_unique: "[mediating(E,G,r,f,t); lub(cf(E,E), λn ∈ nat. r(n) O Rp(DD`n,E,r(n))) = id(set(E)); commute(DD,ee,E,r); commute(DD,ee,G,f); emb_chain(DD,ee); cpo(E); cpo(G)] ==> t = lub(cf(E,G), λn ∈ nat. f(n) O Rp(DD`n,E,r(n)))" apply (rule_tac b = t in comp_id [THEN subst]) apply (erule_tac [2] subst) apply (rule_tac [2] b = t in lub_const [THEN subst]) apply (rule_tac [4] comp_lubs [THEN ssubst]) prefer 9 apply (simp add: comp_assoc mediating_eq) apply (assumption |
rule cont_fun emb_cont mediating_emb cont_cf cpo_cf chain_const
commute_chain emb_chain_cpo)+ done
(*---------------------------------------------------------------------*) (* Dinf yields the inverse_limit, stated as rho_emb_commute and *) (* Dinf_universal. *) (*---------------------------------------------------------------------*)
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.62Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-04-26)
¤
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 und die Messung sind noch experimentell.