let rec e_has_var d_has_var xs e =
  let frec = e_has_var d_has_var xs in
  match e with
  | Tconst _ -> false
  | Tvar y -> List.exists (Var.equal y) xs
  | Tdata a -> d_has_var xs a
  | Tapp(_,ts) -> List.exists (frec) ts
  | Tif(a,b,c) -> frec a || frec b || frec c
  | Tlet(x,v,t) ->
      frec v ||
        (let xs = List.filter (fun y -> not (Var.equal x y)) xs in
         xs <> [] && e_has_var d_has_var xs t)