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 |