197 val live = live_of_bnf bnf; |
197 val live = live_of_bnf bnf; |
198 val rel = mk_rel live Ts Ts (rel_of_bnf bnf); |
198 val rel = mk_rel live Ts Ts (rel_of_bnf bnf); |
199 val Ts' = map domain_type (fst (strip_typeN live (fastype_of rel))); |
199 val Ts' = map domain_type (fst (strip_typeN live (fastype_of rel))); |
200 in Term.list_comb (rel, map build_arg Ts') end; |
200 in Term.list_comb (rel, map build_arg Ts') end; |
201 |
201 |
202 fun derive_induct_fold_rec_thms_for_types nn pre_bnfs fp_induct fp_fold_thms fp_rec_thms |
202 fun derive_induct_fold_rec_thms_for_types nn pre_bnfs ctor_induct ctor_fold_thms ctor_rec_thms |
203 nesting_bnfs nested_bnfs fpTs Cs ctr_Tsss mss ns gss hss ctrss xsss ctr_defss folds recs |
203 nesting_bnfs nested_bnfs fpTs Cs ctr_Tsss mss ns gss hss ctrss xsss ctr_defss folds recs |
204 fold_defs rec_defs lthy = |
204 fold_defs rec_defs lthy = |
205 let |
205 let |
206 val pre_map_defs = map map_def_of_bnf pre_bnfs; |
206 val pre_map_defs = map map_def_of_bnf pre_bnfs; |
207 val pre_set_defss = map set_defs_of_bnf pre_bnfs; |
207 val pre_set_defss = map set_defs_of_bnf pre_bnfs; |
284 Library.foldr (Logic.list_implies o apfst (map mk_prem)) (raw_premss, |
284 Library.foldr (Logic.list_implies o apfst (map mk_prem)) (raw_premss, |
285 HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj (map2 (curry (op $)) ps us))); |
285 HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj (map2 (curry (op $)) ps us))); |
286 |
286 |
287 val kksss = map (map (map (fst o snd) o #2)) raw_premss; |
287 val kksss = map (map (map (fst o snd) o #2)) raw_premss; |
288 |
288 |
289 val ctor_induct' = fp_induct OF (map mk_sumEN_tupled_balanced mss); |
289 val ctor_induct' = ctor_induct OF (map mk_sumEN_tupled_balanced mss); |
290 |
290 |
291 val thm = |
291 val thm = |
292 Goal.prove_sorry lthy [] [] goal (fn {context = ctxt, ...} => |
292 Goal.prove_sorry lthy [] [] goal (fn {context = ctxt, ...} => |
293 mk_induct_tac ctxt nn ns mss kksss (flat ctr_defss) ctor_induct' nested_set_map's |
293 mk_induct_tac ctxt nn ns mss kksss (flat ctr_defss) ctor_induct' nested_set_map's |
294 pre_set_defss) |
294 pre_set_defss) |
331 |
331 |
332 val fold_goalss = map5 (map4 o mk_goal gss) gfolds xctrss gss xsss gxsss; |
332 val fold_goalss = map5 (map4 o mk_goal gss) gfolds xctrss gss xsss gxsss; |
333 val rec_goalss = map5 (map4 o mk_goal hss) hrecs xctrss hss xsss hxsss; |
333 val rec_goalss = map5 (map4 o mk_goal hss) hrecs xctrss hss xsss hxsss; |
334 |
334 |
335 val fold_tacss = |
335 val fold_tacss = |
336 map2 (map o mk_rec_like_tac pre_map_defs [] nesting_map_ids'' fold_defs) fp_fold_thms |
336 map2 (map o mk_rec_like_tac pre_map_defs [] nesting_map_ids'' fold_defs) ctor_fold_thms |
337 ctr_defss; |
337 ctr_defss; |
338 val rec_tacss = |
338 val rec_tacss = |
339 map2 (map o mk_rec_like_tac pre_map_defs nested_map_comp's |
339 map2 (map o mk_rec_like_tac pre_map_defs nested_map_comp's |
340 (nested_map_ids'' @ nesting_map_ids'') rec_defs) fp_rec_thms ctr_defss; |
340 (nested_map_ids'' @ nesting_map_ids'') rec_defs) ctor_rec_thms ctr_defss; |
341 |
341 |
342 fun prove goal tac = |
342 fun prove goal tac = |
343 Goal.prove_sorry lthy [] [] goal (tac o #context) |
343 Goal.prove_sorry lthy [] [] goal (tac o #context) |
344 |> Thm.close_derivation; |
344 |> Thm.close_derivation; |
345 in |
345 in |
350 in |
350 in |
351 ((induct_thm, induct_thms, [induct_case_names_attr]), |
351 ((induct_thm, induct_thms, [induct_case_names_attr]), |
352 (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs)) |
352 (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs)) |
353 end; |
353 end; |
354 |
354 |
355 fun derive_coinduct_unfold_corec_thms_for_types names_lthy0 no_defs_lthy nn pre_bnfs fp_induct |
355 fun derive_coinduct_unfold_corec_thms_for_types names_lthy0 no_defs_lthy nn pre_bnfs dtor_coinduct |
356 fp_strong_induct dtor_ctors fp_fold_thms fp_rec_thms nesting_bnfs nested_bnfs fpTs Cs As kss mss |
356 dtor_strong_induct dtor_ctors dtor_unfold_thms dtor_corec_thms nesting_bnfs nested_bnfs fpTs Cs |
357 ns cs cpss pgss crssss cgssss phss csssss chssss ctrss ctr_defss ctr_wrap_ress unfolds corecs |
357 As kss mss ns cs cpss pgss crssss cgssss phss csssss chssss ctrss ctr_defss ctr_wrap_ress |
358 unfold_defs corec_defs lthy = |
358 unfolds corecs unfold_defs corec_defs lthy = |
359 let |
359 let |
360 val pre_map_defs = map map_def_of_bnf pre_bnfs; |
360 val pre_map_defs = map map_def_of_bnf pre_bnfs; |
361 val pre_rel_defs = map rel_def_of_bnf pre_bnfs; |
361 val pre_rel_defs = map rel_def_of_bnf pre_bnfs; |
362 val nested_map_comp's = map map_comp'_of_bnf nested_bnfs; |
362 val nested_map_comp's = map map_comp'_of_bnf nested_bnfs; |
363 val nested_map_comps'' = map ((fn thm => thm RS sym) o map_comp_of_bnf) nested_bnfs; |
363 val nested_map_comps'' = map ((fn thm => thm RS sym) o map_comp_of_bnf) nested_bnfs; |
447 (if nn = 1 then thm RS mp |
447 (if nn = 1 then thm RS mp |
448 else funpow nn (fn thm => reassoc_conjs (thm RS mp_conj)) thm) |
448 else funpow nn (fn thm => reassoc_conjs (thm RS mp_conj)) thm) |
449 |> Drule.zero_var_indexes |
449 |> Drule.zero_var_indexes |
450 |> `(conj_dests nn); |
450 |> `(conj_dests nn); |
451 in |
451 in |
452 (postproc nn (prove fp_induct goal), postproc nn (prove fp_strong_induct strong_goal)) |
452 (postproc nn (prove dtor_coinduct goal), postproc nn (prove dtor_strong_induct strong_goal)) |
453 end; |
453 end; |
454 |
454 |
455 fun mk_coinduct_concls ms discs ctrs = |
455 fun mk_coinduct_concls ms discs ctrs = |
456 let |
456 let |
457 fun mk_disc_concl disc = [name_of_disc disc]; |
457 fun mk_disc_concl disc = [name_of_disc disc]; |
520 |
520 |
521 val nested_map_if_distribs = map mk_map_if_distrib nested_bnfs; |
521 val nested_map_if_distribs = map mk_map_if_distrib nested_bnfs; |
522 |
522 |
523 val unfold_tacss = |
523 val unfold_tacss = |
524 map3 (map oo mk_corec_like_tac unfold_defs [] [] nesting_map_ids'' []) |
524 map3 (map oo mk_corec_like_tac unfold_defs [] [] nesting_map_ids'' []) |
525 fp_fold_thms pre_map_defs ctr_defss; |
525 dtor_unfold_thms pre_map_defs ctr_defss; |
526 val corec_tacss = |
526 val corec_tacss = |
527 map3 (map oo mk_corec_like_tac corec_defs nested_map_comps'' nested_map_comp's |
527 map3 (map oo mk_corec_like_tac corec_defs nested_map_comps'' nested_map_comp's |
528 (nested_map_ids'' @ nesting_map_ids'') nested_map_if_distribs) |
528 (nested_map_ids'' @ nesting_map_ids'') nested_map_if_distribs) |
529 fp_rec_thms pre_map_defs ctr_defss; |
529 dtor_corec_thms pre_map_defs ctr_defss; |
530 |
530 |
531 fun prove goal tac = |
531 fun prove goal tac = |
532 Goal.prove_sorry lthy [] [] goal (tac o #context) |> Thm.close_derivation; |
532 Goal.prove_sorry lthy [] [] goal (tac o #context) |> Thm.close_derivation; |
533 |
533 |
534 val unfold_thmss = map2 (map2 prove) unfold_goalss unfold_tacss; |
534 val unfold_thmss = map2 (map2 prove) unfold_goalss unfold_tacss; |