src/HOL/BNF/Tools/bnf_fp_def_sugar.ML
changeset 52345 87d8650d160c
parent 52344 ff05e50efa0d
child 52346 856b3bd1d87e
equal deleted inserted replaced
52344:ff05e50efa0d 52345:87d8650d160c
    54   val derive_induct_iters_thms_for_types: BNF_Def.bnf list -> term list list ->
    54   val derive_induct_iters_thms_for_types: BNF_Def.bnf list -> term list list ->
    55     (typ list list * typ list list list list * term list list * term list list list list) list ->
    55     (typ list list * typ list list list list * term list list * term list list list list) list ->
    56     thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list -> typ list ->
    56     thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list -> typ list ->
    57     typ list -> typ list list list -> term list list -> thm list list -> term list list ->
    57     typ list -> typ list list list -> term list list -> thm list list -> term list list ->
    58     thm list list -> local_theory ->
    58     thm list list -> local_theory ->
    59     (thm * thm list * Args.src list) * (thm list list * Args.src list)
    59     (thm list * thm * Args.src list) * (thm list list * Args.src list)
    60     * (thm list list * Args.src list)
    60     * (thm list list * Args.src list)
    61   val derive_coinduct_coiters_thms_for_types: BNF_Def.bnf list -> term list list ->
    61   val derive_coinduct_coiters_thms_for_types: BNF_Def.bnf list -> term list list ->
    62     term list * term list list
    62     term list * term list list
    63     * ((term list list * term list list list list * term list list list list) * 'a) list ->
    63     * ((term list list * term list list list list * term list list list list) * 'a) list ->
    64     thm list -> thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list ->
    64     thm list -> thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list ->
    65     typ list -> typ list -> int list list -> int list list -> int list -> thm list list ->
    65     typ list -> typ list -> int list list -> int list list -> int list -> thm list list ->
    66     BNF_Ctr_Sugar.ctr_sugar list -> term list list -> thm list list -> local_theory ->
    66     BNF_Ctr_Sugar.ctr_sugar list -> term list list -> thm list list -> local_theory ->
    67     (thm * thm list * thm * thm list * Args.src list)
    67     ((thm list * thm) list * Args.src list)
    68     * (thm list list * thm list list * Args.src list)
    68     * (thm list list * thm list list * Args.src list)
    69     * (thm list list * thm list list) * (thm list list * thm list list * Args.src list)
    69     * (thm list list * thm list list) * (thm list list * thm list list * Args.src list)
    70     * (thm list list * thm list list * Args.src list)
    70     * (thm list list * thm list list * Args.src list)
    71     * (thm list list * thm list list * Args.src list)
    71     * (thm list list * thm list list * Args.src list)
    72 
    72 
   673       end;
   673       end;
   674 
   674 
   675     val fold_thmss = mk_iter_thmss fold_args_types folds fold_defs (map un_fold_of ctor_iter_thmss);
   675     val fold_thmss = mk_iter_thmss fold_args_types folds fold_defs (map un_fold_of ctor_iter_thmss);
   676     val rec_thmss = mk_iter_thmss rec_args_types recs rec_defs (map co_rec_of ctor_iter_thmss);
   676     val rec_thmss = mk_iter_thmss rec_args_types recs rec_defs (map co_rec_of ctor_iter_thmss);
   677   in
   677   in
   678     ((induct_thm, induct_thms, [induct_case_names_attr]),
   678     ((induct_thms, induct_thm, [induct_case_names_attr]),
   679      (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs))
   679      (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs))
   680   end;
   680   end;
   681 
   681 
   682 fun derive_coinduct_coiters_thms_for_types pre_bnfs (dtor_coiters1 :: _)
   682 fun derive_coinduct_coiters_thms_for_types pre_bnfs (dtor_coiters1 :: _)
   683     (cs, cpss,
   683     (cs, cpss,
   725 
   725 
   726     val vs = map2 (curry Free) vs' fpTs;
   726     val vs = map2 (curry Free) vs' fpTs;
   727     val vdiscss = map2 (map o rapp) vs discss;
   727     val vdiscss = map2 (map o rapp) vs discss;
   728     val vselsss = map2 (map o map o rapp) vs selsss;
   728     val vselsss = map2 (map o map o rapp) vs selsss;
   729 
   729 
   730     val ((coinduct_thms, coinduct_thm), (strong_coinduct_thms, strong_coinduct_thm)) =
   730     val coinduct_thms_pairs =
   731       let
   731       let
   732         val uvrs = map3 (fn r => fn u => fn v => r $ u $ v) rs us vs;
   732         val uvrs = map3 (fn r => fn u => fn v => r $ u $ v) rs us vs;
   733         val uv_eqs = map2 (curry HOLogic.mk_eq) us vs;
   733         val uv_eqs = map2 (curry HOLogic.mk_eq) us vs;
   734         val strong_rs =
   734         val strong_rs =
   735           map4 (fn u => fn v => fn uvr => fn uv_eq =>
   735           map4 (fn u => fn v => fn uvr => fn uv_eq =>
   776 
   776 
   777         fun mk_goal rs' =
   777         fun mk_goal rs' =
   778           Logic.list_implies (map8 (mk_prem rs') uvrs us vs ns udiscss uselsss vdiscss vselsss,
   778           Logic.list_implies (map8 (mk_prem rs') uvrs us vs ns udiscss uselsss vdiscss vselsss,
   779             concl);
   779             concl);
   780 
   780 
   781         val goal = mk_goal rs;
   781         val goals = map mk_goal [rs, strong_rs];
   782         val strong_goal = mk_goal strong_rs;
       
   783 
   782 
   784         fun prove dtor_coinduct' goal =
   783         fun prove dtor_coinduct' goal =
   785           Goal.prove_sorry lthy [] [] goal (fn {context = ctxt, ...} =>
   784           Goal.prove_sorry lthy [] [] goal (fn {context = ctxt, ...} =>
   786             mk_coinduct_tac ctxt nesting_rel_eqs nn ns dtor_coinduct' pre_rel_defs dtor_ctors
   785             mk_coinduct_tac ctxt nesting_rel_eqs nn ns dtor_coinduct' pre_rel_defs dtor_ctors
   787               exhausts ctr_defss disc_thmsss sel_thmsss)
   786               exhausts ctr_defss disc_thmsss sel_thmsss)
   792           Thm.permute_prems 0 nn
   791           Thm.permute_prems 0 nn
   793             (if nn = 1 then thm RS mp else funpow nn (fn thm => reassoc_conjs (thm RS mp_conj)) thm)
   792             (if nn = 1 then thm RS mp else funpow nn (fn thm => reassoc_conjs (thm RS mp_conj)) thm)
   794           |> Drule.zero_var_indexes
   793           |> Drule.zero_var_indexes
   795           |> `(conj_dests nn);
   794           |> `(conj_dests nn);
   796       in
   795       in
   797         (postproc nn (prove (co_induct_of dtor_coinducts) goal),
   796         map2 (postproc nn oo prove) dtor_coinducts goals
   798          postproc nn (prove (strong_co_induct_of dtor_coinducts) strong_goal))
       
   799       end;
   797       end;
   800 
   798 
   801     fun mk_coinduct_concls ms discs ctrs =
   799     fun mk_coinduct_concls ms discs ctrs =
   802       let
   800       let
   803         fun mk_disc_concl disc = [name_of_disc disc];
   801         fun mk_disc_concl disc = [name_of_disc disc];
   947           Attrib.internal (K (Rule_Cases.case_conclusion (casex, concls))))
   945           Attrib.internal (K (Rule_Cases.case_conclusion (casex, concls))))
   948         coinduct_cases coinduct_conclss;
   946         coinduct_cases coinduct_conclss;
   949     val coinduct_case_attrs =
   947     val coinduct_case_attrs =
   950       coinduct_consumes_attr :: coinduct_case_names_attr :: coinduct_case_concl_attrs;
   948       coinduct_consumes_attr :: coinduct_case_names_attr :: coinduct_case_concl_attrs;
   951   in
   949   in
   952     ((coinduct_thm, coinduct_thms, strong_coinduct_thm, strong_coinduct_thms, coinduct_case_attrs),
   950     ((coinduct_thms_pairs, coinduct_case_attrs),
   953      (unfold_thmss, corec_thmss, []),
   951      (unfold_thmss, corec_thmss, []),
   954      (safe_unfold_thmss, safe_corec_thmss),
   952      (safe_unfold_thmss, safe_corec_thmss),
   955      (disc_unfold_thmss, disc_corec_thmss, simp_attrs),
   953      (disc_unfold_thmss, disc_corec_thmss, simp_attrs),
   956      (disc_unfold_iff_thmss, disc_corec_iff_thmss, simp_attrs),
   954      (disc_unfold_iff_thmss, disc_corec_iff_thmss, simp_attrs),
   957      (sel_unfold_thmss, sel_corec_thmss, simp_attrs))
   955      (sel_unfold_thmss, sel_corec_thmss, simp_attrs))
  1108 
  1106 
  1109     val ((xtor_co_iterss, iters_args_types, coiters_args_types), lthy) =
  1107     val ((xtor_co_iterss, iters_args_types, coiters_args_types), lthy) =
  1110       mk_co_iters_prelims fp fpTs Cs ns mss xtor_co_iterss0 lthy;
  1108       mk_co_iters_prelims fp fpTs Cs ns mss xtor_co_iterss0 lthy;
  1111 
  1109 
  1112     fun define_ctrs_case_for_type ((((((((((((((((((((((((fp_bnf, fp_b), fpT), C), ctor), dtor),
  1110     fun define_ctrs_case_for_type ((((((((((((((((((((((((fp_bnf, fp_b), fpT), C), ctor), dtor),
  1113               xtor_co_iters), ctor_dtor), dtor_ctor), ctor_inject), pre_map_def), pre_set_defs),
  1111             xtor_co_iters), ctor_dtor), dtor_ctor), ctor_inject), pre_map_def), pre_set_defs),
  1114             pre_rel_def), fp_map_thm), fp_set_thms), fp_rel_thm), n), ks), ms), ctr_bindings),
  1112           pre_rel_def), fp_map_thm), fp_set_thms), fp_rel_thm), n), ks), ms), ctr_bindings),
  1115           ctr_mixfixes), ctr_Tss), disc_bindings), sel_bindingss), raw_sel_defaultss) no_defs_lthy =
  1113         ctr_mixfixes), ctr_Tss), disc_bindings), sel_bindingss), raw_sel_defaultss) no_defs_lthy =
  1116       let
  1114       let
  1117         val fp_b_name = Binding.name_of fp_b;
  1115         val fp_b_name = Binding.name_of fp_b;
  1118 
  1116 
  1119         val dtorT = domain_type (fastype_of ctor);
  1117         val dtorT = domain_type (fastype_of ctor);
  1120         val ctr_prod_Ts = map HOLogic.mk_tupleT ctr_Tss;
  1118         val ctr_prod_Ts = map HOLogic.mk_tupleT ctr_Tss;
  1319 
  1317 
  1320     fun derive_and_note_induct_iters_thms_for_types
  1318     fun derive_and_note_induct_iters_thms_for_types
  1321         ((((mapsx, rel_injects, rel_distincts, setss), (ctrss, _, ctr_defss, ctr_sugars)),
  1319         ((((mapsx, rel_injects, rel_distincts, setss), (ctrss, _, ctr_defss, ctr_sugars)),
  1322           (iterss, iter_defss)), lthy) =
  1320           (iterss, iter_defss)), lthy) =
  1323       let
  1321       let
  1324         val ((induct_thm, induct_thms, induct_attrs), (fold_thmss, fold_attrs),
  1322         val ((induct_thms, induct_thm, induct_attrs), (fold_thmss, fold_attrs),
  1325              (rec_thmss, rec_attrs)) =
  1323              (rec_thmss, rec_attrs)) =
  1326           derive_induct_iters_thms_for_types pre_bnfs xtor_co_iterss (the iters_args_types)
  1324           derive_induct_iters_thms_for_types pre_bnfs xtor_co_iterss (the iters_args_types)
  1327             xtor_co_inducts xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs Xs ctrXs_Tsss ctrss
  1325             xtor_co_inducts xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs Xs ctrXs_Tsss ctrss
  1328             ctr_defss iterss iter_defss lthy;
  1326             ctr_defss iterss iter_defss lthy;
  1329 
  1327 
  1351 
  1349 
  1352     fun derive_and_note_coinduct_coiters_thms_for_types
  1350     fun derive_and_note_coinduct_coiters_thms_for_types
  1353         ((((mapsx, rel_injects, rel_distincts, setss), (_, _, ctr_defss, ctr_sugars)),
  1351         ((((mapsx, rel_injects, rel_distincts, setss), (_, _, ctr_defss, ctr_sugars)),
  1354           (coiterss, coiter_defss)), lthy) =
  1352           (coiterss, coiter_defss)), lthy) =
  1355       let
  1353       let
  1356         val ((coinduct_thm, coinduct_thms, strong_coinduct_thm, strong_coinduct_thms,
  1354         val (([(coinduct_thms, coinduct_thm), (strong_coinduct_thms, strong_coinduct_thm)],
  1357               coinduct_attrs),
  1355               coinduct_attrs),
  1358              (unfold_thmss, corec_thmss, coiter_attrs),
  1356              (unfold_thmss, corec_thmss, coiter_attrs),
  1359              (safe_unfold_thmss, safe_corec_thmss),
  1357              (safe_unfold_thmss, safe_corec_thmss),
  1360              (disc_unfold_thmss, disc_corec_thmss, disc_coiter_attrs),
  1358              (disc_unfold_thmss, disc_corec_thmss, disc_coiter_attrs),
  1361              (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_coiter_iff_attrs),
  1359              (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_coiter_iff_attrs),