src/HOL/Tools/BNF/bnf_fp_n2m_sugar.ML
changeset 55803 74d3fe9031d8
parent 55772 367ec44763fd
child 55856 bddaada24074
equal deleted inserted replaced
55802:f7ceebe2f1b5 55803:74d3fe9031d8
   189         | callsp => freeze_fpTs_map kk fpT callsp T)
   189         | callsp => freeze_fpTs_map kk fpT callsp T)
   190       | freeze_fpTs_call _ _ _ T = T;
   190       | freeze_fpTs_call _ _ _ T = T;
   191 
   191 
   192     val ctr_Tsss = map (map binder_types) ctr_Tss;
   192     val ctr_Tsss = map (map binder_types) ctr_Tss;
   193     val ctrXs_Tsss = map4 (map2 o map2 oo freeze_fpTs_call) kks fpTs callssss ctr_Tsss;
   193     val ctrXs_Tsss = map4 (map2 o map2 oo freeze_fpTs_call) kks fpTs callssss ctr_Tsss;
   194     val ctrXs_sum_prod_Ts = map (mk_sumTN_balanced o map HOLogic.mk_tupleT) ctrXs_Tsss;
   194     val ctrXs_repTs = map (mk_sumTN_balanced o map HOLogic.mk_tupleT) ctrXs_Tsss;
   195 
   195 
   196     val ns = map length ctr_Tsss;
   196     val ns = map length ctr_Tsss;
   197     val kss = map (fn n => 1 upto n) ns;
   197     val kss = map (fn n => 1 upto n) ns;
   198     val mss = map (map length) ctr_Tsss;
   198     val mss = map (map length) ctr_Tsss;
   199 
   199 
   200     val fp_eqs = map dest_TFree Xs ~~ ctrXs_sum_prod_Ts;
   200     val fp_eqs = map dest_TFree Xs ~~ ctrXs_repTs;
   201     val key = key_of_fp_eqs fp fpTs fp_eqs;
   201     val key = key_of_fp_eqs fp fpTs fp_eqs;
   202   in
   202   in
   203     (case n2m_sugar_of no_defs_lthy key of
   203     (case n2m_sugar_of no_defs_lthy key of
   204       SOME n2m_sugar => (n2m_sugar, no_defs_lthy)
   204       SOME n2m_sugar => (n2m_sugar, no_defs_lthy)
   205     | NONE =>
   205     | NONE =>
   219               val deads = deads_of_bnf bnf;
   219               val deads = deads_of_bnf bnf;
   220               val dead_Us =
   220               val dead_Us =
   221                 map_filter (fn (T, U) => if member (op =) deads T then SOME U else NONE) (Ts ~~ Us);
   221                 map_filter (fn (T, U) => if member (op =) deads T then SOME U else NONE) (Ts ~~ Us);
   222             in fold Term.add_tfreesT dead_Us [] end);
   222             in fold Term.add_tfreesT dead_Us [] end);
   223 
   223 
   224         val (pre_bnfs, (fp_res as {xtor_co_iterss = xtor_co_iterss0, xtor_co_induct, dtor_injects,
   224         val fp_absT_infos = map #absT_info fp_sugars0;
   225                dtor_ctors, xtor_co_iter_thmss, ...}, lthy)) =
   225 
       
   226         val ((pre_bnfs, absT_infos), (fp_res as {xtor_co_iterss = xtor_co_iterss0, xtor_co_induct,
       
   227                dtor_injects, dtor_ctors, xtor_co_iter_thmss, ...}, lthy)) =
   226           fp_bnf (construct_mutualized_fp fp fpTs fp_sugars0) fp_bs As' killed_As' fp_eqs
   228           fp_bnf (construct_mutualized_fp fp fpTs fp_sugars0) fp_bs As' killed_As' fp_eqs
   227             no_defs_lthy;
   229             no_defs_lthy0;
       
   230 
       
   231         val fp_abs_inverses = map #abs_inverse fp_absT_infos;
       
   232         val fp_type_definitions = map #type_definition fp_absT_infos;
       
   233 
       
   234         val abss = map #abs absT_infos;
       
   235         val reps = map #rep absT_infos;
       
   236         val absTs = map #absT absT_infos;
       
   237         val repTs = map #repT absT_infos;
       
   238         val abs_inverses = map #abs_inverse absT_infos;
   228 
   239 
   229         val nesting_bnfs = nesty_bnfs lthy ctrXs_Tsss As;
   240         val nesting_bnfs = nesty_bnfs lthy ctrXs_Tsss As;
   230         val nested_bnfs = nesty_bnfs lthy ctrXs_Tsss Xs;
   241         val nested_bnfs = nesty_bnfs lthy ctrXs_Tsss Xs;
   231 
   242 
   232         val ((xtor_co_iterss, iters_args_types, coiters_args_types), _) =
   243         val ((xtor_co_iterss, iters_args_types, coiters_args_types), _) =
   233           mk_co_iters_prelims fp ctr_Tsss fpTs Cs ns mss xtor_co_iterss0 lthy;
   244           mk_co_iters_prelims fp ctr_Tsss fpTs Cs absTs repTs ns mss xtor_co_iterss0 lthy;
   234 
   245 
   235         fun mk_binding b suf = Binding.suffix_name ("_" ^ suf) b;
   246         fun mk_binding b suf = Binding.suffix_name ("_" ^ suf) b;
   236 
   247 
   237         val ((co_iterss, co_iter_defss), lthy) =
   248         val ((co_iterss, co_iter_defss), lthy) =
   238           fold_map2 (fn b =>
   249           fold_map2 (fn b =>
   239             (if fp = Least_FP then define_iters [foldN, recN] (the iters_args_types)
   250             if fp = Least_FP then
   240              else define_coiters [unfoldN, corecN] (the coiters_args_types))
   251               define_iters [foldN, recN] (the iters_args_types) (mk_binding b) fpTs Cs reps
   241               (mk_binding b) fpTs Cs) fp_bs xtor_co_iterss lthy
   252             else
       
   253               define_coiters [unfoldN, corecN] (the coiters_args_types) (mk_binding b) fpTs Cs abss)
       
   254             fp_bs xtor_co_iterss lthy
   242           |>> split_list;
   255           |>> split_list;
   243 
   256 
   244         val ((common_co_inducts, co_inductss, un_fold_thmss, co_rec_thmss, disc_unfold_thmss,
   257         val ((common_co_inducts, co_inductss, un_fold_thmss, co_rec_thmss, disc_unfold_thmss,
   245               disc_corec_thmss, sel_unfold_thmsss, sel_corec_thmsss), fp_sugar_thms) =
   258               disc_corec_thmss, sel_unfold_thmsss, sel_corec_thmsss), fp_sugar_thms) =
   246           if fp = Least_FP then
   259           if fp = Least_FP then
   247             derive_induct_iters_thms_for_types pre_bnfs (the iters_args_types) xtor_co_induct
   260             derive_induct_iters_thms_for_types pre_bnfs (the iters_args_types) xtor_co_induct
   248               xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs Xs ctrXs_Tsss ctrss ctr_defss
   261               xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs Xs ctrXs_Tsss fp_abs_inverses
   249               co_iterss co_iter_defss lthy
   262               fp_type_definitions abs_inverses ctrss ctr_defss co_iterss co_iter_defss lthy
   250             |> `(fn ((inducts, induct, _), (fold_thmss, rec_thmss, _)) =>
   263             |> `(fn ((inducts, induct, _), (fold_thmss, rec_thmss, _)) =>
   251               ([induct], [inducts], fold_thmss, rec_thmss, replicate nn [],
   264               ([induct], [inducts], fold_thmss, rec_thmss, replicate nn [],
   252                replicate nn [], replicate nn [], replicate nn []))
   265                replicate nn [], replicate nn [], replicate nn []))
   253             ||> (fn info => (SOME info, NONE))
   266             ||> (fn info => (SOME info, NONE))
   254           else
   267           else
   255             derive_coinduct_coiters_thms_for_types pre_bnfs (the coiters_args_types) xtor_co_induct
   268             derive_coinduct_coiters_thms_for_types pre_bnfs (the coiters_args_types) xtor_co_induct
   256               dtor_injects dtor_ctors xtor_co_iter_thmss nesting_bnfs fpTs Cs Xs ctrXs_Tsss kss mss
   269               dtor_injects dtor_ctors xtor_co_iter_thmss nesting_bnfs fpTs Cs Xs ctrXs_Tsss kss mss
   257               ns ctr_defss ctr_sugars co_iterss co_iter_defss
   270               ns fp_abs_inverses abs_inverses (fn thm => thm RS @{thm vimage2p_refl}) ctr_defss
   258               (Proof_Context.export lthy no_defs_lthy) lthy
   271               ctr_sugars co_iterss co_iter_defss (Proof_Context.export lthy no_defs_lthy) lthy
   259             |> `(fn ((coinduct_thms_pairs, _), (unfold_thmss, corec_thmss, _),
   272             |> `(fn ((coinduct_thms_pairs, _), (unfold_thmss, corec_thmss, _),
   260                     (disc_unfold_thmss, disc_corec_thmss, _), _,
   273                     (disc_unfold_thmss, disc_corec_thmss, _), _,
   261                     (sel_unfold_thmsss, sel_corec_thmsss, _)) =>
   274                     (sel_unfold_thmsss, sel_corec_thmsss, _)) =>
   262               (map snd coinduct_thms_pairs, map fst coinduct_thms_pairs, unfold_thmss,
   275               (map snd coinduct_thms_pairs, map fst coinduct_thms_pairs, unfold_thmss,
   263                corec_thmss, disc_unfold_thmss, disc_corec_thmss, sel_unfold_thmsss,
   276                corec_thmss, disc_unfold_thmss, disc_corec_thmss, sel_unfold_thmsss,
   264                sel_corec_thmsss))
   277                sel_corec_thmsss))
   265             ||> (fn info => (NONE, SOME info));
   278             ||> (fn info => (NONE, SOME info));
   266 
   279 
   267         val phi = Proof_Context.export_morphism no_defs_lthy no_defs_lthy0;
   280         val phi = Proof_Context.export_morphism no_defs_lthy no_defs_lthy0;
   268 
   281 
   269         fun mk_target_fp_sugar T X kk pre_bnf ctrXs_Tss ctr_defs ctr_sugar co_iters maps co_inducts
   282         fun mk_target_fp_sugar T X kk pre_bnf absT_info ctrXs_Tss ctr_defs ctr_sugar co_iters maps
   270             un_fold_thms co_rec_thms disc_unfold_thms disc_corec_thms sel_unfold_thmss
   283             co_inducts un_fold_thms co_rec_thms disc_unfold_thms disc_corec_thms sel_unfold_thmss
   271             sel_corec_thmss =
   284             sel_corec_thmss =
   272           {T = T, X = X, fp = fp, fp_res = fp_res, fp_res_index = kk, pre_bnf = pre_bnf,
   285           {T = T, X = X, fp = fp, fp_res = fp_res, fp_res_index = kk, pre_bnf = pre_bnf,
   273            nested_bnfs = nested_bnfs, nesting_bnfs = nesting_bnfs, ctrXs_Tss = ctrXs_Tss,
   286            absT_info = absT_info, nested_bnfs = nested_bnfs, nesting_bnfs = nesting_bnfs,
   274            ctr_defs = ctr_defs, ctr_sugar = ctr_sugar, co_iters = co_iters, maps = maps,
   287            ctrXs_Tss = ctrXs_Tss, ctr_defs = ctr_defs, ctr_sugar = ctr_sugar, co_iters = co_iters,
   275            common_co_inducts = common_co_inducts, co_inducts = co_inducts,
   288            maps = maps, common_co_inducts = common_co_inducts, co_inducts = co_inducts,
   276            co_iter_thmss = [un_fold_thms, co_rec_thms],
   289            co_iter_thmss = [un_fold_thms, co_rec_thms],
   277            disc_co_iterss = [disc_unfold_thms, disc_corec_thms],
   290            disc_co_iterss = [disc_unfold_thms, disc_corec_thms],
   278            sel_co_itersss = [sel_unfold_thmss, sel_corec_thmss]}
   291            sel_co_itersss = [sel_unfold_thmss, sel_corec_thmss]}
   279           |> morph_fp_sugar phi;
   292           |> morph_fp_sugar phi;
   280 
   293 
   281         val target_fp_sugars =
   294         val target_fp_sugars =
   282           map16 mk_target_fp_sugar fpTs Xs kks pre_bnfs ctrXs_Tsss ctr_defss ctr_sugars co_iterss
   295           map17 mk_target_fp_sugar fpTs Xs kks pre_bnfs absT_infos ctrXs_Tsss ctr_defss ctr_sugars
   283             mapss (transpose co_inductss) un_fold_thmss co_rec_thmss disc_unfold_thmss
   296             co_iterss mapss (transpose co_inductss) un_fold_thmss co_rec_thmss disc_unfold_thmss
   284             disc_corec_thmss sel_unfold_thmsss sel_corec_thmsss;
   297             disc_corec_thmss sel_unfold_thmsss sel_corec_thmsss;
   285 
   298 
   286         val n2m_sugar = (target_fp_sugars, fp_sugar_thms);
   299         val n2m_sugar = (target_fp_sugars, fp_sugar_thms);
   287       in
   300       in
   288         (n2m_sugar, lthy |> register_n2m_sugar key n2m_sugar)
   301         (n2m_sugar, lthy |> register_n2m_sugar key n2m_sugar)