equal
deleted
inserted
replaced
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) = |