@@ -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+
716743let 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
0 commit comments