src/HOL/HOLCF/Tools/domaindef.ML
changeset 41292 2b7bc8d9fd6e
parent 41290 e9c9577d88b5
child 41296 6aaf80ea9715
equal deleted inserted replaced
41291:752d81c2ce25 41292:2b7bc8d9fd6e
    48 
    48 
    49 (* building types and terms *)
    49 (* building types and terms *)
    50 
    50 
    51 val udomT = @{typ udom}
    51 val udomT = @{typ udom}
    52 val deflT = @{typ "udom defl"}
    52 val deflT = @{typ "udom defl"}
       
    53 val udeflT = @{typ "udom u defl"}
    53 fun emb_const T = Const (@{const_name emb}, T ->> udomT)
    54 fun emb_const T = Const (@{const_name emb}, T ->> udomT)
    54 fun prj_const T = Const (@{const_name prj}, udomT ->> T)
    55 fun prj_const T = Const (@{const_name prj}, udomT ->> T)
    55 fun defl_const T = Const (@{const_name defl}, Term.itselfT T --> deflT)
    56 fun defl_const T = Const (@{const_name defl}, Term.itselfT T --> deflT)
    56 fun liftemb_const T = Const (@{const_name liftemb}, mk_upT T ->> udomT)
    57 fun liftemb_const T = Const (@{const_name liftemb}, mk_upT T ->> mk_upT udomT)
    57 fun liftprj_const T = Const (@{const_name liftprj}, udomT ->> mk_upT T)
    58 fun liftprj_const T = Const (@{const_name liftprj}, mk_upT udomT ->> mk_upT T)
    58 fun liftdefl_const T = Const (@{const_name liftdefl}, Term.itselfT T --> deflT)
    59 fun liftdefl_const T = Const (@{const_name liftdefl}, Term.itselfT T --> udeflT)
    59 
    60 
    60 fun mk_u_map t =
    61 fun mk_u_map t =
    61   let
    62   let
    62     val (T, U) = dest_cfunT (fastype_of t)
    63     val (T, U) = dest_cfunT (fastype_of t)
    63     val u_map_type = (T ->> U) ->> (mk_upT T ->> mk_upT U)
    64     val u_map_type = (T ->> U) ->> (mk_upT T ->> mk_upT U)
   127     val prj_eqn = Logic.mk_equals (prj_const newT, cabs_const (udomT, newT) $
   128     val prj_eqn = Logic.mk_equals (prj_const newT, cabs_const (udomT, newT) $
   128       Abs ("x", udomT, Abs_const $ mk_cast (defl, Bound 0)))
   129       Abs ("x", udomT, Abs_const $ mk_cast (defl, Bound 0)))
   129     val defl_eqn = Logic.mk_equals (defl_const newT,
   130     val defl_eqn = Logic.mk_equals (defl_const newT,
   130       Abs ("x", Term.itselfT newT, defl))
   131       Abs ("x", Term.itselfT newT, defl))
   131     val liftemb_eqn =
   132     val liftemb_eqn =
   132       Logic.mk_equals (liftemb_const newT,
   133       Logic.mk_equals (liftemb_const newT, mk_u_map (emb_const newT))
   133       mk_cfcomp (@{const u_emb}, mk_u_map (emb_const newT)))
       
   134     val liftprj_eqn =
   134     val liftprj_eqn =
   135       Logic.mk_equals (liftprj_const newT,
   135       Logic.mk_equals (liftprj_const newT, mk_u_map (prj_const newT))
   136       mk_cfcomp (mk_u_map (prj_const newT), @{const u_prj}))
       
   137     val liftdefl_eqn =
   136     val liftdefl_eqn =
   138       Logic.mk_equals (liftdefl_const newT,
   137       Logic.mk_equals (liftdefl_const newT,
   139         Abs ("t", Term.itselfT newT,
   138         Abs ("t", Term.itselfT newT,
   140           mk_capply (@{const u_defl}, defl_const newT $ Logic.mk_type newT)))
   139           mk_capply (@{const pdefl}, defl_const newT $ Logic.mk_type newT)))
   141 
   140 
   142     val name_def = Binding.suffix_name "_def" name
   141     val name_def = Binding.suffix_name "_def" name
   143     val emb_bind = (Binding.prefix_name "emb_" name_def, [])
   142     val emb_bind = (Binding.prefix_name "emb_" name_def, [])
   144     val prj_bind = (Binding.prefix_name "prj_" name_def, [])
   143     val prj_bind = (Binding.prefix_name "prj_" name_def, [])
   145     val defl_bind = (Binding.prefix_name "defl_" name_def, [])
   144     val defl_bind = (Binding.prefix_name "defl_" name_def, [])
   147     val liftprj_bind = (Binding.prefix_name "liftprj_" name_def, [])
   146     val liftprj_bind = (Binding.prefix_name "liftprj_" name_def, [])
   148     val liftdefl_bind = (Binding.prefix_name "liftdefl_" name_def, [])
   147     val liftdefl_bind = (Binding.prefix_name "liftdefl_" name_def, [])
   149 
   148 
   150     (*instantiate class rep*)
   149     (*instantiate class rep*)
   151     val lthy = thy
   150     val lthy = thy
   152       |> Class.instantiation ([full_tname], lhs_tfrees, @{sort liftdomain})
   151       |> Class.instantiation ([full_tname], lhs_tfrees, @{sort domain})
   153     val ((_, (_, emb_ldef)), lthy) =
   152     val ((_, (_, emb_ldef)), lthy) =
   154         Specification.definition (NONE, (emb_bind, emb_eqn)) lthy
   153         Specification.definition (NONE, (emb_bind, emb_eqn)) lthy
   155     val ((_, (_, prj_ldef)), lthy) =
   154     val ((_, (_, prj_ldef)), lthy) =
   156         Specification.definition (NONE, (prj_bind, prj_eqn)) lthy
   155         Specification.definition (NONE, (prj_bind, prj_eqn)) lthy
   157     val ((_, (_, defl_ldef)), lthy) =
   156     val ((_, (_, defl_ldef)), lthy) =
   176     val typedef_thms =
   175     val typedef_thms =
   177       [type_definition_thm, #below_def cpo_info, emb_def, prj_def, defl_def,
   176       [type_definition_thm, #below_def cpo_info, emb_def, prj_def, defl_def,
   178       liftemb_def, liftprj_def, liftdefl_def]
   177       liftemb_def, liftprj_def, liftdefl_def]
   179     val thy = lthy
   178     val thy = lthy
   180       |> Class.prove_instantiation_instance
   179       |> Class.prove_instantiation_instance
   181           (K (Tactic.rtac (@{thm typedef_liftdomain_class} OF typedef_thms) 1))
   180           (K (Tactic.rtac (@{thm typedef_domain_class} OF typedef_thms) 1))
   182       |> Local_Theory.exit_global
   181       |> Local_Theory.exit_global
   183 
   182 
   184     (*other theorems*)
   183     (*other theorems*)
   185     val defl_thm' = Thm.transfer thy defl_def
   184     val defl_thm' = Thm.transfer thy defl_def
   186     val (DEFL_thm, thy) = thy
   185     val (DEFL_thm, thy) = thy