let rec eq_terms e1 e2 =
  match e1, e2 with
    | Tconst c1, Tconst c2 -> Pervasives.compare c1 c2 = 0
    | Tvar v1, Tvar v2 -> Var.equal v1 v2
    | Tapp (f1, args1), Tapp (f2, args2) ->
        f1 = f2 && List.for_all2 eq_terms args1 args2
    | Tif (c1, t1, e1), Tif (c2, t2, e2) ->
        eq_terms c1 c2 && eq_terms t1 t2 && eq_terms e1 e2
    | Tlet (x,v,t),Tlet(x',v',t') ->
        Var.equal x x' && eq_terms v v' && eq_terms t t'
    | Tgetfield (f,r) , Tgetfield(g,s) ->
        Fieldinfo.equal f g && eq_terms r s
    | Tsetfield (f,r,v) , Tsetfield(g,s,w) ->
        Fieldinfo.equal f g && eq_terms r s && eq_terms v w
    | Taccess (t,i) , Taccess (u,j) ->
        eq_terms t u && eq_terms i j
    | Tupdate (t,i,v), Tupdate(u,j,w) ->
        eq_terms t u && eq_terms i j && eq_terms v w
    | _ -> false