src/HOL/BNF/Tools/bnf_lfp.ML
changeset 51893 596baae88a88
parent 51869 d58cd7673b04
child 51894 7c43b8df0f5d
equal deleted inserted replaced
51892:e5432ec161ff 51893:596baae88a88
   252       end;
   252       end;
   253 
   253 
   254     val alg_set_thms =
   254     val alg_set_thms =
   255       let
   255       let
   256         val alg_prem = HOLogic.mk_Trueprop (mk_alg As Bs ss);
   256         val alg_prem = HOLogic.mk_Trueprop (mk_alg As Bs ss);
   257         fun mk_prem x set B = HOLogic.mk_Trueprop (mk_subset (set $ x) B);
   257         fun mk_prem x set B = HOLogic.mk_Trueprop (mk_leq (set $ x) B);
   258         fun mk_concl s x B = HOLogic.mk_Trueprop (HOLogic.mk_mem (s $ x, B));
   258         fun mk_concl s x B = HOLogic.mk_Trueprop (HOLogic.mk_mem (s $ x, B));
   259         val premss = map2 ((fn x => fn sets =>  map2 (mk_prem x) sets (As @ Bs))) xFs setssAs;
   259         val premss = map2 ((fn x => fn sets =>  map2 (mk_prem x) sets (As @ Bs))) xFs setssAs;
   260         val concls = map3 mk_concl ss xFs Bs;
   260         val concls = map3 mk_concl ss xFs Bs;
   261         val goals = map3 (fn x => fn prems => fn concl =>
   261         val goals = map3 (fn x => fn prems => fn concl =>
   262           fold_rev Logic.all (x :: As @ Bs @ ss)
   262           fold_rev Logic.all (x :: As @ Bs @ ss)
   347 
   347 
   348     val (mor_image_thms, morE_thms) =
   348     val (mor_image_thms, morE_thms) =
   349       let
   349       let
   350         val prem = HOLogic.mk_Trueprop (mk_mor Bs ss B's s's fs);
   350         val prem = HOLogic.mk_Trueprop (mk_mor Bs ss B's s's fs);
   351         fun mk_image_goal f B1 B2 = fold_rev Logic.all (Bs @ ss @ B's @ s's @ fs)
   351         fun mk_image_goal f B1 B2 = fold_rev Logic.all (Bs @ ss @ B's @ s's @ fs)
   352           (Logic.mk_implies (prem, HOLogic.mk_Trueprop (mk_subset (mk_image f $ B1) B2)));
   352           (Logic.mk_implies (prem, HOLogic.mk_Trueprop (mk_leq (mk_image f $ B1) B2)));
   353         val image_goals = map3 mk_image_goal fs Bs B's;
   353         val image_goals = map3 mk_image_goal fs Bs B's;
   354         fun mk_elim_prem sets x T = HOLogic.mk_Trueprop
   354         fun mk_elim_prem sets x T = HOLogic.mk_Trueprop
   355           (HOLogic.mk_mem (x, mk_in (passive_UNIVs @ Bs) sets T));
   355           (HOLogic.mk_mem (x, mk_in (passive_UNIVs @ Bs) sets T));
   356         fun mk_elim_goal sets mapAsBs f s s' x T =
   356         fun mk_elim_goal sets mapAsBs f s s' x T =
   357           fold_rev Logic.all (x :: Bs @ ss @ B's @ s's @ fs)
   357           fold_rev Logic.all (x :: Bs @ ss @ B's @ s's @ fs)
   364         (map prove image_goals, map prove elim_goals)
   364         (map prove image_goals, map prove elim_goals)
   365       end;
   365       end;
   366 
   366 
   367     val mor_incl_thm =
   367     val mor_incl_thm =
   368       let
   368       let
   369         val prems = map2 (HOLogic.mk_Trueprop oo mk_subset) Bs Bs_copy;
   369         val prems = map2 (HOLogic.mk_Trueprop oo mk_leq) Bs Bs_copy;
   370         val concl = HOLogic.mk_Trueprop (mk_mor Bs ss Bs_copy ss active_ids);
   370         val concl = HOLogic.mk_Trueprop (mk_mor Bs ss Bs_copy ss active_ids);
   371       in
   371       in
   372         Goal.prove_sorry lthy [] []
   372         Goal.prove_sorry lthy [] []
   373           (fold_rev Logic.all (Bs @ ss @ Bs_copy) (Logic.list_implies (prems, concl)))
   373           (fold_rev Logic.all (Bs @ ss @ Bs_copy) (Logic.list_implies (prems, concl)))
   374           (K (mk_mor_incl_tac mor_def map_id's))
   374           (K (mk_mor_incl_tac mor_def map_id's))
   390         |> Thm.close_derivation
   390         |> Thm.close_derivation
   391       end;
   391       end;
   392 
   392 
   393     val mor_inv_thm =
   393     val mor_inv_thm =
   394       let
   394       let
   395         fun mk_inv_prem f inv_f B B' = HOLogic.mk_conj (mk_subset (mk_image inv_f $ B') B,
   395         fun mk_inv_prem f inv_f B B' = HOLogic.mk_conj (mk_leq (mk_image inv_f $ B') B,
   396           HOLogic.mk_conj (mk_inver inv_f f B, mk_inver f inv_f B'));
   396           HOLogic.mk_conj (mk_inver inv_f f B, mk_inver f inv_f B'));
   397         val prems = map HOLogic.mk_Trueprop
   397         val prems = map HOLogic.mk_Trueprop
   398           ([mk_mor Bs ss B's s's fs,
   398           ([mk_mor Bs ss B's s's fs,
   399           mk_alg passive_UNIVs Bs ss,
   399           mk_alg passive_UNIVs Bs ss,
   400           mk_alg passive_UNIVs B's s's] @
   400           mk_alg passive_UNIVs B's s's] @
   670               sum_Card_order sum_Cnotzero suc_bd_Card_order suc_bd_Cinfinite suc_bd_Cnotzero
   670               sum_Card_order sum_Cnotzero suc_bd_Card_order suc_bd_Cinfinite suc_bd_Cnotzero
   671               suc_bd_Asuc_bd Asuc_bd_Cinfinite)))
   671               suc_bd_Asuc_bd Asuc_bd_Cinfinite)))
   672           |> Thm.close_derivation;
   672           |> Thm.close_derivation;
   673 
   673 
   674         val least_prem = HOLogic.mk_Trueprop (mk_alg As Bs ss);
   674         val least_prem = HOLogic.mk_Trueprop (mk_alg As Bs ss);
   675         val least_conjunction = Library.foldr1 HOLogic.mk_conj (map2 mk_subset min_algss Bs);
   675         val least_conjunction = Library.foldr1 HOLogic.mk_conj (map2 mk_leq min_algss Bs);
   676         val least_cT = certifyT lthy suc_bdT;
   676         val least_cT = certifyT lthy suc_bdT;
   677         val least_ct = certify lthy (Term.absfree idx' least_conjunction);
   677         val least_ct = certify lthy (Term.absfree idx' least_conjunction);
   678 
   678 
   679         val least = singleton (Proof_Context.export names_lthy lthy)
   679         val least = singleton (Proof_Context.export names_lthy lthy)
   680           (Goal.prove_sorry lthy [] []
   680           (Goal.prove_sorry lthy [] []
   746           |> Thm.close_derivation;
   746           |> Thm.close_derivation;
   747 
   747 
   748         val least_prem = HOLogic.mk_Trueprop (mk_alg As Bs ss);
   748         val least_prem = HOLogic.mk_Trueprop (mk_alg As Bs ss);
   749         fun mk_least_thm min_alg B def = Goal.prove_sorry lthy [] []
   749         fun mk_least_thm min_alg B def = Goal.prove_sorry lthy [] []
   750           (fold_rev Logic.all (As @ Bs @ ss)
   750           (fold_rev Logic.all (As @ Bs @ ss)
   751             (Logic.mk_implies (least_prem, HOLogic.mk_Trueprop (mk_subset min_alg B))))
   751             (Logic.mk_implies (least_prem, HOLogic.mk_Trueprop (mk_leq min_alg B))))
   752           (K (mk_least_min_alg_tac def least_min_algs_thm))
   752           (K (mk_least_min_alg_tac def least_min_algs_thm))
   753           |> Thm.close_derivation;
   753           |> Thm.close_derivation;
   754 
   754 
   755         val leasts = map3 mk_least_thm min_algs Bs min_alg_defs;
   755         val leasts = map3 mk_least_thm min_algs Bs min_alg_defs;
   756 
   756 
  1693         val set_bd_tacss = map (map (fn thm => K (rtac thm 1))) (transpose set_bd_thmss);
  1693         val set_bd_tacss = map (map (fn thm => K (rtac thm 1))) (transpose set_bd_thmss);
  1694         val in_bd_tacs = map2 (K oo mk_in_bd_tac sum_Card_order suc_bd_Cnotzero)
  1694         val in_bd_tacs = map2 (K oo mk_in_bd_tac sum_Card_order suc_bd_Cnotzero)
  1695           in_incl_min_alg_thms card_of_min_alg_thms;
  1695           in_incl_min_alg_thms card_of_min_alg_thms;
  1696         val map_wpull_tacs = map (K o mk_wpull_tac) map_wpull_thms;
  1696         val map_wpull_tacs = map (K o mk_wpull_tac) map_wpull_thms;
  1697 
  1697 
  1698         val srel_O_Gr_tacs = replicate n (simple_srel_O_Gr_tac o #context);
  1698         val rel_OO_Grp_tacs = replicate n (K (rtac refl 1));
  1699 
  1699 
  1700         val tacss = map10 zip_axioms map_id_tacs map_comp_tacs map_cong0_tacs set_nat_tacss
  1700         val tacss = map10 zip_axioms map_id_tacs map_comp_tacs map_cong0_tacs set_nat_tacss
  1701           bd_co_tacs bd_cinf_tacs set_bd_tacss in_bd_tacs map_wpull_tacs srel_O_Gr_tacs;
  1701           bd_co_tacs bd_cinf_tacs set_bd_tacss in_bd_tacs map_wpull_tacs rel_OO_Grp_tacs;
  1702 
  1702 
  1703         val ctor_witss =
  1703         val ctor_witss =
  1704           let
  1704           let
  1705             val witss = map2 (fn Ds => fn bnf => mk_wits_of_bnf
  1705             val witss = map2 (fn Ds => fn bnf => mk_wits_of_bnf
  1706               (replicate (nwits_of_bnf bnf) Ds)
  1706               (replicate (nwits_of_bnf bnf) Ds)
  1743         val fold_sets = fold_thms lthy (maps (fn bnf =>
  1743         val fold_sets = fold_thms lthy (maps (fn bnf =>
  1744           map (fn thm => thm RS meta_eq_to_obj_eq) (set_defs_of_bnf bnf)) Ibnfs);
  1744           map (fn thm => thm RS meta_eq_to_obj_eq) (set_defs_of_bnf bnf)) Ibnfs);
  1745 
  1745 
  1746         val timer = time (timer "registered new datatypes as BNFs");
  1746         val timer = time (timer "registered new datatypes as BNFs");
  1747 
  1747 
  1748         val srels = map2 (fn Ds => mk_srel_of_bnf Ds (passiveAs @ Ts) (passiveBs @ Ts')) Dss bnfs;
       
  1749         val Isrels = map (mk_srel_of_bnf deads passiveAs passiveBs) Ibnfs;
       
  1750         val rels = map2 (fn Ds => mk_rel_of_bnf Ds (passiveAs @ Ts) (passiveBs @ Ts')) Dss bnfs;
  1748         val rels = map2 (fn Ds => mk_rel_of_bnf Ds (passiveAs @ Ts) (passiveBs @ Ts')) Dss bnfs;
  1751         val Irels = map (mk_rel_of_bnf deads passiveAs passiveBs) Ibnfs;
  1749         val Irels = map (mk_rel_of_bnf deads passiveAs passiveBs) Ibnfs;
  1752 
  1750 
  1753         val IsrelRs = map (fn Isrel => Term.list_comb (Isrel, IRs)) Isrels;
  1751         val Irelphis = map (fn Irel => Term.list_comb (Irel, Iphis)) Irels;
  1754         val srelRs = map (fn srel => Term.list_comb (srel, IRs @ IsrelRs)) srels;
  1752         val relphis = map (fn rel => Term.list_comb (rel, Iphis @ Irelphis)) rels;
  1755         val Irelphis = map (fn Isrel => Term.list_comb (Isrel, Iphis)) Irels;
  1753 
  1756         val relphis = map (fn srel => Term.list_comb (srel, Iphis @ Irelphis)) rels;
  1754         val in_rels = map in_rel_of_bnf bnfs;
  1757 
  1755         val in_Irels = map in_rel_of_bnf Ibnfs;
  1758         val in_srels = map in_srel_of_bnf bnfs;
  1756         val rel_defs = map rel_def_of_bnf bnfs;
  1759         val in_Isrels = map in_srel_of_bnf Ibnfs;
       
  1760         val srel_defs = map srel_def_of_bnf bnfs;
       
  1761         val Isrel_defs = map srel_def_of_bnf Ibnfs;
       
  1762         val Irel_defs = map rel_def_of_bnf Ibnfs;
  1757         val Irel_defs = map rel_def_of_bnf Ibnfs;
  1763 
  1758 
  1764         val ctor_set_incl_thmss = map (map (fold_sets o hd)) Fset_set_thmsss;
  1759         val ctor_set_incl_thmss = map (map (fold_sets o hd)) Fset_set_thmsss;
  1765         val ctor_set_set_incl_thmsss = map (transpose o map (map fold_sets o tl)) Fset_set_thmsss;
  1760         val ctor_set_set_incl_thmsss = map (transpose o map (map fold_sets o tl)) Fset_set_thmsss;
  1766         val folded_ctor_map_thms = map fold_maps ctor_map_thms;
  1761         val folded_ctor_map_thms = map fold_maps ctor_map_thms;
  1767         val folded_ctor_set_thmss = map (map fold_sets) ctor_set_thmss;
  1762         val folded_ctor_set_thmss = map (map fold_sets) ctor_set_thmss;
  1768         val folded_ctor_set_thmss' = transpose folded_ctor_set_thmss;
  1763         val folded_ctor_set_thmss' = transpose folded_ctor_set_thmss;
  1769 
  1764 
  1770         val ctor_Isrel_thms =
  1765         val ctor_Irel_thms =
  1771           let
  1766           let
  1772             fun mk_goal xF yF ctor ctor' IsrelR srelR = fold_rev Logic.all (xF :: yF :: IRs)
  1767             fun mk_goal xF yF ctor ctor' Irelphi relphi = fold_rev Logic.all (xF :: yF :: Iphis)
  1773               (mk_Trueprop_eq (HOLogic.mk_mem (HOLogic.mk_prod (ctor $ xF, ctor' $ yF), IsrelR),
  1768               (mk_Trueprop_eq (Irelphi $ (ctor $ xF) $ (ctor' $ yF), relphi $ xF $ yF));
  1774                   HOLogic.mk_mem (HOLogic.mk_prod (xF, yF), srelR)));
  1769             val goals = map6 mk_goal xFs yFs ctors ctor's Irelphis relphis;
  1775             val goals = map6 mk_goal xFs yFs ctors ctor's IsrelRs srelRs;
       
  1776           in
  1770           in
  1777             map12 (fn i => fn goal => fn in_srel => fn map_comp => fn map_cong0 =>
  1771             map12 (fn i => fn goal => fn in_rel => fn map_comp => fn map_cong0 =>
  1778               fn ctor_map => fn ctor_sets => fn ctor_inject => fn ctor_dtor =>
  1772               fn ctor_map => fn ctor_sets => fn ctor_inject => fn ctor_dtor =>
  1779               fn set_maps => fn ctor_set_incls => fn ctor_set_set_inclss =>
  1773               fn set_maps => fn ctor_set_incls => fn ctor_set_set_inclss =>
  1780               Goal.prove_sorry lthy [] [] goal
  1774               Goal.prove_sorry lthy [] [] goal
  1781                (K (mk_ctor_srel_tac lthy in_Isrels i in_srel map_comp map_cong0 ctor_map ctor_sets
  1775                (K (mk_ctor_rel_tac lthy in_Irels i in_rel map_comp map_cong0 ctor_map ctor_sets
  1782                  ctor_inject ctor_dtor set_maps ctor_set_incls ctor_set_set_inclss))
  1776                  ctor_inject ctor_dtor set_maps ctor_set_incls ctor_set_set_inclss))
  1783               |> Thm.close_derivation)
  1777               |> Thm.close_derivation)
  1784             ks goals in_srels map_comp's map_cong0s folded_ctor_map_thms folded_ctor_set_thmss'
  1778             ks goals in_rels map_comp's map_cong0s folded_ctor_map_thms folded_ctor_set_thmss'
  1785               ctor_inject_thms ctor_dtor_thms set_map'ss ctor_set_incl_thmss
  1779               ctor_inject_thms ctor_dtor_thms set_map'ss ctor_set_incl_thmss
  1786               ctor_set_set_incl_thmsss
  1780               ctor_set_set_incl_thmsss
  1787           end;
       
  1788 
       
  1789         val ctor_Irel_thms =
       
  1790           let
       
  1791             fun mk_goal xF yF ctor ctor' Ipredphi predphi = fold_rev Logic.all (xF :: yF :: Iphis)
       
  1792               (mk_Trueprop_eq (Ipredphi $ (ctor $ xF) $ (ctor' $ yF), predphi $ xF $ yF));
       
  1793             val goals = map6 mk_goal xFs yFs ctors ctor's Irelphis relphis;
       
  1794           in
       
  1795             map3 (fn goal => fn srel_def => fn ctor_Isrel =>
       
  1796               Goal.prove_sorry lthy [] [] goal
       
  1797                 (mk_ctor_or_dtor_rel_tac srel_def Irel_defs Isrel_defs ctor_Isrel)
       
  1798               |> Thm.close_derivation)
       
  1799             goals srel_defs ctor_Isrel_thms
       
  1800           end;
  1781           end;
  1801 
  1782 
  1802         val timer = time (timer "additional properties");
  1783         val timer = time (timer "additional properties");
  1803 
  1784 
  1804         val ls' = if m = 1 then [0] else ls
  1785         val ls' = if m = 1 then [0] else ls
  1811         val Ibnf_notes =
  1792         val Ibnf_notes =
  1812           [(ctor_mapN, map single folded_ctor_map_thms),
  1793           [(ctor_mapN, map single folded_ctor_map_thms),
  1813           (ctor_relN, map single ctor_Irel_thms),
  1794           (ctor_relN, map single ctor_Irel_thms),
  1814           (ctor_set_inclN, ctor_set_incl_thmss),
  1795           (ctor_set_inclN, ctor_set_incl_thmss),
  1815           (ctor_set_set_inclN, map flat ctor_set_set_incl_thmsss)] @
  1796           (ctor_set_set_inclN, map flat ctor_set_set_incl_thmsss)] @
  1816           (if note_all then
       
  1817              [(ctor_srelN, map single ctor_Isrel_thms)]
       
  1818            else
       
  1819              []) @
       
  1820           map2 (fn i => fn thms => (mk_ctor_setN i, map single thms)) ls' folded_ctor_set_thmss
  1797           map2 (fn i => fn thms => (mk_ctor_setN i, map single thms)) ls' folded_ctor_set_thmss
  1821           |> maps (fn (thmN, thmss) =>
  1798           |> maps (fn (thmN, thmss) =>
  1822             map2 (fn b => fn thms =>
  1799             map2 (fn b => fn thms =>
  1823               ((Binding.qualify true (Binding.name_of b) (Binding.name thmN), []), [(thms, [])]))
  1800               ((Binding.qualify true (Binding.name_of b) (Binding.name thmN), []), [(thms, [])]))
  1824             bs thmss)
  1801             bs thmss)