src/HOL/Tools/Ctr_Sugar/ctr_sugar.ML
changeset 54970 891141de5672
parent 54900 136fe16e726a
child 55342 1bd9e637ac9f
equal deleted inserted replaced
54969:0ac0b6576d21 54970:891141de5672
    50   val mk_case: typ list -> typ -> term -> term
    50   val mk_case: typ list -> typ -> term -> term
    51   val mk_disc_or_sel: typ list -> term -> term
    51   val mk_disc_or_sel: typ list -> term -> term
    52   val name_of_ctr: term -> string
    52   val name_of_ctr: term -> string
    53   val name_of_disc: term -> string
    53   val name_of_disc: term -> string
    54   val dest_ctr: Proof.context -> string -> term -> term * term list
    54   val dest_ctr: Proof.context -> string -> term -> term * term list
    55   val dest_case: Proof.context -> string -> typ list -> term -> (term list * term list) option
    55   val dest_case: Proof.context -> string -> typ list -> term ->
       
    56     (ctr_sugar * term list * term list) option
    56 
    57 
    57   val wrap_free_constructors: ({prems: thm list, context: Proof.context} -> tactic) list list ->
    58   val wrap_free_constructors: ({prems: thm list, context: Proof.context} -> tactic) list list ->
    58     (((bool * (bool * bool)) * term list) * binding) *
    59     (((bool * (bool * bool)) * term list) * binding) *
    59       (binding list * (binding list list * (binding * term) list list)) -> local_theory ->
    60       (binding list * (binding list list * (binding * term) list list)) -> local_theory ->
    60     ctr_sugar * local_theory
    61     ctr_sugar * local_theory
   264 
   265 
   265 fun dest_case ctxt s Ts t =
   266 fun dest_case ctxt s Ts t =
   266   (case Term.strip_comb t of
   267   (case Term.strip_comb t of
   267     (Const (c, _), args as _ :: _) =>
   268     (Const (c, _), args as _ :: _) =>
   268     (case ctr_sugar_of ctxt s of
   269     (case ctr_sugar_of ctxt s of
   269       SOME {casex = Const (case_name, _), discs = discs0, selss = selss0, ...} =>
   270       SOME (ctr_sugar as {casex = Const (case_name, _), discs = discs0, selss = selss0, ...}) =>
   270       if case_name = c then
   271       if case_name = c then
   271         let val n = length discs0 in
   272         let val n = length discs0 in
   272           if n < length args then
   273           if n < length args then
   273             let
   274             let
   274               val (branches, obj :: leftovers) = chop n args;
   275               val (branches, obj :: leftovers) = chop n args;
   276               val selss = map (map (mk_disc_or_sel Ts)) selss0;
   277               val selss = map (map (mk_disc_or_sel Ts)) selss0;
   277               val conds = map (rapp obj) discs;
   278               val conds = map (rapp obj) discs;
   278               val branch_argss = map (fn sels => map (rapp obj) sels @ leftovers) selss;
   279               val branch_argss = map (fn sels => map (rapp obj) sels @ leftovers) selss;
   279               val branches' = map2 (curry Term.betapplys) branches branch_argss;
   280               val branches' = map2 (curry Term.betapplys) branches branch_argss;
   280             in
   281             in
   281               SOME (conds, branches')
   282               SOME (ctr_sugar, conds, branches')
   282             end
   283             end
   283           else
   284           else
   284             NONE
   285             NONE
   285         end
   286         end
   286       else
   287       else