let rec e_rename s t =
match t with
| Tconst _ -> t
| Tvar x ->
( match apply s x with
| None -> t
| Some y -> Fol.e_var y )
| Tdata _ as t ->
List.fold_left
(fun t (x,x') -> e_let x (Fol.e_var x') t)
t s
| Tapp(f,ts) -> e_app f (List.map (e_rename s) ts)
| Tif(a,b,c) -> e_if (e_rename s a) (e_rename s b) (e_rename s c)
| Tlet(y,a,b) ->
let a' = e_rename s a in
let s' = (y,y)::s in (* defensive ! *)
e_let y a' (e_rename s' b)