Module OrderedClause <: OrderedType
with Definition t:=clause
with Definition compare:=compare_clause'.
Definition t := clause.
Definition eq : clause -> clause -> Prop := Logic.eq.
Definition compare := compare_clause'.
Definition mem_add (x: elt) (s: t) : option t :=
if mem x s then None else Some (add x s).
(* general functions that should be moved elsewhere *)
Definition ocons {A : Type} (o : option A) l :=
match o with Some a => a :: l | None => l end.
Fixpoint omapl {A B : Type} (f : A -> option B) (l : list A) : list B :=
match l with
| a :: l' => ocons (f a) (omapl f l')
| nil => nil
end.
Fixpoint merge {A: Type} (cmp : A -> A -> comparison) l1 l2 :=
let fix merge_aux l2 :=
match l1, l2 with
| [], _ => l2
| _, [] => l1
| a1::l1', a2::l2' =>
match cmp a1 a2 with
| Eq => a1 :: merge cmp l1' l2'
| Gt => a1 :: merge cmp l1' l2
| _ => a2 :: merge_aux l2' end
end
in merge_aux l2.
Notation sortu_atms := (rsort_uniq pure_atom_cmp).
Notation insu_atm := (insert_uniq pure_atom_cmp).
Notation sortu_clauses := (rsort_uniq compare_clause).

Lemma empty_set_elems':
forall s, M.Empty s <-> M.elements s = nil.