src/HOL/Tools/BNF/bnf_fp_def_sugar.ML
changeset 58732 854eed6e5aed
parent 58731 43a3ef574065
child 58734 20235f0512e2
equal deleted inserted replaced
58731:43a3ef574065 58732:854eed6e5aed
    40      co_rec_discs: thm list,
    40      co_rec_discs: thm list,
    41      co_rec_disc_iffs: thm list,
    41      co_rec_disc_iffs: thm list,
    42      co_rec_selss: thm list list,
    42      co_rec_selss: thm list list,
    43      co_rec_codes: thm list,
    43      co_rec_codes: thm list,
    44      co_rec_transfers: thm list,
    44      co_rec_transfers: thm list,
       
    45      rec_o_maps: thm list,
    45      common_rel_co_inducts: thm list,
    46      common_rel_co_inducts: thm list,
    46      rel_co_inducts: thm list,
    47      rel_co_inducts: thm list,
    47      common_set_inducts: thm list,
    48      common_set_inducts: thm list,
    48      set_inducts: thm list}
    49      set_inducts: thm list}
    49 
    50 
   174 val sel_transferN = "sel_transfer";
   175 val sel_transferN = "sel_transfer";
   175 val corec_codeN = "corec_code";
   176 val corec_codeN = "corec_code";
   176 val corec_transferN = "corec_transfer";
   177 val corec_transferN = "corec_transfer";
   177 val map_disc_iffN = "map_disc_iff";
   178 val map_disc_iffN = "map_disc_iff";
   178 val map_selN = "map_sel";
   179 val map_selN = "map_sel";
       
   180 val rec_o_mapN = "rec_o_map";
   179 val rec_transferN = "rec_transfer";
   181 val rec_transferN = "rec_transfer";
   180 val set_casesN = "set_cases";
   182 val set_casesN = "set_cases";
   181 val set_introsN = "set_intros";
   183 val set_introsN = "set_intros";
   182 val set_inductN = "set_induct";
   184 val set_inductN = "set_induct";
   183 val set_selN = "set_sel";
   185 val set_selN = "set_sel";
   214    co_rec_discs: thm list,
   216    co_rec_discs: thm list,
   215    co_rec_disc_iffs: thm list,
   217    co_rec_disc_iffs: thm list,
   216    co_rec_selss: thm list list,
   218    co_rec_selss: thm list list,
   217    co_rec_codes: thm list,
   219    co_rec_codes: thm list,
   218    co_rec_transfers: thm list,
   220    co_rec_transfers: thm list,
       
   221    rec_o_maps: thm list,
   219    common_rel_co_inducts: thm list,
   222    common_rel_co_inducts: thm list,
   220    rel_co_inducts: thm list,
   223    rel_co_inducts: thm list,
   221    common_set_inducts: thm list,
   224    common_set_inducts: thm list,
   222    set_inducts: thm list};
   225    set_inducts: thm list};
   223 
   226 
   252    set_selssss = map (map (map (map (Morphism.thm phi)))) set_selssss,
   255    set_selssss = map (map (map (map (Morphism.thm phi)))) set_selssss,
   253    set_introssss = map (map (map (map (Morphism.thm phi)))) set_introssss,
   256    set_introssss = map (map (map (map (Morphism.thm phi)))) set_introssss,
   254    set_cases = map (Morphism.thm phi) set_cases};
   257    set_cases = map (Morphism.thm phi) set_cases};
   255 
   258 
   256 fun morph_fp_co_induct_sugar phi ({co_rec, common_co_inducts, co_inducts, co_rec_def, co_rec_thms,
   259 fun morph_fp_co_induct_sugar phi ({co_rec, common_co_inducts, co_inducts, co_rec_def, co_rec_thms,
   257     co_rec_discs, co_rec_disc_iffs, co_rec_selss, co_rec_codes, co_rec_transfers,
   260     co_rec_discs, co_rec_disc_iffs, co_rec_selss, co_rec_codes, co_rec_transfers, rec_o_maps,
   258     common_rel_co_inducts, rel_co_inducts, common_set_inducts, set_inducts} : fp_co_induct_sugar) =
   261     common_rel_co_inducts, rel_co_inducts, common_set_inducts, set_inducts} : fp_co_induct_sugar) =
   259   {co_rec = Morphism.term phi co_rec,
   262   {co_rec = Morphism.term phi co_rec,
   260    common_co_inducts = map (Morphism.thm phi) common_co_inducts,
   263    common_co_inducts = map (Morphism.thm phi) common_co_inducts,
   261    co_inducts = map (Morphism.thm phi) co_inducts,
   264    co_inducts = map (Morphism.thm phi) co_inducts,
   262    co_rec_def = Morphism.thm phi co_rec_def,
   265    co_rec_def = Morphism.thm phi co_rec_def,
   264    co_rec_discs = map (Morphism.thm phi) co_rec_discs,
   267    co_rec_discs = map (Morphism.thm phi) co_rec_discs,
   265    co_rec_disc_iffs = map (Morphism.thm phi) co_rec_disc_iffs,
   268    co_rec_disc_iffs = map (Morphism.thm phi) co_rec_disc_iffs,
   266    co_rec_selss = map (map (Morphism.thm phi)) co_rec_selss,
   269    co_rec_selss = map (map (Morphism.thm phi)) co_rec_selss,
   267    co_rec_codes = map (Morphism.thm phi) co_rec_codes,
   270    co_rec_codes = map (Morphism.thm phi) co_rec_codes,
   268    co_rec_transfers = map (Morphism.thm phi) co_rec_transfers,
   271    co_rec_transfers = map (Morphism.thm phi) co_rec_transfers,
       
   272    rec_o_maps = map (Morphism.thm phi) rec_o_maps,
   269    common_rel_co_inducts = map (Morphism.thm phi) common_rel_co_inducts,
   273    common_rel_co_inducts = map (Morphism.thm phi) common_rel_co_inducts,
   270    rel_co_inducts = map (Morphism.thm phi) rel_co_inducts,
   274    rel_co_inducts = map (Morphism.thm phi) rel_co_inducts,
   271    common_set_inducts = map (Morphism.thm phi) common_set_inducts,
   275    common_set_inducts = map (Morphism.thm phi) common_set_inducts,
   272    set_inducts = map (Morphism.thm phi) set_inducts};
   276    set_inducts = map (Morphism.thm phi) set_inducts};
   273 
   277 
   346     live_nesting_bnfs fp_res ctrXs_Tsss ctr_defss ctr_sugars co_recs co_rec_defs map_thmss
   350     live_nesting_bnfs fp_res ctrXs_Tsss ctr_defss ctr_sugars co_recs co_rec_defs map_thmss
   347     common_co_inducts co_inductss co_rec_thmss co_rec_discss co_rec_selsss rel_injectss
   351     common_co_inducts co_inductss co_rec_thmss co_rec_discss co_rec_selsss rel_injectss
   348     rel_distinctss map_disc_iffss map_selsss rel_selss rel_intross rel_casess set_thmss set_selsssss
   352     rel_distinctss map_disc_iffss map_selsss rel_selss rel_intross rel_casess set_thmss set_selsssss
   349     set_introsssss set_casess ctr_transferss case_transferss disc_transferss co_rec_disc_iffss
   353     set_introsssss set_casess ctr_transferss case_transferss disc_transferss co_rec_disc_iffss
   350     co_rec_codess co_rec_transferss common_rel_co_inducts rel_co_inductss common_set_inducts
   354     co_rec_codess co_rec_transferss common_rel_co_inducts rel_co_inductss common_set_inducts
   351     set_inductss sel_transferss noted =
   355     set_inductss sel_transferss rec_o_mapss noted =
   352   let
   356   let
   353     val fp_sugars =
   357     val fp_sugars =
   354       map_index (fn (kk, T) =>
   358       map_index (fn (kk, T) =>
   355         {T = T, BT = nth BTs kk, X = nth Xs kk, fp = fp, fp_res = fp_res, fp_res_index = kk,
   359         {T = T, BT = nth BTs kk, X = nth Xs kk, fp = fp, fp_res = fp_res, fp_res_index = kk,
   356          pre_bnf = nth pre_bnfs kk, absT_info = nth absT_infos kk,
   360          pre_bnf = nth pre_bnfs kk, absT_info = nth absT_infos kk,
   386             co_rec_discs = nth co_rec_discss kk,
   390             co_rec_discs = nth co_rec_discss kk,
   387             co_rec_disc_iffs = nth co_rec_disc_iffss kk,
   391             co_rec_disc_iffs = nth co_rec_disc_iffss kk,
   388             co_rec_selss = nth co_rec_selsss kk,
   392             co_rec_selss = nth co_rec_selsss kk,
   389             co_rec_codes = nth co_rec_codess kk,
   393             co_rec_codes = nth co_rec_codess kk,
   390             co_rec_transfers = nth co_rec_transferss kk,
   394             co_rec_transfers = nth co_rec_transferss kk,
       
   395             rec_o_maps = nth rec_o_mapss kk,
   391             common_rel_co_inducts = common_rel_co_inducts,
   396             common_rel_co_inducts = common_rel_co_inducts,
   392             rel_co_inducts = nth rel_co_inductss kk,
   397             rel_co_inducts = nth rel_co_inductss kk,
   393             common_set_inducts = common_set_inducts,
   398             common_set_inducts = common_set_inducts,
   394             set_inducts = nth set_inductss kk}}
   399             set_inducts = nth set_inductss kk}}
   395         |> morph_fp_sugar (substitute_noted_thm noted)) Ts;
   400         |> morph_fp_sugar (substitute_noted_thm noted)) Ts;
  1997 
  2002 
  1998     val ((pre_bnfs, absT_infos), (fp_res as {bnfs = fp_bnfs as any_fp_bnf :: _, ctors = ctors0,
  2003     val ((pre_bnfs, absT_infos), (fp_res as {bnfs = fp_bnfs as any_fp_bnf :: _, ctors = ctors0,
  1999              dtors = dtors0, xtor_co_recs = xtor_co_recs0, xtor_co_induct, dtor_ctors,
  2004              dtors = dtors0, xtor_co_recs = xtor_co_recs0, xtor_co_induct, dtor_ctors,
  2000              ctor_dtors, ctor_injects, dtor_injects, xtor_maps, xtor_setss, xtor_rels,
  2005              ctor_dtors, ctor_injects, dtor_injects, xtor_maps, xtor_setss, xtor_rels,
  2001              xtor_co_rec_thms, xtor_rel_co_induct, dtor_set_inducts,
  2006              xtor_co_rec_thms, xtor_rel_co_induct, dtor_set_inducts,
  2002              xtor_co_rec_transfers, ...},
  2007              xtor_co_rec_transfers, xtor_co_rec_o_maps, ...},
  2003            lthy)) =
  2008            lthy)) =
  2004       fp_bnf (construct_fp mixfixes map_bs rel_bs set_bss) fp_bs (map dest_TFree unsorted_As)
  2009       fp_bnf (construct_fp mixfixes map_bs rel_bs set_bss) fp_bs (map dest_TFree unsorted_As)
  2005         (map dest_TFree killed_As) fp_eqs no_defs_lthy
  2010         (map dest_TFree killed_As) fp_eqs no_defs_lthy
  2006       handle BAD_DEAD (X, X_backdrop) =>
  2011       handle BAD_DEAD (X, X_backdrop) =>
  2007         (case X_backdrop of
  2012         (case X_backdrop of
  2046     val pre_map_defs = map map_def_of_bnf pre_bnfs;
  2051     val pre_map_defs = map map_def_of_bnf pre_bnfs;
  2047     val pre_set_defss = map set_defs_of_bnf pre_bnfs;
  2052     val pre_set_defss = map set_defs_of_bnf pre_bnfs;
  2048     val pre_rel_defs = map rel_def_of_bnf pre_bnfs;
  2053     val pre_rel_defs = map rel_def_of_bnf pre_bnfs;
  2049     val fp_nesting_set_maps = maps set_map_of_bnf fp_nesting_bnfs;
  2054     val fp_nesting_set_maps = maps set_map_of_bnf fp_nesting_bnfs;
  2050     val live_nesting_map_id0s = map map_id0_of_bnf live_nesting_bnfs;
  2055     val live_nesting_map_id0s = map map_id0_of_bnf live_nesting_bnfs;
       
  2056     val live_nesting_map_ident0s = map map_ident0_of_bnf live_nesting_bnfs;
  2051     val live_nesting_set_maps = maps set_map_of_bnf live_nesting_bnfs;
  2057     val live_nesting_set_maps = maps set_map_of_bnf live_nesting_bnfs;
  2052     val live_nesting_rel_eqs = map rel_eq_of_bnf live_nesting_bnfs;
  2058     val live_nesting_rel_eqs = map rel_eq_of_bnf live_nesting_bnfs;
  2053 
  2059 
  2054     val live = live_of_bnf any_fp_bnf;
  2060     val live = live_of_bnf any_fp_bnf;
  2055     val _ =
  2061     val _ =
  2062       @{map 3} (fn alive => fn A as TFree (_, S) => fn B =>
  2068       @{map 3} (fn alive => fn A as TFree (_, S) => fn B =>
  2063           if alive then resort_tfree_or_tvar S B else A)
  2069           if alive then resort_tfree_or_tvar S B else A)
  2064         (liveness_of_fp_bnf num_As any_fp_bnf) As Bs0;
  2070         (liveness_of_fp_bnf num_As any_fp_bnf) As Bs0;
  2065 
  2071 
  2066     val B_ify_T = Term.typ_subst_atomic (As ~~ Bs);
  2072     val B_ify_T = Term.typ_subst_atomic (As ~~ Bs);
       
  2073     val live_AsBs = filter (op <>) (As ~~ Bs);
  2067 
  2074 
  2068     val ctors = map (mk_ctor As) ctors0;
  2075     val ctors = map (mk_ctor As) ctors0;
  2069     val dtors = map (mk_dtor As) dtors0;
  2076     val dtors = map (mk_dtor As) dtors0;
  2070 
  2077 
  2071     val fpTs = map (domain_type o fastype_of) dtors;
  2078     val fpTs = map (domain_type o fastype_of) dtors;
  2206       injects @ distincts @ case_thms @ co_recs @ map_thms @ rel_injects @ rel_distincts @
  2213       injects @ distincts @ case_thms @ co_recs @ map_thms @ rel_injects @ rel_distincts @
  2207       set_thmss;
  2214       set_thmss;
  2208 
  2215 
  2209     fun mk_co_rec_transfer_goals lthy co_recs =
  2216     fun mk_co_rec_transfer_goals lthy co_recs =
  2210       let
  2217       let
  2211         val liveAsBs = filter (op <>) (As ~~ Bs);
  2218         val B_ify = Term.subst_atomic_types (live_AsBs @ (Cs ~~ Es));
  2212         val B_ify = Term.subst_atomic_types (liveAsBs @ (Cs ~~ Es));
       
  2213 
  2219 
  2214         val ((Rs, Ss), names_lthy) = lthy
  2220         val ((Rs, Ss), names_lthy) = lthy
  2215           |> mk_Frees "R" (map (uncurry mk_pred2T) liveAsBs)
  2221           |> mk_Frees "R" (map (uncurry mk_pred2T) live_AsBs)
  2216           ||>> mk_Frees "S" (map2 mk_pred2T Cs Es);
  2222           ||>> mk_Frees "S" (map2 mk_pred2T Cs Es);
  2217 
  2223 
  2218         val co_recBs = map B_ify co_recs;
  2224         val co_recBs = map B_ify co_recs;
  2219       in
  2225       in
  2220         (Rs, Ss, map2 (mk_parametricity_goal lthy (Rs @ Ss)) co_recs co_recBs, names_lthy)
  2226         (Rs, Ss, map2 (mk_parametricity_goal lthy (Rs @ Ss)) co_recs co_recBs, names_lthy)
  2228                xtor_co_rec_transfers pre_rel_defs live_nesting_rel_eqs)
  2234                xtor_co_rec_transfers pre_rel_defs live_nesting_rel_eqs)
  2229         |> Conjunction.elim_balanced nn
  2235         |> Conjunction.elim_balanced nn
  2230         |> Proof_Context.export names_lthy lthy
  2236         |> Proof_Context.export names_lthy lthy
  2231         |> map Thm.close_derivation
  2237         |> map Thm.close_derivation
  2232       end;
  2238       end;
       
  2239 
       
  2240     fun derive_rec_o_map_thmss lthy recs rec_defs =
       
  2241       if live = 0 then replicate nn []
       
  2242       else
       
  2243         let
       
  2244           fun variant_names n pre = fst (Variable.variant_fixes (replicate n pre) lthy);
       
  2245 
       
  2246           val maps0 = map map_of_bnf fp_bnfs;
       
  2247           val ABs = As ~~ Bs
       
  2248           val liveness = map (op <>) ABs;
       
  2249           val f_names = variant_names num_As "f";
       
  2250           val fs = map2 (curry Free) f_names (map (op -->) ABs);
       
  2251           val live_gs = AList.find (op =) (fs ~~ liveness) true;
       
  2252 
       
  2253           val gmaps = map (fn map0 => Term.list_comb (mk_map live As Bs map0, live_gs)) maps0;
       
  2254 
       
  2255           val rec_Ts as rec_T1 :: _ = map fastype_of recs;
       
  2256           val rec_arg_Ts = binder_fun_types rec_T1;
       
  2257 
       
  2258           val B_ify_T = Term.typ_subst_atomic (As ~~ Bs);
       
  2259 
       
  2260           val num_rec_args = length rec_arg_Ts;
       
  2261           val g_Ts = map B_ify_T rec_arg_Ts;
       
  2262           val g_names = variant_names num_rec_args "g";
       
  2263           val gs = map2 (curry Free) g_names g_Ts;
       
  2264           val grecs = map (fn recx => Term.list_comb (Term.map_types B_ify_T recx, gs)) recs;
       
  2265 
       
  2266           val rec_o_map_lhss = map2 (curry HOLogic.mk_comp) grecs gmaps;
       
  2267 
       
  2268           val ABfs = ABs ~~ fs;
       
  2269 
       
  2270           fun mk_rec_arg_arg (x as Free (_, T)) =
       
  2271             let val U = B_ify_T T in
       
  2272               if T = U then x else build_map lthy [] (the o AList.lookup (op =) ABfs) (T, U) $ x
       
  2273             end;
       
  2274 
       
  2275           fun mk_rec_o_map_arg rec_arg_T h =
       
  2276             let
       
  2277               val x_Ts = binder_types rec_arg_T;
       
  2278               val m = length x_Ts;
       
  2279               val x_names = variant_names m "x";
       
  2280               val xs = map2 (curry Free) x_names x_Ts;
       
  2281               val xs' = map mk_rec_arg_arg xs;
       
  2282             in
       
  2283               fold_rev Term.lambda xs (Term.list_comb (h, xs'))
       
  2284             end;
       
  2285 
       
  2286           fun mk_rec_o_map_rhs recx =
       
  2287             let val args = map2 mk_rec_o_map_arg rec_arg_Ts gs in
       
  2288               Term.list_comb (recx, args)
       
  2289             end;
       
  2290 
       
  2291           val rec_o_map_rhss = map mk_rec_o_map_rhs recs;
       
  2292 
       
  2293           val rec_o_map_goals =
       
  2294             map2 (fold_rev (fold_rev Logic.all) [fs, gs] o HOLogic.mk_Trueprop oo
       
  2295               curry HOLogic.mk_eq) rec_o_map_lhss rec_o_map_rhss;
       
  2296           val rec_o_map_thms =
       
  2297             @{map 3} (fn goal => fn rec_def => fn ctor_rec_o_map =>
       
  2298                 Goal.prove_sorry lthy [] [] goal (fn {context = ctxt, ...} =>
       
  2299                   mk_rec_o_map_tac ctxt rec_def pre_map_defs live_nesting_map_ident0s abs_inverses
       
  2300                     ctor_rec_o_map)
       
  2301                 |> Thm.close_derivation)
       
  2302               rec_o_map_goals rec_defs xtor_co_rec_o_maps;
       
  2303         in
       
  2304           map single rec_o_map_thms
       
  2305         end;
  2233 
  2306 
  2234     fun derive_note_induct_recs_thms_for_types
  2307     fun derive_note_induct_recs_thms_for_types
  2235         ((((map_thmss, map_disc_iffss, map_selsss, rel_injectss, rel_distinctss, rel_selss,
  2308         ((((map_thmss, map_disc_iffss, map_selsss, rel_injectss, rel_distinctss, rel_selss,
  2236             rel_intross, rel_casess, set_thmss, set_selsssss, set_introsssss,
  2309             rel_intross, rel_casess, set_thmss, set_selsssss, set_introsssss,
  2237             set_casess, ctr_transferss, case_transferss, disc_transferss, sel_transferss),
  2310             set_casess, ctr_transferss, case_transferss, disc_transferss, sel_transferss),
  2263             in
  2336             in
  2264               ((map single rel_induct_thms, single common_rel_induct_thm),
  2337               ((map single rel_induct_thms, single common_rel_induct_thm),
  2265                (rel_induct_attrs, rel_induct_attrs))
  2338                (rel_induct_attrs, rel_induct_attrs))
  2266             end;
  2339             end;
  2267 
  2340 
       
  2341         val rec_o_map_thmss = derive_rec_o_map_thmss lthy recs rec_defs;
       
  2342 
  2268         val simp_thmss =
  2343         val simp_thmss =
  2269           @{map 6} mk_simp_thms ctr_sugars rec_thmss map_thmss rel_injectss rel_distinctss set_thmss;
  2344           @{map 6} mk_simp_thms ctr_sugars rec_thmss map_thmss rel_injectss rel_distinctss set_thmss;
  2270 
  2345 
  2271         val common_notes =
  2346         val common_notes =
  2272           (if nn > 1 then
  2347           (if nn > 1 then
  2277           |> massage_simple_notes fp_common_name;
  2352           |> massage_simple_notes fp_common_name;
  2278 
  2353 
  2279         val notes =
  2354         val notes =
  2280           [(inductN, map single induct_thms, fn T_name => induct_attrs @ [induct_type_attr T_name]),
  2355           [(inductN, map single induct_thms, fn T_name => induct_attrs @ [induct_type_attr T_name]),
  2281            (recN, rec_thmss, K rec_attrs),
  2356            (recN, rec_thmss, K rec_attrs),
       
  2357            (rec_o_mapN, rec_o_map_thmss, K []),
  2282            (rec_transferN, rec_transfer_thmss, K []),
  2358            (rec_transferN, rec_transfer_thmss, K []),
  2283            (rel_inductN, rel_induct_thmss, K (rel_induct_attrs @ [induct_pred_attr ""])),
  2359            (rel_inductN, rel_induct_thmss, K (rel_induct_attrs @ [induct_pred_attr ""])),
  2284            (simpsN, simp_thmss, K [])]
  2360            (simpsN, simp_thmss, K [])]
  2285           |> massage_multi_notes fp_b_names fpTs;
  2361           |> massage_multi_notes fp_b_names fpTs;
  2286       in
  2362       in
  2295           map_thmss [induct_thm] (map single induct_thms) rec_thmss (replicate nn [])
  2371           map_thmss [induct_thm] (map single induct_thms) rec_thmss (replicate nn [])
  2296           (replicate nn []) rel_injectss rel_distinctss map_disc_iffss map_selsss rel_selss
  2372           (replicate nn []) rel_injectss rel_distinctss map_disc_iffss map_selsss rel_selss
  2297           rel_intross rel_casess set_thmss set_selsssss set_introsssss set_casess ctr_transferss
  2373           rel_intross rel_casess set_thmss set_selsssss set_introsssss set_casess ctr_transferss
  2298           case_transferss disc_transferss (replicate nn []) (replicate nn []) rec_transfer_thmss
  2374           case_transferss disc_transferss (replicate nn []) (replicate nn []) rec_transfer_thmss
  2299           common_rel_induct_thms rel_induct_thmss [] (replicate nn []) sel_transferss
  2375           common_rel_induct_thms rel_induct_thmss [] (replicate nn []) sel_transferss
       
  2376           rec_o_map_thmss
  2300       end;
  2377       end;
  2301 
  2378 
  2302     fun derive_corec_transfer_thms lthy corecs corec_defs =
  2379     fun derive_corec_transfer_thms lthy corecs corec_defs =
  2303       let
  2380       let
  2304         val (Rs, Ss, goals, names_lthy) = mk_co_rec_transfer_goals lthy corecs;
  2381         val (Rs, Ss, goals, names_lthy) = mk_co_rec_transfer_goals lthy corecs;
  2414           (transpose [coinduct_thms, coinduct_strong_thms]) corec_thmss corec_disc_thmss
  2491           (transpose [coinduct_thms, coinduct_strong_thms]) corec_thmss corec_disc_thmss
  2415           corec_sel_thmsss rel_injectss rel_distinctss map_disc_iffss map_selsss rel_selss
  2492           corec_sel_thmsss rel_injectss rel_distinctss map_disc_iffss map_selsss rel_selss
  2416           rel_intross rel_casess set_thmss set_selsssss set_introsssss set_casess ctr_transferss
  2493           rel_intross rel_casess set_thmss set_selsssss set_introsssss set_casess ctr_transferss
  2417           case_transferss disc_transferss corec_disc_iff_thmss (map single corec_code_thms)
  2494           case_transferss disc_transferss corec_disc_iff_thmss (map single corec_code_thms)
  2418           corec_transfer_thmss common_rel_coinduct_thms rel_coinduct_thmss set_induct_thms
  2495           corec_transfer_thmss common_rel_coinduct_thms rel_coinduct_thmss set_induct_thms
  2419           (replicate nn (if nn = 1 then set_induct_thms else [])) sel_transferss
  2496           (replicate nn (if nn = 1 then set_induct_thms else [])) sel_transferss (replicate nn [])
  2420       end;
  2497       end;
  2421 
  2498 
  2422     val lthy'' = lthy'
  2499     val lthy'' = lthy'
  2423       |> live > 0 ? fold2 (fn Type (s, _) => fn bnf => register_bnf_raw s bnf) fpTs fp_bnfs
  2500       |> live > 0 ? fold2 (fn Type (s, _) => fn bnf => register_bnf_raw s bnf) fpTs fp_bnfs
  2424       |> fold_map (define_ctrs_dtrs_for_type fp) (fp_bnfs ~~ fp_bs ~~ fpTs ~~ ctors ~~ dtors ~~
  2501       |> fold_map (define_ctrs_dtrs_for_type fp) (fp_bnfs ~~ fp_bs ~~ fpTs ~~ ctors ~~ dtors ~~