(** a second comparison function on clauses that meets the requirements of model generation *)
Definition pure_atom2pn_atom (b : bool) (a : pure_atom) :=
match a with
| Eqv e1 e2 => if b then Equ e1 e2 else Nequ e1 e2
end.
Definition pn_atom_cmp (a1 a2 : pn_atom) : comparison :=
match a1, a2 with
| Equ e1 e2, Equ e1' e2' => pure_atom_cmp (Eqv e1 e2) (Eqv e1' e2')
| Nequ e1 e2, Equ e1' e2' =>
if expr_eq e1 e1' then Gt else pure_atom_cmp (Eqv e1 e2) (Eqv e1' e2')
| Equ e1 e2, Nequ e1' e2' =>
if expr_eq e1 e1' then Lt else pure_atom_cmp (Eqv e1 e2) (Eqv e1' e2')
| Nequ e1 e2, Nequ e1' e2' => pure_atom_cmp (Eqv e1 e2) (Eqv e1' e2')
end.
Definition pure_clause2pn_list (c : clause) :=
match c with
| PureClause gamma delta _ _ =>
rsort pn_atom_cmp
(map (pure_atom2pn_atom false) gamma ++ map (pure_atom2pn_atom true) delta)
| _ => nil
end.
Definition compare_clause2 (cl1 cl2 : clause) :=
match cl1, cl2 with
| PureClause _ _ _ _, PureClause _ _ _ _ =>
compare_list pn_atom_cmp (pure_clause2pn_list cl1) (pure_clause2pn_list cl2)
| _, _ => compare_clause cl1 cl2
end.

(* Specifications: *)
Lemma compare_clause_eq cl1 cl2 : Eq = compare_clause cl1 cl2 -> cl1 = cl2.