16 by (fast intro: compact_approx) |
16 by (fast intro: compact_approx) |
17 |
17 |
18 lemma compact_Rep_compact_basis: "compact (Rep_compact_basis a)" |
18 lemma compact_Rep_compact_basis: "compact (Rep_compact_basis a)" |
19 by (rule Rep_compact_basis [unfolded mem_Collect_eq]) |
19 by (rule Rep_compact_basis [unfolded mem_Collect_eq]) |
20 |
20 |
21 instantiation compact_basis :: (profinite) sq_ord |
21 instantiation compact_basis :: (profinite) below |
22 begin |
22 begin |
23 |
23 |
24 definition |
24 definition |
25 compact_le_def: |
25 compact_le_def: |
26 "(op \<sqsubseteq>) \<equiv> (\<lambda>x y. Rep_compact_basis x \<sqsubseteq> Rep_compact_basis y)" |
26 "(op \<sqsubseteq>) \<equiv> (\<lambda>x y. Rep_compact_basis x \<sqsubseteq> Rep_compact_basis y)" |
45 by (simp add: Abs_compact_basis_inverse) |
45 by (simp add: Abs_compact_basis_inverse) |
46 |
46 |
47 lemmas approx_Rep_compact_basis = Rep_compact_take [symmetric] |
47 lemmas approx_Rep_compact_basis = Rep_compact_take [symmetric] |
48 |
48 |
49 interpretation compact_basis: |
49 interpretation compact_basis: |
50 basis_take sq_le compact_take |
50 basis_take below compact_take |
51 proof |
51 proof |
52 fix n :: nat and a :: "'a compact_basis" |
52 fix n :: nat and a :: "'a compact_basis" |
53 show "compact_take n a \<sqsubseteq> a" |
53 show "compact_take n a \<sqsubseteq> a" |
54 unfolding compact_le_def |
54 unfolding compact_le_def |
55 by (simp add: Rep_compact_take approx_less) |
55 by (simp add: Rep_compact_take approx_below) |
56 next |
56 next |
57 fix n :: nat and a :: "'a compact_basis" |
57 fix n :: nat and a :: "'a compact_basis" |
58 show "compact_take n (compact_take n a) = compact_take n a" |
58 show "compact_take n (compact_take n a) = compact_take n a" |
59 by (simp add: Rep_compact_basis_inject [symmetric] Rep_compact_take) |
59 by (simp add: Rep_compact_basis_inject [symmetric] Rep_compact_take) |
60 next |
60 next |
91 definition |
91 definition |
92 approximants :: "'a \<Rightarrow> 'a compact_basis set" where |
92 approximants :: "'a \<Rightarrow> 'a compact_basis set" where |
93 "approximants = (\<lambda>x. {a. Rep_compact_basis a \<sqsubseteq> x})" |
93 "approximants = (\<lambda>x. {a. Rep_compact_basis a \<sqsubseteq> x})" |
94 |
94 |
95 interpretation compact_basis: |
95 interpretation compact_basis: |
96 ideal_completion sq_le compact_take Rep_compact_basis approximants |
96 ideal_completion below compact_take Rep_compact_basis approximants |
97 proof |
97 proof |
98 fix w :: 'a |
98 fix w :: 'a |
99 show "preorder.ideal sq_le (approximants w)" |
99 show "preorder.ideal below (approximants w)" |
100 proof (rule sq_le.idealI) |
100 proof (rule below.idealI) |
101 show "\<exists>x. x \<in> approximants w" |
101 show "\<exists>x. x \<in> approximants w" |
102 unfolding approximants_def |
102 unfolding approximants_def |
103 apply (rule_tac x="Abs_compact_basis (approx 0\<cdot>w)" in exI) |
103 apply (rule_tac x="Abs_compact_basis (approx 0\<cdot>w)" in exI) |
104 apply (simp add: Abs_compact_basis_inverse approx_less) |
104 apply (simp add: Abs_compact_basis_inverse approx_below) |
105 done |
105 done |
106 next |
106 next |
107 fix x y :: "'a compact_basis" |
107 fix x y :: "'a compact_basis" |
108 assume "x \<in> approximants w" "y \<in> approximants w" |
108 assume "x \<in> approximants w" "y \<in> approximants w" |
109 thus "\<exists>z \<in> approximants w. x \<sqsubseteq> z \<and> y \<sqsubseteq> z" |
109 thus "\<exists>z \<in> approximants w. x \<sqsubseteq> z \<and> y \<sqsubseteq> z" |
114 apply (drule profinite_compact_eq_approx) |
114 apply (drule profinite_compact_eq_approx) |
115 apply (drule profinite_compact_eq_approx) |
115 apply (drule profinite_compact_eq_approx) |
116 apply (clarify, rename_tac i j) |
116 apply (clarify, rename_tac i j) |
117 apply (rule_tac x="Abs_compact_basis (approx (max i j)\<cdot>w)" in exI) |
117 apply (rule_tac x="Abs_compact_basis (approx (max i j)\<cdot>w)" in exI) |
118 apply (simp add: compact_le_def) |
118 apply (simp add: compact_le_def) |
119 apply (simp add: Abs_compact_basis_inverse approx_less) |
119 apply (simp add: Abs_compact_basis_inverse approx_below) |
120 apply (erule subst, erule subst) |
120 apply (erule subst, erule subst) |
121 apply (simp add: monofun_cfun chain_mono [OF chain_approx]) |
121 apply (simp add: monofun_cfun chain_mono [OF chain_approx]) |
122 done |
122 done |
123 next |
123 next |
124 fix x y :: "'a compact_basis" |
124 fix x y :: "'a compact_basis" |
125 assume "x \<sqsubseteq> y" "y \<in> approximants w" thus "x \<in> approximants w" |
125 assume "x \<sqsubseteq> y" "y \<in> approximants w" thus "x \<in> approximants w" |
126 unfolding approximants_def |
126 unfolding approximants_def |
127 apply simp |
127 apply simp |
128 apply (simp add: compact_le_def) |
128 apply (simp add: compact_le_def) |
129 apply (erule (1) trans_less) |
129 apply (erule (1) below_trans) |
130 done |
130 done |
131 qed |
131 qed |
132 next |
132 next |
133 fix Y :: "nat \<Rightarrow> 'a" |
133 fix Y :: "nat \<Rightarrow> 'a" |
134 assume Y: "chain Y" |
134 assume Y: "chain Y" |
135 show "approximants (\<Squnion>i. Y i) = (\<Union>i. approximants (Y i))" |
135 show "approximants (\<Squnion>i. Y i) = (\<Union>i. approximants (Y i))" |
136 unfolding approximants_def |
136 unfolding approximants_def |
137 apply safe |
137 apply safe |
138 apply (simp add: compactD2 [OF compact_Rep_compact_basis Y]) |
138 apply (simp add: compactD2 [OF compact_Rep_compact_basis Y]) |
139 apply (erule trans_less, rule is_ub_thelub [OF Y]) |
139 apply (erule below_trans, rule is_ub_thelub [OF Y]) |
140 done |
140 done |
141 next |
141 next |
142 fix a :: "'a compact_basis" |
142 fix a :: "'a compact_basis" |
143 show "approximants (Rep_compact_basis a) = {b. b \<sqsubseteq> a}" |
143 show "approximants (Rep_compact_basis a) = {b. b \<sqsubseteq> a}" |
144 unfolding approximants_def compact_le_def .. |
144 unfolding approximants_def compact_le_def .. |
146 fix x y :: "'a" |
146 fix x y :: "'a" |
147 assume "approximants x \<subseteq> approximants y" thus "x \<sqsubseteq> y" |
147 assume "approximants x \<subseteq> approximants y" thus "x \<sqsubseteq> y" |
148 apply (subgoal_tac "(\<Squnion>i. approx i\<cdot>x) \<sqsubseteq> y", simp) |
148 apply (subgoal_tac "(\<Squnion>i. approx i\<cdot>x) \<sqsubseteq> y", simp) |
149 apply (rule admD, simp, simp) |
149 apply (rule admD, simp, simp) |
150 apply (drule_tac c="Abs_compact_basis (approx i\<cdot>x)" in subsetD) |
150 apply (drule_tac c="Abs_compact_basis (approx i\<cdot>x)" in subsetD) |
151 apply (simp add: approximants_def Abs_compact_basis_inverse approx_less) |
151 apply (simp add: approximants_def Abs_compact_basis_inverse approx_below) |
152 apply (simp add: approximants_def Abs_compact_basis_inverse) |
152 apply (simp add: approximants_def Abs_compact_basis_inverse) |
153 done |
153 done |
154 qed |
154 qed |
155 |
155 |
156 text {* minimal compact element *} |
156 text {* minimal compact element *} |
286 apply (subgoal_tac "\<exists>n. \<forall>m\<ge>n. pd_take m t = t", fast) |
286 apply (subgoal_tac "\<exists>n. \<forall>m\<ge>n. pd_take m t = t", fast) |
287 apply (induct t rule: pd_basis_induct) |
287 apply (induct t rule: pd_basis_induct) |
288 apply (cut_tac a=a in compact_basis.take_covers) |
288 apply (cut_tac a=a in compact_basis.take_covers) |
289 apply (clarify, rule_tac x=n in exI) |
289 apply (clarify, rule_tac x=n in exI) |
290 apply (clarify, simp) |
290 apply (clarify, simp) |
291 apply (rule antisym_less) |
291 apply (rule below_antisym) |
292 apply (rule compact_basis.take_less) |
292 apply (rule compact_basis.take_less) |
293 apply (drule_tac a=a in compact_basis.take_chain_le) |
293 apply (drule_tac a=a in compact_basis.take_chain_le) |
294 apply simp |
294 apply simp |
295 apply (clarify, rename_tac i j) |
295 apply (clarify, rename_tac i j) |
296 apply (rule_tac x="max i j" in exI, simp) |
296 apply (rule_tac x="max i j" in exI, simp) |