src/HOL/Tools/BNF/bnf_lfp.ML
changeset 56237 69a9dfe71aed
parent 56192 d666cb0e4cf9
child 56263 9b32aafecec1
equal deleted inserted replaced
56236:713ae0c9e652 56237:69a9dfe71aed
   102     val prod_sTs = map2 (curry op -->) prodFTs activeAs;
   102     val prod_sTs = map2 (curry op -->) prodFTs activeAs;
   103 
   103 
   104     (* terms *)
   104     (* terms *)
   105     val mapsAsAs = map4 mk_map_of_bnf Dss Ass Ass bnfs;
   105     val mapsAsAs = map4 mk_map_of_bnf Dss Ass Ass bnfs;
   106     val mapsAsBs = map4 mk_map_of_bnf Dss Ass Bss bnfs;
   106     val mapsAsBs = map4 mk_map_of_bnf Dss Ass Bss bnfs;
   107     val mapsBsAs = map4 mk_map_of_bnf Dss Bss Ass bnfs;
       
   108     val mapsBsCs' = map4 mk_map_of_bnf Dss Bss Css' bnfs;
   107     val mapsBsCs' = map4 mk_map_of_bnf Dss Bss Css' bnfs;
   109     val mapsAsCs' = map4 mk_map_of_bnf Dss Ass Css' bnfs;
   108     val mapsAsCs' = map4 mk_map_of_bnf Dss Ass Css' bnfs;
   110     val map_fsts = map4 mk_map_of_bnf Dss (replicate n (passiveAs @ prodBsAs)) Bss bnfs;
   109     val map_fsts = map4 mk_map_of_bnf Dss (replicate n (passiveAs @ prodBsAs)) Bss bnfs;
   111     val map_fsts_rev = map4 mk_map_of_bnf Dss Bss (replicate n (passiveAs @ prodBsAs)) bnfs;
   110     val map_fsts_rev = map4 mk_map_of_bnf Dss Bss (replicate n (passiveAs @ prodBsAs)) bnfs;
   112     fun mk_setss Ts = map3 mk_sets_of_bnf (map (replicate live) Dss)
   111     fun mk_setss Ts = map3 mk_sets_of_bnf (map (replicate live) Dss)
   286         map (fn goal =>
   285         map (fn goal =>
   287           Goal.prove_sorry lthy [] [] goal (K (mk_alg_set_tac alg_def)) |> Thm.close_derivation)
   286           Goal.prove_sorry lthy [] [] goal (K (mk_alg_set_tac alg_def)) |> Thm.close_derivation)
   288         goals
   287         goals
   289       end;
   288       end;
   290 
   289 
   291     fun mk_talg BTs = mk_alg (map HOLogic.mk_UNIV BTs);
       
   292 
       
   293     val talg_thm =
       
   294       let
       
   295         val goal = fold_rev Logic.all ss
       
   296           (HOLogic.mk_Trueprop (mk_talg activeAs ss))
       
   297       in
       
   298         Goal.prove_sorry lthy [] [] goal
       
   299           (K (rtac (alg_def RS iffD2) 1 THEN CONJ_WRAP (K (EVERY' [rtac ballI, rtac UNIV_I] 1)) ss))
       
   300         |> Thm.close_derivation
       
   301       end;
       
   302 
       
   303     val timer = time (timer "Algebra definition & thms");
   290     val timer = time (timer "Algebra definition & thms");
   304 
   291 
   305     val alg_not_empty_thms =
   292     val alg_not_empty_thms =
   306       let
   293       let
   307         val alg_prem =
   294         val alg_prem =
   360         val morT = Library.foldr (op -->) (Ts, HOLogic.boolT);
   347         val morT = Library.foldr (op -->) (Ts, HOLogic.boolT);
   361       in
   348       in
   362         Term.list_comb (Const (mor, morT), args)
   349         Term.list_comb (Const (mor, morT), args)
   363       end;
   350       end;
   364 
   351 
   365     val (mor_image_thms, morE_thms) =
   352     val morE_thms =
   366       let
   353       let
   367         val prem = HOLogic.mk_Trueprop (mk_mor Bs ss B's s's fs);
   354         val prem = HOLogic.mk_Trueprop (mk_mor Bs ss B's s's fs);
   368         fun mk_image_goal f B1 B2 = fold_rev Logic.all (Bs @ ss @ B's @ s's @ fs)
       
   369           (Logic.mk_implies (prem, HOLogic.mk_Trueprop (mk_leq (mk_image f $ B1) B2)));
       
   370         val image_goals = map3 mk_image_goal fs Bs B's;
       
   371         fun mk_elim_prem sets x T = HOLogic.mk_Trueprop
   355         fun mk_elim_prem sets x T = HOLogic.mk_Trueprop
   372           (HOLogic.mk_mem (x, mk_in (passive_UNIVs @ Bs) sets T));
   356           (HOLogic.mk_mem (x, mk_in (passive_UNIVs @ Bs) sets T));
   373         fun mk_elim_goal sets mapAsBs f s s' x T =
   357         fun mk_elim_goal sets mapAsBs f s s' x T =
   374           fold_rev Logic.all (x :: Bs @ ss @ B's @ s's @ fs)
   358           fold_rev Logic.all (x :: Bs @ ss @ B's @ s's @ fs)
   375             (Logic.list_implies ([prem, mk_elim_prem sets x T],
   359             (Logic.list_implies ([prem, mk_elim_prem sets x T],
   376               mk_Trueprop_eq (f $ (s $ x), s' $ Term.list_comb (mapAsBs, passive_ids @ fs @ [x]))));
   360               mk_Trueprop_eq (f $ (s $ x), s' $ Term.list_comb (mapAsBs, passive_ids @ fs @ [x]))));
   377         val elim_goals = map7 mk_elim_goal setssAs mapsAsBs fs ss s's xFs FTsAs;
   361         val elim_goals = map7 mk_elim_goal setssAs mapsAsBs fs ss s's xFs FTsAs;
   378         fun prove goal =
   362         fun prove goal =
   379           Goal.prove_sorry lthy [] [] goal (K (mk_mor_elim_tac mor_def)) |> Thm.close_derivation;
   363           Goal.prove_sorry lthy [] [] goal (K (mk_mor_elim_tac mor_def)) |> Thm.close_derivation;
   380       in
   364       in
   381         (map prove image_goals, map prove elim_goals)
   365         map prove elim_goals
   382       end;
   366       end;
   383 
   367 
   384     val mor_incl_thm =
   368     val mor_incl_thm =
   385       let
   369       let
   386         val prems = map2 (HOLogic.mk_Trueprop oo mk_leq) Bs Bs_copy;
   370         val prems = map2 (HOLogic.mk_Trueprop oo mk_leq) Bs Bs_copy;
   405              (Logic.list_implies (prems, concl)))
   389              (Logic.list_implies (prems, concl)))
   406           (K (mk_mor_comp_tac mor_def set_mapss map_comp_id_thms))
   390           (K (mk_mor_comp_tac mor_def set_mapss map_comp_id_thms))
   407         |> Thm.close_derivation
   391         |> Thm.close_derivation
   408       end;
   392       end;
   409 
   393 
   410     val mor_inv_thm =
       
   411       let
       
   412         fun mk_inv_prem f inv_f B B' = HOLogic.mk_conj (mk_leq (mk_image inv_f $ B') B,
       
   413           HOLogic.mk_conj (mk_inver inv_f f B, mk_inver f inv_f B'));
       
   414         val prems = map HOLogic.mk_Trueprop
       
   415           ([mk_mor Bs ss B's s's fs, mk_alg Bs ss, mk_alg B's s's] @
       
   416           map4 mk_inv_prem fs inv_fs Bs B's);
       
   417         val concl = HOLogic.mk_Trueprop (mk_mor B's s's Bs ss inv_fs);
       
   418       in
       
   419         Goal.prove_sorry lthy [] []
       
   420           (fold_rev Logic.all (Bs @ ss @ B's @ s's @ fs @ inv_fs)
       
   421             (Logic.list_implies (prems, concl)))
       
   422           (K (mk_mor_inv_tac alg_def mor_def set_mapss morE_thms map_comp_id_thms map_cong0L_thms))
       
   423         |> Thm.close_derivation
       
   424       end;
       
   425 
       
   426     val mor_cong_thm =
   394     val mor_cong_thm =
   427       let
   395       let
   428         val prems = map HOLogic.mk_Trueprop
   396         val prems = map HOLogic.mk_Trueprop
   429          (map2 (curry HOLogic.mk_eq) fs_copy fs @ [mk_mor Bs ss B's s's fs])
   397          (map2 (curry HOLogic.mk_eq) fs_copy fs @ [mk_mor Bs ss B's s's fs])
   430         val concl = HOLogic.mk_Trueprop (mk_mor Bs ss B's s's fs_copy);
   398         val concl = HOLogic.mk_Trueprop (mk_mor Bs ss B's s's fs_copy);
   473           (K (mk_mor_UNIV_tac m morE_thms mor_def))
   441           (K (mk_mor_UNIV_tac m morE_thms mor_def))
   474         |> Thm.close_derivation
   442         |> Thm.close_derivation
   475       end;
   443       end;
   476 
   444 
   477     val timer = time (timer "Morphism definition & thms");
   445     val timer = time (timer "Morphism definition & thms");
   478 
       
   479     (* isomorphism *)
       
   480 
       
   481     (*mor Bs1 ss1 Bs2 ss2 fs \<and> (\<exists>gs. mor Bs2 ss2 Bs1 ss1 fs \<and>
       
   482        forall i = 1 ... n. (inver gs[i] fs[i] Bs1[i] \<and> inver fs[i] gs[i] Bs2[i]))*)
       
   483     fun mk_iso Bs1 ss1 Bs2 ss2 fs gs =
       
   484       let
       
   485         val ex_inv_mor = list_exists_free gs
       
   486           (HOLogic.mk_conj (mk_mor Bs2 ss2 Bs1 ss1 gs,
       
   487             Library.foldr1 HOLogic.mk_conj (map2 (curry HOLogic.mk_conj)
       
   488               (map3 mk_inver gs fs Bs1) (map3 mk_inver fs gs Bs2))));
       
   489       in
       
   490         HOLogic.mk_conj (mk_mor Bs1 ss1 Bs2 ss2 fs, ex_inv_mor)
       
   491       end;
       
   492 
       
   493     val iso_alt_thm =
       
   494       let
       
   495         val prems = map HOLogic.mk_Trueprop [mk_alg Bs ss, mk_alg B's s's]
       
   496         val concl = mk_Trueprop_eq (mk_iso Bs ss B's s's fs inv_fs,
       
   497           HOLogic.mk_conj (mk_mor Bs ss B's s's fs,
       
   498             Library.foldr1 HOLogic.mk_conj (map3 mk_bij_betw fs Bs B's)));
       
   499       in
       
   500         Goal.prove_sorry lthy [] []
       
   501           (fold_rev Logic.all (Bs @ ss @ B's @ s's @ fs) (Logic.list_implies (prems, concl)))
       
   502           (K (mk_iso_alt_tac mor_image_thms mor_inv_thm))
       
   503         |> Thm.close_derivation
       
   504       end;
       
   505 
       
   506     val timer = time (timer "Isomorphism definition & thms");
       
   507 
       
   508     (* algebra copies *)
       
   509 
       
   510     val (copy_alg_thm, ex_copy_alg_thm) =
       
   511       let
       
   512         val prems = map HOLogic.mk_Trueprop
       
   513          (mk_alg Bs ss :: map3 mk_bij_betw inv_fs B's Bs);
       
   514         val inver_prems = map HOLogic.mk_Trueprop
       
   515           (map3 mk_inver inv_fs fs Bs @ map3 mk_inver fs inv_fs B's);
       
   516         val all_prems = prems @ inver_prems;
       
   517         fun mk_s f s mapT = Library.foldl1 HOLogic.mk_comp [f, s,
       
   518           Term.list_comb (mapT, passive_ids @ inv_fs)];
       
   519 
       
   520         val alg = HOLogic.mk_Trueprop
       
   521           (mk_alg B's (map3 mk_s fs ss mapsBsAs));
       
   522         val copy_str_thm = Goal.prove_sorry lthy [] []
       
   523           (fold_rev Logic.all (Bs @ ss @ B's @ inv_fs @ fs)
       
   524             (Logic.list_implies (all_prems, alg)))
       
   525           (K (mk_copy_str_tac set_mapss alg_def alg_set_thms))
       
   526           |> Thm.close_derivation;
       
   527 
       
   528         val iso = HOLogic.mk_Trueprop
       
   529           (mk_iso B's (map3 mk_s fs ss mapsBsAs) Bs ss inv_fs fs_copy);
       
   530         val copy_alg_thm = Goal.prove_sorry lthy [] []
       
   531           (fold_rev Logic.all (Bs @ ss @ B's @ inv_fs @ fs)
       
   532             (Logic.list_implies (all_prems, iso)))
       
   533           (fn {context = ctxt, prems = _} =>
       
   534             mk_copy_alg_tac ctxt set_mapss alg_set_thms mor_def iso_alt_thm copy_str_thm)
       
   535           |> Thm.close_derivation;
       
   536 
       
   537         val ex = HOLogic.mk_Trueprop
       
   538           (list_exists_free s's
       
   539             (HOLogic.mk_conj (mk_alg B's s's,
       
   540               mk_iso B's s's Bs ss inv_fs fs_copy)));
       
   541         val ex_copy_alg_thm = Goal.prove_sorry lthy [] []
       
   542           (fold_rev Logic.all (Bs @ ss @ B's @ inv_fs @ fs)
       
   543              (Logic.list_implies (prems, ex)))
       
   544           (K (mk_ex_copy_alg_tac n copy_str_thm copy_alg_thm))
       
   545           |> Thm.close_derivation;
       
   546       in
       
   547         (copy_alg_thm, ex_copy_alg_thm)
       
   548       end;
       
   549 
       
   550     val timer = time (timer "Copy thms");
       
   551 
       
   552 
   446 
   553     (* bounds *)
   447     (* bounds *)
   554 
   448 
   555     val sum_bd = Library.foldr1 (uncurry mk_csum) bds;
   449     val sum_bd = Library.foldr1 (uncurry mk_csum) bds;
   556     val sum_bdT = fst (dest_relT (fastype_of sum_bd));
   450     val sum_bdT = fst (dest_relT (fastype_of sum_bd));
   780         val min_algT = Library.foldr (op -->) (Ts, T);
   674         val min_algT = Library.foldr (op -->) (Ts, T);
   781       in
   675       in
   782         Term.list_comb (Const (nth min_algs (i - 1), min_algT), ss)
   676         Term.list_comb (Const (nth min_algs (i - 1), min_algT), ss)
   783       end;
   677       end;
   784 
   678 
       
   679     val min_algs = map (mk_min_alg ss) ks;
       
   680 
   785     val (alg_min_alg_thm, card_of_min_alg_thms, least_min_alg_thms, mor_incl_min_alg_thm) =
   681     val (alg_min_alg_thm, card_of_min_alg_thms, least_min_alg_thms, mor_incl_min_alg_thm) =
   786       let
   682       let
   787         val min_algs = map (mk_min_alg ss) ks;
       
   788 
       
   789         val goal = fold_rev Logic.all ss (HOLogic.mk_Trueprop (mk_alg min_algs ss));
   683         val goal = fold_rev Logic.all ss (HOLogic.mk_Trueprop (mk_alg min_algs ss));
   790         val alg_min_alg = Goal.prove_sorry lthy [] [] goal
   684         val alg_min_alg = Goal.prove_sorry lthy [] [] goal
   791           (K (mk_alg_min_alg_tac m alg_def min_alg_defs suc_bd_limit_thm sbd_Cinfinite
   685           (K (mk_alg_min_alg_tac m alg_def min_alg_defs suc_bd_limit_thm sbd_Cinfinite
   792             set_sbdss min_algs_thms min_algs_mono_thms))
   686             set_sbdss min_algs_thms min_algs_mono_thms))
   793           |> Thm.close_derivation;
   687           |> Thm.close_derivation;
   794 
   688 
   795         fun mk_card_of_thm min_alg def = Goal.prove_sorry lthy [] []
   689         fun mk_card_of_thm min_alg def = Goal.prove_sorry lthy [] []
   796           (fold_rev Logic.all ss
   690           (HOLogic.mk_Trueprop (mk_ordLeq (mk_card_of min_alg) Asuc_bd))
   797             (HOLogic.mk_Trueprop (mk_ordLeq (mk_card_of min_alg) Asuc_bd)))
       
   798           (K (mk_card_of_min_alg_tac def card_of_min_algs_thm
   691           (K (mk_card_of_min_alg_tac def card_of_min_algs_thm
   799             suc_bd_Card_order suc_bd_Asuc_bd Asuc_bd_Cinfinite))
   692             suc_bd_Card_order suc_bd_Asuc_bd Asuc_bd_Cinfinite))
   800           |> Thm.close_derivation;
   693           |> Thm.close_derivation;
   801 
   694 
   802         val least_prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
   695         val least_prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
   807           |> Thm.close_derivation;
   700           |> Thm.close_derivation;
   808 
   701 
   809         val leasts = map3 mk_least_thm min_algs Bs min_alg_defs;
   702         val leasts = map3 mk_least_thm min_algs Bs min_alg_defs;
   810 
   703 
   811         val incl_prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
   704         val incl_prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
   812         val incl_min_algs = map (mk_min_alg ss) ks;
       
   813         val incl = Goal.prove_sorry lthy [] []
   705         val incl = Goal.prove_sorry lthy [] []
   814           (fold_rev Logic.all (Bs @ ss)
   706           (fold_rev Logic.all (Bs @ ss)
   815             (Logic.mk_implies (incl_prem,
   707             (Logic.mk_implies (incl_prem,
   816               HOLogic.mk_Trueprop (mk_mor incl_min_algs ss Bs ss active_ids))))
   708               HOLogic.mk_Trueprop (mk_mor min_algs ss Bs ss active_ids))))
   817           (K (EVERY' (rtac mor_incl_thm :: map etac leasts) 1))
   709           (K (EVERY' (rtac mor_incl_thm :: map etac leasts) 1))
   818           |> Thm.close_derivation;
   710           |> Thm.close_derivation;
   819       in
   711       in
   820         (alg_min_alg, map2 mk_card_of_thm min_algs min_alg_defs, leasts, incl)
   712         (alg_min_alg, map2 mk_card_of_thm min_algs min_alg_defs, leasts, incl)
   821       end;
   713       end;
   902       (fn {context = ctxt, prems = _} => mk_alg_select_tac ctxt Abs_IIT_inverse_thm)
   794       (fn {context = ctxt, prems = _} => mk_alg_select_tac ctxt Abs_IIT_inverse_thm)
   903       |> Thm.close_derivation;
   795       |> Thm.close_derivation;
   904 
   796 
   905     val mor_select_thm =
   797     val mor_select_thm =
   906       let
   798       let
   907         val alg_prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
       
   908         val i_prem = HOLogic.mk_Trueprop (HOLogic.mk_mem (iidx, II));
   799         val i_prem = HOLogic.mk_Trueprop (HOLogic.mk_mem (iidx, II));
   909         val mor_prem = HOLogic.mk_Trueprop (mk_mor select_Bs select_ss Bs ss Asuc_fs);
   800         val mor_prem = HOLogic.mk_Trueprop (mk_mor select_Bs select_ss active_UNIVs ss Asuc_fs);
   910         val prems = [alg_prem, i_prem, mor_prem];
   801         val prems = [i_prem, mor_prem];
   911         val concl = HOLogic.mk_Trueprop
   802         val concl = HOLogic.mk_Trueprop
   912           (mk_mor car_inits str_inits Bs ss
   803           (mk_mor car_inits str_inits active_UNIVs ss
   913             (map (fn f => HOLogic.mk_comp (f, mk_rapp iidx Asuc_bdT)) Asuc_fs));
   804             (map (fn f => HOLogic.mk_comp (f, mk_rapp iidx Asuc_bdT)) Asuc_fs));
   914       in
   805       in
   915         Goal.prove_sorry lthy [] []
   806         Goal.prove_sorry lthy [] []
   916           (fold_rev Logic.all (iidx :: Bs @ ss @ Asuc_fs) (Logic.list_implies (prems, concl)))
   807           (fold_rev Logic.all (iidx :: ss @ Asuc_fs) (Logic.list_implies (prems, concl)))
   917           (K (mk_mor_select_tac mor_def mor_cong_thm mor_comp_thm mor_incl_min_alg_thm alg_def
   808           (K (mk_mor_select_tac mor_def mor_cong_thm mor_comp_thm mor_incl_min_alg_thm alg_def
   918             alg_select_thm alg_set_thms set_mapss str_init_defs))
   809             alg_select_thm alg_set_thms set_mapss str_init_defs))
   919         |> Thm.close_derivation
   810         |> Thm.close_derivation
   920       end;
   811       end;
   921 
   812 
   922     val (init_ex_mor_thm, init_unique_mor_thms) =
   813     val init_unique_mor_thms =
   923       let
   814       let
   924         val prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
       
   925         val concl = HOLogic.mk_Trueprop
       
   926           (list_exists_free init_fs (mk_mor car_inits str_inits Bs ss init_fs));
       
   927         val ex_mor = Goal.prove_sorry lthy [] []
       
   928           (fold_rev Logic.all (Bs @ ss) (Logic.mk_implies (prem, concl)))
       
   929           (fn {context = ctxt, prems = _} => mk_init_ex_mor_tac ctxt Abs_IIT_inverse_thm
       
   930             ex_copy_alg_thm alg_min_alg_thm card_of_min_alg_thms mor_comp_thm mor_select_thm
       
   931             mor_incl_min_alg_thm)
       
   932           |> Thm.close_derivation;
       
   933 
       
   934         val prems = map2 (HOLogic.mk_Trueprop oo curry HOLogic.mk_mem) init_xs car_inits
   815         val prems = map2 (HOLogic.mk_Trueprop oo curry HOLogic.mk_mem) init_xs car_inits
   935         val mor_prems = map HOLogic.mk_Trueprop
   816         val mor_prems = map HOLogic.mk_Trueprop
   936           [mk_mor car_inits str_inits Bs ss init_fs,
   817           [mk_mor car_inits str_inits Bs ss init_fs,
   937           mk_mor car_inits str_inits Bs ss init_fs_copy];
   818           mk_mor car_inits str_inits Bs ss init_fs_copy];
   938         fun mk_fun_eq f g x = HOLogic.mk_eq (f $ x, g $ x);
   819         fun mk_fun_eq f g x = HOLogic.mk_eq (f $ x, g $ x);
   943             (Logic.list_implies (prems @ mor_prems, unique)))
   824             (Logic.list_implies (prems @ mor_prems, unique)))
   944           (K (mk_init_unique_mor_tac m alg_def alg_init_thm least_min_alg_thms
   825           (K (mk_init_unique_mor_tac m alg_def alg_init_thm least_min_alg_thms
   945             in_mono'_thms alg_set_thms morE_thms map_cong0s))
   826             in_mono'_thms alg_set_thms morE_thms map_cong0s))
   946           |> Thm.close_derivation;
   827           |> Thm.close_derivation;
   947       in
   828       in
   948         (ex_mor, split_conj_thm unique_mor)
   829         split_conj_thm unique_mor
   949       end;
   830       end;
   950 
   831 
   951     val init_setss = mk_setss (passiveAs @ active_initTs);
   832     val init_setss = mk_setss (passiveAs @ active_initTs);
   952     val active_init_setss = map (drop m) init_setss;
   833     val active_init_setss = map (drop m) init_setss;
   953     val init_ins = map2 (fn sets => mk_in (passive_UNIVs @ car_inits) sets) init_setss init_FTs;
   834     val init_ins = map2 (fn sets => mk_in (passive_UNIVs @ car_inits) sets) init_setss init_FTs;
   995     val Rep_Ts = map2 (fn info => fn T => Const (#Rep_name info, T --> initT)) T_glob_infos Ts;
   876     val Rep_Ts = map2 (fn info => fn T => Const (#Rep_name info, T --> initT)) T_glob_infos Ts;
   996     val Abs_Ts = map2 (fn info => fn T => Const (#Abs_name info, initT --> T)) T_glob_infos Ts;
   877     val Abs_Ts = map2 (fn info => fn T => Const (#Abs_name info, initT --> T)) T_glob_infos Ts;
   997 
   878 
   998     val type_defs = map #type_definition T_loc_infos;
   879     val type_defs = map #type_definition T_loc_infos;
   999     val Reps = map #Rep T_loc_infos;
   880     val Reps = map #Rep T_loc_infos;
  1000     val Rep_casess = map #Rep_cases T_loc_infos;
       
  1001     val Rep_injects = map #Rep_inject T_loc_infos;
       
  1002     val Rep_inverses = map #Rep_inverse T_loc_infos;
   881     val Rep_inverses = map #Rep_inverse T_loc_infos;
  1003     val Abs_inverses = map #Abs_inverse T_loc_infos;
   882     val Abs_inverses = map #Abs_inverse T_loc_infos;
  1004 
       
  1005     fun mk_inver_thm mk_tac rep abs X thm =
       
  1006       Goal.prove_sorry lthy [] []
       
  1007         (HOLogic.mk_Trueprop (mk_inver rep abs X))
       
  1008         (K (EVERY' [rtac iffD2, rtac @{thm inver_def}, rtac ballI, mk_tac thm] 1))
       
  1009       |> Thm.close_derivation;
       
  1010 
       
  1011     val inver_Reps = map4 (mk_inver_thm rtac) Abs_Ts Rep_Ts (map HOLogic.mk_UNIV Ts) Rep_inverses;
       
  1012     val inver_Abss = map4 (mk_inver_thm etac) Rep_Ts Abs_Ts car_inits Abs_inverses;
       
  1013 
   883 
  1014     val timer = time (timer "THE TYPEDEFs & Rep/Abs thms");
   884     val timer = time (timer "THE TYPEDEFs & Rep/Abs thms");
  1015 
   885 
  1016     val UNIVs = map HOLogic.mk_UNIV Ts;
   886     val UNIVs = map HOLogic.mk_UNIV Ts;
  1017     val FTs = mk_FTs (passiveAs @ Ts);
   887     val FTs = mk_FTs (passiveAs @ Ts);
  1069     val ctor's = mk_ctors passiveBs;
   939     val ctor's = mk_ctors passiveBs;
  1070     val ctor_defs = map (fn def => Morphism.thm phi def RS meta_eq_to_obj_eq) ctor_def_frees;
   940     val ctor_defs = map (fn def => Morphism.thm phi def RS meta_eq_to_obj_eq) ctor_def_frees;
  1071 
   941 
  1072     val (mor_Rep_thm, mor_Abs_thm) =
   942     val (mor_Rep_thm, mor_Abs_thm) =
  1073       let
   943       let
  1074         val copy = alg_init_thm RS copy_alg_thm;
   944         val defs = mor_def :: ctor_defs;
  1075         fun mk_bij inj Rep cases = @{thm bij_betwI'} OF [inj, Rep, cases];
   945 
  1076         val bijs = map3 mk_bij Rep_injects Reps Rep_casess;
       
  1077         val mor_Rep =
   946         val mor_Rep =
  1078           Goal.prove_sorry lthy [] []
   947           Goal.prove_sorry lthy [] []
  1079             (HOLogic.mk_Trueprop (mk_mor UNIVs ctors car_inits str_inits Rep_Ts))
   948             (HOLogic.mk_Trueprop (mk_mor UNIVs ctors car_inits str_inits Rep_Ts))
  1080             (fn {context = ctxt, prems = _} => mk_mor_Rep_tac ctxt ctor_defs copy bijs inver_Abss
   949             (fn {context = ctxt, prems = _} => mk_mor_Rep_tac ctxt m defs Reps Abs_inverses
  1081               inver_Reps)
   950               alg_min_alg_thm alg_set_thms set_mapss)
  1082           |> Thm.close_derivation;
   951           |> Thm.close_derivation;
  1083 
   952 
  1084         val inv = mor_inv_thm OF [mor_Rep, talg_thm, alg_init_thm];
   953         fun mk_ct initFT str abs = Term.absdummy initFT (abs $ (str $ Bound 0))
       
   954         val cts = map3 (SOME o certify lthy ooo mk_ct) init_FTs str_inits Abs_Ts;
       
   955 
  1085         val mor_Abs =
   956         val mor_Abs =
  1086           Goal.prove_sorry lthy [] []
   957           Goal.prove_sorry lthy [] []
  1087             (HOLogic.mk_Trueprop (mk_mor car_inits str_inits UNIVs ctors Abs_Ts))
   958             (HOLogic.mk_Trueprop (mk_mor car_inits str_inits UNIVs ctors Abs_Ts))
  1088             (K (mk_mor_Abs_tac inv inver_Abss inver_Reps))
   959             (fn {context = ctxt, prems = _} => mk_mor_Abs_tac ctxt cts defs Abs_inverses
       
   960               map_comp_id_thms map_cong0L_thms)
  1089           |> Thm.close_derivation;
   961           |> Thm.close_derivation;
  1090       in
   962       in
  1091         (mor_Rep, mor_Abs)
   963         (mor_Rep, mor_Abs)
  1092       end;
   964       end;
  1093 
   965 
  1120     fun mk_fold Ts ss i = Term.list_comb (Const (nth fold_names (i - 1), Library.foldr (op -->)
   992     fun mk_fold Ts ss i = Term.list_comb (Const (nth fold_names (i - 1), Library.foldr (op -->)
  1121       (map fastype_of ss, nth Ts (i - 1) --> range_type (fastype_of (nth ss (i - 1))))), ss);
   993       (map fastype_of ss, nth Ts (i - 1) --> range_type (fastype_of (nth ss (i - 1))))), ss);
  1122     val fold_defs = map (fn def =>
   994     val fold_defs = map (fn def =>
  1123       mk_unabs_def n (Morphism.thm phi def RS meta_eq_to_obj_eq)) fold_def_frees;
   995       mk_unabs_def n (Morphism.thm phi def RS meta_eq_to_obj_eq)) fold_def_frees;
  1124 
   996 
       
   997     (* algebra copies *)
       
   998 
       
   999     val copy_thm =
       
  1000       let
       
  1001         val prems = HOLogic.mk_Trueprop (mk_alg Bs ss) ::
       
  1002           map3 (HOLogic.mk_Trueprop ooo mk_bij_betw) inv_fs B's Bs;
       
  1003         val concl = HOLogic.mk_Trueprop (list_exists_free s's
       
  1004           (HOLogic.mk_conj (mk_alg B's s's, mk_mor B's s's Bs ss inv_fs)));
       
  1005       in
       
  1006         Goal.prove_sorry lthy [] []
       
  1007           (fold_rev Logic.all (Bs @ ss @ B's @ inv_fs) (Logic.list_implies (prems, concl)))
       
  1008           (K (mk_copy_tac m alg_def mor_def alg_set_thms set_mapss))
       
  1009           |> Thm.close_derivation
       
  1010       end;
       
  1011 
       
  1012     val init_ex_mor_thm =
       
  1013       let
       
  1014         val goal = HOLogic.mk_Trueprop
       
  1015           (list_exists_free fs (mk_mor UNIVs ctors active_UNIVs ss fs));
       
  1016       in
       
  1017         singleton (Proof_Context.export names_lthy lthy)
       
  1018           (Goal.prove_sorry lthy [] [] goal
       
  1019             (fn {context = ctxt, prems = _} =>
       
  1020               mk_init_ex_mor_tac ctxt Abs_IIT_inverse_thm (alg_min_alg_thm RS copy_thm)
       
  1021                 card_of_min_alg_thms mor_Rep_thm mor_comp_thm mor_select_thm mor_incl_thm)
       
  1022             |> Thm.close_derivation)
       
  1023       end;
       
  1024 
  1125     val mor_fold_thm =
  1025     val mor_fold_thm =
  1126       let
  1026       let
  1127         val ex_mor = talg_thm RS init_ex_mor_thm;
       
  1128         val mor_cong = mor_cong_thm OF (map (mk_nth_conv n) ks);
  1027         val mor_cong = mor_cong_thm OF (map (mk_nth_conv n) ks);
  1129         val mor_comp = mor_Rep_thm RS mor_comp_thm;
       
  1130         val cT = certifyT lthy foldT;
  1028         val cT = certifyT lthy foldT;
  1131         val ct = certify lthy fold_fun
  1029         val ct = certify lthy fold_fun
  1132       in
  1030       in
  1133         singleton (Proof_Context.export names_lthy lthy)
  1031         singleton (Proof_Context.export names_lthy lthy)
  1134           (Goal.prove_sorry lthy [] []
  1032           (Goal.prove_sorry lthy [] []
  1135             (HOLogic.mk_Trueprop (mk_mor UNIVs ctors active_UNIVs ss (map (mk_fold Ts ss) ks)))
  1033             (HOLogic.mk_Trueprop (mk_mor UNIVs ctors active_UNIVs ss (map (mk_fold Ts ss) ks)))
  1136             (K (mk_mor_fold_tac cT ct fold_defs ex_mor (mor_comp RS mor_cong))))
  1034             (K (mk_mor_fold_tac cT ct fold_defs init_ex_mor_thm mor_cong)))
  1137         |> Thm.close_derivation
  1035         |> Thm.close_derivation
  1138       end;
  1036       end;
  1139 
  1037 
  1140     val ctor_fold_thms = map (fn morE => rule_by_tactic lthy
  1038     val ctor_fold_thms = map (fn morE => rule_by_tactic lthy
  1141       ((rtac CollectI THEN' CONJ_WRAP' (K (rtac @{thm subset_UNIV})) (1 upto m + n)) 1)
  1039       ((rtac CollectI THEN' CONJ_WRAP' (K (rtac @{thm subset_UNIV})) (1 upto m + n)) 1)