aboutsummaryrefslogtreecommitdiff
path: root/engine/termops.ml
diff options
context:
space:
mode:
authorMaxime Dénès2015-07-02 16:16:46 +0200
committerMaxime Dénès2015-07-02 16:16:46 +0200
commit27de0f2d7e5cd0cc4b221413dfe3c7b739104350 (patch)
treea42625106f71295ebc2011b797603cd1b3b8ec83 /engine/termops.ml
parenta28d9981e5baf812de14e62de8d904e545e804e5 (diff)
parent44f45f58dc0a169286c9fcfa7d2edbc8bc04673b (diff)
Merge branch 'v8.5' into trunk
Diffstat (limited to 'engine/termops.ml')
-rw-r--r--engine/termops.ml15
1 files changed, 9 insertions, 6 deletions
diff --git a/engine/termops.ml b/engine/termops.ml
index 9f04faa839..937471cf76 100644
--- a/engine/termops.ml
+++ b/engine/termops.ml
@@ -453,26 +453,29 @@ let map_constr_with_full_binders g f l cstr = match kind_of_term cstr with
index) which is processed by [g] (which typically add 1 to [n]) at
each binder traversal; it is not recursive *)
-let fold_constr_with_binders g f n acc c = match kind_of_term c with
+let fold_constr_with_full_binders g f n acc c = match kind_of_term c with
| (Rel _ | Meta _ | Var _ | Sort _ | Const _ | Ind _
| Construct _) -> acc
| Cast (c,_, t) -> f n (f n acc c) t
- | Prod (_,t,c) -> f (g n) (f n acc t) c
- | Lambda (_,t,c) -> f (g n) (f n acc t) c
- | LetIn (_,b,t,c) -> f (g n) (f n (f n acc b) t) c
+ | Prod (na,t,c) -> f (g (na,None,t) n) (f n acc t) c
+ | Lambda (na,t,c) -> f (g (na,None,t) n) (f n acc t) c
+ | LetIn (na,b,t,c) -> f (g (na,Some b,t) n) (f n (f n acc b) t) c
| App (c,l) -> Array.fold_left (f n) (f n acc c) l
| Proj (p,c) -> f n acc c
| Evar (_,l) -> Array.fold_left (f n) acc l
| Case (_,p,c,bl) -> Array.fold_left (f n) (f n (f n acc p) c) bl
| Fix (_,(lna,tl,bl)) ->
- let n' = iterate g (Array.length tl) n in
+ let n' = CArray.fold_left2 (fun c n t -> g (n,None,t) c) n lna tl in
let fd = Array.map2 (fun t b -> (t,b)) tl bl in
Array.fold_left (fun acc (t,b) -> f n' (f n acc t) b) acc fd
| CoFix (_,(lna,tl,bl)) ->
- let n' = iterate g (Array.length tl) n in
+ let n' = CArray.fold_left2 (fun c n t -> g (n,None,t) c) n lna tl in
let fd = Array.map2 (fun t b -> (t,b)) tl bl in
Array.fold_left (fun acc (t,b) -> f n' (f n acc t) b) acc fd
+let fold_constr_with_binders g f n acc c =
+ fold_constr_with_full_binders (fun _ x -> g x) f n acc c
+
(* [iter_constr_with_full_binders g f acc c] iters [f acc] on the immediate
subterms of [c]; it carries an extra data [acc] which is processed by [g] at
each binder traversal; it is not recursive and the order with which