src/HOLCF/CompactBasis.thy
changeset 27289 c49d427867aa
parent 27288 274b80691259
child 27297 2c42b1505f25
--- a/src/HOLCF/CompactBasis.thy	Thu Jun 19 22:43:59 2008 +0200
+++ b/src/HOLCF/CompactBasis.thy	Thu Jun 19 22:50:58 2008 +0200
@@ -240,7 +240,7 @@
 lemma principal_less_iff_mem_rep: "principal a \<sqsubseteq> x \<longleftrightarrow> a \<in> rep x"
 by (simp add: rep_eq)
 
-lemma principal_less_iff: "principal a \<sqsubseteq> principal b \<longleftrightarrow> a \<preceq> b"
+lemma principal_less_iff [simp]: "principal a \<sqsubseteq> principal b \<longleftrightarrow> a \<preceq> b"
 by (simp add: principal_less_iff_mem_rep rep_principal)
 
 lemma principal_eq_iff: "principal a = principal b \<longleftrightarrow> a \<preceq> b \<and> b \<preceq> a"
@@ -250,7 +250,7 @@
 by (simp add: rep_eq)
 
 lemma principal_mono: "a \<preceq> b \<Longrightarrow> principal a \<sqsubseteq> principal b"
-by (simp add: principal_less_iff)
+by (simp only: principal_less_iff)
 
 lemma lessI: "(\<And>a. principal a \<sqsubseteq> x \<Longrightarrow> principal a \<sqsubseteq> u) \<Longrightarrow> x \<sqsubseteq> u"
 unfolding principal_less_iff_mem_rep
@@ -316,7 +316,7 @@
  apply (erule imageI)
 done
 
-lemma compact_principal: "compact (principal a)"
+lemma compact_principal [simp]: "compact (principal a)"
 by (rule compactI2, simp add: principal_less_iff_mem_rep rep_contlub)
 
 definition
@@ -392,6 +392,16 @@
  apply (clarify, simp add: P)
 done
 
+lemma principal_induct2:
+  "\<lbrakk>\<And>y. adm (\<lambda>x. P x y); \<And>x. adm (\<lambda>y. P x y);
+    \<And>a b. P (principal a) (principal b)\<rbrakk> \<Longrightarrow> P x y"
+apply (rule_tac x=y in spec)
+apply (rule_tac x=x in principal_induct, simp)
+apply (rule allI, rename_tac y)
+apply (rule_tac x=y in principal_induct, simp)
+apply simp
+done
+
 lemma compact_imp_principal: "compact x \<Longrightarrow> \<exists>a. x = principal a"
 apply (drule adm_compact_neq [OF _ cont_id])
 apply (drule admD2 [where Y="\<lambda>n. completion_approx n\<cdot>x"])
@@ -412,17 +422,9 @@
 typedef (open) 'a compact_basis = "{x::'a::profinite. compact x}"
 by (fast intro: compact_approx)
 
-lemma compact_Rep_compact_basis [simp]: "compact (Rep_compact_basis a)"
+lemma compact_Rep_compact_basis: "compact (Rep_compact_basis a)"
 by (rule Rep_compact_basis [unfolded mem_Collect_eq])
 
-lemma Rep_Abs_compact_basis_approx [simp]:
-  "Rep_compact_basis (Abs_compact_basis (approx n\<cdot>x)) = approx n\<cdot>x"
-by (rule Abs_compact_basis_inverse, simp)
-
-lemma compact_imp_Rep_compact_basis:
-  "compact x \<Longrightarrow> \<exists>y. x = Rep_compact_basis y"
-by (rule exI, rule Abs_compact_basis_inverse [symmetric], simp)
-
 instantiation compact_basis :: (profinite) sq_ord
 begin
 
@@ -438,81 +440,7 @@
 by (rule typedef_po
     [OF type_definition_compact_basis compact_le_def])
 
