src/HOL/BNF/Tools/bnf_lfp.ML
changeset 49541 32fb6e4c7f4b
parent 49538 c90818b63599
child 49542 b39354db8629
equal deleted inserted replaced
49540:b1bdbb099f99 49541:32fb6e4c7f4b
  1392         val f1s_maps = map (mk_map Ts f1s YTs Yctors (mk_passive_maps passiveAs passiveYs)) ks;
  1392         val f1s_maps = map (mk_map Ts f1s YTs Yctors (mk_passive_maps passiveAs passiveYs)) ks;
  1393         val f2s_maps = map (mk_map Ts' f2s YTs Yctors (mk_passive_maps passiveBs passiveYs)) ks;
  1393         val f2s_maps = map (mk_map Ts' f2s YTs Yctors (mk_passive_maps passiveBs passiveYs)) ks;
  1394         val p1s_maps = map (mk_map XTs p1s Ts ctors (mk_passive_maps passiveXs passiveAs)) ks;
  1394         val p1s_maps = map (mk_map XTs p1s Ts ctors (mk_passive_maps passiveXs passiveAs)) ks;
  1395         val p2s_maps = map (mk_map XTs p2s Ts' ctor's (mk_passive_maps passiveXs passiveBs)) ks;
  1395         val p2s_maps = map (mk_map XTs p2s Ts' ctor's (mk_passive_maps passiveXs passiveBs)) ks;
  1396 
  1396 
  1397         val map_simp_thms =
  1397         val ctor_map_thms =
  1398           let
  1398           let
  1399             fun mk_goal fs_map map ctor ctor' = fold_rev Logic.all fs
  1399             fun mk_goal fs_map map ctor ctor' = fold_rev Logic.all fs
  1400               (mk_Trueprop_eq (HOLogic.mk_comp (fs_map, ctor),
  1400               (mk_Trueprop_eq (HOLogic.mk_comp (fs_map, ctor),
  1401                 HOLogic.mk_comp (ctor', Term.list_comb (map, fs @ fs_maps))));
  1401                 HOLogic.mk_comp (ctor', Term.list_comb (map, fs @ fs_maps))));
  1402             val goals = map4 mk_goal fs_maps map_FTFT's ctors ctor's;
  1402             val goals = map4 mk_goal fs_maps map_FTFT's ctors ctor's;
  1518               map3 (fn f => fn sets => fn sets' =>
  1518               map3 (fn f => fn sets => fn sets' =>
  1519                 HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj
  1519                 HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj
  1520                   (map4 (mk_set_natural f) fs_maps Izs sets sets')))
  1520                   (map4 (mk_set_natural f) fs_maps Izs sets sets')))
  1521                   fs setss_by_range setss_by_range';
  1521                   fs setss_by_range setss_by_range';
  1522 
  1522 
  1523             fun mk_tac induct = mk_set_nat_tac m (rtac induct) set_natural'ss map_simp_thms;
  1523             fun mk_tac induct = mk_set_nat_tac m (rtac induct) set_natural'ss ctor_map_thms;
  1524             val thms =
  1524             val thms =
  1525               map5 (fn goal => fn csets => fn set_simps => fn induct => fn i =>
  1525               map5 (fn goal => fn csets => fn set_simps => fn induct => fn i =>
  1526                 singleton (Proof_Context.export names_lthy lthy)
  1526                 singleton (Proof_Context.export names_lthy lthy)
  1527                   (Skip_Proof.prove lthy [] [] goal (mk_tac induct csets set_simps i))
  1527                   (Skip_Proof.prove lthy [] [] goal (mk_tac induct csets set_simps i))
  1528                 |> Thm.close_derivation)
  1528                 |> Thm.close_derivation)
  1579               HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj
  1579               HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj
  1580                 (map4 mk_map_cong setss_by_bnf Izs fs_maps fs_copy_maps));
  1580                 (map4 mk_map_cong setss_by_bnf Izs fs_maps fs_copy_maps));
  1581 
  1581 
  1582             val thm = singleton (Proof_Context.export names_lthy lthy)
  1582             val thm = singleton (Proof_Context.export names_lthy lthy)
  1583               (Skip_Proof.prove lthy [] [] goal
  1583               (Skip_Proof.prove lthy [] [] goal
  1584               (mk_mcong_tac (rtac induct) Fset_set_thmsss map_congs map_simp_thms))
  1584               (mk_mcong_tac (rtac induct) Fset_set_thmsss map_congs ctor_map_thms))
  1585               |> Thm.close_derivation;
  1585               |> Thm.close_derivation;
  1586           in
  1586           in
  1587             split_conj_thm thm
  1587             split_conj_thm thm
  1588           end;
  1588           end;
  1589 
  1589 
  1648                 (map8 mk_wpull AXs B1s B2s f1s f2s (replicate m NONE) p1s p2s),
  1648                 (map8 mk_wpull AXs B1s B2s f1s f2s (replicate m NONE) p1s p2s),
  1649               HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj goals));
  1649               HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj goals));
  1650 
  1650 
  1651             val thm = singleton (Proof_Context.export names_lthy lthy)
  1651             val thm = singleton (Proof_Context.export names_lthy lthy)
  1652               (Skip_Proof.prove lthy [] [] goal
  1652               (Skip_Proof.prove lthy [] [] goal
  1653               (K (mk_lfp_map_wpull_tac m (rtac induct) map_wpulls map_simp_thms
  1653               (K (mk_lfp_map_wpull_tac m (rtac induct) map_wpulls ctor_map_thms
  1654                 (transpose set_simp_thmss) Fset_set_thmsss ctor_inject_thms)))
  1654                 (transpose set_simp_thmss) Fset_set_thmsss ctor_inject_thms)))
  1655               |> Thm.close_derivation;
  1655               |> Thm.close_derivation;
  1656           in
  1656           in
  1657             split_conj_thm thm
  1657             split_conj_thm thm
  1658           end;
  1658           end;
  1659 
  1659 
  1660         val timer = time (timer "helpers for BNF properties");
  1660         val timer = time (timer "helpers for BNF properties");
  1661 
  1661 
  1662         val map_id_tacs = map (K o mk_map_id_tac map_ids) map_unique_thms;
  1662         val map_id_tacs = map (K o mk_map_id_tac map_ids) map_unique_thms;
  1663         val map_comp_tacs =
  1663         val map_comp_tacs =
  1664           map2 (K oo mk_map_comp_tac map_comp's map_simp_thms) map_unique_thms ks;
  1664           map2 (K oo mk_map_comp_tac map_comp's ctor_map_thms) map_unique_thms ks;
  1665         val map_cong_tacs = map (mk_map_cong_tac m) map_cong_thms;
  1665         val map_cong_tacs = map (mk_map_cong_tac m) map_cong_thms;
  1666         val set_nat_tacss = map (map (K o mk_set_natural_tac)) (transpose set_natural_thmss);
  1666         val set_nat_tacss = map (map (K o mk_set_natural_tac)) (transpose set_natural_thmss);
  1667         val bd_co_tacs = replicate n (K (mk_bd_card_order_tac bd_card_orders));
  1667         val bd_co_tacs = replicate n (K (mk_bd_card_order_tac bd_card_orders));
  1668         val bd_cinf_tacs = replicate n (K (rtac (bd_Cinfinite RS conjunct1) 1));
  1668         val bd_cinf_tacs = replicate n (K (rtac (bd_Cinfinite RS conjunct1) 1));
  1669         val set_bd_tacss = map (map (fn thm => K (rtac thm 1))) (transpose set_bd_thmss);
  1669         val set_bd_tacss = map (map (fn thm => K (rtac thm 1))) (transpose set_bd_thmss);
  1734         val Isrel_defs = map srel_def_of_bnf Ibnfs;
  1734         val Isrel_defs = map srel_def_of_bnf Ibnfs;
  1735         val Irel_defs = map rel_def_of_bnf Ibnfs;
  1735         val Irel_defs = map rel_def_of_bnf Ibnfs;
  1736 
  1736 
  1737         val set_incl_thmss = map (map (fold_sets o hd)) Fset_set_thmsss;
  1737         val set_incl_thmss = map (map (fold_sets o hd)) Fset_set_thmsss;
  1738         val set_set_incl_thmsss = map (transpose o map (map fold_sets o tl)) Fset_set_thmsss;
  1738         val set_set_incl_thmsss = map (transpose o map (map fold_sets o tl)) Fset_set_thmsss;
  1739         val folded_map_simp_thms = map fold_maps map_simp_thms;
  1739         val folded_ctor_map_thms = map fold_maps ctor_map_thms;
  1740         val folded_set_simp_thmss = map (map fold_sets) set_simp_thmss;
  1740         val folded_set_simp_thmss = map (map fold_sets) set_simp_thmss;
  1741         val folded_set_simp_thmss' = transpose folded_set_simp_thmss;
  1741         val folded_set_simp_thmss' = transpose folded_set_simp_thmss;
  1742 
  1742 
  1743         val ctor_Isrel_thms =
  1743         val ctor_Isrel_thms =
  1744           let
  1744           let
  1746               (mk_Trueprop_eq (HOLogic.mk_mem (HOLogic.mk_prod (ctor $ xF, ctor' $ yF), IsrelR),
  1746               (mk_Trueprop_eq (HOLogic.mk_mem (HOLogic.mk_prod (ctor $ xF, ctor' $ yF), IsrelR),
  1747                   HOLogic.mk_mem (HOLogic.mk_prod (xF, yF), srelR)));
  1747                   HOLogic.mk_mem (HOLogic.mk_prod (xF, yF), srelR)));
  1748             val goals = map6 mk_goal xFs yFs ctors ctor's IsrelRs srelRs;
  1748             val goals = map6 mk_goal xFs yFs ctors ctor's IsrelRs srelRs;
  1749           in
  1749           in
  1750             map12 (fn i => fn goal => fn in_srel => fn map_comp => fn map_cong =>
  1750             map12 (fn i => fn goal => fn in_srel => fn map_comp => fn map_cong =>
  1751               fn map_simp => fn set_simps => fn ctor_inject => fn ctor_dtor =>
  1751               fn ctor_map => fn set_simps => fn ctor_inject => fn ctor_dtor =>
  1752               fn set_naturals => fn set_incls => fn set_set_inclss =>
  1752               fn set_naturals => fn set_incls => fn set_set_inclss =>
  1753               Skip_Proof.prove lthy [] [] goal
  1753               Skip_Proof.prove lthy [] [] goal
  1754                (K (mk_ctor_srel_tac in_Isrels i in_srel map_comp map_cong map_simp set_simps
  1754                (K (mk_ctor_srel_tac in_Isrels i in_srel map_comp map_cong ctor_map set_simps
  1755                  ctor_inject ctor_dtor set_naturals set_incls set_set_inclss))
  1755                  ctor_inject ctor_dtor set_naturals set_incls set_set_inclss))
  1756               |> Thm.close_derivation)
  1756               |> Thm.close_derivation)
  1757             ks goals in_srels map_comp's map_congs folded_map_simp_thms folded_set_simp_thmss'
  1757             ks goals in_srels map_comp's map_congs folded_ctor_map_thms folded_set_simp_thmss'
  1758               ctor_inject_thms ctor_dtor_thms set_natural'ss set_incl_thmss set_set_incl_thmsss
  1758               ctor_inject_thms ctor_dtor_thms set_natural'ss set_incl_thmss set_set_incl_thmsss
  1759           end;
  1759           end;
  1760 
  1760 
  1761         val ctor_Irel_thms =
  1761         val ctor_Irel_thms =
  1762           let
  1762           let
  1779           [(map_uniqueN, [fold_maps map_unique_thm])]
  1779           [(map_uniqueN, [fold_maps map_unique_thm])]
  1780           |> map (fn (thmN, thms) =>
  1780           |> map (fn (thmN, thms) =>
  1781             ((Binding.qualify true (Binding.name_of b) (Binding.name thmN), []), [(thms, [])]));
  1781             ((Binding.qualify true (Binding.name_of b) (Binding.name thmN), []), [(thms, [])]));
  1782 
  1782 
  1783         val Ibnf_notes =
  1783         val Ibnf_notes =
  1784           [(ctor_relN, map single ctor_Irel_thms),
  1784           [(ctor_mapN, map single folded_ctor_map_thms),
       
  1785           (ctor_relN, map single ctor_Irel_thms),
  1785           (ctor_srelN, map single ctor_Isrel_thms),
  1786           (ctor_srelN, map single ctor_Isrel_thms),
  1786           (map_simpsN, map single folded_map_simp_thms),
       
  1787           (set_inclN, set_incl_thmss),
  1787           (set_inclN, set_incl_thmss),
  1788           (set_set_inclN, map flat set_set_incl_thmsss)] @
  1788           (set_set_inclN, map flat set_set_incl_thmsss)] @
  1789           map2 (fn i => fn thms => (mk_set_simpsN i, map single thms)) ls' folded_set_simp_thmss
  1789           map2 (fn i => fn thms => (mk_set_simpsN i, map single thms)) ls' folded_set_simp_thmss
  1790           |> maps (fn (thmN, thmss) =>
  1790           |> maps (fn (thmN, thmss) =>
  1791             map2 (fn b => fn thms =>
  1791             map2 (fn b => fn thms =>