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