aboutsummaryrefslogtreecommitdiffhomepage
path: root/pretyping/cases.ml
diff options
context:
space:
mode:
Diffstat (limited to 'pretyping/cases.ml')
-rw-r--r--pretyping/cases.ml35
1 files changed, 22 insertions, 13 deletions
diff --git a/pretyping/cases.ml b/pretyping/cases.ml
index a89d5a942..ad506b89b 100644
--- a/pretyping/cases.ml
+++ b/pretyping/cases.ml
@@ -166,7 +166,7 @@ type tomatch_type =
type tomatch_status =
| Pushed of ((constr * tomatch_type) * int list * (name * dep_status))
| Alias of (constr * constr * alias_constr * constr)
- | Abstract of rel_declaration
+ | Abstract of int * rel_declaration
type tomatch_stack = tomatch_status list
@@ -540,7 +540,7 @@ let dependent_decl a = function
let rec dep_in_tomatch n = function
| (Pushed _ | Alias _) :: l -> dep_in_tomatch n l
- | Abstract d :: l -> dependent_decl (mkRel n) d or dep_in_tomatch (n+1) l
+ | Abstract (_,d) :: l -> dependent_decl (mkRel n) d or dep_in_tomatch (n+1) l
| [] -> false
let dependencies_in_rhs nargs current tms eqns =
@@ -594,8 +594,9 @@ let regeneralize_index_tomatch n =
Pushed ((c,tm),l,dep) :: genrec depth rest
| Alias (c1,c2,d,t) :: rest ->
Alias (regeneralize_index n depth c1,c2,d,t) :: genrec depth rest
- | Abstract d :: rest ->
- Abstract (map_rel_declaration (regeneralize_index n depth) d)
+ | Abstract (i,d) :: rest ->
+ let i = regeneralize_rel n depth i in
+ Abstract (i,map_rel_declaration (regeneralize_index n depth) d)
:: genrec (depth+1) rest in
genrec 0
@@ -617,8 +618,8 @@ let replace_tomatch n c =
Pushed ((b,tm),l,dep) :: replrec depth rest
| Alias (c1,c2,d,t) :: rest ->
Alias (replace_term n c depth c1,c2,d,t) :: replrec depth rest
- | Abstract d :: rest ->
- Abstract (map_rel_declaration (replace_term n c depth) d)
+ | Abstract (i,d) :: rest ->
+ Abstract (i,map_rel_declaration (replace_term n c depth) d)
:: replrec (depth+1) rest in
replrec 0
@@ -639,8 +640,9 @@ let rec liftn_tomatch_stack n depth = function
| Alias (c1,c2,d,t)::rest ->
Alias (liftn n depth c1,liftn n depth c2,d,liftn n depth t)
::(liftn_tomatch_stack n depth rest)
- | Abstract d::rest ->
- Abstract (map_rel_declaration (liftn n depth) d)
+ | Abstract (i,d)::rest ->
+ let i = if i<depth then i else i+n in
+ Abstract (i,map_rel_declaration (liftn n depth) d)
::(liftn_tomatch_stack n (depth+1) rest)
let lift_tomatch_stack n = liftn_tomatch_stack n 1
@@ -761,6 +763,12 @@ let insert_aliases env sigma alias eqns =
let eqns = list_map3 (insert_aliases_eqn sign1) eqnsnames alias_rests eqns in
sign2, env, eqns
+let push_generalized_decl_eqn env n (na,c,t) eqn =
+ let na = match na with
+ | Anonymous -> Anonymous
+ | Name id -> pi1 (Environ.lookup_rel n eqn.rhs.rhs_env) in
+ push_rels_eqn [(na,c,t)] eqn
+
(**********************************************************************)
(* Functions to deal with elimination predicate *)
@@ -875,7 +883,7 @@ let rec extract_predicate ccl = function
| Alias (deppat,nondeppat,_,_)::tms ->
(* substitution already done in build_branch *)
extract_predicate ccl tms
- | Abstract d::tms ->
+ | Abstract (i,d)::tms ->
mkProd_or_LetIn d (extract_predicate ccl tms)
| Pushed ((cur,NotInd _),_,(dep,_))::tms ->
let tms = if dep<>Anonymous then lift_tomatch_stack 1 tms else tms in
@@ -1068,7 +1076,7 @@ let rec generalize_problem names pb = function
let tomatch = lift_tomatch_stack 1 pb'.tomatch in
let tomatch = regeneralize_index_tomatch (i+1) tomatch in
{ pb' with
- tomatch = Abstract d :: tomatch;
+ tomatch = Abstract (i,d) :: tomatch;
pred = generalize_predicate names i d pb'.tomatch pb'.pred }
(* No more patterns: typing the right-hand side of equations *)
@@ -1197,7 +1205,7 @@ let rec compile pb =
match pb.tomatch with
| (Pushed cur)::rest -> match_current { pb with tomatch = rest } cur
| (Alias x)::rest -> compile_alias pb x rest
- | (Abstract d)::rest -> compile_generalization pb d rest
+ | (Abstract (i,d))::rest -> compile_generalization pb i d rest
| [] -> build_leaf pb
(* Case splitting *)
@@ -1243,12 +1251,13 @@ and compile_branch current names deps pb arsign eqn cstr =
let j = compile pb in
(it_mkLambda_or_LetIn j.uj_val sign, j.uj_type)
-and compile_generalization pb d rest =
+(* Abstract over a declaration before continuing splitting *)
+and compile_generalization pb i d rest =
let pb =
{ pb with
env = push_rel d pb.env;
tomatch = rest;
- mat = List.map (push_rels_eqn [d]) pb.mat } in
+ mat = List.map (push_generalized_decl_eqn pb.env i d) pb.mat } in
let j = compile pb in
{ uj_val = mkLambda_or_LetIn d j.uj_val;
uj_type = mkProd_or_LetIn d j.uj_type }