src/HOL/BNF/Tools/bnf_fp_def_sugar.ML
changeset 51815 efacb9b99865
parent 51814 8b89afea27e7
child 51816 5f1dec4297da
equal deleted inserted replaced
51814:8b89afea27e7 51815:efacb9b99865
     5 Sugared datatype and codatatype constructions.
     5 Sugared datatype and codatatype constructions.
     6 *)
     6 *)
     7 
     7 
     8 signature BNF_FP_DEF_SUGAR =
     8 signature BNF_FP_DEF_SUGAR =
     9 sig
     9 sig
    10   val derive_induct_fold_rec_thms_for_types: int -> BNF_Def.BNF list -> thm -> thm list ->
    10   val derive_induct_fold_rec_thms_for_types: BNF_Def.BNF list -> thm -> thm list -> thm list ->
    11     thm list -> BNF_Def.BNF list -> BNF_Def.BNF list -> typ list -> typ list ->
    11     BNF_Def.BNF list -> BNF_Def.BNF list -> typ list -> typ list -> typ list list list ->
    12     typ list list list -> int list list -> int list -> term list list -> term list list ->
    12     int list list -> int list -> term list list -> term list list -> term list list -> term list
    13     term list list -> term list list list -> thm list list -> term list -> term list -> thm list ->
    13     list list -> thm list list -> term list -> term list -> thm list -> thm list -> Proof.context ->
    14     thm list -> Proof.context ->
       
    15     (thm * thm list * Args.src list) * (thm list list * Args.src list)
    14     (thm * thm list * Args.src list) * (thm list list * Args.src list)
    16       * (thm list list * Args.src list)
    15       * (thm list list * Args.src list)
    17   val derive_coinduct_unfold_corec_thms_for_types: Proof.context -> Proof.context -> int ->
    16   val derive_coinduct_unfold_corec_thms_for_types: Proof.context -> Proof.context ->
    18     BNF_Def.BNF list -> thm -> thm -> thm list -> thm list -> thm list -> BNF_Def.BNF list ->
    17     BNF_Def.BNF list -> thm -> thm -> thm list -> thm list -> thm list -> BNF_Def.BNF list ->
    19     BNF_Def.BNF list -> typ list -> typ list -> typ list -> int list list -> int list list ->
    18     BNF_Def.BNF list -> typ list -> typ list -> typ list -> int list list -> int list list ->
    20     int list -> term list -> term list list -> term list list -> term list list list list ->
    19     int list -> term list -> term list list -> term list list -> term list list list list ->
    21     term list list list list -> term list list -> term list list list list ->
    20     term list list list list -> term list list -> term list list list list ->
    22     term list list list list -> term list list -> thm list list ->
    21     term list list list list -> term list list -> thm list list ->
   197     val live = live_of_bnf bnf;
   196     val live = live_of_bnf bnf;
   198     val rel = mk_rel live Ts Ts (rel_of_bnf bnf);
   197     val rel = mk_rel live Ts Ts (rel_of_bnf bnf);
   199     val Ts' = map domain_type (fst (strip_typeN live (fastype_of rel)));
   198     val Ts' = map domain_type (fst (strip_typeN live (fastype_of rel)));
   200   in Term.list_comb (rel, map build_arg Ts') end;
   199   in Term.list_comb (rel, map build_arg Ts') end;
   201 
   200 
   202 fun derive_induct_fold_rec_thms_for_types nn pre_bnfs ctor_induct ctor_fold_thms ctor_rec_thms
   201 fun derive_induct_fold_rec_thms_for_types 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
   202     nesting_bnfs nested_bnfs fpTs Cs ctr_Tsss mss ns gss hss ctrss xsss ctr_defss folds recs
   204     fold_defs rec_defs lthy =
   203     fold_defs rec_defs lthy =
   205   let
   204   let
       
   205     val nn = length pre_bnfs;
       
   206 
   206     val pre_map_defs = map map_def_of_bnf pre_bnfs;
   207     val pre_map_defs = map map_def_of_bnf pre_bnfs;
   207     val pre_set_defss = map set_defs_of_bnf pre_bnfs;
   208     val pre_set_defss = map set_defs_of_bnf pre_bnfs;
   208     val nested_map_comp's = map map_comp'_of_bnf nested_bnfs;
   209     val nested_map_comp's = map map_comp'_of_bnf nested_bnfs;
   209     val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs;
   210     val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs;
   210     val nested_set_map's = maps set_map'_of_bnf nested_bnfs;
   211     val nested_set_map's = maps set_map'_of_bnf nested_bnfs;
   350   in
   351   in
   351     ((induct_thm, induct_thms, [induct_case_names_attr]),
   352     ((induct_thm, induct_thms, [induct_case_names_attr]),
   352      (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs))
   353      (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs))
   353   end;
   354   end;
   354 
   355 
   355 fun derive_coinduct_unfold_corec_thms_for_types names_lthy0 no_defs_lthy nn pre_bnfs dtor_coinduct
   356 fun derive_coinduct_unfold_corec_thms_for_types names_lthy0 no_defs_lthy pre_bnfs dtor_coinduct
   356     dtor_strong_induct dtor_ctors dtor_unfold_thms dtor_corec_thms nesting_bnfs nested_bnfs fpTs Cs
   357     dtor_strong_induct dtor_ctors dtor_unfold_thms dtor_corec_thms nesting_bnfs nested_bnfs fpTs Cs
   357     As kss mss ns cs cpss pgss crssss cgssss phss csssss chssss ctrss ctr_defss ctr_wrap_ress
   358     As kss mss ns cs cpss pgss crssss cgssss phss csssss chssss ctrss ctr_defss ctr_wrap_ress
   358     unfolds corecs unfold_defs corec_defs lthy =
   359     unfolds corecs unfold_defs corec_defs lthy =
   359   let
   360   let
       
   361     val nn = length pre_bnfs;
       
   362 
   360     val pre_map_defs = map map_def_of_bnf pre_bnfs;
   363     val pre_map_defs = map map_def_of_bnf pre_bnfs;
   361     val pre_rel_defs = map rel_def_of_bnf pre_bnfs;
   364     val pre_rel_defs = map rel_def_of_bnf pre_bnfs;
   362     val nested_map_comp's = map map_comp'_of_bnf nested_bnfs;
   365     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;
   366     val nested_map_comps'' = map ((fn thm => thm RS sym) o map_comp_of_bnf) nested_bnfs;
   364     val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs;
   367     val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs;
   527           map3 (map oo mk_corec_like_tac corec_defs nested_map_comps'' nested_map_comp's
   530           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)
   531               (nested_map_ids'' @ nesting_map_ids'') nested_map_if_distribs)
   529             dtor_corec_thms pre_map_defs ctr_defss;
   532             dtor_corec_thms pre_map_defs ctr_defss;
   530 
   533 
   531         fun prove goal tac =
   534         fun prove goal tac =
   532           Goal.prove_sorry lthy [] [] goal (tac o #context) |> Thm.close_derivation;
   535           Goal.prove_sorry lthy [] [] goal (tac o #context)
       
   536           |> Thm.close_derivation;
   533 
   537 
   534         val unfold_thmss = map2 (map2 prove) unfold_goalss unfold_tacss;
   538         val unfold_thmss = map2 (map2 prove) unfold_goalss unfold_tacss;
   535         val corec_thmss = map2 (map2 prove) corec_goalss corec_tacss;
   539         val corec_thmss = map2 (map2 prove) corec_goalss corec_tacss;
   536 
   540 
   537         val filter_safesss =
   541         val filter_safesss =
  1206         (((ctrss, xsss, ctr_defss, ctr_wrap_ress), (folds, recs, fold_defs, rec_defs)), lthy) =
  1210         (((ctrss, xsss, ctr_defss, ctr_wrap_ress), (folds, recs, fold_defs, rec_defs)), lthy) =
  1207       let
  1211       let
  1208         val ((induct_thm, induct_thms, induct_attrs),
  1212         val ((induct_thm, induct_thms, induct_attrs),
  1209              (fold_thmss, fold_attrs),
  1213              (fold_thmss, fold_attrs),
  1210              (rec_thmss, rec_attrs)) =
  1214              (rec_thmss, rec_attrs)) =
  1211           derive_induct_fold_rec_thms_for_types nn pre_bnfs fp_induct fp_fold_thms fp_rec_thms
  1215           derive_induct_fold_rec_thms_for_types pre_bnfs fp_induct fp_fold_thms fp_rec_thms
  1212             nesting_bnfs nested_bnfs fpTs Cs ctr_Tsss mss ns gss hss ctrss xsss ctr_defss folds recs
  1216             nesting_bnfs nested_bnfs fpTs Cs ctr_Tsss mss ns gss hss ctrss xsss ctr_defss folds recs
  1213             fold_defs rec_defs lthy;
  1217             fold_defs rec_defs lthy;
  1214 
  1218 
  1215         fun induct_type_attr T_name = Attrib.internal (K (Induct.induct_type T_name));
  1219         fun induct_type_attr T_name = Attrib.internal (K (Induct.induct_type T_name));
  1216 
  1220 
  1238              (unfold_thmss, corec_thmss, corec_like_attrs),
  1242              (unfold_thmss, corec_thmss, corec_like_attrs),
  1239              (safe_unfold_thmss, safe_corec_thmss),
  1243              (safe_unfold_thmss, safe_corec_thmss),
  1240              (disc_unfold_thmss, disc_corec_thmss, disc_corec_like_attrs),
  1244              (disc_unfold_thmss, disc_corec_thmss, disc_corec_like_attrs),
  1241              (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_corec_like_iff_attrs),
  1245              (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_corec_like_iff_attrs),
  1242              (sel_unfold_thmss, sel_corec_thmss, sel_corec_like_attrs)) =
  1246              (sel_unfold_thmss, sel_corec_thmss, sel_corec_like_attrs)) =
  1243           derive_coinduct_unfold_corec_thms_for_types names_lthy0 no_defs_lthy nn pre_bnfs fp_induct
  1247           derive_coinduct_unfold_corec_thms_for_types names_lthy0 no_defs_lthy pre_bnfs fp_induct
  1244             fp_strong_induct dtor_ctors fp_fold_thms fp_rec_thms nesting_bnfs nested_bnfs fpTs Cs As
  1248             fp_strong_induct dtor_ctors fp_fold_thms fp_rec_thms nesting_bnfs nested_bnfs fpTs Cs As
  1245             kss mss ns cs cpss pgss crssss cgssss phss csssss chssss ctrss ctr_defss ctr_wrap_ress
  1249             kss mss ns cs cpss pgss crssss cgssss phss csssss chssss ctrss ctr_defss ctr_wrap_ress
  1246             unfolds corecs unfold_defs corec_defs lthy;
  1250             unfolds corecs unfold_defs corec_defs lthy;
  1247 
  1251 
  1248         fun coinduct_type_attr T_name = Attrib.internal (K (Induct.coinduct_type T_name));
  1252         fun coinduct_type_attr T_name = Attrib.internal (K (Induct.coinduct_type T_name));