src/HOL/Tools/BNF/bnf_lfp.ML
changeset 55541 fd9ea8ae28f6
parent 55538 6a5986170c1d
child 55702 63c80031d8dd
equal deleted inserted replaced
55540:892a425c5eaa 55541:fd9ea8ae28f6
    83     fun mk_FTs Ts = map2 (fn Ds => mk_T_of_bnf Ds Ts) Dss bnfs;
    83     fun mk_FTs Ts = map2 (fn Ds => mk_T_of_bnf Ds Ts) Dss bnfs;
    84     val (params, params') = `(map Term.dest_TFree) (mk_params passiveAs);
    84     val (params, params') = `(map Term.dest_TFree) (mk_params passiveAs);
    85     val FTsAs = mk_FTs allAs;
    85     val FTsAs = mk_FTs allAs;
    86     val FTsBs = mk_FTs allBs;
    86     val FTsBs = mk_FTs allBs;
    87     val FTsCs = mk_FTs allCs;
    87     val FTsCs = mk_FTs allCs;
    88     val ATs = map HOLogic.mk_setT passiveAs;
       
    89     val BTs = map HOLogic.mk_setT activeAs;
    88     val BTs = map HOLogic.mk_setT activeAs;
    90     val B'Ts = map HOLogic.mk_setT activeBs;
    89     val B'Ts = map HOLogic.mk_setT activeBs;
    91     val B''Ts = map HOLogic.mk_setT activeCs;
    90     val B''Ts = map HOLogic.mk_setT activeCs;
    92     val sTs = map2 (curry op -->) FTsAs activeAs;
    91     val sTs = map2 (curry op -->) FTsAs activeAs;
    93     val s'Ts = map2 (curry op -->) FTsBs activeBs;
    92     val s'Ts = map2 (curry op -->) FTsBs activeBs;
   118         (mk_card_of (HOLogic.mk_UNIV
   117         (mk_card_of (HOLogic.mk_UNIV
   119           (mk_T_of_bnf Ds (replicate live (fst (dest_relT (fastype_of bd0)))) bnf))))
   118           (mk_T_of_bnf Ds (replicate live (fst (dest_relT (fastype_of bd0)))) bnf))))
   120       bd0s Dss bnfs;
   119       bd0s Dss bnfs;
   121     val witss = map wits_of_bnf bnfs;
   120     val witss = map wits_of_bnf bnfs;
   122 
   121 
   123     val (((((((((((((((((((zs, zs'), As), Bs), Bs_copy), B's), B''s), ss), prod_ss), s's), s''s),
   122     val ((((((((((((((((((zs, zs'), Bs), Bs_copy), B's), B''s), ss), prod_ss), s's), s''s),
   124       fs), fs_copy), inv_fs), self_fs), gs), all_gs), (xFs, xFs')), (yFs, yFs')),
   123       fs), fs_copy), inv_fs), self_fs), gs), all_gs), (xFs, xFs')), (yFs, yFs')),
   125       names_lthy) = lthy
   124       names_lthy) = lthy
   126       |> mk_Frees' "z" activeAs
   125       |> mk_Frees' "z" activeAs
   127       ||>> mk_Frees "A" ATs
       
   128       ||>> mk_Frees "B" BTs
   126       ||>> mk_Frees "B" BTs
   129       ||>> mk_Frees "B" BTs
   127       ||>> mk_Frees "B" BTs
   130       ||>> mk_Frees "B'" B'Ts
   128       ||>> mk_Frees "B'" B'Ts
   131       ||>> mk_Frees "B''" B''Ts
   129       ||>> mk_Frees "B''" B''Ts
   132       ||>> mk_Frees "s" sTs
   130       ||>> mk_Frees "s" sTs
   243     (* algebra *)
   241     (* algebra *)
   244 
   242 
   245     val alg_bind = mk_internal_b algN;
   243     val alg_bind = mk_internal_b algN;
   246     val alg_def_bind = (Thm.def_binding alg_bind, []);
   244     val alg_def_bind = (Thm.def_binding alg_bind, []);
   247 
   245 
   248     (*forall i = 1 ... n: (\<forall>x \<in> Fi_in A1 .. Am B1 ... Bn. si x \<in> Bi)*)
   246     (*forall i = 1 ... n: (\<forall>x \<in> Fi_in UNIV .. UNIV B1 ... Bn. si x \<in> Bi)*)
   249     val alg_spec =
   247     val alg_spec =
   250       let
   248       let
   251         val ins = map3 mk_in (replicate n (As @ Bs)) setssAs FTsAs;
   249         val ins = map3 mk_in (replicate n (passive_UNIVs @ Bs)) setssAs FTsAs;
   252         fun mk_alg_conjunct B s X x x' =
   250         fun mk_alg_conjunct B s X x x' =
   253           mk_Ball X (Term.absfree x' (HOLogic.mk_mem (s $ x, B)));
   251           mk_Ball X (Term.absfree x' (HOLogic.mk_mem (s $ x, B)));
   254 
   252 
   255         val rhs = Library.foldr1 HOLogic.mk_conj (map5 mk_alg_conjunct Bs ss ins xFs xFs')
   253         val rhs = Library.foldr1 HOLogic.mk_conj (map5 mk_alg_conjunct Bs ss ins xFs xFs')
   256       in
   254       in
   257         fold_rev (Term.absfree o Term.dest_Free) (As @ Bs @ ss) rhs
   255         fold_rev (Term.absfree o Term.dest_Free) (Bs @ ss) rhs
   258       end;
   256       end;
   259 
   257 
   260     val ((alg_free, (_, alg_def_free)), (lthy, lthy_old)) =
   258     val ((alg_free, (_, alg_def_free)), (lthy, lthy_old)) =
   261         lthy
   259         lthy
   262         |> Local_Theory.define ((alg_bind, NoSyn), (alg_def_bind, alg_spec))
   260         |> Local_Theory.define ((alg_bind, NoSyn), (alg_def_bind, alg_spec))
   263         ||> `Local_Theory.restore;
   261         ||> `Local_Theory.restore;
   264 
   262 
   265     val phi = Proof_Context.export_morphism lthy_old lthy;
   263     val phi = Proof_Context.export_morphism lthy_old lthy;
   266     val alg = fst (Term.dest_Const (Morphism.term phi alg_free));
   264     val alg = fst (Term.dest_Const (Morphism.term phi alg_free));
   267     val alg_def = mk_unabs_def (live + n) (Morphism.thm phi alg_def_free RS meta_eq_to_obj_eq);
   265     val alg_def = mk_unabs_def (2 * n) (Morphism.thm phi alg_def_free RS meta_eq_to_obj_eq);
   268 
   266 
   269     fun mk_alg As Bs ss =
   267     fun mk_alg Bs ss =
   270       let
   268       let
   271         val args = As @ Bs @ ss;
   269         val args = Bs @ ss;
   272         val Ts = map fastype_of args;
   270         val Ts = map fastype_of args;
   273         val algT = Library.foldr (op -->) (Ts, HOLogic.boolT);
   271         val algT = Library.foldr (op -->) (Ts, HOLogic.boolT);
   274       in
   272       in
   275         Term.list_comb (Const (alg, algT), args)
   273         Term.list_comb (Const (alg, algT), args)
   276       end;
   274       end;
   277 
   275 
   278     val alg_set_thms =
   276     val alg_set_thms =
   279       let
   277       let
   280         val alg_prem = HOLogic.mk_Trueprop (mk_alg As Bs ss);
   278         val alg_prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
   281         fun mk_prem x set B = HOLogic.mk_Trueprop (mk_leq (set $ x) B);
   279         fun mk_prem x set B = HOLogic.mk_Trueprop (mk_leq (set $ x) B);
   282         fun mk_concl s x B = HOLogic.mk_Trueprop (HOLogic.mk_mem (s $ x, B));
   280         fun mk_concl s x B = HOLogic.mk_Trueprop (HOLogic.mk_mem (s $ x, B));
   283         val premss = map2 ((fn x => fn sets =>  map2 (mk_prem x) sets (As @ Bs))) xFs setssAs;
   281         val premss = map2 ((fn x => fn sets => map2 (mk_prem x) (drop m sets) Bs)) xFs setssAs;
   284         val concls = map3 mk_concl ss xFs Bs;
   282         val concls = map3 mk_concl ss xFs Bs;
   285         val goals = map3 (fn x => fn prems => fn concl =>
   283         val goals = map3 (fn x => fn prems => fn concl =>
   286           fold_rev Logic.all (x :: As @ Bs @ ss)
   284           fold_rev Logic.all (x :: Bs @ ss)
   287             (Logic.list_implies (alg_prem :: prems, concl))) xFs premss concls;
   285             (Logic.list_implies (alg_prem :: prems, concl))) xFs premss concls;
   288       in
   286       in
   289         map (fn goal =>
   287         map (fn goal =>
   290           Goal.prove_sorry lthy [] [] goal (K (mk_alg_set_tac alg_def)) |> Thm.close_derivation)
   288           Goal.prove_sorry lthy [] [] goal (K (mk_alg_set_tac alg_def)) |> Thm.close_derivation)
   291         goals
   289         goals
   292       end;
   290       end;
   293 
   291 
   294     fun mk_talg ATs BTs = mk_alg (map HOLogic.mk_UNIV ATs) (map HOLogic.mk_UNIV BTs);
   292     fun mk_talg BTs = mk_alg (map HOLogic.mk_UNIV BTs);
   295 
   293 
   296     val talg_thm =
   294     val talg_thm =
   297       let
   295       let
   298         val goal = fold_rev Logic.all ss
   296         val goal = fold_rev Logic.all ss
   299           (HOLogic.mk_Trueprop (mk_talg passiveAs activeAs ss))
   297           (HOLogic.mk_Trueprop (mk_talg activeAs ss))
   300       in
   298       in
   301         Goal.prove_sorry lthy [] [] goal
   299         Goal.prove_sorry lthy [] [] goal
   302           (K (stac alg_def 1 THEN CONJ_WRAP (K (EVERY' [rtac ballI, rtac UNIV_I] 1)) ss))
   300           (K (stac alg_def 1 THEN CONJ_WRAP (K (EVERY' [rtac ballI, rtac UNIV_I] 1)) ss))
   303         |> Thm.close_derivation
   301         |> Thm.close_derivation
   304       end;
   302       end;
   306     val timer = time (timer "Algebra definition & thms");
   304     val timer = time (timer "Algebra definition & thms");
   307 
   305 
   308     val alg_not_empty_thms =
   306     val alg_not_empty_thms =
   309       let
   307       let
   310         val alg_prem =
   308         val alg_prem =
   311           HOLogic.mk_Trueprop (mk_alg passive_UNIVs Bs ss);
   309           HOLogic.mk_Trueprop (mk_alg Bs ss);
   312         val concls = map (HOLogic.mk_Trueprop o mk_not_empty) Bs;
   310         val concls = map (HOLogic.mk_Trueprop o mk_not_empty) Bs;
   313         val goals =
   311         val goals =
   314           map (fn concl =>
   312           map (fn concl =>
   315             fold_rev Logic.all (Bs @ ss) (Logic.mk_implies (alg_prem, concl))) concls;
   313             fold_rev Logic.all (Bs @ ss) (Logic.mk_implies (alg_prem, concl))) concls;
   316       in
   314       in
   413     val mor_inv_thm =
   411     val mor_inv_thm =
   414       let
   412       let
   415         fun mk_inv_prem f inv_f B B' = HOLogic.mk_conj (mk_leq (mk_image inv_f $ B') B,
   413         fun mk_inv_prem f inv_f B B' = HOLogic.mk_conj (mk_leq (mk_image inv_f $ B') B,
   416           HOLogic.mk_conj (mk_inver inv_f f B, mk_inver f inv_f B'));
   414           HOLogic.mk_conj (mk_inver inv_f f B, mk_inver f inv_f B'));
   417         val prems = map HOLogic.mk_Trueprop
   415         val prems = map HOLogic.mk_Trueprop
   418           ([mk_mor Bs ss B's s's fs,
   416           ([mk_mor Bs ss B's s's fs, mk_alg Bs ss, mk_alg B's s's] @
   419           mk_alg passive_UNIVs Bs ss,
       
   420           mk_alg passive_UNIVs B's s's] @
       
   421           map4 mk_inv_prem fs inv_fs Bs B's);
   417           map4 mk_inv_prem fs inv_fs Bs B's);
   422         val concl = HOLogic.mk_Trueprop (mk_mor B's s's Bs ss inv_fs);
   418         val concl = HOLogic.mk_Trueprop (mk_mor B's s's Bs ss inv_fs);
   423       in
   419       in
   424         Goal.prove_sorry lthy [] []
   420         Goal.prove_sorry lthy [] []
   425           (fold_rev Logic.all (Bs @ ss @ B's @ s's @ fs @ inv_fs)
   421           (fold_rev Logic.all (Bs @ ss @ B's @ s's @ fs @ inv_fs)
   495         HOLogic.mk_conj (mk_mor Bs1 ss1 Bs2 ss2 fs, ex_inv_mor)
   491         HOLogic.mk_conj (mk_mor Bs1 ss1 Bs2 ss2 fs, ex_inv_mor)
   496       end;
   492       end;
   497 
   493 
   498     val iso_alt_thm =
   494     val iso_alt_thm =
   499       let
   495       let
   500         val prems = map HOLogic.mk_Trueprop
   496         val prems = map HOLogic.mk_Trueprop [mk_alg Bs ss, mk_alg B's s's]
   501          [mk_alg passive_UNIVs Bs ss,
       
   502          mk_alg passive_UNIVs B's s's]
       
   503         val concl = mk_Trueprop_eq (mk_iso Bs ss B's s's fs inv_fs,
   497         val concl = mk_Trueprop_eq (mk_iso Bs ss B's s's fs inv_fs,
   504           HOLogic.mk_conj (mk_mor Bs ss B's s's fs,
   498           HOLogic.mk_conj (mk_mor Bs ss B's s's fs,
   505             Library.foldr1 HOLogic.mk_conj (map3 mk_bij_betw fs Bs B's)));
   499             Library.foldr1 HOLogic.mk_conj (map3 mk_bij_betw fs Bs B's)));
   506       in
   500       in
   507         Goal.prove_sorry lthy [] []
   501         Goal.prove_sorry lthy [] []
   515     (* algebra copies *)
   509     (* algebra copies *)
   516 
   510 
   517     val (copy_alg_thm, ex_copy_alg_thm) =
   511     val (copy_alg_thm, ex_copy_alg_thm) =
   518       let
   512       let
   519         val prems = map HOLogic.mk_Trueprop
   513         val prems = map HOLogic.mk_Trueprop
   520          (mk_alg passive_UNIVs Bs ss :: map3 mk_bij_betw inv_fs B's Bs);
   514          (mk_alg Bs ss :: map3 mk_bij_betw inv_fs B's Bs);
   521         val inver_prems = map HOLogic.mk_Trueprop
   515         val inver_prems = map HOLogic.mk_Trueprop
   522           (map3 mk_inver inv_fs fs Bs @ map3 mk_inver fs inv_fs B's);
   516           (map3 mk_inver inv_fs fs Bs @ map3 mk_inver fs inv_fs B's);
   523         val all_prems = prems @ inver_prems;
   517         val all_prems = prems @ inver_prems;
   524         fun mk_s f s mapT y y' = Term.absfree y' (f $ (s $
   518         fun mk_s f s mapT y y' = Term.absfree y' (f $ (s $
   525           (Term.list_comb (mapT, passive_ids @ inv_fs) $ y)));
   519           (Term.list_comb (mapT, passive_ids @ inv_fs) $ y)));
   526 
   520 
   527         val alg = HOLogic.mk_Trueprop
   521         val alg = HOLogic.mk_Trueprop
   528           (mk_alg passive_UNIVs B's (map5 mk_s fs ss mapsBsAs yFs yFs'));
   522           (mk_alg B's (map5 mk_s fs ss mapsBsAs yFs yFs'));
   529         val copy_str_thm = Goal.prove_sorry lthy [] []
   523         val copy_str_thm = Goal.prove_sorry lthy [] []
   530           (fold_rev Logic.all (Bs @ ss @ B's @ inv_fs @ fs)
   524           (fold_rev Logic.all (Bs @ ss @ B's @ inv_fs @ fs)
   531             (Logic.list_implies (all_prems, alg)))
   525             (Logic.list_implies (all_prems, alg)))
   532           (K (mk_copy_str_tac set_mapss alg_def alg_set_thms))
   526           (K (mk_copy_str_tac set_mapss alg_def alg_set_thms))
   533           |> Thm.close_derivation;
   527           |> Thm.close_derivation;
   540           (K (mk_copy_alg_tac set_mapss alg_set_thms mor_def iso_alt_thm copy_str_thm))
   534           (K (mk_copy_alg_tac set_mapss alg_set_thms mor_def iso_alt_thm copy_str_thm))
   541           |> Thm.close_derivation;
   535           |> Thm.close_derivation;
   542 
   536 
   543         val ex = HOLogic.mk_Trueprop
   537         val ex = HOLogic.mk_Trueprop
   544           (list_exists_free s's
   538           (list_exists_free s's
   545             (HOLogic.mk_conj (mk_alg passive_UNIVs B's s's,
   539             (HOLogic.mk_conj (mk_alg B's s's,
   546               mk_iso B's s's Bs ss inv_fs fs_copy)));
   540               mk_iso B's s's Bs ss inv_fs fs_copy)));
   547         val ex_copy_alg_thm = Goal.prove_sorry lthy [] []
   541         val ex_copy_alg_thm = Goal.prove_sorry lthy [] []
   548           (fold_rev Logic.all (Bs @ ss @ B's @ inv_fs @ fs)
   542           (fold_rev Logic.all (Bs @ ss @ B's @ inv_fs @ fs)
   549              (Logic.list_implies (prems, ex)))
   543              (Logic.list_implies (prems, ex)))
   550           (K (mk_ex_copy_alg_tac n copy_str_thm copy_alg_thm))
   544           (K (mk_ex_copy_alg_tac n copy_str_thm copy_alg_thm))
   591     val Asuc_bd_Cinfinite = suc_bd_Cinfinite RS (basis_Asuc RS @{thm Cinfinite_cexp});
   585     val Asuc_bd_Cinfinite = suc_bd_Cinfinite RS (basis_Asuc RS @{thm Cinfinite_cexp});
   592 
   586 
   593     val suc_bd_Asuc_bd = @{thm ordLess_ordLeq_trans[OF ordLess_ctwo_cexp cexp_mono1]} OF
   587     val suc_bd_Asuc_bd = @{thm ordLess_ordLeq_trans[OF ordLess_ctwo_cexp cexp_mono1]} OF
   594       [suc_bd_Card_order, basis_Asuc, suc_bd_Card_order];
   588       [suc_bd_Card_order, basis_Asuc, suc_bd_Card_order];
   595 
   589 
   596     val Asuc_bdT = fst (dest_relT (fastype_of (mk_Asuc_bd As)));
   590 
       
   591     val Asuc_bd = mk_Asuc_bd passive_UNIVs;
       
   592     val Asuc_bdT = fst (dest_relT (fastype_of Asuc_bd));
   597     val II_BTs = replicate n (HOLogic.mk_setT Asuc_bdT);
   593     val II_BTs = replicate n (HOLogic.mk_setT Asuc_bdT);
   598     val II_sTs = map2 (fn Ds => fn bnf =>
   594     val II_sTs = map2 (fn Ds => fn bnf =>
   599       mk_T_of_bnf Ds (passiveAs @ replicate n Asuc_bdT) bnf --> Asuc_bdT) Dss bnfs;
   595       mk_T_of_bnf Ds (passiveAs @ replicate n Asuc_bdT) bnf --> Asuc_bdT) Dss bnfs;
   600 
   596 
   601     val (((((((idxs, Asi_name), (idx, idx')), (jdx, jdx')), II_Bs), II_ss), Asuc_fs),
   597     val (((((((idxs, Asi_name), (idx, idx')), (jdx, jdx')), II_Bs), II_ss), Asuc_fs),
   629     (* minimal algebra *)
   625     (* minimal algebra *)
   630 
   626 
   631     fun mk_minG Asi i k = mk_UNION (mk_underS suc_bd $ i)
   627     fun mk_minG Asi i k = mk_UNION (mk_underS suc_bd $ i)
   632       (Term.absfree jdx' (mk_nthN n (Asi $ jdx) k));
   628       (Term.absfree jdx' (mk_nthN n (Asi $ jdx) k));
   633 
   629 
   634     fun mk_minH_component As Asi i sets Ts s k =
   630     fun mk_minH_component Asi i sets Ts s k =
   635       HOLogic.mk_binop @{const_name "sup"}
   631       HOLogic.mk_binop @{const_name "sup"}
   636       (mk_minG Asi i k, mk_image s $ mk_in (As @ map (mk_minG Asi i) ks) sets Ts);
   632       (mk_minG Asi i k, mk_image s $ mk_in (passive_UNIVs @ map (mk_minG Asi i) ks) sets Ts);
   637 
   633 
   638     fun mk_min_algs As ss =
   634     fun mk_min_algs ss =
   639       let
   635       let
   640         val BTs = map (range_type o fastype_of) ss;
   636         val BTs = map (range_type o fastype_of) ss;
   641         val Ts = map (HOLogic.dest_setT o fastype_of) As @ BTs;
   637         val Ts = passiveAs @ BTs;
   642         val (Asi, Asi') = `Free (Asi_name, suc_bdT -->
   638         val (Asi, Asi') = `Free (Asi_name, suc_bdT -->
   643           Library.foldr1 HOLogic.mk_prodT (map HOLogic.mk_setT BTs));
   639           Library.foldr1 HOLogic.mk_prodT (map HOLogic.mk_setT BTs));
   644       in
   640       in
   645          mk_worec suc_bd (Term.absfree Asi' (Term.absfree idx' (HOLogic.mk_tuple
   641          mk_worec suc_bd (Term.absfree Asi' (Term.absfree idx' (HOLogic.mk_tuple
   646            (map4 (mk_minH_component As Asi idx) (mk_setss Ts) (mk_FTs Ts) ss ks))))
   642            (map4 (mk_minH_component Asi idx) (mk_setss Ts) (mk_FTs Ts) ss ks))))
   647       end;
   643       end;
   648 
   644 
   649     val (min_algs_thms, min_algs_mono_thms, card_of_min_algs_thm, least_min_algs_thm) =
   645     val (min_algs_thms, min_algs_mono_thms, card_of_min_algs_thm, least_min_algs_thm) =
   650       let
   646       let
   651         val i_field = HOLogic.mk_mem (idx, field_suc_bd);
   647         val i_field = HOLogic.mk_mem (idx, field_suc_bd);
   652         val min_algs = mk_min_algs As ss;
   648         val min_algs = mk_min_algs ss;
   653         val min_algss = map (fn k => mk_nthN n (min_algs $ idx) k) ks;
   649         val min_algss = map (fn k => mk_nthN n (min_algs $ idx) k) ks;
   654 
   650 
   655         val concl = HOLogic.mk_Trueprop
   651         val concl = HOLogic.mk_Trueprop
   656           (HOLogic.mk_eq (min_algs $ idx, HOLogic.mk_tuple
   652           (HOLogic.mk_eq (min_algs $ idx, HOLogic.mk_tuple
   657             (map4 (mk_minH_component As min_algs idx) setssAs FTsAs ss ks)));
   653             (map4 (mk_minH_component min_algs idx) setssAs FTsAs ss ks)));
   658         val goal = fold_rev Logic.all (idx :: As @ ss)
   654         val goal = fold_rev Logic.all (idx :: ss)
   659           (Logic.mk_implies (HOLogic.mk_Trueprop i_field, concl));
   655           (Logic.mk_implies (HOLogic.mk_Trueprop i_field, concl));
   660 
   656 
   661         val min_algs_thm = Goal.prove_sorry lthy [] [] goal
   657         val min_algs_thm = Goal.prove_sorry lthy [] [] goal
   662           (K (mk_min_algs_tac suc_bd_worel in_cong'_thms))
   658           (K (mk_min_algs_tac suc_bd_worel in_cong'_thms))
   663           |> Thm.close_derivation;
   659           |> Thm.close_derivation;
   664 
   660 
   665         val min_algs_thms = map (fn k => min_algs_thm RS mk_nthI n k) ks;
   661         val min_algs_thms = map (fn k => min_algs_thm RS mk_nthI n k) ks;
   666 
   662 
   667         fun mk_mono_goal min_alg =
   663         fun mk_mono_goal min_alg =
   668           fold_rev Logic.all (As @ ss) (HOLogic.mk_Trueprop (mk_relChain suc_bd
   664           fold_rev Logic.all ss (HOLogic.mk_Trueprop (mk_relChain suc_bd
   669             (Term.absfree idx' min_alg)));
   665             (Term.absfree idx' min_alg)));
   670 
   666 
   671         val monos =
   667         val monos =
   672           map2 (fn goal => fn min_algs =>
   668           map2 (fn goal => fn min_algs =>
   673             Goal.prove_sorry lthy [] [] goal (K (mk_min_algs_mono_tac lthy min_algs))
   669             Goal.prove_sorry lthy [] [] goal (K (mk_min_algs_mono_tac lthy min_algs))
   674             |> Thm.close_derivation)
   670             |> Thm.close_derivation)
   675           (map mk_mono_goal min_algss) min_algs_thms;
   671           (map mk_mono_goal min_algss) min_algs_thms;
   676 
       
   677         val Asuc_bd = mk_Asuc_bd As;
       
   678 
   672 
   679         fun mk_card_conjunct min_alg = mk_ordLeq (mk_card_of min_alg) Asuc_bd;
   673         fun mk_card_conjunct min_alg = mk_ordLeq (mk_card_of min_alg) Asuc_bd;
   680         val card_conjunction = Library.foldr1 HOLogic.mk_conj (map mk_card_conjunct min_algss);
   674         val card_conjunction = Library.foldr1 HOLogic.mk_conj (map mk_card_conjunct min_algss);
   681         val card_cT = certifyT lthy suc_bdT;
   675         val card_cT = certifyT lthy suc_bdT;
   682         val card_ct = certify lthy (Term.absfree idx' card_conjunction);
   676         val card_ct = certify lthy (Term.absfree idx' card_conjunction);
   688               m suc_bd_worel min_algs_thms in_bd_sums
   682               m suc_bd_worel min_algs_thms in_bd_sums
   689               sum_Card_order sum_Cnotzero suc_bd_Card_order suc_bd_Cinfinite suc_bd_Cnotzero
   683               sum_Card_order sum_Cnotzero suc_bd_Card_order suc_bd_Cinfinite suc_bd_Cnotzero
   690               suc_bd_Asuc_bd Asuc_bd_Cinfinite)))
   684               suc_bd_Asuc_bd Asuc_bd_Cinfinite)))
   691           |> Thm.close_derivation;
   685           |> Thm.close_derivation;
   692 
   686 
   693         val least_prem = HOLogic.mk_Trueprop (mk_alg As Bs ss);
   687         val least_prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
   694         val least_conjunction = Library.foldr1 HOLogic.mk_conj (map2 mk_leq min_algss Bs);
   688         val least_conjunction = Library.foldr1 HOLogic.mk_conj (map2 mk_leq min_algss Bs);
   695         val least_cT = certifyT lthy suc_bdT;
   689         val least_cT = certifyT lthy suc_bdT;
   696         val least_ct = certify lthy (Term.absfree idx' least_conjunction);
   690         val least_ct = certify lthy (Term.absfree idx' least_conjunction);
   697 
   691 
   698         val least = singleton (Proof_Context.export names_lthy lthy)
   692         val least = singleton (Proof_Context.export names_lthy lthy)
   713     val min_alg_def_bind = rpair [] o Thm.def_binding o min_alg_bind;
   707     val min_alg_def_bind = rpair [] o Thm.def_binding o min_alg_bind;
   714 
   708 
   715     fun min_alg_spec i =
   709     fun min_alg_spec i =
   716       let
   710       let
   717         val rhs = mk_UNION (field_suc_bd)
   711         val rhs = mk_UNION (field_suc_bd)
   718           (Term.absfree idx' (mk_nthN n (mk_min_algs As ss $ idx) i));
   712           (Term.absfree idx' (mk_nthN n (mk_min_algs ss $ idx) i));
   719       in
   713       in
   720         fold_rev (Term.absfree o Term.dest_Free) (As @ ss) rhs
   714         fold_rev (Term.absfree o Term.dest_Free) ss rhs
   721       end;
   715       end;
   722 
   716 
   723     val ((min_alg_frees, (_, min_alg_def_frees)), (lthy, lthy_old)) =
   717     val ((min_alg_frees, (_, min_alg_def_frees)), (lthy, lthy_old)) =
   724         lthy
   718         lthy
   725         |> fold_map (fn i => Local_Theory.define
   719         |> fold_map (fn i => Local_Theory.define
   728         ||> `Local_Theory.restore;
   722         ||> `Local_Theory.restore;
   729 
   723 
   730     val phi = Proof_Context.export_morphism lthy_old lthy;
   724     val phi = Proof_Context.export_morphism lthy_old lthy;
   731     val min_algs = map (fst o Term.dest_Const o Morphism.term phi) min_alg_frees;
   725     val min_algs = map (fst o Term.dest_Const o Morphism.term phi) min_alg_frees;
   732     val min_alg_defs = map (fn def =>
   726     val min_alg_defs = map (fn def =>
   733       mk_unabs_def live (Morphism.thm phi def RS meta_eq_to_obj_eq)) min_alg_def_frees;
   727       mk_unabs_def n (Morphism.thm phi def RS meta_eq_to_obj_eq)) min_alg_def_frees;
   734 
   728 
   735     fun mk_min_alg As ss i =
   729     fun mk_min_alg ss i =
   736       let
   730       let
   737         val T = HOLogic.mk_setT (range_type (fastype_of (nth ss (i - 1))))
   731         val T = HOLogic.mk_setT (range_type (fastype_of (nth ss (i - 1))))
   738         val args = As @ ss;
   732         val Ts = map fastype_of ss;
   739         val Ts = map fastype_of args;
       
   740         val min_algT = Library.foldr (op -->) (Ts, T);
   733         val min_algT = Library.foldr (op -->) (Ts, T);
   741       in
   734       in
   742         Term.list_comb (Const (nth min_algs (i - 1), min_algT), args)
   735         Term.list_comb (Const (nth min_algs (i - 1), min_algT), ss)
   743       end;
   736       end;
   744 
   737 
   745     val (alg_min_alg_thm, card_of_min_alg_thms, least_min_alg_thms, mor_incl_min_alg_thm) =
   738     val (alg_min_alg_thm, card_of_min_alg_thms, least_min_alg_thms, mor_incl_min_alg_thm) =
   746       let
   739       let
   747         val min_algs = map (mk_min_alg As ss) ks;
   740         val min_algs = map (mk_min_alg ss) ks;
   748 
   741 
   749         val goal = fold_rev Logic.all (As @ ss) (HOLogic.mk_Trueprop (mk_alg As min_algs ss));
   742         val goal = fold_rev Logic.all ss (HOLogic.mk_Trueprop (mk_alg min_algs ss));
   750         val alg_min_alg = Goal.prove_sorry lthy [] [] goal
   743         val alg_min_alg = Goal.prove_sorry lthy [] [] goal
   751           (K (mk_alg_min_alg_tac m alg_def min_alg_defs suc_bd_limit_thm sum_Cinfinite
   744           (K (mk_alg_min_alg_tac m alg_def min_alg_defs suc_bd_limit_thm sum_Cinfinite
   752             set_bd_sumss min_algs_thms min_algs_mono_thms))
   745             set_bd_sumss min_algs_thms min_algs_mono_thms))
   753           |> Thm.close_derivation;
   746           |> Thm.close_derivation;
   754 
   747 
   755         val Asuc_bd = mk_Asuc_bd As;
       
   756         fun mk_card_of_thm min_alg def = Goal.prove_sorry lthy [] []
   748         fun mk_card_of_thm min_alg def = Goal.prove_sorry lthy [] []
   757           (fold_rev Logic.all (As @ ss)
   749           (fold_rev Logic.all ss
   758             (HOLogic.mk_Trueprop (mk_ordLeq (mk_card_of min_alg) Asuc_bd)))
   750             (HOLogic.mk_Trueprop (mk_ordLeq (mk_card_of min_alg) Asuc_bd)))
   759           (K (mk_card_of_min_alg_tac def card_of_min_algs_thm
   751           (K (mk_card_of_min_alg_tac def card_of_min_algs_thm
   760             suc_bd_Card_order suc_bd_Asuc_bd Asuc_bd_Cinfinite))
   752             suc_bd_Card_order suc_bd_Asuc_bd Asuc_bd_Cinfinite))
   761           |> Thm.close_derivation;
   753           |> Thm.close_derivation;
   762 
   754 
   763         val least_prem = HOLogic.mk_Trueprop (mk_alg As Bs ss);
   755         val least_prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
   764         fun mk_least_thm min_alg B def = Goal.prove_sorry lthy [] []
   756         fun mk_least_thm min_alg B def = Goal.prove_sorry lthy [] []
   765           (fold_rev Logic.all (As @ Bs @ ss)
   757           (fold_rev Logic.all (Bs @ ss)
   766             (Logic.mk_implies (least_prem, HOLogic.mk_Trueprop (mk_leq min_alg B))))
   758             (Logic.mk_implies (least_prem, HOLogic.mk_Trueprop (mk_leq min_alg B))))
   767           (K (mk_least_min_alg_tac def least_min_algs_thm))
   759           (K (mk_least_min_alg_tac def least_min_algs_thm))
   768           |> Thm.close_derivation;
   760           |> Thm.close_derivation;
   769 
   761 
   770         val leasts = map3 mk_least_thm min_algs Bs min_alg_defs;
   762         val leasts = map3 mk_least_thm min_algs Bs min_alg_defs;
   771 
   763 
   772         val incl_prem = HOLogic.mk_Trueprop (mk_alg passive_UNIVs Bs ss);
   764         val incl_prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
   773         val incl_min_algs = map (mk_min_alg passive_UNIVs ss) ks;
   765         val incl_min_algs = map (mk_min_alg ss) ks;
   774         val incl = Goal.prove_sorry lthy [] []
   766         val incl = Goal.prove_sorry lthy [] []
   775           (fold_rev Logic.all (Bs @ ss)
   767           (fold_rev Logic.all (Bs @ ss)
   776             (Logic.mk_implies (incl_prem,
   768             (Logic.mk_implies (incl_prem,
   777               HOLogic.mk_Trueprop (mk_mor incl_min_algs ss Bs ss active_ids))))
   769               HOLogic.mk_Trueprop (mk_mor incl_min_algs ss Bs ss active_ids))))
   778           (K (EVERY' (rtac mor_incl_thm :: map etac leasts) 1))
   770           (K (EVERY' (rtac mor_incl_thm :: map etac leasts) 1))
   810       ||>> mk_Frees "P" (replicate n (mk_pred1T initT));
   802       ||>> mk_Frees "P" (replicate n (mk_pred1T initT));
   811 
   803 
   812     val II = HOLogic.mk_Collect (fst iidx', IIT, list_exists_free (II_Bs @ II_ss)
   804     val II = HOLogic.mk_Collect (fst iidx', IIT, list_exists_free (II_Bs @ II_ss)
   813       (HOLogic.mk_conj (HOLogic.mk_eq (iidx,
   805       (HOLogic.mk_conj (HOLogic.mk_eq (iidx,
   814         Abs_IIT $ (HOLogic.mk_prod (HOLogic.mk_tuple II_Bs, HOLogic.mk_tuple II_ss))),
   806         Abs_IIT $ (HOLogic.mk_prod (HOLogic.mk_tuple II_Bs, HOLogic.mk_tuple II_ss))),
   815         mk_alg passive_UNIVs II_Bs II_ss)));
   807         mk_alg II_Bs II_ss)));
   816 
   808 
   817     val select_Bs = map (mk_nthN n (HOLogic.mk_fst (Rep_IIT $ iidx))) ks;
   809     val select_Bs = map (mk_nthN n (HOLogic.mk_fst (Rep_IIT $ iidx))) ks;
   818     val select_ss = map (mk_nthN n (HOLogic.mk_snd (Rep_IIT $ iidx))) ks;
   810     val select_ss = map (mk_nthN n (HOLogic.mk_snd (Rep_IIT $ iidx))) ks;
   819 
   811 
   820     val str_init_binds = mk_internal_bs str_initN;
   812     val str_init_binds = mk_internal_bs str_initN;
   847         str_init_frees;
   839         str_init_frees;
   848 
   840 
   849     val str_init_defs = map (fn def =>
   841     val str_init_defs = map (fn def =>
   850       mk_unabs_def 2 (Morphism.thm phi def RS meta_eq_to_obj_eq)) str_init_def_frees;
   842       mk_unabs_def 2 (Morphism.thm phi def RS meta_eq_to_obj_eq)) str_init_def_frees;
   851 
   843 
   852     val car_inits = map (mk_min_alg passive_UNIVs str_inits) ks;
   844     val car_inits = map (mk_min_alg str_inits) ks;
   853 
   845 
   854     (*TODO: replace with instantiate? (problem: figure out right type instantiation)*)
   846     (*TODO: replace with instantiate? (problem: figure out right type instantiation)*)
   855     val alg_init_thm = Goal.prove_sorry lthy [] []
   847     val alg_init_thm = Goal.prove_sorry lthy [] []
   856       (HOLogic.mk_Trueprop (mk_alg passive_UNIVs car_inits str_inits))
   848       (HOLogic.mk_Trueprop (mk_alg car_inits str_inits))
   857       (K (rtac alg_min_alg_thm 1))
   849       (K (rtac alg_min_alg_thm 1))
   858       |> Thm.close_derivation;
   850       |> Thm.close_derivation;
   859 
   851 
   860     val alg_select_thm = Goal.prove_sorry lthy [] []
   852     val alg_select_thm = Goal.prove_sorry lthy [] []
   861       (HOLogic.mk_Trueprop (mk_Ball II
   853       (HOLogic.mk_Trueprop (mk_Ball II
   862         (Term.absfree iidx' (mk_alg passive_UNIVs select_Bs select_ss))))
   854         (Term.absfree iidx' (mk_alg select_Bs select_ss))))
   863       (fn {context = ctxt, prems = _} => mk_alg_select_tac ctxt Abs_IIT_inverse_thm)
   855       (fn {context = ctxt, prems = _} => mk_alg_select_tac ctxt Abs_IIT_inverse_thm)
   864       |> Thm.close_derivation;
   856       |> Thm.close_derivation;
   865 
   857 
   866     val mor_select_thm =
   858     val mor_select_thm =
   867       let
   859       let
   868         val alg_prem = HOLogic.mk_Trueprop (mk_alg passive_UNIVs Bs ss);
   860         val alg_prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
   869         val i_prem = HOLogic.mk_Trueprop (HOLogic.mk_mem (iidx, II));
   861         val i_prem = HOLogic.mk_Trueprop (HOLogic.mk_mem (iidx, II));
   870         val mor_prem = HOLogic.mk_Trueprop (mk_mor select_Bs select_ss Bs ss Asuc_fs);
   862         val mor_prem = HOLogic.mk_Trueprop (mk_mor select_Bs select_ss Bs ss Asuc_fs);
   871         val prems = [alg_prem, i_prem, mor_prem];
   863         val prems = [alg_prem, i_prem, mor_prem];
   872         val concl = HOLogic.mk_Trueprop
   864         val concl = HOLogic.mk_Trueprop
   873           (mk_mor car_inits str_inits Bs ss
   865           (mk_mor car_inits str_inits Bs ss
   880         |> Thm.close_derivation
   872         |> Thm.close_derivation
   881       end;
   873       end;
   882 
   874 
   883     val (init_ex_mor_thm, init_unique_mor_thms) =
   875     val (init_ex_mor_thm, init_unique_mor_thms) =
   884       let
   876       let
   885         val prem = HOLogic.mk_Trueprop (mk_alg passive_UNIVs Bs ss);
   877         val prem = HOLogic.mk_Trueprop (mk_alg Bs ss);
   886         val concl = HOLogic.mk_Trueprop
   878         val concl = HOLogic.mk_Trueprop
   887           (list_exists_free init_fs (mk_mor car_inits str_inits Bs ss init_fs));
   879           (list_exists_free init_fs (mk_mor car_inits str_inits Bs ss init_fs));
   888         val ex_mor = Goal.prove_sorry lthy [] []
   880         val ex_mor = Goal.prove_sorry lthy [] []
   889           (fold_rev Logic.all (Bs @ ss) (Logic.mk_implies (prem, concl)))
   881           (fold_rev Logic.all (Bs @ ss) (Logic.mk_implies (prem, concl)))
   890           (fn {context = ctxt, prems = _} => mk_init_ex_mor_tac ctxt Abs_IIT_inverse_thm
   882           (fn {context = ctxt, prems = _} => mk_init_ex_mor_tac ctxt Abs_IIT_inverse_thm