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)