equal
deleted
inserted
replaced
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 |