src/HOL/HOLCF/Library/Defl_Bifinite.thy
changeset 41394 51c866d1b53b
parent 41292 2b7bc8d9fd6e
child 41436 480978f80eae
equal deleted inserted replaced
41393:17bf4ddd0833 41394:51c866d1b53b
   567 subsection {* Chain of approx functions on algebraic deflations *}
   567 subsection {* Chain of approx functions on algebraic deflations *}
   568 
   568 
   569 definition
   569 definition
   570   defl_approx :: "nat \<Rightarrow> 'a defl \<rightarrow> 'a defl"
   570   defl_approx :: "nat \<Rightarrow> 'a defl \<rightarrow> 'a defl"
   571 where
   571 where
   572   "defl_approx = (\<lambda>i. defl.basis_fun (\<lambda>d. defl_principal (fd_take i d)))"
   572   "defl_approx = (\<lambda>i. defl.extension (\<lambda>d. defl_principal (fd_take i d)))"
   573 
   573 
   574 lemma defl_approx_principal:
   574 lemma defl_approx_principal:
   575   "defl_approx i\<cdot>(defl_principal d) = defl_principal (fd_take i d)"
   575   "defl_approx i\<cdot>(defl_principal d) = defl_principal (fd_take i d)"
   576 unfolding defl_approx_def
   576 unfolding defl_approx_def
   577 by (simp add: defl.basis_fun_principal fd_take_mono)
   577 by (simp add: defl.extension_principal fd_take_mono)
   578 
   578 
   579 lemma defl_approx: "approx_chain defl_approx"
   579 lemma defl_approx: "approx_chain defl_approx"
   580 proof
   580 proof
   581   show chain: "chain defl_approx"
   581   show chain: "chain defl_approx"
   582     unfolding defl_approx_def
   582     unfolding defl_approx_def
   583     by (simp add: chainI defl.basis_fun_mono fd_take_mono fd_take_chain)
   583     by (simp add: chainI defl.extension_mono fd_take_mono fd_take_chain)
   584   show idem: "\<And>i x. defl_approx i\<cdot>(defl_approx i\<cdot>x) = defl_approx i\<cdot>x"
   584   show idem: "\<And>i x. defl_approx i\<cdot>(defl_approx i\<cdot>x) = defl_approx i\<cdot>x"
   585     apply (induct_tac x rule: defl.principal_induct, simp)
   585     apply (induct_tac x rule: defl.principal_induct, simp)
   586     apply (simp add: defl_approx_principal fd_take_idem)
   586     apply (simp add: defl_approx_principal fd_take_idem)
   587     done
   587     done
   588   show below: "\<And>i x. defl_approx i\<cdot>x \<sqsubseteq> x"
   588   show below: "\<And>i x. defl_approx i\<cdot>x \<sqsubseteq> x"
   592   show lub: "(\<Squnion>i. defl_approx i) = ID"
   592   show lub: "(\<Squnion>i. defl_approx i) = ID"
   593     apply (rule cfun_eqI, rule below_antisym)
   593     apply (rule cfun_eqI, rule below_antisym)
   594     apply (simp add: contlub_cfun_fun chain lub_below_iff chain below)
   594     apply (simp add: contlub_cfun_fun chain lub_below_iff chain below)
   595     apply (induct_tac x rule: defl.principal_induct, simp)
   595     apply (induct_tac x rule: defl.principal_induct, simp)
   596     apply (simp add: contlub_cfun_fun chain)
   596     apply (simp add: contlub_cfun_fun chain)
   597     apply (simp add: compact_below_lub_iff defl.compact_principal chain)
   597     apply (simp add: compact_below_lub_iff chain)
   598     apply (simp add: defl_approx_principal)
   598     apply (simp add: defl_approx_principal)
   599     apply (subgoal_tac "\<exists>i. fd_take i a = a", metis below_refl)
   599     apply (subgoal_tac "\<exists>i. fd_take i a = a", metis below_refl)
   600     apply (rule fd_take_covers)
   600     apply (rule fd_take_covers)
   601     done
   601     done
   602   show "\<And>i. finite {x. defl_approx i\<cdot>x = x}"
   602   show "\<And>i. finite {x. defl_approx i\<cdot>x = x}"