-text {* minimal compact element *}
-
-definition
-  compact_bot :: "'a::bifinite compact_basis" where
-  "compact_bot = Abs_compact_basis \<bottom>"
-
-lemma Rep_compact_bot: "Rep_compact_basis compact_bot = \<bottom>"
-unfolding compact_bot_def by (simp add: Abs_compact_basis_inverse)
-
-lemma compact_minimal [simp]: "compact_bot \<sqsubseteq> a"
-unfolding compact_le_def Rep_compact_bot by simp
-
-text {* compacts *}
-
-definition
-  compacts :: "'a \<Rightarrow> 'a compact_basis set" where
-  "compacts = (\<lambda>x. {a. Rep_compact_basis a \<sqsubseteq> x})"
-
-lemma ideal_compacts: "sq_le.ideal (compacts w)"
-unfolding compacts_def
- apply (rule sq_le.idealI)
-   apply (rule_tac x="Abs_compact_basis (approx 0\<cdot>w)" in exI)
-   apply (simp add: approx_less)
-  apply simp
-  apply (cut_tac a=x in compact_Rep_compact_basis)
-  apply (cut_tac a=y in compact_Rep_compact_basis)
-  apply (drule bifinite_compact_eq_approx)
-  apply (drule bifinite_compact_eq_approx)
-  apply (clarify, rename_tac i j)
-  apply (rule_tac x="Abs_compact_basis (approx (max i j)\<cdot>w)" in exI)
-  apply (simp add: approx_less compact_le_def)
-  apply (erule subst, erule subst)
-  apply (simp add: monofun_cfun chain_mono [OF chain_approx])
- apply (simp add: compact_le_def)
- apply (erule (1) trans_less)
-done
-
-lemma compacts_Rep_compact_basis:
-  "compacts (Rep_compact_basis b) = {a. a \<sqsubseteq> b}"
-unfolding compacts_def compact_le_def ..
-
-lemma cont_compacts: "cont compacts"
-unfolding compacts_def
-apply (rule contI2)
-apply (rule monofunI)
-apply (simp add: set_cpo_simps)
-apply (fast intro: trans_less)
-apply (simp add: set_cpo_simps)
-apply clarify
-apply simp
-apply (erule (1) compactD2 [OF compact_Rep_compact_basis])
-done
-
-lemma compacts_lessD: "compacts x \<subseteq> compacts y \<Longrightarrow> x \<sqsubseteq> y"
-apply (subgoal_tac "(\<Squnion>i. approx i\<cdot>x) \<sqsubseteq> y", simp)
-apply (rule admD, simp, simp)
-apply (drule_tac c="Abs_compact_basis (approx i\<cdot>x)" in subsetD)
-apply (simp add: compacts_def Abs_compact_basis_inverse approx_less)
-apply (simp add: compacts_def Abs_compact_basis_inverse)
-done
-
-lemma compacts_mono: "x \<sqsubseteq> y \<Longrightarrow> compacts x \<subseteq> compacts y"
-unfolding compacts_def by (fast intro: trans_less)
-
-lemma less_compact_basis_iff: "(x \<sqsubseteq> y) = (compacts x \<subseteq> compacts y)"
-by (rule iffI [OF compacts_mono compacts_lessD])
-
-lemma compact_basis_induct:
-  "\<lbrakk>adm P; \<And>a. P (Rep_compact_basis a)\<rbrakk> \<Longrightarrow> P x"
-apply (erule approx_induct)
-apply (drule_tac x="Abs_compact_basis (approx n\<cdot>x)" in meta_spec)
-apply (simp add: Abs_compact_basis_inverse)
-done
-
-text {* approximation on compact bases *}
+text {* Take function for compact basis *}
 
 definition
   compact_approx :: "nat \<Rightarrow> 'a compact_basis \<Rightarrow> 'a compact_basis" where
@@ -525,84 +453,128 @@
 
 lemmas approx_Rep_compact_basis = Rep_compact_approx [symmetric]
 
-lemma compact_approx_le: "compact_approx n a \<sqsubseteq> a"
-unfolding compact_le_def
-by (simp add: Rep_compact_approx approx_less)
-
-lemma compact_approx_mono1:
-  "i \<le> j \<Longrightarrow> compact_approx i a \<sqsubseteq> compact_approx j a"
-unfolding compact_le_def
-apply (simp add: Rep_compact_approx)
-apply (rule chain_mono, simp, assumption)
-done
-
-lemma compact_approx_mono:
-  "a \<sqsubseteq> b \<Longrightarrow> compact_approx n a \<sqsubseteq> compact_approx n b"
-unfolding compact_le_def
-apply (simp add: Rep_compact_approx)
-apply (erule monofun_cfun_arg)
-done
+interpretation compact_basis:
+  basis_take [sq_le compact_approx]
+proof
+  fix n :: nat and a :: "'a compact_basis"
+  show "compact_approx n a \<sqsubseteq> a"
+    unfolding compact_le_def
+    by (simp add: Rep_compact_approx approx_less)
+next
+  fix n :: nat and a :: "'a compact_basis"
+  show "compact_approx n (compact_approx n a) = compact_approx n a"
+    by (simp add: Rep_compact_basis_inject [symmetric] Rep_compact_approx)
+next
+  fix n :: nat and a b :: "'a compact_basis"
+  assume "a \<sqsubseteq> b" thus "compact_approx n a \<sqsubseteq> compact_approx n b"
+    unfolding compact_le_def Rep_compact_approx
+    by (rule monofun_cfun_arg)
+next
+  fix n :: nat and a :: "'a compact_basis"
+  show "\<And>n a. compact_approx n a \<sqsubseteq> compact_approx (Suc n) a"
+    unfolding compact_le_def Rep_compact_approx
+    by (rule chainE, simp)
+next
+  fix n :: nat
+  show "finite (range (compact_approx n))"
+    apply (rule finite_imageD [where f="Rep_compact_basis"])
+    apply (rule finite_subset [where B="range (\<lambda>x. approx n\<cdot>x)"])
+    apply (clarsimp simp add: Rep_compact_approx)
+    apply (rule finite_range_approx)
+    apply (rule inj_onI, simp add: Rep_compact_basis_inject)
+    done
+next
+  fix a :: "'a compact_basis"
+  show "\<exists>n. compact_approx n a = a"
+    apply (simp add: Rep_compact_basis_inject [symmetric])
+    apply (simp add: Rep_compact_approx)
+    apply (rule bifinite_compact_eq_approx)
+    apply (rule compact_Rep_compact_basis)
+    done
+qed
 
