src/HOL/BNF/Tools/bnf_wrap.ML
changeset 49594 55e798614c45
parent 49591 91b228e26348
child 49618 29be73b789f9
equal deleted inserted replaced
49593:c958f282b382 49594:55e798614c45
    33 val isN = "is_";
    33 val isN = "is_";
    34 val unN = "un_";
    34 val unN = "un_";
    35 fun mk_unN 1 1 suf = unN ^ suf
    35 fun mk_unN 1 1 suf = unN ^ suf
    36   | mk_unN _ l suf = unN ^ suf ^ string_of_int l;
    36   | mk_unN _ l suf = unN ^ suf ^ string_of_int l;
    37 
    37 
       
    38 val caseN = "case";
    38 val case_congN = "case_cong";
    39 val case_congN = "case_cong";
    39 val case_eqN = "case_eq";
    40 val case_convN = "case_conv";
    40 val casesN = "cases";
       
    41 val collapseN = "collapse";
    41 val collapseN = "collapse";
    42 val disc_excludeN = "disc_exclude";
    42 val disc_excludeN = "disc_exclude";
    43 val disc_exhaustN = "disc_exhaust";
    43 val disc_exhaustN = "disc_exhaust";
    44 val discsN = "discs";
    44 val discsN = "discs";
    45 val distinctN = "distinct";
    45 val distinctN = "distinct";
   380           in
   380           in
   381             Skip_Proof.prove lthy [] [] goal (fn _ => mk_nchotomy_tac n exhaust_thm)
   381             Skip_Proof.prove lthy [] [] goal (fn _ => mk_nchotomy_tac n exhaust_thm)
   382           end;
   382           end;
   383 
   383 
   384         val (all_sel_thms, sel_thmss, disc_thmss, disc_thms, discI_thms, disc_exclude_thms,
   384         val (all_sel_thms, sel_thmss, disc_thmss, disc_thms, discI_thms, disc_exclude_thms,
   385              disc_exhaust_thms, collapse_thms, expand_thms, case_eq_thms) =
   385              disc_exhaust_thms, collapse_thms, expand_thms, case_conv_thms) =
   386           if no_dests then
   386           if no_dests then
   387             ([], [], [], [], [], [], [], [], [], [])
   387             ([], [], [], [], [], [], [], [], [], [])
   388           else
   388           else
   389             let
   389             let
   390               fun make_sel_thm xs' case_thm sel_def =
   390               fun make_sel_thm xs' case_thm sel_def =
   537                        (inst_thm v disc_exhaust_thm) uncollapse_thms disc_exclude_thmsss
   537                        (inst_thm v disc_exhaust_thm) uncollapse_thms disc_exclude_thmsss
   538                        disc_exclude_thmsss')]
   538                        disc_exclude_thmsss')]
   539                   |> Proof_Context.export names_lthy lthy
   539                   |> Proof_Context.export names_lthy lthy
   540                 end;
   540                 end;
   541 
   541 
   542               val case_eq_thms =
   542               val case_conv_thms =
   543                 let
   543                 let
   544                   fun mk_body f usels = Term.list_comb (f, usels);
   544                   fun mk_body f usels = Term.list_comb (f, usels);
   545                   val goal = mk_Trueprop_eq (ufcase, mk_IfN B udiscs (map2 mk_body fs uselss));
   545                   val goal = mk_Trueprop_eq (ufcase, mk_IfN B udiscs (map2 mk_body fs uselss));
   546                 in
   546                 in
   547                   [Skip_Proof.prove lthy [] [] goal (fn {context = ctxt, ...} =>
   547                   [Skip_Proof.prove lthy [] [] goal (fn {context = ctxt, ...} =>
   548                      mk_case_eq_tac ctxt n uexhaust_thm case_thms disc_thmss' sel_thmss)]
   548                      mk_case_conv_tac ctxt n uexhaust_thm case_thms disc_thmss' sel_thmss)]
   549                   |> Proof_Context.export names_lthy lthy
   549                   |> Proof_Context.export names_lthy lthy
   550                 end;
   550                 end;
   551             in
   551             in
   552               (all_sel_thms, sel_thmss, disc_thmss, disc_thms, discI_thms, disc_exclude_thms,
   552               (all_sel_thms, sel_thmss, disc_thmss, disc_thms, discI_thms, disc_exclude_thms,
   553                [disc_exhaust_thm], collapse_thms, expand_thms, case_eq_thms)
   553                [disc_exhaust_thm], collapse_thms, expand_thms, case_conv_thms)
   554             end;
   554             end;
   555 
   555 
   556         val (case_cong_thm, weak_case_cong_thm) =
   556         val (case_cong_thm, weak_case_cong_thm) =
   557           let
   557           let
   558             fun mk_prem xctr xs f g =
   558             fun mk_prem xctr xs f g =
   599 
   599 
   600         val exhaust_case_names_attr = Attrib.internal (K (Rule_Cases.case_names exhaust_cases));
   600         val exhaust_case_names_attr = Attrib.internal (K (Rule_Cases.case_names exhaust_cases));
   601         val cases_type_attr = Attrib.internal (K (Induct.cases_type dataT_name));
   601         val cases_type_attr = Attrib.internal (K (Induct.cases_type dataT_name));
   602 
   602 
   603         val notes =
   603         val notes =
   604           [(case_congN, [case_cong_thm], []),
   604           [(caseN, case_thms, simp_attrs),
   605            (case_eqN, case_eq_thms, []),
   605            (case_congN, [case_cong_thm], []),
   606            (casesN, case_thms, simp_attrs),
   606            (case_convN, case_conv_thms, []),
   607            (collapseN, collapse_thms, simp_attrs),
   607            (collapseN, collapse_thms, simp_attrs),
   608            (discsN, disc_thms, simp_attrs),
   608            (discsN, disc_thms, simp_attrs),
   609            (disc_excludeN, disc_exclude_thms, []),
   609            (disc_excludeN, disc_exclude_thms, []),
   610            (disc_exhaustN, disc_exhaust_thms, [exhaust_case_names_attr]),
   610            (disc_exhaustN, disc_exhaust_thms, [exhaust_case_names_attr]),
   611            (distinctN, distinct_thms, simp_attrs @ induct_simp_attrs),
   611            (distinctN, distinct_thms, simp_attrs @ induct_simp_attrs),