let rec add d s =
  Trace.msg "d" "Add" d Fact.pp_diseq;
  let (x,y,_) = Fact.d_diseq d in
  let xd = deq s x in
  let yd = deq s y in
  let xd' = Term.Set.add y xd in
  let yd' = Term.Set.add x yd in
  match xd == xd', yd == yd' with
    | truetrue -> 
        (Term.Set.empty, s)
    | truefalse ->
        Trace.msg "d" "Update" (x, y) Term.pp_diseq;
        (Term.Set.singleton y, Term.Map.add y yd' s)
    | falsetrue -> 
        Trace.msg "d" "Update" (x, y) Term.pp_diseq;
        (Term.Set.singleton x, Term.Map.add x xd' s)
    | falsefalse -> 
        Trace.msg "d" "Update" (x, y) Term.pp_diseq;
        let ch' = Term.Set.add x (Term.Set.singleton y) in
        let s' = Term.Map.add x xd' (Term.Map.add y yd' s) in
          (ch', s')