src/HOL/Tools/BNF/bnf_fp_def_sugar.ML
changeset 58044 b5cdfb352814
parent 58011 bc6bced136e5
child 58093 6f37a300c82b
equal deleted inserted replaced
58043:a90847f03ec8 58044:b5cdfb352814
   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') =