src/HOL/Tools/BNF/bnf_fp_def_sugar.ML
changeset 78095 bc42c074e58f
parent 77879 dd222e2af01a
child 80634 a90ab1ea6458
equal deleted inserted replaced
78094:c3efa0b63d2e 78095:bc42c074e58f
   416 
   416 
   417 val interpret_fp_sugars = FP_Sugar_Plugin.data;
   417 val interpret_fp_sugars = FP_Sugar_Plugin.data;
   418 
   418 
   419 val register_fp_sugars_raw =
   419 val register_fp_sugars_raw =
   420   fold (fn fp_sugar as {T = Type (s, _), ...} =>
   420   fold (fn fp_sugar as {T = Type (s, _), ...} =>
   421     Local_Theory.declaration {syntax = false, pervasive = true}
   421     Local_Theory.declaration {syntax = false, pervasive = true, pos = \<^here>}
   422       (fn phi => Data.map (Symtab.update (s, morph_fp_sugar phi fp_sugar))));
   422       (fn phi => Data.map (Symtab.update (s, morph_fp_sugar phi fp_sugar))));
   423 
   423 
   424 fun register_fp_sugars plugins fp_sugars =
   424 fun register_fp_sugars plugins fp_sugars =
   425   register_fp_sugars_raw fp_sugars #> interpret_fp_sugars plugins fp_sugars;
   425   register_fp_sugars_raw fp_sugars #> interpret_fp_sugars plugins fp_sugars;
   426 
   426 
  1067                     mk_set_cases_tac ctxt (Thm.cterm_of ctxt ta) prems exhaust set_thms)
  1067                     mk_set_cases_tac ctxt (Thm.cterm_of ctxt ta) prems exhaust set_thms)
  1068                   |> Thm.close_derivation \<^here>
  1068                   |> Thm.close_derivation \<^here>
  1069                   |> rotate_prems ~1;
  1069                   |> rotate_prems ~1;
  1070 
  1070 
  1071                 val cases_set_attr =
  1071                 val cases_set_attr =
  1072                   Attrib.internal (K (Induct.cases_pred (name_of_set set)));
  1072                   Attrib.internal \<^here> (K (Induct.cases_pred (name_of_set set)));
  1073 
  1073 
  1074                 val ctr_names = quasi_unambiguous_case_names (flat
  1074                 val ctr_names = quasi_unambiguous_case_names (flat
  1075                   (map (uncurry mk_names o map_prod length name_of_ctr) (premss ~~ ctrAs)));
  1075                   (map (uncurry mk_names o map_prod length name_of_ctr) (premss ~~ ctrAs)));
  1076               in
  1076               in
  1077                 (* TODO: @{attributes [elim?]} *)
  1077                 (* TODO: @{attributes [elim?]} *)
  2029                mk_set_induct0_tac ctxt (map (Thm.cterm_of ctxt'') Ps) prems dtor_set_inducts
  2029                mk_set_induct0_tac ctxt (map (Thm.cterm_of ctxt'') Ps) prems dtor_set_inducts
  2030                  exhausts set_pre_defs ctor_defs dtor_ctors Abs_pre_inverses)
  2030                  exhausts set_pre_defs ctor_defs dtor_ctors Abs_pre_inverses)
  2031           |> Thm.close_derivation \<^here>;
  2031           |> Thm.close_derivation \<^here>;
  2032 
  2032 
  2033         val case_names_attr = Attrib.case_names (quasi_unambiguous_case_names case_names);
  2033         val case_names_attr = Attrib.case_names (quasi_unambiguous_case_names case_names);
  2034         val induct_set_attrs = map (Attrib.internal o K o Induct.induct_pred o name_of_set) sets;
  2034         val induct_set_attrs = map (Attrib.internal \<^here> o K o Induct.induct_pred o name_of_set) sets;
  2035       in
  2035       in
  2036         (thm, case_names_attr :: induct_set_attrs)
  2036         (thm, case_names_attr :: induct_set_attrs)
  2037       end
  2037       end
  2038     val consumes_attr = Attrib.consumes 1;
  2038     val consumes_attr = Attrib.consumes 1;
  2039   in
  2039   in
  2645             type_definitions abs_inverses ctrss ctr_defss recs rec_defs lthy;
  2645             type_definitions abs_inverses ctrss ctr_defss recs rec_defs lthy;
  2646 
  2646 
  2647         val rec_transfer_thmss =
  2647         val rec_transfer_thmss =
  2648           map single (derive_rec_transfer_thms lthy recs rec_defs recs_args_types);
  2648           map single (derive_rec_transfer_thms lthy recs rec_defs recs_args_types);
  2649 
  2649 
  2650         val induct_type_attr = Attrib.internal o K o Induct.induct_type;
  2650         val induct_type_attr = Attrib.internal \<^here> o K o Induct.induct_type;
  2651         val induct_pred_attr = Attrib.internal o K o Induct.induct_pred;
  2651         val induct_pred_attr = Attrib.internal \<^here> o K o Induct.induct_pred;
  2652 
  2652 
  2653         val ((rel_induct_thmss, common_rel_induct_thms),
  2653         val ((rel_induct_thmss, common_rel_induct_thms),
  2654              (rel_induct_attrs, common_rel_induct_attrs)) =
  2654              (rel_induct_attrs, common_rel_induct_attrs)) =
  2655           if live = 0 then
  2655           if live = 0 then
  2656             ((replicate nn [], []), ([], []))
  2656             ((replicate nn [], []), ([], []))
  2806                   [thm, eq_ifIN ctxt thms]));
  2806                   [thm, eq_ifIN ctxt thms]));
  2807 
  2807 
  2808         val corec_code_thms = map (eq_ifIN lthy) corec_thmss;
  2808         val corec_code_thms = map (eq_ifIN lthy) corec_thmss;
  2809         val corec_sel_thmss = map flat corec_sel_thmsss;
  2809         val corec_sel_thmss = map flat corec_sel_thmsss;
  2810 
  2810 
  2811         val coinduct_type_attr = Attrib.internal o K o Induct.coinduct_type;
  2811         val coinduct_type_attr = Attrib.internal \<^here> o K o Induct.coinduct_type;
  2812         val coinduct_pred_attr = Attrib.internal o K o Induct.coinduct_pred;
  2812         val coinduct_pred_attr = Attrib.internal \<^here> o K o Induct.coinduct_pred;
  2813 
  2813 
  2814         val flat_corec_thms = append oo append;
  2814         val flat_corec_thms = append oo append;
  2815 
  2815 
  2816         val corec_transfer_thmss = map single (derive_corec_transfer_thms lthy corecs corec_defs);
  2816         val corec_transfer_thmss = map single (derive_corec_transfer_thms lthy corecs corec_defs);
  2817 
  2817