101 val ctr_transferN = "ctr_transfer"; |
101 val ctr_transferN = "ctr_transfer"; |
102 val corec_codeN = "corec_code"; |
102 val corec_codeN = "corec_code"; |
103 val map_disc_iffN = "map_disc_iff"; |
103 val map_disc_iffN = "map_disc_iff"; |
104 val map_selN = "map_sel"; |
104 val map_selN = "map_sel"; |
105 val set_casesN = "set_cases"; |
105 val set_casesN = "set_cases"; |
106 val set_emptyN = "set_empty"; |
|
107 val set_introsN = "set_intros"; |
106 val set_introsN = "set_intros"; |
108 val set_inductN = "set_induct"; |
107 val set_inductN = "set_induct"; |
109 val set_selN = "set_sel"; |
108 val set_selN = "set_sel"; |
110 |
109 |
111 structure Data = Generic_Data |
110 structure Data = Generic_Data |
1427 val set0_thms = flat set0_thmss; |
1426 val set0_thms = flat set0_thmss; |
1428 val set_thms = set0_thms |
1427 val set_thms = set0_thms |
1429 |> map (unfold_thms lthy @{thms insert_is_Un[THEN sym] Un_empty_left |
1428 |> map (unfold_thms lthy @{thms insert_is_Un[THEN sym] Un_empty_left |
1430 Un_insert_left}); |
1429 Un_insert_left}); |
1431 |
1430 |
1432 val sets = map (mk_set (snd (Term.dest_Type fpT))) (sets_of_bnf fp_bnf); |
|
1433 |
|
1434 val set_empty_thms = |
|
1435 let |
|
1436 val ctr_argT_namess = map ((fn Ts => fold Term.add_tfree_namesT Ts []) o |
|
1437 binder_types o fastype_of) ctrs; |
|
1438 val setTs = map (HOLogic.dest_setT o range_type o fastype_of) sets; |
|
1439 val setT_names = map (fn T => the_single (Term.add_tfree_namesT T [])) setTs; |
|
1440 |
|
1441 fun mk_set_empty_goal disc set T = |
|
1442 Logic.mk_implies (HOLogic.mk_Trueprop (disc $ u), |
|
1443 mk_Trueprop_eq (set $ u, HOLogic.mk_set T [])); |
|
1444 |
|
1445 val goals = |
|
1446 if null discs then |
|
1447 [] |
|
1448 else |
|
1449 map_filter I (flat |
|
1450 (map2 (fn names => fn disc => |
|
1451 map3 (fn name => fn setT => fn set => |
|
1452 if member (op =) names name then NONE |
|
1453 else SOME (mk_set_empty_goal disc set setT)) |
|
1454 setT_names setTs sets) |
|
1455 ctr_argT_namess discs)); |
|
1456 in |
|
1457 if null goals then |
|
1458 [] |
|
1459 else |
|
1460 Goal.prove_sorry lthy [] [] (Logic.mk_conjunction_balanced goals) |
|
1461 (fn {context = ctxt, prems = _} => |
|
1462 mk_set_empty_tac ctxt (certify ctxt u) exhaust set0_thms (flat disc_thmss)) |
|
1463 |> Conjunction.elim_balanced (length goals) |
|
1464 |> Proof_Context.export names_lthy lthy |
|
1465 |> map Thm.close_derivation |
|
1466 end; |
|
1467 |
|
1468 val rel_infos = (ctr_defs' ~~ cxIns, ctr_defs' ~~ cyIns); |
1431 val rel_infos = (ctr_defs' ~~ cxIns, ctr_defs' ~~ cyIns); |
1469 |
1432 |
1470 fun mk_rel_thm postproc ctr_defs' cxIn cyIn = |
1433 fun mk_rel_thm postproc ctr_defs' cxIn cyIn = |
1471 fold_thms lthy ctr_defs' |
1434 fold_thms lthy ctr_defs' |
1472 (unfold_thms lthy (pre_rel_def :: abs_inverse :: |
1435 (unfold_thms lthy (pre_rel_def :: abs_inverse :: |
1536 val ctr_transfer_thms = |
1499 val ctr_transfer_thms = |
1537 let |
1500 let |
1538 val goals = mk_parametricity_goals names_lthy Rs ctrAs ctrBs; |
1501 val goals = mk_parametricity_goals names_lthy Rs ctrAs ctrBs; |
1539 in |
1502 in |
1540 Goal.prove_sorry lthy [] [] (Logic.mk_conjunction_balanced goals) |
1503 Goal.prove_sorry lthy [] [] (Logic.mk_conjunction_balanced goals) |
1541 (fn {context = ctxt, prems = _} => mk_ctr_transfer_tac rel_intro_thms) |
1504 (K (mk_ctr_transfer_tac rel_intro_thms)) |
1542 |> Conjunction.elim_balanced (length goals) |
1505 |> Conjunction.elim_balanced (length goals) |
1543 |> Proof_Context.export names_lthy lthy |
1506 |> Proof_Context.export names_lthy lthy |
1544 |> map Thm.close_derivation |
1507 |> map Thm.close_derivation |
1545 end; |
1508 end; |
1546 |
1509 |
1594 end) ctrAs; |
1557 end) ctrAs; |
1595 val goal = Logic.mk_implies (mk_Trueprop_mem (elem, set $ ta), thesis); |
1558 val goal = Logic.mk_implies (mk_Trueprop_mem (elem, set $ ta), thesis); |
1596 val thm = |
1559 val thm = |
1597 Goal.prove_sorry lthy [] (flat premss) goal |
1560 Goal.prove_sorry lthy [] (flat premss) goal |
1598 (fn {context = ctxt, prems} => |
1561 (fn {context = ctxt, prems} => |
1599 mk_set_cases_tac ctxt (certify ctxt ta) prems exhaust set_thms) |
1562 mk_set_cases_tac ctxt (certify ctxt ta) prems exhaust set_thms) |
1600 |> singleton (Proof_Context.export names_lthy lthy) |
1563 |> singleton (Proof_Context.export names_lthy lthy) |
1601 |> Thm.close_derivation |
1564 |> Thm.close_derivation |
1602 |> rotate_prems ~1; |
1565 |> rotate_prems ~1; |
1603 |
1566 |
1604 val consumes_attr = Attrib.internal (K (Rule_Cases.consumes 1)); |
1567 val consumes_attr = Attrib.internal (K (Rule_Cases.consumes 1)); |
1678 if null goals then |
1641 if null goals then |
1679 [] |
1642 [] |
1680 else |
1643 else |
1681 Goal.prove_sorry lthy [] [] (Logic.mk_conjunction_balanced goals) |
1644 Goal.prove_sorry lthy [] [] (Logic.mk_conjunction_balanced goals) |
1682 (fn {context = ctxt, prems = _} => |
1645 (fn {context = ctxt, prems = _} => |
1683 mk_rel_sel_tac ctxt (certify ctxt ta) (certify ctxt tb) exhaust |
1646 mk_rel_sel_tac ctxt (certify ctxt ta) (certify ctxt tb) exhaust |
1684 (flat disc_thmss) (flat sel_thmss) rel_inject_thms distincts |
1647 (flat disc_thmss) (flat sel_thmss) rel_inject_thms distincts |
1685 rel_distinct_thms) |
1648 rel_distinct_thms) |
1686 |> Conjunction.elim_balanced (length goals) |
1649 |> Conjunction.elim_balanced (length goals) |
1687 |> Proof_Context.export names_lthy lthy |
1650 |> Proof_Context.export names_lthy lthy |
1688 |> map Thm.close_derivation |
1651 |> map Thm.close_derivation |
1689 end; |
1652 end; |
1690 |
1653 |
1716 val goal = |
1679 val goal = |
1717 Logic.list_implies (HOLogic.mk_Trueprop rel_Rs_a_b :: assms, thesis); |
1680 Logic.list_implies (HOLogic.mk_Trueprop rel_Rs_a_b :: assms, thesis); |
1718 val thm = |
1681 val thm = |
1719 Goal.prove_sorry lthy [] [] goal |
1682 Goal.prove_sorry lthy [] [] goal |
1720 (fn {context = ctxt, prems = _} => |
1683 (fn {context = ctxt, prems = _} => |
1721 mk_rel_cases_tac ctxt (certify ctxt ta) (certify ctxt tb) exhaust |
1684 mk_rel_cases_tac ctxt (certify ctxt ta) (certify ctxt tb) exhaust |
1722 injects rel_inject_thms distincts rel_distinct_thms |
1685 injects rel_inject_thms distincts rel_distinct_thms |
1723 (map rel_eq_of_bnf live_nesting_bnfs)) |
1686 (map rel_eq_of_bnf live_nesting_bnfs)) |
1724 |> singleton (Proof_Context.export names_lthy lthy) |
1687 |> singleton (Proof_Context.export names_lthy lthy) |
1725 |> Thm.close_derivation; |
1688 |> Thm.close_derivation; |
1726 |
1689 |
1727 val ctr_names = quasi_unambiguous_case_names ((map name_of_ctr) ctrAs); |
1690 val ctr_names = quasi_unambiguous_case_names ((map name_of_ctr) ctrAs); |
1728 val case_names_attr = Attrib.internal (K (Rule_Cases.case_names ctr_names)); |
1691 val case_names_attr = Attrib.internal (K (Rule_Cases.case_names ctr_names)); |
1749 if null goals then |
1712 if null goals then |
1750 [] |
1713 [] |
1751 else |
1714 else |
1752 Goal.prove_sorry lthy [] [] (Logic.mk_conjunction_balanced goals) |
1715 Goal.prove_sorry lthy [] [] (Logic.mk_conjunction_balanced goals) |
1753 (fn {context = ctxt, prems = _} => |
1716 (fn {context = ctxt, prems = _} => |
1754 mk_map_disc_iff_tac ctxt (certify ctxt ta) exhaust (flat disc_thmss) |
1717 mk_map_disc_iff_tac ctxt (certify ctxt ta) exhaust (flat disc_thmss) |
1755 map_thms) |
1718 map_thms) |
1756 |> Conjunction.elim_balanced (length goals) |
1719 |> Conjunction.elim_balanced (length goals) |
1757 |> Proof_Context.export names_lthy lthy |
1720 |> Proof_Context.export names_lthy lthy |
1758 |> map Thm.close_derivation |
1721 |> map Thm.close_derivation |
1759 end; |
1722 end; |
1760 |
1723 |
1776 val concl = mk_Trueprop_eq (lhs, rhs); |
1739 val concl = mk_Trueprop_eq (lhs, rhs); |
1777 in |
1740 in |
1778 if is_refl_bool prem then concl |
1741 if is_refl_bool prem then concl |
1779 else Logic.mk_implies (HOLogic.mk_Trueprop prem, concl) |
1742 else Logic.mk_implies (HOLogic.mk_Trueprop prem, concl) |
1780 end; |
1743 end; |
|
1744 |
1781 val goals = map mk_goal discAs_selAss; |
1745 val goals = map mk_goal discAs_selAss; |
1782 in |
1746 in |
1783 if null goals then |
1747 if null goals then |
1784 [] |
1748 [] |
1785 else |
1749 else |
1786 Goal.prove_sorry lthy [] [] (Logic.mk_conjunction_balanced goals) |
1750 Goal.prove_sorry lthy [] [] (Logic.mk_conjunction_balanced goals) |
1787 (fn {context = ctxt, prems = _} => |
1751 (fn {context = ctxt, prems = _} => |
1788 mk_map_sel_tac ctxt (certify ctxt ta) exhaust (flat disc_thmss) |
1752 mk_map_sel_tac ctxt (certify ctxt ta) exhaust (flat disc_thmss) |
1789 map_thms (flat sel_thmss)) |
1753 map_thms (flat sel_thmss)) |
1790 |> Conjunction.elim_balanced (length goals) |
1754 |> Conjunction.elim_balanced (length goals) |
1791 |> Proof_Context.export names_lthy lthy |
1755 |> Proof_Context.export names_lthy lthy |
1792 |> map Thm.close_derivation |
1756 |> map Thm.close_derivation |
1793 end; |
1757 end; |
1794 |
1758 |
1876 (rel_injectN, rel_inject_thms, K simp_attrs), |
1840 (rel_injectN, rel_inject_thms, K simp_attrs), |
1877 (rel_introsN, rel_intro_thms, K []), |
1841 (rel_introsN, rel_intro_thms, K []), |
1878 (rel_selN, rel_sel_thms, K []), |
1842 (rel_selN, rel_sel_thms, K []), |
1879 (setN, set_thms, K (code_nitpicksimp_attrs @ simp_attrs)), |
1843 (setN, set_thms, K (code_nitpicksimp_attrs @ simp_attrs)), |
1880 (set_casesN, set_cases_thms, nth set_cases_attrss), |
1844 (set_casesN, set_cases_thms, nth set_cases_attrss), |
1881 (set_emptyN, set_empty_thms, K []), |
|
1882 (set_introsN, set_intros_thms, K []), |
1845 (set_introsN, set_intros_thms, K []), |
1883 (set_selN, set_sel_thms, K [])] |
1846 (set_selN, set_sel_thms, K [])] |
1884 |> massage_simple_notes fp_b_name; |
1847 |> massage_simple_notes fp_b_name; |
1885 |
1848 |
1886 val (noted, lthy') = |
1849 val (noted, lthy') = |