Proof with try congruence.
set (P' := fun (g_u : M.t * M.t) (res: superposition_result * M.t*M.t) =>
res = (C_example R sel, given', unselected') ->
(R, sel) = clauses_generate nil
(rsort_uniq (rev_cmp compare_clause) (M.elements given'))).
generalize (loop_ind P'). intros H1 H2. unfold P' in H1.
apply H1 with (given_unselected := (given, unselected)); auto; intros [? ?] ? ?;
inversion 1; subst...
Qed.

Lemma check_clauseset_Cexample_model init final empty R selected :
check_clauseset init = (C_example R selected, final, empty) ->
(R, selected) = clauses_generate nil
(rsort_uniq (rev_cmp compare_clause) (M.elements final)).