let simplify clause =
  try
    List.fold_left
      (fun clause term -> 
        match term with
          | TTrue | TNot(TFalse-> clause
          | TFalse | TNot(TTrue-> raise Exit
          | TRel(rel1,t11,t12) ->
            if 
              List.exists
                (fun term -> 
                  match term with
                    | TRel(rel2,t21,t22) 
                        when contradict_rel (rel1,t11,t12) (rel2, t21,t22) ->
                      raise Exit
                    | TRel(rel2,t21,t22) ->
                      rel_are_equals (rel1,t11,t12) (rel2,t21,t22)
                    | TNot(TRel(rel2,t21,t22))
                        when (rel_are_equals (rel1,t11,t12) (rel2,t21,t22)) -> 
                      raise Exit
                    | TNot(TRel(rel2,t21,t22)) ->
                      contradict_rel (rel1,t11,t12) (rel2,t21,t22)
                    | _ -> false)
                clause
            then clause
            else term::clause
         | TNot(TRel(rel1,t11,t12)) ->
            if 
              List.exists
                (fun term -> 
                  match term with
                    | TNot(TRel(rel2,t21,t22))
                        when contradict_rel (rel1,t11,t12) (rel2, t21,t22) ->
                      raise Exit
                    | TNot(TRel(rel2,t21,t22)) ->
                      rel_are_equals (rel1,t11,t12) (rel2,t21,t22)
                    | TRel(rel2,t21,t22)
                        when (rel_are_equals (rel1,t11,t12) (rel2,t21,t22)) -> 
                      raise Exit
                    | TRel(rel2,t21,t22) ->
                      contradict_rel (rel1,t11,t12) (rel2,t21,t22)
                    | _ -> false)
                clause
            then clause
            else term::clause
         | _ -> term :: clause)
      [] clause
  with Exit -> [TFalse]