src/HOL/BNF/Tools/bnf_gfp.ML
changeset 53203 222ea6acbdd6
parent 53143 ba80154a1118
child 53258 775b43e72d82
equal deleted inserted replaced
53202:2333fae25719 53203:222ea6acbdd6
  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