aboutsummaryrefslogtreecommitdiffhomepage
path: root/contrib/subtac/subtac_cases.ml
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/subtac/subtac_cases.ml')
-rw-r--r--contrib/subtac/subtac_cases.ml21
1 files changed, 12 insertions, 9 deletions
diff --git a/contrib/subtac/subtac_cases.ml b/contrib/subtac/subtac_cases.ml
index 72bb80aa6..7e18e58a0 100644
--- a/contrib/subtac/subtac_cases.ml
+++ b/contrib/subtac/subtac_cases.ml
@@ -1698,26 +1698,29 @@ let rec is_included x y =
if i = i' then List.for_all2 is_included args args'
else false
-let build_ineqs prevpatterns pats liftsign patargs =
+(* liftsign is the current pattern's signature length *)
+let build_ineqs prevpatterns pats liftsign =
let _tomatchs = List.length pats in
let diffs =
List.fold_left
(fun c eqnpats ->
let acc = List.fold_left2
- (fun acc (ppat_sign, ppat_c, ppat_ty, (ppat_eqs, ppat_arity), ppat) curpat ->
+ (fun acc (ppat_sign, ppat_c, ppat_ty, (ppat_eqs, ppat_arity), ppat)
+ (curpat_sign, curpat_c, curpat_ty, (curpat_eqs, curpat_arity), curpat) ->
match acc with
None -> None
| Some (sign, len, n, c) -> (* FixMe: do not work with ppat_args *)
if is_included curpat ppat then
- let lens = List.length ppat_sign in
- let len' = lens + len in
+ let lens = List.length ppat_sign in (* Length of previous pattern's signature *)
+ let len' = lens + len in (* Accumulated length of previous pattern's signatures *)
let acc =
- (lift_rel_context len ppat_sign @ sign,
+ (lift_rel_context len ppat_sign @ sign, (* Jump over previous prevpat signs *)
len',
- succ n,
+ succ n, (* nth pattern *)
mkApp (Lazy.force eq_ind,
- [| lift (lens + liftsign) ppat_ty ; liftn liftsign (succ lens) ppat_c ;
- mkRel (len' + patargs.(pred n)) |]) ::
+ [| lift (lens + liftsign) ppat_ty ;
+ liftn liftsign (succ lens) ppat_c ;
+ lift len' curpat_c |]) ::
List.map (lift lens) c)
in Some acc
else None)
@@ -1750,7 +1753,7 @@ let constrs_of_pats typing_fun tycon env isevars eqns tomatchs sign neqs arity =
let pattern_rels = fst (List.fold_right (fun (sign, pat_c, pat_ty, _, pat) (l, acc) ->
acc :: l, List.length sign + acc) pats ([], 1))
in
- let ineqs = build_ineqs prevpatterns newpatterns signlen (Array.of_list pattern_rels) in
+ let ineqs = build_ineqs prevpatterns pats signlen in
let eqs_rels = List.fold_left (fun eqenv (_,_,_,(eqs,ty), _) ->
(List.map (fun (x,y) -> (x, None, y)) eqs) @ eqenv)
[] pats