src/HOL/Tools/BNF/bnf_fp_def_sugar.ML
changeset 55414 eab03e9cee8a
parent 55410 54b09e82b9e1
child 55444 ec73f81e49e7
equal deleted inserted replaced
55413:a8e96847523c 55414:eab03e9cee8a
   539     val fpT_to_C as Type (_, [fpT, _]) = snd (strip_typeN nn (fastype_of (hd ctor_iters)));
   539     val fpT_to_C as Type (_, [fpT, _]) = snd (strip_typeN nn (fastype_of (hd ctor_iters)));
   540 
   540 
   541     fun generate_iter pre (_, _, fss, xssss) ctor_iter =
   541     fun generate_iter pre (_, _, fss, xssss) ctor_iter =
   542       (mk_binding pre,
   542       (mk_binding pre,
   543        fold_rev (fold_rev Term.lambda) fss (Term.list_comb (ctor_iter,
   543        fold_rev (fold_rev Term.lambda) fss (Term.list_comb (ctor_iter,
   544          map2 (mk_sum_caseN_balanced oo map2 mk_uncurried2_fun) fss xssss)));
   544          map2 (mk_case_sumN_balanced oo map2 mk_uncurried2_fun) fss xssss)));
   545   in
   545   in
   546     define_co_iters Least_FP fpT Cs (map3 generate_iter iterNs iter_args_typess' ctor_iters) lthy
   546     define_co_iters Least_FP fpT Cs (map3 generate_iter iterNs iter_args_typess' ctor_iters) lthy
   547   end;
   547   end;
   548 
   548 
   549 fun define_coiters coiterNs (_, cs, cpss, coiter_args_typess') mk_binding fpTs Cs dtor_coiters
   549 fun define_coiters coiterNs (_, cs, cpss, coiter_args_typess') mk_binding fpTs Cs dtor_coiters
   865         fun mk_U maybe_mk_sumT =
   865         fun mk_U maybe_mk_sumT =
   866           typ_subst_nonatomic (map2 (fn C => fn fpT => (maybe_mk_sumT fpT C, fpT)) Cs fpTs);
   866           typ_subst_nonatomic (map2 (fn C => fn fpT => (maybe_mk_sumT fpT C, fpT)) Cs fpTs);
   867 
   867 
   868         fun tack z_name (c, u) f =
   868         fun tack z_name (c, u) f =
   869           let val z = Free (z_name, mk_sumT (fastype_of u, fastype_of c)) in
   869           let val z = Free (z_name, mk_sumT (fastype_of u, fastype_of c)) in
   870             Term.lambda z (mk_sum_case (Term.lambda u u, Term.lambda c (f $ c)) $ z)
   870             Term.lambda z (mk_case_sum (Term.lambda u u, Term.lambda c (f $ c)) $ z)
   871           end;
   871           end;
   872 
   872 
   873         fun build_coiter fcoiters maybe_mk_sumT maybe_tack cqf =
   873         fun build_coiter fcoiters maybe_mk_sumT maybe_tack cqf =
   874           let val T = fastype_of cqf in
   874           let val T = fastype_of cqf in
   875             if exists_subtype_in Cs T then
   875             if exists_subtype_in Cs T then
   900           |> Thm.close_derivation;
   900           |> Thm.close_derivation;
   901 
   901 
   902         val unfold_thmss = map2 (map2 prove) unfold_goalss unfold_tacss;
   902         val unfold_thmss = map2 (map2 prove) unfold_goalss unfold_tacss;
   903         val corec_thmss =
   903         val corec_thmss =
   904           map2 (map2 prove) corec_goalss corec_tacss
   904           map2 (map2 prove) corec_goalss corec_tacss
   905           |> map (map (unfold_thms lthy @{thms sum_case_if}));
   905           |> map (map (unfold_thms lthy @{thms case_sum_if}));
   906       in
   906       in
   907         (unfold_thmss, corec_thmss)
   907         (unfold_thmss, corec_thmss)
   908       end;
   908       end;
   909 
   909 
   910     val (disc_unfold_iff_thmss, disc_corec_iff_thmss) =
   910     val (disc_unfold_iff_thmss, disc_corec_iff_thmss) =