src/HOL/Codatatype/Tools/bnf_lfp.ML
changeset 49227 2652319c394e
parent 49222 cbe8c859817c
child 49228 e43910ccee74
equal deleted inserted replaced
49226:510c6d4a73ec 49227:2652319c394e
   934 
   934 
   935     val timer = time (timer "Initiality definition & thms");
   935     val timer = time (timer "Initiality definition & thms");
   936 
   936 
   937     val ((T_names, (T_glob_infos, T_loc_infos)), lthy) =
   937     val ((T_names, (T_glob_infos, T_loc_infos)), lthy) =
   938       lthy
   938       lthy
   939       |> fold_map3 (fn b => fn mx => fn car_init => typedef true NONE (b, params, mx) car_init NONE
   939       |> fold_map3 (fn b => fn mx => fn car_init => typedef false NONE (b, params, mx) car_init NONE
   940           (EVERY' [rtac ssubst, rtac @{thm ex_in_conv}, resolve_tac alg_not_empty_thms,
   940           (EVERY' [rtac ssubst, rtac @{thm ex_in_conv}, resolve_tac alg_not_empty_thms,
   941             rtac alg_init_thm] 1)) bs mixfixes car_inits
   941             rtac alg_init_thm] 1)) bs mixfixes car_inits
   942       |>> apsnd split_list o split_list;
   942       |>> apsnd split_list o split_list;
   943 
   943 
   944     val Ts = map (fn name => Type (name, params')) T_names;
   944     val Ts = map (fn name => Type (name, params')) T_names;
   945     fun mk_Ts passive = map (Term.typ_subst_atomic (passiveAs ~~ passive)) Ts;
   945     fun mk_Ts passive = map (Term.typ_subst_atomic (passiveAs ~~ passive)) Ts;
   946     val Ts' = mk_Ts passiveBs;
   946     val Ts' = mk_Ts passiveBs;
   947     val Rep_Ts = map2 (fn info => fn T => Const (#Rep_name info, T --> initT)) T_glob_infos Ts;
   947     val Rep_Ts = map2 (fn info => fn T => Const (#Rep_name info, T --> initT)) T_glob_infos Ts;
   948     val Abs_Ts = map2 (fn info => fn T => Const (#Abs_name info, initT --> T)) T_glob_infos Ts;
   948     val Abs_Ts = map2 (fn info => fn T => Const (#Abs_name info, initT --> T)) T_glob_infos Ts;
   949 
   949 
   950     val set_defs = map (the o #set_def) T_loc_infos;
       
   951     val type_defs = map #type_definition T_loc_infos;
   950     val type_defs = map #type_definition T_loc_infos;
   952     val Reps = map #Rep T_loc_infos;
   951     val Reps = map #Rep T_loc_infos;
   953     val Rep_casess = map #Rep_cases T_loc_infos;
   952     val Rep_casess = map #Rep_cases T_loc_infos;
   954     val Rep_injects = map #Rep_inject T_loc_infos;
   953     val Rep_injects = map #Rep_inject T_loc_infos;
   955     val Rep_inverses = map #Rep_inverse T_loc_infos;
   954     val Rep_inverses = map #Rep_inverse T_loc_infos;
   956     val Abs_inverses = map #Abs_inverse T_loc_infos;
   955     val Abs_inverses = map #Abs_inverse T_loc_infos;
   957 
   956 
   958     val T_subset1s = map mk_T_subset1 set_defs;
       
   959     val T_subset2s = map mk_T_subset2 set_defs;
       
   960 
       
   961     fun mk_inver_thm mk_tac rep abs X thm =
   957     fun mk_inver_thm mk_tac rep abs X thm =
   962       Skip_Proof.prove lthy [] []
   958       Skip_Proof.prove lthy [] []
   963         (HOLogic.mk_Trueprop (mk_inver rep abs X))
   959         (HOLogic.mk_Trueprop (mk_inver rep abs X))
   964         (K (EVERY' [rtac ssubst, rtac @{thm inver_def}, rtac ballI, mk_tac thm] 1))
   960         (K (EVERY' [rtac ssubst, rtac @{thm inver_def}, rtac ballI, mk_tac thm] 1))
   965       |> Thm.close_derivation;
   961       |> Thm.close_derivation;
   966 
   962 
   967     val inver_Reps = map4 (mk_inver_thm rtac) Abs_Ts Rep_Ts (map HOLogic.mk_UNIV Ts) Rep_inverses;
   963     val inver_Reps = map4 (mk_inver_thm rtac) Abs_Ts Rep_Ts (map HOLogic.mk_UNIV Ts) Rep_inverses;
   968     val inver_Abss = map4 (mk_inver_thm etac) Rep_Ts Abs_Ts car_inits
   964     val inver_Abss = map4 (mk_inver_thm etac) Rep_Ts Abs_Ts car_inits Abs_inverses;
   969       (map2 (curry op RS) T_subset1s Abs_inverses);
       
   970 
   965 
   971     val timer = time (timer "THE TYPEDEFs & Rep/Abs thms");
   966     val timer = time (timer "THE TYPEDEFs & Rep/Abs thms");
   972 
   967 
   973     val UNIVs = map HOLogic.mk_UNIV Ts;
   968     val UNIVs = map HOLogic.mk_UNIV Ts;
   974     val FTs = mk_FTs (passiveAs @ Ts);
   969     val FTs = mk_FTs (passiveAs @ Ts);
  1034     val fld_defs = map (Morphism.thm phi) fld_def_frees;
  1029     val fld_defs = map (Morphism.thm phi) fld_def_frees;
  1035 
  1030 
  1036     val (mor_Rep_thm, mor_Abs_thm) =
  1031     val (mor_Rep_thm, mor_Abs_thm) =
  1037       let
  1032       let
  1038         val copy = alg_init_thm RS copy_alg_thm;
  1033         val copy = alg_init_thm RS copy_alg_thm;
  1039         fun mk_bij inj subset1 subset2 Rep cases = @{thm bij_betwI'} OF
  1034         fun mk_bij inj Rep cases = @{thm bij_betwI'} OF [inj, Rep, cases];
  1040           [inj, Rep RS subset2, subset1 RS cases];
  1035         val bijs = map3 mk_bij Rep_injects Reps Rep_casess;
  1041         val bijs = map5 mk_bij Rep_injects T_subset1s T_subset2s Reps Rep_casess;
       
  1042         val mor_Rep =
  1036         val mor_Rep =
  1043           Skip_Proof.prove lthy [] []
  1037           Skip_Proof.prove lthy [] []
  1044             (HOLogic.mk_Trueprop (mk_mor UNIVs flds car_inits str_inits Rep_Ts))
  1038             (HOLogic.mk_Trueprop (mk_mor UNIVs flds car_inits str_inits Rep_Ts))
  1045             (mk_mor_Rep_tac fld_defs copy bijs inver_Abss inver_Reps)
  1039             (mk_mor_Rep_tac fld_defs copy bijs inver_Abss inver_Reps)
  1046           |> Thm.close_derivation;
  1040           |> Thm.close_derivation;
  1116         val prem = HOLogic.mk_Trueprop (mk_mor UNIVs flds active_UNIVs ss fs);
  1110         val prem = HOLogic.mk_Trueprop (mk_mor UNIVs flds active_UNIVs ss fs);
  1117         fun mk_fun_eq f i = HOLogic.mk_eq (f, mk_iter Ts ss i);
  1111         fun mk_fun_eq f i = HOLogic.mk_eq (f, mk_iter Ts ss i);
  1118         val unique = HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj (map2 mk_fun_eq fs ks));
  1112         val unique = HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj (map2 mk_fun_eq fs ks));
  1119         val unique_mor = Skip_Proof.prove lthy [] []
  1113         val unique_mor = Skip_Proof.prove lthy [] []
  1120           (fold_rev Logic.all (ss @ fs) (Logic.mk_implies (prem, unique)))
  1114           (fold_rev Logic.all (ss @ fs) (Logic.mk_implies (prem, unique)))
  1121           (K (mk_iter_unique_mor_tac type_defs init_unique_mor_thms T_subset2s Reps
  1115           (K (mk_iter_unique_mor_tac type_defs init_unique_mor_thms Reps
  1122             mor_comp_thm mor_Abs_thm mor_iter_thm))
  1116             mor_comp_thm mor_Abs_thm mor_iter_thm))
  1123           |> Thm.close_derivation;
  1117           |> Thm.close_derivation;
  1124       in
  1118       in
  1125         `split_conj_thm unique_mor
  1119         `split_conj_thm unique_mor
  1126       end;
  1120       end;
  1301         val goal = Logic.list_implies (prems, concl);
  1295         val goal = Logic.list_implies (prems, concl);
  1302       in
  1296       in
  1303         (Skip_Proof.prove lthy [] []
  1297         (Skip_Proof.prove lthy [] []
  1304           (fold_rev Logic.all (phis @ Izs) goal)
  1298           (fold_rev Logic.all (phis @ Izs) goal)
  1305           (K (mk_fld_induct_tac m set_natural'ss init_induct_thm morE_thms mor_Abs_thm
  1299           (K (mk_fld_induct_tac m set_natural'ss init_induct_thm morE_thms mor_Abs_thm
  1306             Rep_inverses Abs_inverses Reps T_subset1s T_subset2s))
  1300             Rep_inverses Abs_inverses Reps))
  1307         |> Thm.close_derivation,
  1301         |> Thm.close_derivation,
  1308         rev (Term.add_tfrees goal []))
  1302         rev (Term.add_tfrees goal []))
  1309       end;
  1303       end;
  1310 
  1304 
  1311     val cTs = map (SOME o certifyT lthy o TFree) induct_params;
  1305     val cTs = map (SOME o certifyT lthy o TFree) induct_params;