let rec termsAreEqual term1 term2 =
  match term1,term2 with
    | TTrue,TTrue
    | TFalse,TFalse -> true
    | TCall (a,None), TCall (b,None)
    | TReturn a, TReturn b -> Kernel_function.equal a b
    | TCall (f1,Some b1), TCall(f2, Some b2) ->
      Kernel_function.equal f1 f2 && Datatype.String.equal b1.b_name b2.b_name
    | TNot(TRel(rel1,t11,t12)), TRel(rel2,t21,t22)
    | TRel(rel1,t11,t12), TNot(TRel(rel2,t21,t22)) ->
      contradict_rel (rel1,t11,t12) (rel2,t21,t22)
    | TNot(a),TNot(b) -> termsAreEqual a b
    | TRel(rel1,t11,t12), TRel(rel2,t21,t22) -> 
      rel_are_equals (rel1,t11,t12) (rel2,t21,t22)
    | _  -> false