src/HOLCF/CompactBasis.thy
changeset 31076 99fe356cbbc2
parent 30729 461ee3e49ad3
child 35901 12f09bf2c77f
equal deleted inserted replaced
31075:a9d6cf6de9a8 31076:99fe356cbbc2
    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)