let e_rename subst e =
  let rename_var v = match apply subst v with
    | None -> None
    | Some v' -> Some (Fol.e_var v')
  in
  let rename_data d = match d with
    | D1var (x, v) ->
        let d = match apply subst v with
          | None -> d
          | Some v' -> D1var (x, v')
        in d
    | _ -> d
  in
  let rec rename_data_rec d =
    let d' = do_data_rec rename_data rename_exp d in
      Fol.e_data d'
  and rename_exp e = Fol.change_in_exp rename_var rename_data_rec e
  in rename_exp e