Proof with
simpl; auto;
try solve [simpl; destruct gamma as [|p]; simpl; auto; destruct p; simpl; auto].
intros A; destruct c as [gamma delta| |]... simpl.
destruct gamma... destruct delta... destruct p... destruct delta... destruct p...
remember (expr_eq e1 e) as b; destruct b...
if_tac... simpl; split; auto. intro Hyp.
rewrite (listd_insert_uniq_un pure_atom_denote FF). 2: apply pure_atom_cmp_eq.
destruct Hyp as [B C].
simpl in A; destruct A as [A|[A|A]]; [auto| | |right; auto].
assert (D : (e === e2) s).
if_tac in B; simpl in B;
apply (var_eq_trans _ _ _ _ A); [apply var_eq_sym; auto | auto].
solve[left; if_tac; simpl; [apply var_eq_sym; auto | auto]].
assert (D : (e === e2) s).
rewrite <- (expr_eq_eq' _ _ Heqb) .
if_tac in B; simpl in B;
apply (var_eq_trans _ _ _ _ A); [apply var_eq_sym; auto | auto];
apply var_eq_refl.
solve[left; if_tac; simpl; [apply var_eq_sym; auto | auto]].
Qed.

(* Specifications: *)
Lemma sp_sound c d l0 s :
clause_denote c s -> clause_denote d s -> listd clause_denote inter TT l0 s ->
listd clause_denote inter TT (sp c d l0) s.