diff -r 38677db30cad -r 8c2f449af35a src/HOLCF/Bifinite.thy --- a/src/HOLCF/Bifinite.thy Fri Oct 08 07:39:50 2010 -0700 +++ b/src/HOLCF/Bifinite.thy Sat Oct 09 07:24:49 2010 -0700 @@ -5,7 +5,7 @@ header {* Bifinite domains *} theory Bifinite -imports Algebraic +imports Algebraic Cprod Sprod Ssum Up Lift One Tr begin subsection {* Class of bifinite domains *} @@ -144,7 +144,7 @@ Abs_fin_defl_inverse [unfolded mem_Collect_eq, OF 1]) qed -subsection {* Instance for universal domain type *} +subsection {* The universal domain is bifinite *} instantiation udom :: bifinite begin @@ -178,7 +178,7 @@ end -subsection {* Instance for continuous function space *} +subsection {* Continuous function space is a bifinite domain *} definition cfun_approx :: "nat \ (udom \ udom) \ (udom \ udom)" @@ -237,4 +237,324 @@ "SFP('a::bifinite \ 'b::bifinite) = cfun_sfp\SFP('a)\SFP('b)" by (rule sfp_cfun_def) +subsection {* Cartesian product is a bifinite domain *} + +definition + prod_approx :: "nat \ udom \ udom \ udom \ udom" +where + "prod_approx = (\i. cprod_map\(udom_approx i)\(udom_approx i))" + +lemma prod_approx: "approx_chain prod_approx" +proof (rule approx_chain.intro) + show "chain (\i. prod_approx i)" + unfolding prod_approx_def by simp + show "(\i. prod_approx i) = ID" + unfolding prod_approx_def + by (simp add: lub_distribs cprod_map_ID) + show "\i. finite_deflation (prod_approx i)" + unfolding prod_approx_def + by (intro finite_deflation_cprod_map finite_deflation_udom_approx) +qed + +definition prod_sfp :: "sfp \ sfp \ sfp" +where "prod_sfp = sfp_fun2 prod_approx cprod_map" + +lemma cast_prod_sfp: + "cast\(prod_sfp\A\B) = udom_emb prod_approx oo + cprod_map\(cast\A)\(cast\B) oo udom_prj prod_approx" +unfolding prod_sfp_def +apply (rule cast_sfp_fun2 [OF prod_approx]) +apply (erule (1) finite_deflation_cprod_map) +done + +instantiation prod :: (bifinite, bifinite) bifinite +begin + +definition + "emb = udom_emb prod_approx oo cprod_map\emb\emb" + +definition + "prj = cprod_map\prj\prj oo udom_prj prod_approx" + +definition + "sfp (t::('a \ 'b) itself) = prod_sfp\SFP('a)\SFP('b)" + +instance proof + show "ep_pair emb (prj :: udom \ 'a \ 'b)" + unfolding emb_prod_def prj_prod_def + using ep_pair_udom [OF prod_approx] + by (intro ep_pair_comp ep_pair_cprod_map ep_pair_emb_prj) +next + show "cast\SFP('a \ 'b) = emb oo (prj :: udom \ 'a \ 'b)" + unfolding emb_prod_def prj_prod_def sfp_prod_def cast_prod_sfp + by (simp add: cast_SFP oo_def expand_cfun_eq cprod_map_map) +qed + end + +lemma SFP_prod: + "SFP('a::bifinite \ 'b::bifinite) = prod_sfp\SFP('a)\SFP('b)" +by (rule sfp_prod_def) + +subsection {* Strict product is a bifinite domain *} + +definition + sprod_approx :: "nat \ udom \ udom \ udom \ udom" +where + "sprod_approx = (\i. sprod_map\(udom_approx i)\(udom_approx i))" + +lemma sprod_approx: "approx_chain sprod_approx" +proof (rule approx_chain.intro) + show "chain (\i. sprod_approx i)" + unfolding sprod_approx_def by simp + show "(\i. sprod_approx i) = ID" + unfolding sprod_approx_def + by (simp add: lub_distribs sprod_map_ID) + show "\i. finite_deflation (sprod_approx i)" + unfolding sprod_approx_def + by (intro finite_deflation_sprod_map finite_deflation_udom_approx) +qed + +definition sprod_sfp :: "sfp \ sfp \ sfp" +where "sprod_sfp = sfp_fun2 sprod_approx sprod_map" + +lemma cast_sprod_sfp: + "cast\(sprod_sfp\A\B) = + udom_emb sprod_approx oo + sprod_map\(cast\A)\(cast\B) oo + udom_prj sprod_approx" +unfolding sprod_sfp_def +apply (rule cast_sfp_fun2 [OF sprod_approx]) +apply (erule (1) finite_deflation_sprod_map) +done + +instantiation sprod :: (bifinite, bifinite) bifinite +begin + +definition + "emb = udom_emb sprod_approx oo sprod_map\emb\emb" + +definition + "prj = sprod_map\prj\prj oo udom_prj sprod_approx" + +definition + "sfp (t::('a \ 'b) itself) = sprod_sfp\SFP('a)\SFP('b)" + +instance proof + show "ep_pair emb (prj :: udom \ 'a \ 'b)" + unfolding emb_sprod_def prj_sprod_def + using ep_pair_udom [OF sprod_approx] + by (intro ep_pair_comp ep_pair_sprod_map ep_pair_emb_prj) +next + show "cast\SFP('a \ 'b) = emb oo (prj :: udom \ 'a \ 'b)" + unfolding emb_sprod_def prj_sprod_def sfp_sprod_def cast_sprod_sfp + by (simp add: cast_SFP oo_def expand_cfun_eq sprod_map_map) +qed + +end + +lemma SFP_sprod: + "SFP('a::bifinite \ 'b::bifinite) = sprod_sfp\SFP('a)\SFP('b)" +by (rule sfp_sprod_def) + +subsection {* Lifted cpo is a bifinite domain *} + +definition u_approx :: "nat \ udom\<^sub>\ \ udom\<^sub>\" +where "u_approx = (\i. u_map\(udom_approx i))" + +lemma u_approx: "approx_chain u_approx" +proof (rule approx_chain.intro) + show "chain (\i. u_approx i)" + unfolding u_approx_def by simp + show "(\i. u_approx i) = ID" + unfolding u_approx_def + by (simp add: lub_distribs u_map_ID) + show "\i. finite_deflation (u_approx i)" + unfolding u_approx_def + by (intro finite_deflation_u_map finite_deflation_udom_approx) +qed + +definition u_sfp :: "sfp \ sfp" +where "u_sfp = sfp_fun1 u_approx u_map" + +lemma cast_u_sfp: + "cast\(u_sfp\A) = + udom_emb u_approx oo u_map\(cast\A) oo udom_prj u_approx" +unfolding u_sfp_def +apply (rule cast_sfp_fun1 [OF u_approx]) +apply (erule finite_deflation_u_map) +done + +instantiation u :: (bifinite) bifinite +begin + +definition + "emb = udom_emb u_approx oo u_map\emb" + +definition + "prj = u_map\prj oo udom_prj u_approx" + +definition + "sfp (t::'a u itself) = u_sfp\SFP('a)" + +instance proof + show "ep_pair emb (prj :: udom \ 'a u)" + unfolding emb_u_def prj_u_def + using ep_pair_udom [OF u_approx] + by (intro ep_pair_comp ep_pair_u_map ep_pair_emb_prj) +next + show "cast\SFP('a u) = emb oo (prj :: udom \ 'a u)" + unfolding emb_u_def prj_u_def sfp_u_def cast_u_sfp + by (simp add: cast_SFP oo_def expand_cfun_eq u_map_map) +qed + +end + +lemma SFP_u: "SFP('a::bifinite u) = u_sfp\SFP('a)" +by (rule sfp_u_def) + +subsection {* Lifted countable types are bifinite domains *} + +definition + lift_approx :: "nat \ 'a::countable lift \ 'a lift" +where + "lift_approx = (\i. FLIFT x. if to_nat x < i then Def x else \)" + +lemma chain_lift_approx [simp]: "chain lift_approx" + unfolding lift_approx_def + by (rule chainI, simp add: FLIFT_mono) + +lemma lub_lift_approx [simp]: "(\i. lift_approx i) = ID" +apply (rule ext_cfun) +apply (simp add: contlub_cfun_fun) +apply (simp add: lift_approx_def) +apply (case_tac x, simp) +apply (rule thelubI) +apply (rule is_lubI) +apply (rule ub_rangeI, simp) +apply (drule ub_rangeD) +apply (erule rev_below_trans) +apply simp +apply (rule lessI) +done + +lemma finite_deflation_lift_approx: "finite_deflation (lift_approx i)" +proof + fix x + show "lift_approx i\x \ x" + unfolding lift_approx_def + by (cases x, simp, simp) + show "lift_approx i\(lift_approx i\x) = lift_approx i\x" + unfolding lift_approx_def + by (cases x, simp, simp) + show "finite {x::'a lift. lift_approx i\x = x}" + proof (rule finite_subset) + let ?S = "insert (\::'a lift) (Def ` to_nat -` {..x = x} \ ?S" + unfolding lift_approx_def + by (rule subsetI, case_tac x, simp, simp split: split_if_asm) + show "finite ?S" + by (simp add: finite_vimageI) + qed +qed + +lemma lift_approx: "approx_chain lift_approx" +using chain_lift_approx lub_lift_approx finite_deflation_lift_approx +by (rule approx_chain.intro) + +instantiation lift :: (countable) bifinite +begin + +definition + "emb = udom_emb lift_approx" + +definition + "prj = udom_prj lift_approx" + +definition + "sfp (t::'a lift itself) = + (\i. sfp_principal (Abs_fin_defl (emb oo lift_approx i oo prj)))" + +instance proof + show ep: "ep_pair emb (prj :: udom \ 'a lift)" + unfolding emb_lift_def prj_lift_def + by (rule ep_pair_udom [OF lift_approx]) + show "cast\SFP('a lift) = emb oo (prj :: udom \ 'a lift)" + unfolding sfp_lift_def + apply (subst contlub_cfun_arg) + apply (rule chainI) + apply (rule sfp.principal_mono) + apply (simp add: below_fin_defl_def) + apply (simp add: Abs_fin_defl_inverse finite_deflation_lift_approx + ep_pair.finite_deflation_e_d_p [OF ep]) + apply (intro monofun_cfun below_refl) + apply (rule chainE) + apply (rule chain_lift_approx) + apply (subst cast_sfp_principal) + apply (simp add: Abs_fin_defl_inverse finite_deflation_lift_approx + ep_pair.finite_deflation_e_d_p [OF ep] lub_distribs) + done +qed + +end + +subsection {* Strict sum is a bifinite domain *} + +definition + ssum_approx :: "nat \ udom \ udom \ udom \ udom" +where + "ssum_approx = (\i. ssum_map\(udom_approx i)\(udom_approx i))" + +lemma ssum_approx: "approx_chain ssum_approx" +proof (rule approx_chain.intro) + show "chain (\i. ssum_approx i)" + unfolding ssum_approx_def by simp + show "(\i. ssum_approx i) = ID" + unfolding ssum_approx_def + by (simp add: lub_distribs ssum_map_ID) + show "\i. finite_deflation (ssum_approx i)" + unfolding ssum_approx_def + by (intro finite_deflation_ssum_map finite_deflation_udom_approx) +qed + +definition ssum_sfp :: "sfp \ sfp \ sfp" +where "ssum_sfp = sfp_fun2 ssum_approx ssum_map" + +lemma cast_ssum_sfp: + "cast\(ssum_sfp\A\B) = + udom_emb ssum_approx oo ssum_map\(cast\A)\(cast\B) oo udom_prj ssum_approx" +unfolding ssum_sfp_def +apply (rule cast_sfp_fun2 [OF ssum_approx]) +apply (erule (1) finite_deflation_ssum_map) +done + +instantiation ssum :: (bifinite, bifinite) bifinite +begin + +definition + "emb = udom_emb ssum_approx oo ssum_map\emb\emb" + +definition + "prj = ssum_map\prj\prj oo udom_prj ssum_approx" + +definition + "sfp (t::('a \ 'b) itself) = ssum_sfp\SFP('a)\SFP('b)" + +instance proof + show "ep_pair emb (prj :: udom \ 'a \ 'b)" + unfolding emb_ssum_def prj_ssum_def + using ep_pair_udom [OF ssum_approx] + by (intro ep_pair_comp ep_pair_ssum_map ep_pair_emb_prj) +next + show "cast\SFP('a \ 'b) = emb oo (prj :: udom \ 'a \ 'b)" + unfolding emb_ssum_def prj_ssum_def sfp_ssum_def cast_ssum_sfp + by (simp add: cast_SFP oo_def expand_cfun_eq ssum_map_map) +qed + +end + +lemma SFP_ssum: + "SFP('a::bifinite \ 'b::bifinite) = ssum_sfp\SFP('a)\SFP('b)" +by (rule sfp_ssum_def) + +end