src/HOLCF/Discrete.thy
changeset 40434 f775e6e0dc99
parent 40091 1ca61fbd8a79
equal deleted inserted replaced
40433:3128c2a54785 40434:f775e6e0dc99
     8 imports Cont
     8 imports Cont
     9 begin
     9 begin
    10 
    10 
    11 datatype 'a discr = Discr "'a :: type"
    11 datatype 'a discr = Discr "'a :: type"
    12 
    12 
    13 subsection {* Discrete ordering *}
    13 subsection {* Discrete cpo class instance *}
    14 
    14 
    15 instantiation discr :: (type) below
    15 instantiation discr :: (type) discrete_cpo
    16 begin
    16 begin
    17 
    17 
    18 definition
    18 definition
    19   below_discr_def:
    19   "(op \<sqsubseteq> :: 'a discr \<Rightarrow> 'a discr \<Rightarrow> bool) = (op =)"
    20     "(op \<sqsubseteq> :: 'a discr \<Rightarrow> 'a discr \<Rightarrow> bool) = (op =)"
       
    21 
    20 
    22 instance ..
    21 instance
       
    22 by default (simp add: below_discr_def)
       
    23 
    23 end
    24 end
    24 
       
    25 subsection {* Discrete cpo class instance *}
       
    26 
       
    27 instance discr :: (type) discrete_cpo
       
    28 by intro_classes (simp add: below_discr_def)
       
    29 
       
    30 lemma discr_below_eq [iff]: "((x::('a::type)discr) << y) = (x = y)"
       
    31 by simp (* FIXME: same discrete_cpo - remove? is [iff] important? *)
       
    32 
       
    33 lemma discr_chain0: 
       
    34  "!!S::nat=>('a::type)discr. chain S ==> S i = S 0"
       
    35 apply (unfold chain_def)
       
    36 apply (induct_tac "i")
       
    37 apply (rule refl)
       
    38 apply (erule subst)
       
    39 apply (rule sym)
       
    40 apply fast
       
    41 done
       
    42 
       
    43 lemma discr_chain_range0 [simp]: 
       
    44  "!!S::nat=>('a::type)discr. chain(S) ==> range(S) = {S 0}"
       
    45 by (fast elim: discr_chain0)
       
    46 
    25 
    47 subsection {* \emph{undiscr} *}
    26 subsection {* \emph{undiscr} *}
    48 
    27 
    49 definition
    28 definition
    50   undiscr :: "('a::type)discr => 'a" where
    29   undiscr :: "('a::type)discr => 'a" where
    54 by (simp add: undiscr_def)
    33 by (simp add: undiscr_def)
    55 
    34 
    56 lemma Discr_undiscr [simp]: "Discr (undiscr y) = y"
    35 lemma Discr_undiscr [simp]: "Discr (undiscr y) = y"
    57 by (induct y) simp
    36 by (induct y) simp
    58 
    37 
    59 lemma discr_chain_f_range0:
       
    60  "!!S::nat=>('a::type)discr. chain(S) ==> range(%i. f(S i)) = {f(S 0)}"
       
    61 by (fast dest: discr_chain0 elim: arg_cong)
       
    62 
       
    63 lemma cont_discr [iff]: "cont (%x::('a::type)discr. f x)"
       
    64 by (rule cont_discrete_cpo)
       
    65 
       
    66 end
    38 end