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