equal
deleted
inserted
replaced
535 lthy |
535 lthy |
536 |> mk_Frees "B" BTs |
536 |> mk_Frees "B" BTs |
537 ||>> mk_Frees "s" sTs |
537 ||>> mk_Frees "s" sTs |
538 ||>> mk_Frees "i" (replicate n suc_bdT) |
538 ||>> mk_Frees "i" (replicate n suc_bdT) |
539 ||>> (fn ctxt => apfst the_single (mk_fresh_names ctxt 1 "Asi")) |
539 ||>> (fn ctxt => apfst the_single (mk_fresh_names ctxt 1 "Asi")) |
540 ||>> yield_singleton (apfst (op ~~) oo mk_Frees' "i") suc_bdT |
540 ||>> yield_singleton (apfst (~~) oo mk_Frees' "i") suc_bdT |
541 ||>> yield_singleton (apfst (op ~~) oo mk_Frees' "j") suc_bdT; |
541 ||>> yield_singleton (apfst (~~) oo mk_Frees' "j") suc_bdT; |
542 |
542 |
543 val suc_bd_limit_thm = |
543 val suc_bd_limit_thm = |
544 let |
544 let |
545 val prem = HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj |
545 val prem = HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj |
546 (map (fn idx => HOLogic.mk_mem (idx, field_suc_bd)) idxs)); |
546 (map (fn idx => HOLogic.mk_mem (idx, field_suc_bd)) idxs)); |
762 |
762 |
763 val ((((II_Bs, II_ss), (iidx, iidx')), init_xFs), _) = |
763 val ((((II_Bs, II_ss), (iidx, iidx')), init_xFs), _) = |
764 lthy |
764 lthy |
765 |> mk_Frees "IIB" II_BTs |
765 |> mk_Frees "IIB" II_BTs |
766 ||>> mk_Frees "IIs" II_sTs |
766 ||>> mk_Frees "IIs" II_sTs |
767 ||>> yield_singleton (apfst (op ~~) oo mk_Frees' "i") IIT |
767 ||>> yield_singleton (apfst (~~) oo mk_Frees' "i") IIT |
768 ||>> mk_Frees "x" init_FTs; |
768 ||>> mk_Frees "x" init_FTs; |
769 |
769 |
770 val II = HOLogic.mk_Collect (fst iidx', IIT, list_exists_free (II_Bs @ II_ss) |
770 val II = HOLogic.mk_Collect (fst iidx', IIT, list_exists_free (II_Bs @ II_ss) |
771 (HOLogic.mk_conj (HOLogic.mk_eq (iidx, |
771 (HOLogic.mk_conj (HOLogic.mk_eq (iidx, |
772 Abs_IIT $ (HOLogic.mk_prod (HOLogic.mk_tuple II_Bs, HOLogic.mk_tuple II_ss))), |
772 Abs_IIT $ (HOLogic.mk_prod (HOLogic.mk_tuple II_Bs, HOLogic.mk_tuple II_ss))), |
814 init_fs_copy), init_phis), _) = |
814 init_fs_copy), init_phis), _) = |
815 lthy |
815 lthy |
816 |> mk_Frees "B" BTs |
816 |> mk_Frees "B" BTs |
817 ||>> mk_Frees "s" sTs |
817 ||>> mk_Frees "s" sTs |
818 ||>> mk_Frees "f" (map (fn T => Asuc_bdT --> T) activeAs) |
818 ||>> mk_Frees "f" (map (fn T => Asuc_bdT --> T) activeAs) |
819 ||>> yield_singleton (apfst (op ~~) oo mk_Frees' "i") IIT |
819 ||>> yield_singleton (apfst (~~) oo mk_Frees' "i") IIT |
820 ||>> mk_Frees "ix" active_initTs |
820 ||>> mk_Frees "ix" active_initTs |
821 ||>> mk_Frees' "x" init_FTs |
821 ||>> mk_Frees' "x" init_FTs |
822 ||>> mk_Frees "f" init_fTs |
822 ||>> mk_Frees "f" init_fTs |
823 ||>> mk_Frees "f" init_fTs |
823 ||>> mk_Frees "f" init_fTs |
824 ||>> mk_Frees "P" (replicate n (mk_pred1T initT)); |
824 ||>> mk_Frees "P" (replicate n (mk_pred1T initT)); |
939 val foldT = Library.foldr1 HOLogic.mk_prodT (map2 (curry op -->) Ts activeAs); |
939 val foldT = Library.foldr1 HOLogic.mk_prodT (map2 (curry op -->) Ts activeAs); |
940 |
940 |
941 val ((ss, (fold_f, fold_f')), _) = |
941 val ((ss, (fold_f, fold_f')), _) = |
942 lthy |
942 lthy |
943 |> mk_Frees "s" sTs |
943 |> mk_Frees "s" sTs |
944 ||>> yield_singleton (apfst (op ~~) oo mk_Frees' "f") foldT; |
944 ||>> yield_singleton (apfst (~~) oo mk_Frees' "f") foldT; |
945 |
945 |
946 fun ctor_bind i = nth external_bs (i - 1) |> Binding.prefix_name (ctorN ^ "_"); |
946 fun ctor_bind i = nth external_bs (i - 1) |> Binding.prefix_name (ctorN ^ "_"); |
947 val ctor_def_bind = rpair [] o Binding.concealed o Thm.def_binding o ctor_bind; |
947 val ctor_def_bind = rpair [] o Binding.concealed o Thm.def_binding o ctor_bind; |
948 |
948 |
949 fun ctor_spec abs str map_FT_init = |
949 fun ctor_spec abs str map_FT_init = |
1277 fun mk_fun_insts T ix = Thm.cterm_of lthy (Var (ix, T --> T)); |
1277 fun mk_fun_insts T ix = Thm.cterm_of lthy (Var (ix, T --> T)); |
1278 val theta = |
1278 val theta = |
1279 (funs ~~ @{map 2} mk_fun_insts Ts funs) @ (algs ~~ map (Thm.cterm_of lthy) ctors); |
1279 (funs ~~ @{map 2} mk_fun_insts Ts funs) @ (algs ~~ map (Thm.cterm_of lthy) ctors); |
1280 val ctor_fold_ctors = (ctor_fold_unique_thm OF |
1280 val ctor_fold_ctors = (ctor_fold_unique_thm OF |
1281 map (fn thm => mk_trans @{thm id_o} (mk_sym (thm RS |
1281 map (fn thm => mk_trans @{thm id_o} (mk_sym (thm RS |
1282 @{thm trans[OF arg_cong2[of _ _ _ _ "op \<circ>", OF refl] o_id]}))) map_id0s) |
1282 @{thm trans[OF arg_cong2[of _ _ _ _ "(\<circ>)", OF refl] o_id]}))) map_id0s) |
1283 |> split_conj_thm |> map mk_sym; |
1283 |> split_conj_thm |> map mk_sym; |
1284 in |
1284 in |
1285 infer_instantiate lthy theta ctor_fold_unique_thm |
1285 infer_instantiate lthy theta ctor_fold_unique_thm |
1286 |> unfold_thms lthy ctor_fold_ctors |
1286 |> unfold_thms lthy ctor_fold_ctors |
1287 |> Morphism.thm (Local_Theory.target_morphism lthy) |
1287 |> Morphism.thm (Local_Theory.target_morphism lthy) |