1921 val surj_ctor_thms = map (fn thm => thm RS @{thm bij_is_surj}) bij_ctor_thms; |
1921 val surj_ctor_thms = map (fn thm => thm RS @{thm bij_is_surj}) bij_ctor_thms; |
1922 val ctor_nchotomy_thms = map (fn thm => thm RS @{thm surjD}) surj_ctor_thms; |
1922 val ctor_nchotomy_thms = map (fn thm => thm RS @{thm surjD}) surj_ctor_thms; |
1923 val ctor_inject_thms = map (fn thm => thm RS @{thm inj_eq}) inj_ctor_thms; |
1923 val ctor_inject_thms = map (fn thm => thm RS @{thm inj_eq}) inj_ctor_thms; |
1924 val ctor_exhaust_thms = map (fn thm => thm RS exE) ctor_nchotomy_thms; |
1924 val ctor_exhaust_thms = map (fn thm => thm RS exE) ctor_nchotomy_thms; |
1925 |
1925 |
1926 fun mk_ctor_dtor_unfold_like_thm dtor_inject dtor_ctor unfold = |
|
1927 iffD1 OF [dtor_inject, trans OF [unfold, dtor_ctor RS sym]]; |
|
1928 |
|
1929 val ctor_dtor_unfold_thms = |
|
1930 map3 mk_ctor_dtor_unfold_like_thm dtor_inject_thms dtor_ctor_thms dtor_unfold_thms; |
|
1931 |
|
1932 val timer = time (timer "ctor definitions & thms"); |
1926 val timer = time (timer "ctor definitions & thms"); |
1933 |
1927 |
1934 val corec_Inl_sum_thms = |
1928 val corec_Inl_sum_thms = |
1935 let |
1929 let |
1936 val mor = mor_comp_thm OF [mor_sum_case_thm, mor_unfold_thm]; |
1930 val mor = mor_comp_thm OF [mor_sum_case_thm, mor_unfold_thm]; |
2012 val (dtor_corec_unique_thms, dtor_corec_unique_thm) = |
2006 val (dtor_corec_unique_thms, dtor_corec_unique_thm) = |
2013 `split_conj_thm (split_conj_prems n |
2007 `split_conj_thm (split_conj_prems n |
2014 (mor_UNIV_thm RS iffD2 RS corec_unique_mor_thm) |
2008 (mor_UNIV_thm RS iffD2 RS corec_unique_mor_thm) |
2015 |> Local_Defs.unfold lthy (@{thms o_sum_case o_id id_o o_assoc sum_case_o_inj(1)} @ |
2009 |> Local_Defs.unfold lthy (@{thms o_sum_case o_id id_o o_assoc sum_case_o_inj(1)} @ |
2016 map_ids @ sym_map_comps) OF replicate n @{thm arg_cong2[of _ _ _ _ sum_case, OF refl]}); |
2010 map_ids @ sym_map_comps) OF replicate n @{thm arg_cong2[of _ _ _ _ sum_case, OF refl]}); |
2017 |
|
2018 val ctor_dtor_corec_thms = |
|
2019 map3 mk_ctor_dtor_unfold_like_thm dtor_inject_thms dtor_ctor_thms dtor_corec_thms; |
|
2020 |
2011 |
2021 val timer = time (timer "corec definitions & thms"); |
2012 val timer = time (timer "corec definitions & thms"); |
2022 |
2013 |
2023 val (dtor_map_coinduct_thm, coinduct_params, dtor_coinduct_thm) = |
2014 val (dtor_map_coinduct_thm, coinduct_params, dtor_coinduct_thm) = |
2024 let |
2015 let |
2874 |> map (fn (thmN, thms) => |
2865 |> map (fn (thmN, thms) => |
2875 ((Binding.qualify true (Binding.name_of b) (Binding.name thmN), []), [(thms, [])])); |
2866 ((Binding.qualify true (Binding.name_of b) (Binding.name thmN), []), [(thms, [])])); |
2876 |
2867 |
2877 val notes = |
2868 val notes = |
2878 [(ctor_dtorN, ctor_dtor_thms), |
2869 [(ctor_dtorN, ctor_dtor_thms), |
2879 (ctor_dtor_corecN, ctor_dtor_corec_thms), |
|
2880 (ctor_dtor_unfoldN, ctor_dtor_unfold_thms), |
|
2881 (ctor_exhaustN, ctor_exhaust_thms), |
2870 (ctor_exhaustN, ctor_exhaust_thms), |
2882 (ctor_injectN, ctor_inject_thms), |
2871 (ctor_injectN, ctor_inject_thms), |
2883 (dtor_corecN, dtor_corec_thms), |
2872 (dtor_corecN, dtor_corec_thms), |
2884 (dtor_ctorN, dtor_ctor_thms), |
2873 (dtor_ctorN, dtor_ctor_thms), |
2885 (dtor_exhaustN, dtor_exhaust_thms), |
2874 (dtor_exhaustN, dtor_exhaust_thms), |
2897 in |
2886 in |
2898 timer; |
2887 timer; |
2899 ({Ts = Ts, bnfs = Jbnfs, ctors = ctors, dtors = dtors, |
2888 ({Ts = Ts, bnfs = Jbnfs, ctors = ctors, dtors = dtors, |
2900 xtor_co_iterss = transpose [unfolds, corecs], |
2889 xtor_co_iterss = transpose [unfolds, corecs], |
2901 xtor_co_induct = dtor_coinduct_thm, dtor_ctors = dtor_ctor_thms, |
2890 xtor_co_induct = dtor_coinduct_thm, dtor_ctors = dtor_ctor_thms, |
2902 ctor_dtors = ctor_dtor_thms, ctor_injects = ctor_inject_thms, |
2891 ctor_dtors = ctor_dtor_thms, |
|
2892 ctor_injects = ctor_inject_thms, dtor_injects = dtor_inject_thms, |
2903 xtor_map_thms = folded_dtor_map_thms, xtor_set_thmss = folded_dtor_set_thmss', |
2893 xtor_map_thms = folded_dtor_map_thms, xtor_set_thmss = folded_dtor_set_thmss', |
2904 xtor_rel_thms = dtor_Jrel_thms, |
2894 xtor_rel_thms = dtor_Jrel_thms, |
2905 xtor_co_iter_thmss = transpose [ctor_dtor_unfold_thms, ctor_dtor_corec_thms], |
2895 xtor_co_iter_thmss = transpose [dtor_unfold_thms, dtor_corec_thms], |
2906 xtor_co_iter_o_map_thmss = transpose [dtor_unfold_o_map_thms, dtor_corec_o_map_thms], |
2896 xtor_co_iter_o_map_thmss = transpose [dtor_unfold_o_map_thms, dtor_corec_o_map_thms], |
2907 rel_co_induct_thm = Jrel_coinduct_thm}, |
2897 rel_co_induct_thm = Jrel_coinduct_thm}, |
2908 lthy |> Local_Theory.notes (common_notes @ notes) |> snd) |
2898 lthy |> Local_Theory.notes (common_notes @ notes) |> snd) |
2909 end; |
2899 end; |
2910 |
2900 |