src/HOLCF/UpperPD.thy
changeset 39986 38677db30cad
parent 39984 0300d5170622
child 39989 ad60d7311f43
equal deleted inserted replaced
39985:310f98585107 39986:38677db30cad
    74 
    74 
    75 typedef (open) 'a upper_pd =
    75 typedef (open) 'a upper_pd =
    76   "{S::'a pd_basis set. upper_le.ideal S}"
    76   "{S::'a pd_basis set. upper_le.ideal S}"
    77 by (fast intro: upper_le.ideal_principal)
    77 by (fast intro: upper_le.ideal_principal)
    78 
    78 
    79 instantiation upper_pd :: (sfp) below
    79 instantiation upper_pd :: (bifinite) below
    80 begin
    80 begin
    81 
    81 
    82 definition
    82 definition
    83   "x \<sqsubseteq> y \<longleftrightarrow> Rep_upper_pd x \<subseteq> Rep_upper_pd y"
    83   "x \<sqsubseteq> y \<longleftrightarrow> Rep_upper_pd x \<subseteq> Rep_upper_pd y"
    84 
    84 
    85 instance ..
    85 instance ..
    86 end
    86 end
    87 
    87 
    88 instance upper_pd :: (sfp) po
    88 instance upper_pd :: (bifinite) po
    89 using type_definition_upper_pd below_upper_pd_def
    89 using type_definition_upper_pd below_upper_pd_def
    90 by (rule upper_le.typedef_ideal_po)
    90 by (rule upper_le.typedef_ideal_po)
    91 
    91 
    92 instance upper_pd :: (sfp) cpo
    92 instance upper_pd :: (bifinite) cpo
    93 using type_definition_upper_pd below_upper_pd_def
    93 using type_definition_upper_pd below_upper_pd_def
    94 by (rule upper_le.typedef_ideal_cpo)
    94 by (rule upper_le.typedef_ideal_cpo)
    95 
    95 
    96 definition
    96 definition
    97   upper_principal :: "'a pd_basis \<Rightarrow> 'a upper_pd" where
    97   upper_principal :: "'a pd_basis \<Rightarrow> 'a upper_pd" where
   106 text {* Upper powerdomain is pointed *}
   106 text {* Upper powerdomain is pointed *}
   107 
   107 
   108 lemma upper_pd_minimal: "upper_principal (PDUnit compact_bot) \<sqsubseteq> ys"
   108 lemma upper_pd_minimal: "upper_principal (PDUnit compact_bot) \<sqsubseteq> ys"
   109 by (induct ys rule: upper_pd.principal_induct, simp, simp)
   109 by (induct ys rule: upper_pd.principal_induct, simp, simp)
   110 
   110 
   111 instance upper_pd :: (sfp) pcpo
   111 instance upper_pd :: (bifinite) pcpo
   112 by intro_classes (fast intro: upper_pd_minimal)
   112 by intro_classes (fast intro: upper_pd_minimal)
   113 
   113 
   114 lemma inst_upper_pd_pcpo: "\<bottom> = upper_principal (PDUnit compact_bot)"
   114 lemma inst_upper_pd_pcpo: "\<bottom> = upper_principal (PDUnit compact_bot)"
   115 by (rule upper_pd_minimal [THEN UU_I, symmetric])
   115 by (rule upper_pd_minimal [THEN UU_I, symmetric])
   116 
   116 
   426     done
   426     done
   427   thus "finite {xs. upper_map\<cdot>d\<cdot>xs = xs}"
   427   thus "finite {xs. upper_map\<cdot>d\<cdot>xs = xs}"
   428     by (rule finite_range_imp_finite_fixes)
   428     by (rule finite_range_imp_finite_fixes)
   429 qed
   429 qed
   430 
   430 
   431 subsection {* Upper powerdomain is an SFP domain *}
   431 subsection {* Upper powerdomain is a bifinite domain *}
   432 
   432 
   433 definition
   433 definition
   434   upper_approx :: "nat \<Rightarrow> udom upper_pd \<rightarrow> udom upper_pd"
   434   upper_approx :: "nat \<Rightarrow> udom upper_pd \<rightarrow> udom upper_pd"
   435 where
   435 where
   436   "upper_approx = (\<lambda>i. upper_map\<cdot>(udom_approx i))"
   436   "upper_approx = (\<lambda>i. upper_map\<cdot>(udom_approx i))"
   456 unfolding upper_sfp_def
   456 unfolding upper_sfp_def
   457 apply (rule cast_sfp_fun1 [OF upper_approx])
   457 apply (rule cast_sfp_fun1 [OF upper_approx])
   458 apply (erule finite_deflation_upper_map)
   458 apply (erule finite_deflation_upper_map)
   459 done
   459 done
   460 
   460 
   461 instantiation upper_pd :: (sfp) sfp
   461 instantiation upper_pd :: (bifinite) bifinite
   462 begin
   462 begin
   463 
   463 
   464 definition
   464 definition
   465   "emb = udom_emb upper_approx oo upper_map\<cdot>emb"
   465   "emb = udom_emb upper_approx oo upper_map\<cdot>emb"
   466 
   466 
   481     by (simp add: cast_SFP oo_def expand_cfun_eq upper_map_map)
   481     by (simp add: cast_SFP oo_def expand_cfun_eq upper_map_map)
   482 qed
   482 qed
   483 
   483 
   484 end
   484 end
   485 
   485 
   486 text {* SFP of type constructor = type combinator *}
       
   487 
       
   488 lemma SFP_upper: "SFP('a upper_pd) = upper_sfp\<cdot>SFP('a)"
   486 lemma SFP_upper: "SFP('a upper_pd) = upper_sfp\<cdot>SFP('a)"
   489 by (rule sfp_upper_pd_def)
   487 by (rule sfp_upper_pd_def)
   490 
   488 
   491 
   489 
   492 subsection {* Join *}
   490 subsection {* Join *}