src/HOL/BNF/Tools/bnf_ctr_sugar.ML
changeset 51819 9df935196be9
parent 51809 d4c1abbb4095
child 51823 38996458bc5c
equal deleted inserted replaced
51818:517f232e867d 51819:9df935196be9
     6 *)
     6 *)
     7 
     7 
     8 signature BNF_CTR_SUGAR =
     8 signature BNF_CTR_SUGAR =
     9 sig
     9 sig
    10   type ctr_wrap_result =
    10   type ctr_wrap_result =
    11     term list * term list list * thm * thm list * thm list * thm list * thm list list * thm list *
    11     {discs: term list,
    12     thm list list
    12      selss: term list list,
       
    13      exhaust: thm,
       
    14      injects: thm list,
       
    15      distincts: thm list,
       
    16      case_thms: thm list,
       
    17      disc_thmss: thm list list,
       
    18      discIs: thm list,
       
    19      sel_thmss: thm list list};
    13 
    20 
    14   val rep_compat_prefix: string
    21   val rep_compat_prefix: string
    15 
    22 
    16   val mk_half_pairss: 'a list * 'a list -> ('a * 'a) list list
    23   val mk_half_pairss: 'a list * 'a list -> ('a * 'a) list list
    17   val join_halves: int -> 'a list list -> 'a list list -> 'a list * 'a list list list
    24   val join_halves: int -> 'a list list -> 'a list list -> 'a list * 'a list list list
    35 
    42 
    36 open BNF_Util
    43 open BNF_Util
    37 open BNF_Ctr_Sugar_Tactics
    44 open BNF_Ctr_Sugar_Tactics
    38 
    45 
    39 type ctr_wrap_result =
    46 type ctr_wrap_result =
    40   term list * term list list * thm * thm list * thm list * thm list * thm list list * thm list *
    47   {discs: term list,
    41   thm list list;
    48    selss: term list list,
       
    49    exhaust: thm,
       
    50    injects: thm list,
       
    51    distincts: thm list,
       
    52    case_thms: thm list,
       
    53    disc_thmss: thm list list,
       
    54    discIs: thm list,
       
    55    sel_thmss: thm list list};
    42 
    56 
    43 val rep_compat_prefix = "new";
    57 val rep_compat_prefix = "new";
    44 
    58 
    45 val isN = "is_";
    59 val isN = "is_";
    46 val unN = "un_";
    60 val unN = "un_";
   669 
   683 
   670         val notes' =
   684         val notes' =
   671           [(map (fn th => th RS notE) distinct_thms, safe_elim_attrs)]
   685           [(map (fn th => th RS notE) distinct_thms, safe_elim_attrs)]
   672           |> map (fn (thms, attrs) => ((Binding.empty, attrs), [(thms, [])]));
   686           |> map (fn (thms, attrs) => ((Binding.empty, attrs), [(thms, [])]));
   673       in
   687       in
   674         ((discs, selss, exhaust_thm, inject_thms, distinct_thms, case_thms, disc_thmss, discI_thms,
   688         ({discs = discs, selss = selss, exhaust = exhaust_thm, injects = inject_thms,
   675           sel_thmss),
   689           distincts = distinct_thms, case_thms = case_thms, disc_thmss = disc_thmss,
   676           lthy
   690           discIs = discI_thms, sel_thmss = sel_thmss},
   677           |> not rep_compat ?
   691          lthy
   678              (Local_Theory.declaration {syntax = false, pervasive = true}
   692          |> not rep_compat ?
       
   693             (Local_Theory.declaration {syntax = false, pervasive = true}
   679                (fn phi => Case_Translation.register
   694                (fn phi => Case_Translation.register
   680                  (Morphism.term phi casex) (map (Morphism.term phi) ctrs)))
   695                   (Morphism.term phi casex) (map (Morphism.term phi) ctrs)))
   681           |> Local_Theory.notes (notes' @ notes) |> snd)
   696          |> Local_Theory.notes (notes' @ notes) |> snd)
   682       end;
   697       end;
   683   in
   698   in
   684     (goalss, after_qed, lthy')
   699     (goalss, after_qed, lthy')
   685   end;
   700   end;
   686 
   701