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; |