src/HOL/Codatatype/Tools/bnf_lfp.ML
changeset 49123 263b0e330d8b
parent 49121 9e0acaa470ab
child 49124 968e1b7de057
equal deleted inserted replaced
49122:83515378d4d7 49123:263b0e330d8b
   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)