let rec equal e1 e2 =
match e1, e2 with
| Tint x1, Tint x2 -> x1=x2
| Treal x1, Treal x2 -> x1=x2
| Ttrue , Ttrue -> true
| Tfalse , Tfalse -> false
| Tcall (f1, args1), Tcall (f2, args2) ->
(LogicId.equal f1 f2) &&
(List.length args1 = List.length args2) &&
(List.for_all2 equal args1 args2)
| Tprim (f1, args1), Tprim (f2, args2) ->
(f1=f2) &&
(List.length args1 = List.length args2) &&
(List.for_all2 equal args1 args2)
| Tif (c1, t1, e1), Tif (c2, t2, e2) ->
equal c1 c2 && equal t1 t2 && equal e1 e2
| Tlet (x,v,t),Tlet(x',v',t') ->
VAR.equal x x' && equal v v' && equal t t'
| Tgetfield (r,f) , Tgetfield(s,g) ->
LogicId.equal f.f_name g.f_name && equal r s
| Tsetfield (r,f,v) , Tsetfield(s,g,w) ->
LogicId.equal f.f_name g.f_name && equal r s && equal v w
| Taccess (t,i) , Taccess (u,j) ->
equal t u && equal i j
| Tupdate (t,i,v), Tupdate(u,j,w) ->
equal t u && equal i j && equal v w
| _ -> false