src/HOL/BNF/Tools/bnf_fp_def_sugar.ML
changeset 52357 a5d3730043c2
parent 52356 45cc1a793955
child 52367 2f5e6ad6e91f
equal deleted inserted replaced
52356:45cc1a793955 52357:a5d3730043c2
    60   val derive_coinduct_coiters_thms_for_types: BNF_Def.bnf list ->
    60   val derive_coinduct_coiters_thms_for_types: BNF_Def.bnf list ->
    61     string * term list * term list list * ((term list list * term list list list)
    61     string * term list * term list list * ((term list list * term list list list)
    62       * (typ list * typ list list)) list ->
    62       * (typ list * typ list list)) list ->
    63     thm list -> thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list ->
    63     thm list -> thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list ->
    64     typ list -> typ list -> int list list -> int list list -> int list -> thm list list ->
    64     typ list -> typ list -> int list list -> int list list -> int list -> thm list list ->
    65     BNF_Ctr_Sugar.ctr_sugar list -> term list list -> thm list list -> local_theory ->
    65     BNF_Ctr_Sugar.ctr_sugar list -> term list list -> thm list list -> (thm list -> thm list) ->
       
    66     local_theory ->
    66     ((thm list * thm) list * Args.src list)
    67     ((thm list * thm) list * Args.src list)
    67     * (thm list list * thm list list * Args.src list)
    68     * (thm list list * thm list list * Args.src list)
    68     * (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)
    69     * (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)
   666   end;
   667   end;
   667 
   668 
   668 fun derive_coinduct_coiters_thms_for_types pre_bnfs (z, cs, cpss,
   669 fun derive_coinduct_coiters_thms_for_types pre_bnfs (z, cs, cpss,
   669       [(unfold_args as (pgss, crgsss), _), (corec_args as (phss, cshsss), _)])
   670       [(unfold_args as (pgss, crgsss), _), (corec_args as (phss, cshsss), _)])
   670     dtor_coinducts dtor_ctors dtor_coiter_thmss nesting_bnfs nested_bnfs fpTs Cs As kss mss ns
   671     dtor_coinducts dtor_ctors dtor_coiter_thmss nesting_bnfs nested_bnfs fpTs Cs As kss mss ns
   671     ctr_defss ctr_sugars coiterss coiter_defss lthy =
   672     ctr_defss ctr_sugars coiterss coiter_defss export_args lthy =
   672   let
   673   let
   673     val coiterss' = transpose coiterss;
   674     val coiterss' = transpose coiterss;
   674     val coiter_defss' = transpose coiter_defss;
   675     val coiter_defss' = transpose coiter_defss;
   675 
   676 
   676     val [unfold_defs, corec_defs] = coiter_defss';
   677     val [unfold_defs, corec_defs] = coiter_defss';
   898         val corec_tacss =
   899         val corec_tacss =
   899           map3 (map oo mk_disc_coiter_iff_tac) case_splitss' corec_thmss disc_thmsss;
   900           map3 (map oo mk_disc_coiter_iff_tac) case_splitss' corec_thmss disc_thmsss;
   900 
   901 
   901         fun prove goal tac =
   902         fun prove goal tac =
   902           Goal.prove_sorry lthy [] [] goal (tac o #context)
   903           Goal.prove_sorry lthy [] [] goal (tac o #context)
       
   904           |> singleton export_args
   903           |> singleton (Proof_Context.export names_lthy lthy)
   905           |> singleton (Proof_Context.export names_lthy lthy)
   904           |> Thm.close_derivation;
   906           |> Thm.close_derivation;
   905 
   907 
   906         fun proves [_] [_] = []
   908         fun proves [_] [_] = []
   907           | proves goals tacs = map2 prove goals tacs;
   909           | proves goals tacs = map2 prove goals tacs;
  1099     val ctr_Tsss = map (map (map (Term.typ_subst_atomic (Xs ~~ fpTs)))) ctrXs_Tsss;
  1101     val ctr_Tsss = map (map (map (Term.typ_subst_atomic (Xs ~~ fpTs)))) ctrXs_Tsss;
  1100     val ns = map length ctr_Tsss;
  1102     val ns = map length ctr_Tsss;
  1101     val kss = map (fn n => 1 upto n) ns;
  1103     val kss = map (fn n => 1 upto n) ns;
  1102     val mss = map (map length) ctr_Tsss;
  1104     val mss = map (map length) ctr_Tsss;
  1103 
  1105 
       
  1106     (* FIXME: names (lthyX, lthyY) *)
       
  1107     val lthyX = lthy;
  1104     val ((xtor_co_iterss, iters_args_types, coiters_args_types), lthy) =
  1108     val ((xtor_co_iterss, iters_args_types, coiters_args_types), lthy) =
  1105       mk_co_iters_prelims fp fpTs Cs ns mss xtor_co_iterss0 lthy;
  1109       mk_co_iters_prelims fp fpTs Cs ns mss xtor_co_iterss0 lthy;
       
  1110     val lthyY = lthy;
  1106 
  1111 
  1107     fun define_ctrs_case_for_type ((((((((((((((((((((((((fp_bnf, fp_b), fpT), C), ctor), dtor),
  1112     fun define_ctrs_case_for_type ((((((((((((((((((((((((fp_bnf, fp_b), fpT), C), ctor), dtor),
  1108             xtor_co_iters), ctor_dtor), dtor_ctor), ctor_inject), pre_map_def), pre_set_defs),
  1113             xtor_co_iters), ctor_dtor), dtor_ctor), ctor_inject), pre_map_def), pre_set_defs),
  1109           pre_rel_def), fp_map_thm), fp_set_thms), fp_rel_thm), n), ks), ms), ctr_bindings),
  1114           pre_rel_def), fp_map_thm), fp_set_thms), fp_rel_thm), n), ks), ms), ctr_bindings),
  1110         ctr_mixfixes), ctr_Tss), disc_bindings), sel_bindingss), raw_sel_defaultss) no_defs_lthy =
  1115         ctr_mixfixes), ctr_Tss), disc_bindings), sel_bindingss), raw_sel_defaultss) no_defs_lthy =
  1355              (disc_unfold_thmss, disc_corec_thmss, disc_coiter_attrs),
  1360              (disc_unfold_thmss, disc_corec_thmss, disc_coiter_attrs),
  1356              (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_coiter_iff_attrs),
  1361              (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_coiter_iff_attrs),
  1357              (sel_unfold_thmss, sel_corec_thmss, sel_coiter_attrs)) =
  1362              (sel_unfold_thmss, sel_corec_thmss, sel_coiter_attrs)) =
  1358           derive_coinduct_coiters_thms_for_types pre_bnfs (the coiters_args_types) xtor_co_inducts
  1363           derive_coinduct_coiters_thms_for_types pre_bnfs (the coiters_args_types) xtor_co_inducts
  1359             dtor_ctors xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs As kss mss ns ctr_defss
  1364             dtor_ctors xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs As kss mss ns ctr_defss
  1360             ctr_sugars coiterss coiter_defss lthy;
  1365             ctr_sugars coiterss coiter_defss (Proof_Context.export lthyY lthyX) lthy;
  1361 
  1366 
  1362         val coinduct_type_attr = Attrib.internal o K o Induct.coinduct_type;
  1367         val coinduct_type_attr = Attrib.internal o K o Induct.coinduct_type;
  1363 
  1368 
  1364         fun flat_coiter_thms coiters disc_coiters sel_coiters =
  1369         fun flat_coiter_thms coiters disc_coiters sel_coiters =
  1365           coiters @ disc_coiters @ sel_coiters;
  1370           coiters @ disc_coiters @ sel_coiters;