Skip to content

Commit 4cc9f85

Browse files
committed
fold_with_full_binders
1 parent 1280347 commit 4cc9f85

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

engine/eConstr.ml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,33 @@ let fold_with_binders sigma g f e acc c =
713713
List.fold_left (fun acc c -> f e acc c) acc args
714714
| _ -> Constr.fold_constr_with_binders g f e acc c
715715

716+
let fold_with_full_binders env sigma g f n acc c =
717+
let open Context.Rel.Declaration in
718+
match kind sigma c with
719+
| (Rel _ | Meta _ | Var _ | Sort _ | Const _ | Ind _
720+
| Construct _ | Int _ | Float _ | String _) -> acc
721+
| Cast (c,_, t) -> f n (f n acc c) t
722+
| Prod (na,t,c) -> f (g (LocalAssum (na, t)) n) (f n acc t) c
723+
| Lambda (na,t,c) -> f (g (LocalAssum (na, t)) n) (f n acc t) c
724+
| LetIn (na,b,t,c) -> f (g (LocalDef (na, b, t)) n) (f n (f n acc b) t) c
725+
| App (c,l) -> Array.fold_left (f n) (f n acc c) l
726+
| Evar ((evk, _) as ev) ->
727+
let args = Evd.expand_existential sigma ev in
728+
List.fold_left (fun acc c -> f n acc c) acc args
729+
| Case (ci,u,pms,p,iv,c,bl) ->
730+
let (ci, _, pms, (p,_), iv, c, bl) = annotate_case env sigma (ci, u, pms, p, iv, c, bl) in
731+
let fold_ctx n accu (nas, c) =
732+
f (List.fold_right g nas n) accu c
733+
in
734+
Array.fold_left (fold_ctx n) (f n (fold_invert (f n) (fold_ctx n (Array.fold_left (f n) acc pms) p) iv) c) bl
735+
| Proj (_,_,c) -> f n acc c
736+
| Fix (_,(lna,tl,bl)) | CoFix (_,(lna,tl,bl))->
737+
let acc = Array.fold_left (f n) acc tl in
738+
let n' = Array.fold_left2_i (fun i n na t -> g (LocalAssum (na, lift i t)) n) n lna tl in
739+
Array.fold_left (f n') acc bl
740+
| Array (_u,t,def,ty) ->
741+
f n (f n (Array.fold_left (f n) acc t) def) ty
742+
716743
let compare_gen k eq_inst eq_sort eq_constr eq_evars nargs c1 c2 =
717744
(c1 == c2) || Constr.compare_head_gen_with k k eq_inst eq_sort eq_constr eq_evars nargs c1 c2
718745

engine/eConstr.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ val iter_with_binders : Evd.evar_map -> ('a -> 'a) -> ('a -> t -> unit) -> 'a ->
363363
val iter_with_full_binders : Environ.env -> Evd.evar_map -> (rel_declaration -> 'a -> 'a) -> ('a -> t -> unit) -> 'a -> t -> unit
364364
val fold : Evd.evar_map -> ('a -> t -> 'a) -> 'a -> t -> 'a
365365
val fold_with_binders : Evd.evar_map -> ('a -> 'a) -> ('a -> 'b -> t -> 'b) -> 'a -> 'b -> t -> 'b
366+
val fold_with_full_binders : Environ.env -> Evd.evar_map -> (rel_declaration -> 'a -> 'a) -> ('a -> 'b -> t -> 'b) -> 'a -> 'b -> t -> 'b
366367

367368
(** Gather the universes transitively used in the term, including in the
368369
type of evars appearing in it. *)

0 commit comments

Comments
 (0)