203 |
203 |
204 fun make_primrecs new_type_names descr sorts thy = |
204 fun make_primrecs new_type_names descr sorts thy = |
205 let |
205 let |
206 val descr' = List.concat descr; |
206 val descr' = List.concat descr; |
207 val recTs = get_rec_types descr' sorts; |
207 val recTs = get_rec_types descr' sorts; |
208 val used = foldr OldTerm.add_typ_tfree_names [] recTs; |
208 val used = List.foldr OldTerm.add_typ_tfree_names [] recTs; |
209 |
209 |
210 val (rec_result_Ts, reccomb_fn_Ts) = make_primrec_Ts descr sorts used; |
210 val (rec_result_Ts, reccomb_fn_Ts) = make_primrec_Ts descr sorts used; |
211 |
211 |
212 val rec_fns = map (uncurry (mk_Free "f")) |
212 val rec_fns = map (uncurry (mk_Free "f")) |
213 (reccomb_fn_Ts ~~ (1 upto (length reccomb_fn_Ts))); |
213 (reccomb_fn_Ts ~~ (1 upto (length reccomb_fn_Ts))); |
253 |
253 |
254 fun make_case_combs new_type_names descr sorts thy fname = |
254 fun make_case_combs new_type_names descr sorts thy fname = |
255 let |
255 let |
256 val descr' = List.concat descr; |
256 val descr' = List.concat descr; |
257 val recTs = get_rec_types descr' sorts; |
257 val recTs = get_rec_types descr' sorts; |
258 val used = foldr OldTerm.add_typ_tfree_names [] recTs; |
258 val used = List.foldr OldTerm.add_typ_tfree_names [] recTs; |
259 val newTs = Library.take (length (hd descr), recTs); |
259 val newTs = Library.take (length (hd descr), recTs); |
260 val T' = TFree (Name.variant used "'t", HOLogic.typeS); |
260 val T' = TFree (Name.variant used "'t", HOLogic.typeS); |
261 |
261 |
262 val case_fn_Ts = map (fn (i, (_, _, constrs)) => |
262 val case_fn_Ts = map (fn (i, (_, _, constrs)) => |
263 map (fn (_, cargs) => |
263 map (fn (_, cargs) => |
300 |
300 |
301 fun make_splits new_type_names descr sorts thy = |
301 fun make_splits new_type_names descr sorts thy = |
302 let |
302 let |
303 val descr' = List.concat descr; |
303 val descr' = List.concat descr; |
304 val recTs = get_rec_types descr' sorts; |
304 val recTs = get_rec_types descr' sorts; |
305 val used' = foldr OldTerm.add_typ_tfree_names [] recTs; |
305 val used' = List.foldr OldTerm.add_typ_tfree_names [] recTs; |
306 val newTs = Library.take (length (hd descr), recTs); |
306 val newTs = Library.take (length (hd descr), recTs); |
307 val T' = TFree (Name.variant used' "'t", HOLogic.typeS); |
307 val T' = TFree (Name.variant used' "'t", HOLogic.typeS); |
308 val P = Free ("P", T' --> HOLogic.boolT); |
308 val P = Free ("P", T' --> HOLogic.boolT); |
309 |
309 |
310 fun make_split (((_, (_, _, constrs)), T), comb_t) = |
310 fun make_split (((_, (_, _, constrs)), T), comb_t) = |
317 val Ts = map (typ_of_dtyp descr' sorts) cargs; |
317 val Ts = map (typ_of_dtyp descr' sorts) cargs; |
318 val frees = map Free (Name.variant_list used (make_tnames Ts) ~~ Ts); |
318 val frees = map Free (Name.variant_list used (make_tnames Ts) ~~ Ts); |
319 val eqn = HOLogic.mk_eq (Free ("x", T), |
319 val eqn = HOLogic.mk_eq (Free ("x", T), |
320 list_comb (Const (cname, Ts ---> T), frees)); |
320 list_comb (Const (cname, Ts ---> T), frees)); |
321 val P' = P $ list_comb (f, frees) |
321 val P' = P $ list_comb (f, frees) |
322 in ((foldr (fn (Free (s, T), t) => HOLogic.mk_all (s, T, t)) |
322 in ((List.foldr (fn (Free (s, T), t) => HOLogic.mk_all (s, T, t)) |
323 (HOLogic.imp $ eqn $ P') frees)::t1s, |
323 (HOLogic.imp $ eqn $ P') frees)::t1s, |
324 (foldr (fn (Free (s, T), t) => HOLogic.mk_exists (s, T, t)) |
324 (List.foldr (fn (Free (s, T), t) => HOLogic.mk_exists (s, T, t)) |
325 (HOLogic.conj $ eqn $ (HOLogic.Not $ P')) frees)::t2s) |
325 (HOLogic.conj $ eqn $ (HOLogic.Not $ P')) frees)::t2s) |
326 end; |
326 end; |
327 |
327 |
328 val (t1s, t2s) = foldr process_constr ([], []) (constrs ~~ fs); |
328 val (t1s, t2s) = List.foldr process_constr ([], []) (constrs ~~ fs); |
329 val lhs = P $ (comb_t $ Free ("x", T)) |
329 val lhs = P $ (comb_t $ Free ("x", T)) |
330 in |
330 in |
331 (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, mk_conj t1s)), |
331 (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, mk_conj t1s)), |
332 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, HOLogic.Not $ mk_disj t2s))) |
332 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, HOLogic.Not $ mk_disj t2s))) |
333 end |
333 end |
420 let |
420 let |
421 val Ts = map (typ_of_dtyp descr' sorts) cargs; |
421 val Ts = map (typ_of_dtyp descr' sorts) cargs; |
422 val tnames = Name.variant_list ["v"] (make_tnames Ts); |
422 val tnames = Name.variant_list ["v"] (make_tnames Ts); |
423 val frees = tnames ~~ Ts |
423 val frees = tnames ~~ Ts |
424 in |
424 in |
425 foldr (fn ((s, T'), t) => HOLogic.mk_exists (s, T', t)) |
425 List.foldr (fn ((s, T'), t) => HOLogic.mk_exists (s, T', t)) |
426 (HOLogic.mk_eq (Free ("v", T), |
426 (HOLogic.mk_eq (Free ("v", T), |
427 list_comb (Const (cname, Ts ---> T), map Free frees))) frees |
427 list_comb (Const (cname, Ts ---> T), map Free frees))) frees |
428 end |
428 end |
429 |
429 |
430 in map (fn ((_, (_, _, constrs)), T) => |
430 in map (fn ((_, (_, _, constrs)), T) => |