168 (Term.list_comb (mapAsBs, passive_ids @ fs) $ x); |
168 (Term.list_comb (mapAsBs, passive_ids @ fs) $ x); |
169 val rhs = Term.list_comb (mapAsCs, |
169 val rhs = Term.list_comb (mapAsCs, |
170 take m all_gs @ map HOLogic.mk_comp (drop m all_gs ~~ fs)) $ x; |
170 take m all_gs @ map HOLogic.mk_comp (drop m all_gs ~~ fs)) $ x; |
171 in |
171 in |
172 Skip_Proof.prove lthy [] [] |
172 Skip_Proof.prove lthy [] [] |
173 (fold_rev Logic.all (x :: fs @ all_gs) (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)))) |
173 (fold_rev Logic.all (x :: fs @ all_gs) (mk_Trueprop_eq (lhs, rhs))) |
174 (K (mk_map_comp_id_tac map_comp)) |
174 (K (mk_map_comp_id_tac map_comp)) |
175 |> Thm.close_derivation |
175 |> Thm.close_derivation |
176 end; |
176 end; |
177 |
177 |
178 val map_comp_id_thms = map5 mk_map_comp_id xFs mapsAsBs mapsBsCs' mapsAsCs' map_comp's; |
178 val map_comp_id_thms = map5 mk_map_comp_id xFs mapsAsBs mapsBsCs' mapsAsCs' map_comp's; |
182 fun mk_map_congL x mapAsAs sets map_cong map_id' = |
182 fun mk_map_congL x mapAsAs sets map_cong map_id' = |
183 let |
183 let |
184 fun mk_prem set f z z' = HOLogic.mk_Trueprop |
184 fun mk_prem set f z z' = HOLogic.mk_Trueprop |
185 (mk_Ball (set $ x) (Term.absfree z' (HOLogic.mk_eq (f $ z, z)))); |
185 (mk_Ball (set $ x) (Term.absfree z' (HOLogic.mk_eq (f $ z, z)))); |
186 val prems = map4 mk_prem (drop m sets) self_fs zs zs'; |
186 val prems = map4 mk_prem (drop m sets) self_fs zs zs'; |
187 val goal = HOLogic.mk_Trueprop (HOLogic.mk_eq |
187 val goal = mk_Trueprop_eq (Term.list_comb (mapAsAs, passive_ids @ self_fs) $ x, x); |
188 (Term.list_comb (mapAsAs, passive_ids @ self_fs) $ x, x)) |
|
189 in |
188 in |
190 Skip_Proof.prove lthy [] [] |
189 Skip_Proof.prove lthy [] [] |
191 (fold_rev Logic.all (x :: self_fs) (Logic.list_implies (prems, goal))) |
190 (fold_rev Logic.all (x :: self_fs) (Logic.list_implies (prems, goal))) |
192 (K (mk_map_congL_tac m map_cong map_id')) |
191 (K (mk_map_congL_tac m map_cong map_id')) |
193 |> Thm.close_derivation |
192 |> Thm.close_derivation |
215 mk_Ball X (Term.absfree x' (HOLogic.mk_mem (s $ x, B))); |
214 mk_Ball X (Term.absfree x' (HOLogic.mk_mem (s $ x, B))); |
216 |
215 |
217 val lhs = Term.list_comb (Free (alg_name, algT), As @ Bs @ ss); |
216 val lhs = Term.list_comb (Free (alg_name, algT), As @ Bs @ ss); |
218 val rhs = Library.foldr1 HOLogic.mk_conj (map5 mk_alg_conjunct Bs ss ins xFs xFs') |
217 val rhs = Library.foldr1 HOLogic.mk_conj (map5 mk_alg_conjunct Bs ss ins xFs xFs') |
219 in |
218 in |
220 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)) |
219 mk_Trueprop_eq (lhs, rhs) |
221 end; |
220 end; |
222 |
221 |
223 val ((alg_free, (_, alg_def_free)), (lthy, lthy_old)) = |
222 val ((alg_free, (_, alg_def_free)), (lthy, lthy_old)) = |
224 lthy |
223 lthy |
225 |> Specification.definition (SOME (alg_bind, NONE, NoSyn), (alg_def_bind, alg_spec)) |
224 |> Specification.definition (SOME (alg_bind, NONE, NoSyn), (alg_def_bind, alg_spec)) |
310 val rhs = HOLogic.mk_conj |
309 val rhs = HOLogic.mk_conj |
311 (Library.foldr1 HOLogic.mk_conj (map5 mk_fbetw fs Bs B's zs zs'), |
310 (Library.foldr1 HOLogic.mk_conj (map5 mk_fbetw fs Bs B's zs zs'), |
312 Library.foldr1 HOLogic.mk_conj |
311 Library.foldr1 HOLogic.mk_conj |
313 (map8 mk_mor setssAs mapsAsBs fs ss s's FTsAs xFs xFs')) |
312 (map8 mk_mor setssAs mapsAsBs fs ss s's FTsAs xFs xFs')) |
314 in |
313 in |
315 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)) |
314 mk_Trueprop_eq (lhs, rhs) |
316 end; |
315 end; |
317 |
316 |
318 val ((mor_free, (_, mor_def_free)), (lthy, lthy_old)) = |
317 val ((mor_free, (_, mor_def_free)), (lthy, lthy_old)) = |
319 lthy |
318 lthy |
320 |> Specification.definition (SOME (mor_bind, NONE, NoSyn), (mor_def_bind, mor_spec)) |
319 |> Specification.definition (SOME (mor_bind, NONE, NoSyn), (mor_def_bind, mor_spec)) |
343 fun mk_elim_prem sets x T = HOLogic.mk_Trueprop |
342 fun mk_elim_prem sets x T = HOLogic.mk_Trueprop |
344 (HOLogic.mk_mem (x, mk_in (passive_UNIVs @ Bs) sets T)); |
343 (HOLogic.mk_mem (x, mk_in (passive_UNIVs @ Bs) sets T)); |
345 fun mk_elim_goal sets mapAsBs f s s' x T = |
344 fun mk_elim_goal sets mapAsBs f s s' x T = |
346 fold_rev Logic.all (x :: Bs @ ss @ B's @ s's @ fs) |
345 fold_rev Logic.all (x :: Bs @ ss @ B's @ s's @ fs) |
347 (Logic.list_implies ([prem, mk_elim_prem sets x T], |
346 (Logic.list_implies ([prem, mk_elim_prem sets x T], |
348 HOLogic.mk_Trueprop (HOLogic.mk_eq (f $ (s $ x), |
347 mk_Trueprop_eq (f $ (s $ x), s' $ Term.list_comb (mapAsBs, passive_ids @ fs @ [x])))); |
349 s' $ Term.list_comb (mapAsBs, passive_ids @ fs @ [x]))))); |
|
350 val elim_goals = map7 mk_elim_goal setssAs mapsAsBs fs ss s's xFs FTsAs; |
348 val elim_goals = map7 mk_elim_goal setssAs mapsAsBs fs ss s's xFs FTsAs; |
351 fun prove goal = |
349 fun prove goal = |
352 Skip_Proof.prove lthy [] [] goal (K (mk_mor_elim_tac mor_def)) |> Thm.close_derivation; |
350 Skip_Proof.prove lthy [] [] goal (K (mk_mor_elim_tac mor_def)) |> Thm.close_derivation; |
353 in |
351 in |
354 (map prove image_goals, map prove elim_goals) |
352 (map prove image_goals, map prove elim_goals) |
443 (HOLogic.mk_comp (f, s), |
441 (HOLogic.mk_comp (f, s), |
444 HOLogic.mk_comp (s', Term.list_comb (mapAsBs, passive_ids @ fs))); |
442 HOLogic.mk_comp (s', Term.list_comb (mapAsBs, passive_ids @ fs))); |
445 val lhs = mk_mor active_UNIVs ss (map HOLogic.mk_UNIV activeBs) s's fs; |
443 val lhs = mk_mor active_UNIVs ss (map HOLogic.mk_UNIV activeBs) s's fs; |
446 val rhs = Library.foldr1 HOLogic.mk_conj (map4 mk_conjunct mapsAsBs fs ss s's); |
444 val rhs = Library.foldr1 HOLogic.mk_conj (map4 mk_conjunct mapsAsBs fs ss s's); |
447 in |
445 in |
448 Skip_Proof.prove lthy [] [] |
446 Skip_Proof.prove lthy [] [] (fold_rev Logic.all (ss @ s's @ fs) (mk_Trueprop_eq (lhs, rhs))) |
449 (fold_rev Logic.all (ss @ s's @ fs) (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)))) |
|
450 (K (mk_mor_UNIV_tac m morE_thms mor_def)) |
447 (K (mk_mor_UNIV_tac m morE_thms mor_def)) |
451 |> Thm.close_derivation |
448 |> Thm.close_derivation |
452 end; |
449 end; |
453 |
450 |
454 val timer = time (timer "Morphism definition & thms"); |
451 val timer = time (timer "Morphism definition & thms"); |
470 val iso_alt_thm = |
467 val iso_alt_thm = |
471 let |
468 let |
472 val prems = map HOLogic.mk_Trueprop |
469 val prems = map HOLogic.mk_Trueprop |
473 [mk_alg passive_UNIVs Bs ss, |
470 [mk_alg passive_UNIVs Bs ss, |
474 mk_alg passive_UNIVs B's s's] |
471 mk_alg passive_UNIVs B's s's] |
475 val concl = HOLogic.mk_Trueprop (HOLogic.mk_eq (mk_iso Bs ss B's s's fs inv_fs, |
472 val concl = mk_Trueprop_eq (mk_iso Bs ss B's s's fs inv_fs, |
476 HOLogic.mk_conj (mk_mor Bs ss B's s's fs, |
473 HOLogic.mk_conj (mk_mor Bs ss B's s's fs, |
477 Library.foldr1 HOLogic.mk_conj (map3 mk_bij_betw fs Bs B's)))); |
474 Library.foldr1 HOLogic.mk_conj (map3 mk_bij_betw fs Bs B's))); |
478 in |
475 in |
479 Skip_Proof.prove lthy [] [] |
476 Skip_Proof.prove lthy [] [] |
480 (fold_rev Logic.all (Bs @ ss @ B's @ s's @ fs) (Logic.list_implies (prems, concl))) |
477 (fold_rev Logic.all (Bs @ ss @ B's @ s's @ fs) (Logic.list_implies (prems, concl))) |
481 (K (mk_iso_alt_tac mor_image_thms mor_inv_thm)) |
478 (K (mk_iso_alt_tac mor_image_thms mor_inv_thm)) |
482 |> Thm.close_derivation |
479 |> Thm.close_derivation |
696 |
693 |
697 val lhs = Term.list_comb (Free (min_alg_name i, min_algT), As @ ss); |
694 val lhs = Term.list_comb (Free (min_alg_name i, min_algT), As @ ss); |
698 val rhs = mk_UNION (field_suc_bd) |
695 val rhs = mk_UNION (field_suc_bd) |
699 (Term.absfree idx' (mk_nthN n (mk_min_algs As ss $ idx) i)); |
696 (Term.absfree idx' (mk_nthN n (mk_min_algs As ss $ idx) i)); |
700 in |
697 in |
701 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)) |
698 mk_Trueprop_eq (lhs, rhs) |
702 end; |
699 end; |
703 |
700 |
704 val ((min_alg_frees, (_, min_alg_def_frees)), (lthy, lthy_old)) = |
701 val ((min_alg_frees, (_, min_alg_def_frees)), (lthy, lthy_old)) = |
705 lthy |
702 lthy |
706 |> fold_map (fn i => Specification.definition |
703 |> fold_map (fn i => Specification.definition |
816 val str_initT = T --> IIT --> Asuc_bdT; |
813 val str_initT = T --> IIT --> Asuc_bdT; |
817 |
814 |
818 val lhs = Term.list_comb (Free (str_init_name i, str_initT), [init_xF, iidx]); |
815 val lhs = Term.list_comb (Free (str_init_name i, str_initT), [init_xF, iidx]); |
819 val rhs = select_s $ (Term.list_comb (map, map_args) $ init_xF); |
816 val rhs = select_s $ (Term.list_comb (map, map_args) $ init_xF); |
820 in |
817 in |
821 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)) |
818 mk_Trueprop_eq (lhs, rhs) |
822 end; |
819 end; |
823 |
820 |
824 val ((str_init_frees, (_, str_init_def_frees)), (lthy, lthy_old)) = |
821 val ((str_init_frees, (_, str_init_def_frees)), (lthy, lthy_old)) = |
825 lthy |
822 lthy |
826 |> fold_map (fn i => Specification.definition |
823 |> fold_map (fn i => Specification.definition |
1004 |
1001 |
1005 val lhs = Free (fld_name i, fldT); |
1002 val lhs = Free (fld_name i, fldT); |
1006 val rhs = Term.absfree x' (abs $ (str $ |
1003 val rhs = Term.absfree x' (abs $ (str $ |
1007 (Term.list_comb (map_FT_init, map HOLogic.id_const passiveAs @ Rep_Ts) $ x))); |
1004 (Term.list_comb (map_FT_init, map HOLogic.id_const passiveAs @ Rep_Ts) $ x))); |
1008 in |
1005 in |
1009 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)) |
1006 mk_Trueprop_eq (lhs, rhs) |
1010 end; |
1007 end; |
1011 |
1008 |
1012 val ((fld_frees, (_, fld_def_frees)), (lthy, lthy_old)) = |
1009 val ((fld_frees, (_, fld_def_frees)), (lthy, lthy_old)) = |
1013 lthy |
1010 lthy |
1014 |> fold_map6 (fn i => fn abs => fn str => fn map => fn x => fn x' => |
1011 |> fold_map6 (fn i => fn abs => fn str => fn map => fn x => fn x' => |
1064 val iterT = Library.foldr (op -->) (sTs, T --> AT); |
1061 val iterT = Library.foldr (op -->) (sTs, T --> AT); |
1065 |
1062 |
1066 val lhs = Term.list_comb (Free (iter_name i, iterT), ss); |
1063 val lhs = Term.list_comb (Free (iter_name i, iterT), ss); |
1067 val rhs = mk_nthN n iter i; |
1064 val rhs = mk_nthN n iter i; |
1068 in |
1065 in |
1069 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)) |
1066 mk_Trueprop_eq (lhs, rhs) |
1070 end; |
1067 end; |
1071 |
1068 |
1072 val ((iter_frees, (_, iter_def_frees)), (lthy, lthy_old)) = |
1069 val ((iter_frees, (_, iter_def_frees)), (lthy, lthy_old)) = |
1073 lthy |
1070 lthy |
1074 |> fold_map3 (fn i => fn T => fn AT => |
1071 |> fold_map3 (fn i => fn T => fn AT => |
1149 val unfT = T --> FT; |
1146 val unfT = T --> FT; |
1150 |
1147 |
1151 val lhs = Free (unf_name i, unfT); |
1148 val lhs = Free (unf_name i, unfT); |
1152 val rhs = mk_iter Ts map_flds i; |
1149 val rhs = mk_iter Ts map_flds i; |
1153 in |
1150 in |
1154 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)) |
1151 mk_Trueprop_eq (lhs, rhs) |
1155 end; |
1152 end; |
1156 |
1153 |
1157 val ((unf_frees, (_, unf_def_frees)), (lthy, lthy_old)) = |
1154 val ((unf_frees, (_, unf_def_frees)), (lthy, lthy_old)) = |
1158 lthy |
1155 lthy |
1159 |> fold_map3 (fn i => fn FT => fn T => |
1156 |> fold_map3 (fn i => fn FT => fn T => |
1172 |
1169 |
1173 val fld_o_unf_thms = map2 (Local_Defs.fold lthy o single) unf_defs fld_o_iter_thms; |
1170 val fld_o_unf_thms = map2 (Local_Defs.fold lthy o single) unf_defs fld_o_iter_thms; |
1174 |
1171 |
1175 val unf_o_fld_thms = |
1172 val unf_o_fld_thms = |
1176 let |
1173 let |
1177 fun mk_goal unf fld FT = |
1174 fun mk_goal unf fld FT = mk_Trueprop_eq (HOLogic.mk_comp (unf, fld), HOLogic.id_const FT); |
1178 HOLogic.mk_Trueprop (HOLogic.mk_eq (HOLogic.mk_comp (unf, fld), HOLogic.id_const FT)); |
|
1179 val goals = map3 mk_goal unfs flds FTs; |
1175 val goals = map3 mk_goal unfs flds FTs; |
1180 in |
1176 in |
1181 map5 (fn goal => fn unf_def => fn iter => fn map_comp_id => fn map_congL => |
1177 map5 (fn goal => fn unf_def => fn iter => fn map_comp_id => fn map_congL => |
1182 Skip_Proof.prove lthy [] [] goal |
1178 Skip_Proof.prove lthy [] [] goal |
1183 (K (mk_unf_o_fld_tac unf_def iter map_comp_id map_congL fld_o_iter_thms)) |
1179 (K (mk_unf_o_fld_tac unf_def iter map_comp_id map_congL fld_o_iter_thms)) |
1226 flds rec_ss rec_maps; |
1222 flds rec_ss rec_maps; |
1227 |
1223 |
1228 val lhs = Term.list_comb (Free (rec_name i, recT), rec_ss); |
1224 val lhs = Term.list_comb (Free (rec_name i, recT), rec_ss); |
1229 val rhs = HOLogic.mk_comp (snd_const (HOLogic.mk_prodT (T, AT)), mk_iter Ts maps i); |
1225 val rhs = HOLogic.mk_comp (snd_const (HOLogic.mk_prodT (T, AT)), mk_iter Ts maps i); |
1230 in |
1226 in |
1231 HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)) |
1227 mk_Trueprop_eq (lhs, rhs) |
1232 end; |
1228 end; |
1233 |
1229 |
1234 val ((rec_frees, (_, rec_def_frees)), (lthy, lthy_old)) = |
1230 val ((rec_frees, (_, rec_def_frees)), (lthy, lthy_old)) = |
1235 lthy |
1231 lthy |
1236 |> fold_map3 (fn i => fn T => fn AT => |
1232 |> fold_map3 (fn i => fn T => fn AT => |
1253 fun mk_goal i rec_s rec_map fld x = |
1249 fun mk_goal i rec_s rec_map fld x = |
1254 let |
1250 let |
1255 val lhs = mk_rec rec_ss i $ (fld $ x); |
1251 val lhs = mk_rec rec_ss i $ (fld $ x); |
1256 val rhs = rec_s $ (Term.list_comb (rec_map, passive_ids @ convols) $ x); |
1252 val rhs = rec_s $ (Term.list_comb (rec_map, passive_ids @ convols) $ x); |
1257 in |
1253 in |
1258 fold_rev Logic.all (x :: rec_ss) (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs))) |
1254 fold_rev Logic.all (x :: rec_ss) (mk_Trueprop_eq (lhs, rhs)) |
1259 end; |
1255 end; |
1260 val goals = map5 mk_goal ks rec_ss rec_maps_rev flds xFs; |
1256 val goals = map5 mk_goal ks rec_ss rec_maps_rev flds xFs; |
1261 in |
1257 in |
1262 map2 (fn goal => fn iter => |
1258 map2 (fn goal => fn iter => |
1263 Skip_Proof.prove lthy [] [] goal (mk_rec_tac rec_defs iter fst_rec_pair_thms) |
1259 Skip_Proof.prove lthy [] [] goal (mk_rec_tac rec_defs iter fst_rec_pair_thms) |
1398 val p2s_maps = map (mk_map XTs p2s Ts' fld's (mk_passive_maps passiveXs passiveBs)) ks; |
1394 val p2s_maps = map (mk_map XTs p2s Ts' fld's (mk_passive_maps passiveXs passiveBs)) ks; |
1399 |
1395 |
1400 val (map_simp_thms, map_thms) = |
1396 val (map_simp_thms, map_thms) = |
1401 let |
1397 let |
1402 fun mk_goal fs_map map fld fld' = fold_rev Logic.all fs |
1398 fun mk_goal fs_map map fld fld' = fold_rev Logic.all fs |
1403 (HOLogic.mk_Trueprop (HOLogic.mk_eq (HOLogic.mk_comp (fs_map, fld), |
1399 (mk_Trueprop_eq (HOLogic.mk_comp (fs_map, fld), |
1404 HOLogic.mk_comp (fld', Term.list_comb (map, fs @ fs_maps))))); |
1400 HOLogic.mk_comp (fld', Term.list_comb (map, fs @ fs_maps)))); |
1405 val goals = map4 mk_goal fs_maps map_FTFT's flds fld's; |
1401 val goals = map4 mk_goal fs_maps map_FTFT's flds fld's; |
1406 val maps = |
1402 val maps = |
1407 map4 (fn goal => fn iter => fn map_comp_id => fn map_cong => |
1403 map4 (fn goal => fn iter => fn map_comp_id => fn map_cong => |
1408 Skip_Proof.prove lthy [] [] goal (K (mk_map_tac m n iter map_comp_id map_cong)) |
1404 Skip_Proof.prove lthy [] [] goal (K (mk_map_tac m n iter map_comp_id map_cong)) |
1409 |> Thm.close_derivation) |
1405 |> Thm.close_derivation) |
1413 end; |
1409 end; |
1414 |
1410 |
1415 val (map_unique_thms, map_unique_thm) = |
1411 val (map_unique_thms, map_unique_thm) = |
1416 let |
1412 let |
1417 fun mk_prem u map fld fld' = |
1413 fun mk_prem u map fld fld' = |
1418 HOLogic.mk_Trueprop (HOLogic.mk_eq (HOLogic.mk_comp (u, fld), |
1414 mk_Trueprop_eq (HOLogic.mk_comp (u, fld), |
1419 HOLogic.mk_comp (fld', Term.list_comb (map, fs @ us)))); |
1415 HOLogic.mk_comp (fld', Term.list_comb (map, fs @ us))); |
1420 val prems = map4 mk_prem us map_FTFT's flds fld's; |
1416 val prems = map4 mk_prem us map_FTFT's flds fld's; |
1421 val goal = |
1417 val goal = |
1422 HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj |
1418 HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj |
1423 (map2 (curry HOLogic.mk_eq) us fs_maps)); |
1419 (map2 (curry HOLogic.mk_eq) us fs_maps)); |
1424 val unique = Skip_Proof.prove lthy [] [] |
1420 val unique = Skip_Proof.prove lthy [] [] |
1458 val setss_by_bnf = transpose setss_by_range; |
1454 val setss_by_bnf = transpose setss_by_range; |
1459 |
1455 |
1460 val (set_simp_thmss, set_thmss) = |
1456 val (set_simp_thmss, set_thmss) = |
1461 let |
1457 let |
1462 fun mk_goal sets fld set col map = |
1458 fun mk_goal sets fld set col map = |
1463 HOLogic.mk_Trueprop (HOLogic.mk_eq (HOLogic.mk_comp (set, fld), |
1459 mk_Trueprop_eq (HOLogic.mk_comp (set, fld), |
1464 HOLogic.mk_comp (col, Term.list_comb (map, passive_ids @ sets)))); |
1460 HOLogic.mk_comp (col, Term.list_comb (map, passive_ids @ sets))); |
1465 val goalss = |
1461 val goalss = |
1466 map3 (fn sets => map4 (mk_goal sets) flds sets) setss_by_range colss map_setss; |
1462 map3 (fn sets => map4 (mk_goal sets) flds sets) setss_by_range colss map_setss; |
1467 val setss = map (map2 (fn iter => fn goal => |
1463 val setss = map (map2 (fn iter => fn goal => |
1468 Skip_Proof.prove lthy [] [] goal (K (mk_set_tac iter)) |> Thm.close_derivation) |
1464 Skip_Proof.prove lthy [] [] goal (K (mk_set_tac iter)) |> Thm.close_derivation) |
1469 iter_thms) goalss; |
1465 iter_thms) goalss; |
1470 |
1466 |
1471 fun mk_simp_goal pas_set act_sets sets fld z set = |
1467 fun mk_simp_goal pas_set act_sets sets fld z set = |
1472 Logic.all z (HOLogic.mk_Trueprop (HOLogic.mk_eq (set $ (fld $ z), |
1468 Logic.all z (mk_Trueprop_eq (set $ (fld $ z), |
1473 mk_union (pas_set $ z, |
1469 mk_union (pas_set $ z, |
1474 Library.foldl1 mk_union (map2 (fn X => mk_UNION (X $ z)) act_sets sets))))); |
1470 Library.foldl1 mk_union (map2 (fn X => mk_UNION (X $ z)) act_sets sets)))); |
1475 val simp_goalss = |
1471 val simp_goalss = |
1476 map2 (fn i => fn sets => |
1472 map2 (fn i => fn sets => |
1477 map4 (fn Fsets => mk_simp_goal (nth Fsets (i - 1)) (drop m Fsets) sets) |
1473 map4 (fn Fsets => mk_simp_goal (nth Fsets (i - 1)) (drop m Fsets) sets) |
1478 FTs_setss flds xFs sets) |
1474 FTs_setss flds xFs sets) |
1479 ls setss_by_range; |
1475 ls setss_by_range; |
1741 val folded_set_simp_thmss' = transpose folded_set_simp_thmss; |
1737 val folded_set_simp_thmss' = transpose folded_set_simp_thmss; |
1742 |
1738 |
1743 val Irel_unfold_thms = |
1739 val Irel_unfold_thms = |
1744 let |
1740 let |
1745 fun mk_goal xF yF fld fld' IrelR relR = fold_rev Logic.all (xF :: yF :: IRs) |
1741 fun mk_goal xF yF fld fld' IrelR relR = fold_rev Logic.all (xF :: yF :: IRs) |
1746 (HOLogic.mk_Trueprop (HOLogic.mk_eq |
1742 (mk_Trueprop_eq (HOLogic.mk_mem (HOLogic.mk_prod (fld $ xF, fld' $ yF), IrelR), |
1747 (HOLogic.mk_mem (HOLogic.mk_prod (fld $ xF, fld' $ yF), IrelR), |
1743 HOLogic.mk_mem (HOLogic.mk_prod (xF, yF), relR))); |
1748 HOLogic.mk_mem (HOLogic.mk_prod (xF, yF), relR)))); |
|
1749 val goals = map6 mk_goal xFs yFs flds fld's IrelRs relRs; |
1744 val goals = map6 mk_goal xFs yFs flds fld's IrelRs relRs; |
1750 in |
1745 in |
1751 map12 (fn i => fn goal => fn in_rel => fn map_comp => fn map_cong => |
1746 map12 (fn i => fn goal => fn in_rel => fn map_comp => fn map_cong => |
1752 fn map_simp => fn set_simps => fn fld_inject => fn fld_unf => |
1747 fn map_simp => fn set_simps => fn fld_inject => fn fld_unf => |
1753 fn set_naturals => fn set_incls => fn set_set_inclss => |
1748 fn set_naturals => fn set_incls => fn set_set_inclss => |
1760 end; |
1755 end; |
1761 |
1756 |
1762 val Ipred_unfold_thms = |
1757 val Ipred_unfold_thms = |
1763 let |
1758 let |
1764 fun mk_goal xF yF fld fld' Ipredphi predphi = fold_rev Logic.all (xF :: yF :: Iphis) |
1759 fun mk_goal xF yF fld fld' Ipredphi predphi = fold_rev Logic.all (xF :: yF :: Iphis) |
1765 (HOLogic.mk_Trueprop (HOLogic.mk_eq |
1760 (mk_Trueprop_eq (Ipredphi $ (fld $ xF) $ (fld' $ yF), predphi $ xF $ yF)); |
1766 (Ipredphi $ (fld $ xF) $ (fld' $ yF), predphi $ xF $ yF))); |
|
1767 val goals = map6 mk_goal xFs yFs flds fld's Ipredphis predphis; |
1761 val goals = map6 mk_goal xFs yFs flds fld's Ipredphis predphis; |
1768 in |
1762 in |
1769 map3 (fn goal => fn pred_def => fn Irel_unfold => |
1763 map3 (fn goal => fn pred_def => fn Irel_unfold => |
1770 Skip_Proof.prove lthy [] [] goal (mk_pred_unfold_tac pred_def Ipred_defs Irel_unfold) |
1764 Skip_Proof.prove lthy [] [] goal (mk_pred_unfold_tac pred_def Ipred_defs Irel_unfold) |
1771 |> Thm.close_derivation) |
1765 |> Thm.close_derivation) |