let rec change_in_exp do_var do_data exp =
let frec = change_in_exp do_var do_data in
match exp with
| Tconst c -> Tconst c
| Tvar v -> (match do_var v with Some e -> e | None -> Tvar v)
| Tdata d -> do_data d
| Tapp (n,tl) -> Tapp(n, List.map (frec) tl)
| Tif (t1,t2,t3) -> Tif(frec t1, frec t2, frec t3)