-lemma ex_compact_approx_eq: "\<exists>n. compact_approx n a = a"
-apply (simp add: Rep_compact_basis_inject [symmetric])
-apply (simp add: Rep_compact_approx)
-apply (rule bifinite_compact_eq_approx)
-apply (rule compact_Rep_compact_basis)
-done
-
-lemma compact_approx_idem:
-  "compact_approx n (compact_approx n a) = compact_approx n a"
-apply (rule Rep_compact_basis_inject [THEN iffD1])
-apply (simp add: Rep_compact_approx)
-done
+text {* Ideal completion *}
 
-lemma finite_fixes_compact_approx: "finite {a. compact_approx n a = a}"
-apply (subgoal_tac "finite (Rep_compact_basis ` {a. compact_approx n a = a})")
-apply (erule finite_imageD)
-apply (rule inj_onI, simp add: Rep_compact_basis_inject)
-apply (rule finite_subset [OF _ finite_fixes_approx [where i=n]])
-apply (rule subsetI, clarify, rename_tac a)
-apply (simp add: Rep_compact_basis_inject [symmetric])
-apply (simp add: Rep_compact_approx)
-done
-
-lemma finite_range_compact_approx: "finite (range (compact_approx n))"
-apply (cut_tac n=n in finite_fixes_compact_approx)
-apply (simp add: idem_fixes_eq_range compact_approx_idem)
-apply (simp add: image_def)
-done
+definition
+  compacts :: "'a \<Rightarrow> 'a compact_basis set" where
+  "compacts = (\<lambda>x. {a. Rep_compact_basis a \<sqsubseteq> x})"
 
 interpretation compact_basis:
   ideal_completion [sq_le compact_approx Rep_compact_basis compacts]
-proof (unfold_locales)
-  fix n :: nat and a b :: "'a compact_basis" and x :: "'a"
-  show "compact_approx n a \<sqsubseteq> a"
-    by (rule compact_approx_le)
-  show "compact_approx n (compact_approx n a) = compact_approx n a"
-    by (rule compact_approx_idem)
-  show "compact_approx n a \<sqsubseteq> compact_approx (Suc n) a"
-    by (rule compact_approx_mono1, simp)
-  show "finite (range (compact_approx n))"
-    by (rule finite_range_compact_approx)
-  show "\<exists>n\<Colon>nat. compact_approx n a = a"
-    by (rule ex_compact_approx_eq)
-  show "preorder.ideal sq_le (compacts x)"
-    by (rule ideal_compacts)
+proof
+  fix w :: 'a
+  show "preorder.ideal sq_le (compacts w)"
+  proof (rule sq_le.idealI)
+    show "\<exists>x. x \<in> compacts w"
+      unfolding compacts_def
+      apply (rule_tac x="Abs_compact_basis (approx 0\<cdot>w)" in exI)
+      apply (simp add: Abs_compact_basis_inverse approx_less)
+      done
+  next
+    fix x y :: "'a compact_basis"
+    assume "x \<in> compacts w" "y \<in> compacts w"
+    thus "\<exists>z \<in> compacts w. x \<sqsubseteq> z \<and> y \<sqsubseteq> z"
+      unfolding compacts_def
+      apply simp
+      apply (cut_tac a=x in compact_Rep_compact_basis)
+      apply (cut_tac a=y in compact_Rep_compact_basis)
+      apply (drule bifinite_compact_eq_approx)
+      apply (drule bifinite_compact_eq_approx)
+      apply (clarify, rename_tac i j)
+      apply (rule_tac x="Abs_compact_basis (approx (max i j)\<cdot>w)" in exI)
+      apply (simp add: compact_le_def)
+      apply (simp add: Abs_compact_basis_inverse approx_less)
+      apply (erule subst, erule subst)
+      apply (simp add: monofun_cfun chain_mono [OF chain_approx])
+      done
+  next
+    fix x y :: "'a compact_basis"
+    assume "x \<sqsubseteq> y" "y \<in> compacts w" thus "x \<in> compacts w"
+      unfolding compacts_def
+      apply simp
+      apply (simp add: compact_le_def)
+      apply (erule (1) trans_less)
+      done
+  qed
+next
   show "cont compacts"
