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 loop_Valid_sound given unselected given' unselected' s :
setd clause_denote inter TT given s ->
setd clause_denote inter TT unselected s ->
loop (given, unselected) = (Valid, given', unselected') ->
clause_denote empty_clause s.