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