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}" |