diff --git a/src/core/term.ml b/src/core/term.ml index 0ce2bdd019d11f174ced6f05e16a112a4e4847f5..b291e76b6bd7dd3a724e62323eac5e0fe230e13b 100644 --- a/src/core/term.ml +++ b/src/core/term.ml @@ -651,12 +651,10 @@ let f_any_unsafe prT prF f = (* replaces variables with de Bruijn indices in term [t] using map [m] *) -let bnd_add i (lvl,rb) = rb := Sint.add (i + lvl) !rb - let rec t_abst m l lvl t = t_label_copy t (match t.t_node with | Tvar u -> begin try let i = Mvs.find u m in - List.iter (bnd_add i) l; + l := Sint.add i !l; t_bvar (i + lvl) t.t_ty with Not_found -> t end | Tlet (e, (u,b,t1)) -> @@ -684,27 +682,32 @@ and f_abst m l lvl f = f_label_copy f (match f.f_node with f_map_unsafe (t_abst m l lvl) (f_abst m l lvl) f) and bnd_t_abst m l lvl bv t = - let rb = ref bv.bv_open in + let l' = ref Sint.empty in let bv = bnd_map (t_abst m l lvl) bv in - let t = t_abst m ((lvl,rb) :: l) (lvl + bv.bv_bound) t in - { bv with bv_open = !rb }, t + let t = t_abst m l' (lvl + bv.bv_bound) t in + update_open lvl l l' bv, t and bnd_f_abst m l lvl bv f = - let rb = ref bv.bv_open in + let l' = ref Sint.empty in let bv = bnd_map (t_abst m l lvl) bv in - let f = f_abst m ((lvl,rb) :: l) (lvl + bv.bv_bound) f in - { bv with bv_open = !rb }, f + let f = f_abst m l' (lvl + bv.bv_bound) f in + update_open lvl l l' bv, f and bnd_q_abst m l lvl (vl,bv,tl,f) = - let rb = ref bv.bv_open in + let l' = ref Sint.empty in + let lvl' = lvl + bv.bv_bound in let bv = bnd_map (t_abst m l lvl) bv in - let l = (lvl,rb) :: l in let lvl = lvl + bv.bv_bound in - let tl = tr_map (t_abst m l lvl) (f_abst m l lvl) tl in - let f = f_abst m l lvl f in - vl, { bv with bv_open = !rb }, tl, f + let tl = tr_map (t_abst m l' lvl') (f_abst m l' lvl') tl in + let f = f_abst m l' lvl' f in + vl, update_open lvl l l' bv, tl, f + +and update_open lvl l l' bv = + l := Sint.union !l' !l; + let add i acc = Sint.add (i + lvl) acc in + { bv with bv_open = Sint.fold add !l' bv.bv_open } -let t_abst m t = t_abst m [] 0 t -let f_abst m f = f_abst m [] 0 f +let t_abst m t = t_abst m (ref Sint.empty) 0 t +let f_abst m f = f_abst m (ref Sint.empty) 0 f (* replaces de Bruijn indices with variables in term [t] using map [m] *)