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