src/HOL/Tools/BNF/bnf_lfp_compat.ML
changeset 58634 9f10d82e8188
parent 58461 75ee8d49c724
child 58659 6c9821c32dd5
equal deleted inserted replaced
58633:8529745af3dc 58634:9f10d82e8188
   113         (Binding.prefix_name rec_split_N (Binding.name b_name));
   113         (Binding.prefix_name rec_split_N (Binding.name b_name));
   114 
   114 
   115     val bs = map mk_binding b_names;
   115     val bs = map mk_binding b_names;
   116     val rhss = mk_split_rec_rhs lthy fpTs Cs recs;
   116     val rhss = mk_split_rec_rhs lthy fpTs Cs recs;
   117   in
   117   in
   118     fold_map3 (define_co_rec_as Least_FP Cs) fpTs bs rhss lthy
   118     @{fold_map 3} (define_co_rec_as Least_FP Cs) fpTs bs rhss lthy
   119   end;
   119   end;
   120 
   120 
   121 fun mk_split_rec_thmss ctxt Xs ctrXs_Tsss ctrss rec0_thmss (recs as rec1 :: _) rec_defs =
   121 fun mk_split_rec_thmss ctxt Xs ctrXs_Tsss ctrss rec0_thmss (recs as rec1 :: _) rec_defs =
   122   let
   122   let
   123     val f_Ts = binder_fun_types (fastype_of rec1);
   123     val f_Ts = binder_fun_types (fastype_of rec1);
   147       in
   147       in
   148         fold_rev (fold_rev Logic.all) [fs, gs]
   148         fold_rev (fold_rev Logic.all) [fs, gs]
   149           (mk_Trueprop_eq (frec $ gctr, Term.list_comb (f, fgs)))
   149           (mk_Trueprop_eq (frec $ gctr, Term.list_comb (f, fgs)))
   150       end;
   150       end;
   151 
   151 
   152     val goalss = map4 (map3 o mk_goal) frecs ctrXs_Tsss ctrss fss;
   152     val goalss = @{map 4} (@{map 3} o mk_goal) frecs ctrXs_Tsss ctrss fss;
   153 
   153 
   154     fun tac ctxt =
   154     fun tac ctxt =
   155       unfold_thms_tac ctxt (@{thms o_apply fst_conv snd_conv} @ rec_defs @ flat rec0_thmss) THEN
   155       unfold_thms_tac ctxt (@{thms o_apply fst_conv snd_conv} @ rec_defs @ flat rec0_thmss) THEN
   156       HEADGOAL (rtac refl);
   156       HEADGOAL (rtac refl);
   157 
   157 
   235     fun mk_ctr_descr Ts = mk_ctr Ts #> dest_Const ##> (binder_types #> map mk_dtyp);
   235     fun mk_ctr_descr Ts = mk_ctr Ts #> dest_Const ##> (binder_types #> map mk_dtyp);
   236     fun mk_typ_descr index (Type (T_name, Ts)) ({ctrs, ...} : ctr_sugar) =
   236     fun mk_typ_descr index (Type (T_name, Ts)) ({ctrs, ...} : ctr_sugar) =
   237       (index, (T_name, map mk_dtyp Ts, map (mk_ctr_descr Ts) ctrs));
   237       (index, (T_name, map mk_dtyp Ts, map (mk_ctr_descr Ts) ctrs));
   238 
   238 
   239     val fp_ctr_sugars = map (#ctr_sugar o #fp_ctr_sugar o checked_fp_sugar_of) fpT_names;
   239     val fp_ctr_sugars = map (#ctr_sugar o #fp_ctr_sugar o checked_fp_sugar_of) fpT_names;
   240     val orig_descr = map3 mk_typ_descr (0 upto nn_fp - 1) fpTs fp_ctr_sugars;
   240     val orig_descr = @{map 3} mk_typ_descr (0 upto nn_fp - 1) fpTs fp_ctr_sugars;
   241     val all_infos = Old_Datatype_Data.get_all thy;
   241     val all_infos = Old_Datatype_Data.get_all thy;
   242     val (orig_descr' :: nested_descrs) =
   242     val (orig_descr' :: nested_descrs) =
   243       if member (op =) prefs Keep_Nesting then [orig_descr]
   243       if member (op =) prefs Keep_Nesting then [orig_descr]
   244       else fst (Old_Datatype_Aux.unfold_datatypes lthy orig_descr all_infos orig_descr nn_fp);
   244       else fst (Old_Datatype_Aux.unfold_datatypes lthy orig_descr all_infos orig_descr nn_fp);
   245 
   245