-    by (rule cont_compacts)
-  show "compacts (Rep_compact_basis a) = {b. b \<sqsubseteq> a}"
-    by (rule compacts_Rep_compact_basis)
+    unfolding compacts_def
+    apply (rule contI2)
+    apply (rule monofunI)
+    apply (simp add: set_cpo_simps)
+    apply (fast intro: trans_less)
+    apply (simp add: set_cpo_simps)
+    apply clarify
+    apply simp
+    apply (erule (1) compactD2 [OF compact_Rep_compact_basis])
+    done
 next
-  fix n :: nat and a b :: "'a compact_basis"
-  assume "a \<sqsubseteq> b"
-  thus "compact_approx n a \<sqsubseteq> compact_approx n b"
-    by (rule compact_approx_mono)
+  fix a :: "'a compact_basis"
+  show "compacts (Rep_compact_basis a) = {b. b \<sqsubseteq> a}"
+    unfolding compacts_def compact_le_def ..
 next
   fix x y :: "'a"
   assume "compacts x \<subseteq> compacts y" thus "x \<sqsubseteq> y"
-    by (rule compacts_lessD)
+    apply (subgoal_tac "(\<Squnion>i. approx i\<cdot>x) \<sqsubseteq> y", simp)
+    apply (rule admD, simp, simp)
+    apply (drule_tac c="Abs_compact_basis (approx i\<cdot>x)" in subsetD)
+    apply (simp add: compacts_def Abs_compact_basis_inverse approx_less)
+    apply (simp add: compacts_def Abs_compact_basis_inverse)
+    done
 qed
 
+text {* minimal compact element *}
+
+definition
+  compact_bot :: "'a::bifinite compact_basis" where
+  "compact_bot = Abs_compact_basis \<bottom>"
+
+lemma Rep_compact_bot: "Rep_compact_basis compact_bot = \<bottom>"
+unfolding compact_bot_def by (simp add: Abs_compact_basis_inverse)
+
+lemma compact_minimal [simp]: "compact_bot \<sqsubseteq> a"
+unfolding compact_le_def Rep_compact_bot by simp
+
 
 subsection {* A compact basis for powerdomains *}
 
@@ -705,37 +677,27 @@
 
 lemma approx_pd_idem: "approx_pd n (approx_pd n t) = approx_pd n t"
 apply (induct t rule: pd_basis_induct)
-apply (simp add: compact_approx_idem)
+apply (simp add: compact_basis.take_take)
 apply simp
 done
 
-lemma range_image_f: "range (image f) = Pow (range f)"
-apply (safe, fast)
-apply (rule_tac x="f -` x" in range_eqI)
-apply (simp, fast)
-done
-
 lemma finite_range_approx_pd: "finite (range (approx_pd n))"
-apply (subgoal_tac "finite (Rep_pd_basis ` range (approx_pd n))")
-apply (erule finite_imageD)
+apply (rule finite_imageD [where f="Rep_pd_basis"])
+apply (rule finite_subset [where B="Pow (range (compact_approx n))"])
+apply (clarsimp simp add: Rep_approx_pd)
+apply (simp add: compact_basis.finite_range_take)
 apply (rule inj_onI, simp add: Rep_pd_basis_inject)
-apply (subst image_image)
-apply (subst Rep_approx_pd)
-apply (simp only: range_composition)
-apply (rule finite_subset [OF image_mono [OF subset_UNIV]])
-apply (simp add: range_image_f)
-apply (rule finite_range_compact_approx)
 done
 
-lemma ex_approx_pd_eq: "\<exists>n. approx_pd n t = t"
+lemma approx_pd_covers: "\<exists>n. approx_pd n t = t"
 apply (subgoal_tac "\<exists>n. \<forall>m\<ge>n. approx_pd m t = t", fast)
 apply (induct t rule: pd_basis_induct)
-apply (cut_tac a=a in ex_compact_approx_eq)
+apply (cut_tac a=a in compact_basis.take_covers)
 apply (clarify, rule_tac x=n in exI)
 apply (clarify, simp)
 apply (rule antisym_less)
-apply (rule compact_approx_le)
-apply (drule_tac a=a in compact_approx_mono1)
+apply (rule compact_basis.take_less)
+apply (drule_tac a=a in compact_basis.take_chain_le)
 apply simp
 apply (clarify, rename_tac i j)
 apply (rule_tac x="max i j" in exI, simp)