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