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