let eq_terms 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 -> Var.equal 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
    | Tlet (x,v,t),Tlet(x',v',t') ->
        (Var.equal x x') && (eq v v') && (eq t t')
    | Tlet _, _ -> false
  in eq e1 e2