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)