src/HOL/HOLCF/Bifinite.thy
changeset 61169 4de9ff3ea29a
parent 58880 0baae4311a9f
child 62175 8ffc4d0e652d
equal deleted inserted replaced
61168:dcdfb6355a05 61169:4de9ff3ea29a
   160     using bifinite [where 'a='a]
   160     using bifinite [where 'a='a]
   161     by (fast intro!: approx_chain_u_map)
   161     by (fast intro!: approx_chain_u_map)
   162 qed
   162 qed
   163 
   163 
   164 instance u :: (profinite) bifinite
   164 instance u :: (profinite) bifinite
   165   by default (rule profinite)
   165   by standard (rule profinite)
   166 
   166 
   167 text {*
   167 text {*
   168   Types @{typ "'a \<rightarrow> 'b"} and @{typ "'a u \<rightarrow>! 'b"} are isomorphic.
   168   Types @{typ "'a \<rightarrow> 'b"} and @{typ "'a u \<rightarrow>! 'b"} are isomorphic.
   169 *}
   169 *}
   170 
   170 
   254 
   254 
   255 lemma approx_chain_unit: "approx_chain (\<bottom> :: nat \<Rightarrow> unit \<rightarrow> unit)"
   255 lemma approx_chain_unit: "approx_chain (\<bottom> :: nat \<Rightarrow> unit \<rightarrow> unit)"
   256 by (simp add: approx_chain_def cfun_eq_iff finite_deflation_bottom)
   256 by (simp add: approx_chain_def cfun_eq_iff finite_deflation_bottom)
   257 
   257 
   258 instance unit :: bifinite
   258 instance unit :: bifinite
   259   by default (fast intro!: approx_chain_unit)
   259   by standard (fast intro!: approx_chain_unit)
   260 
   260 
   261 instance discr :: (countable) profinite
   261 instance discr :: (countable) profinite
   262   by default (fast intro!: discr_approx)
   262   by standard (fast intro!: discr_approx)
   263 
   263 
   264 instance lift :: (countable) bifinite
   264 instance lift :: (countable) bifinite
   265 proof
   265 proof
   266   note [simp] = cont_Abs_lift cont_Rep_lift Rep_lift_inverse Abs_lift_inverse
   266   note [simp] = cont_Abs_lift cont_Rep_lift Rep_lift_inverse Abs_lift_inverse
   267   obtain a :: "nat \<Rightarrow> ('a discr)\<^sub>\<bottom> \<rightarrow> ('a discr)\<^sub>\<bottom>" where a: "approx_chain a"
   267   obtain a :: "nat \<Rightarrow> ('a discr)\<^sub>\<bottom> \<rightarrow> ('a discr)\<^sub>\<bottom>" where a: "approx_chain a"