232 in |
232 in |
233 if length concls = 1 then lambda x r' else r' |
233 if length concls = 1 then lambda x r' else r' |
234 end |
234 end |
235 end; |
235 end; |
236 |
236 |
237 val nonempty_msg = explode "Nonemptiness check failed for datatype "; |
|
238 |
|
239 fun add_dummy name dname (x as (_, (vs, s, mfx, cs))) = |
237 fun add_dummy name dname (x as (_, (vs, s, mfx, cs))) = |
240 if name = s then (true, (vs, s, mfx, (dname, [HOLogic.unitT], NoSyn) :: cs)) |
238 if name = s then (true, (vs, s, mfx, (dname, [HOLogic.unitT], NoSyn) :: cs)) |
241 else x; |
239 else x; |
242 |
240 |
243 fun add_dummies f dts used thy = |
241 fun add_dummies f dts used thy = |
244 apsnd (pair (map fst dts)) (transform_error (f (map snd dts)) thy) |
242 apsnd (pair (map fst dts)) (f (map snd dts) thy) |
245 handle ERROR_MESSAGE msg => if nonempty_msg prefix explode msg then |
243 handle DatatypeAux.Datatype_Empty name' => |
246 let |
244 let |
247 val name = Sign.base_name |
245 val name = Sign.base_name name'; |
248 (implode (drop (length nonempty_msg, explode msg))); |
|
249 val dname = variant used "Dummy" |
246 val dname = variant used "Dummy" |
250 in add_dummies f (map (add_dummy name dname) dts) (dname :: used) thy |
247 in add_dummies f (map (add_dummy name dname) dts) (dname :: used) thy |
251 end |
248 end; |
252 else error msg; |
|
253 |
249 |
254 fun mk_realizer thy vs params ((rule, rrule), rt) = |
250 fun mk_realizer thy vs params ((rule, rrule), rt) = |
255 let |
251 let |
256 val prems = prems_of rule ~~ prems_of rrule; |
252 val prems = prems_of rule ~~ prems_of rrule; |
257 val rvs = map fst (relevant_vars (prop_of rule)); |
253 val rvs = map fst (relevant_vars (prop_of rule)); |
310 |
306 |
311 (** datatype representing computational content of inductive set **) |
307 (** datatype representing computational content of inductive set **) |
312 |
308 |
313 val (thy2, (dummies, dt_info)) = thy1 |> |
309 val (thy2, (dummies, dt_info)) = thy1 |> |
314 (if null dts then rpair ([], None) else |
310 (if null dts then rpair ([], None) else |
315 apsnd (apsnd Some) o add_dummies (DatatypePackage.add_datatype_i false |
311 apsnd (apsnd Some) o add_dummies (DatatypePackage.add_datatype_i false false |
316 (map #2 dts)) (map (pair false) dts) []) |>> |
312 (map #2 dts)) (map (pair false) dts) []) |>> |
317 Extraction.add_typeof_eqns_i ty_eqs |>> |
313 Extraction.add_typeof_eqns_i ty_eqs |>> |
318 Extraction.add_realizes_eqns_i rlz_eqs; |
314 Extraction.add_realizes_eqns_i rlz_eqs; |
319 fun get f x = if_none (apsome f x) []; |
315 fun get f x = if_none (apsome f x) []; |
320 val rec_names = distinct (map (fst o dest_Const o head_of o fst o |
316 val rec_names = distinct (map (fst o dest_Const o head_of o fst o |