src/HOL/BNF/Tools/bnf_fp_def_sugar.ML
changeset 51814 8b89afea27e7
parent 51813 ca201253e7bb
child 51815 efacb9b99865
equal deleted inserted replaced
51813:ca201253e7bb 51814:8b89afea27e7
   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;