let eq_term eq_data e1 e2 = 
  let rec eq e1 e2 = match e1, e2 with
  | Tconst c1, Tconst c2 -> c1 = c2
  | Tconst _, _ -> false
  | Tvar v1, Tvar v2 -> eq_var v1 v2
  | Tvar _, _ -> false
  | Tdata d1, Tdata d2 -> eq_data d1 d2
  | Tdata _, _ -> false
  | Tapp (f1, args1), Tapp (f2, args2) -> 
      f1 = f2 && List.for_all2 eq args1 args2
  | Tapp _, _ -> false
  | Tif (c1, t1, e1), Tif (c2, t2, e2) -> (eq c1 c2) && (eq t1 t2) && (eq e1 e2)
  | Tif _, _ -> false
  in eq e1 e2