diff --git a/prelude/collections.v b/prelude/collections.v
index 1a36815dbc9bf281d13a12ac502c4626c82866b1..08f391b49a78242157cfe1bf2f0827278e4ef8ee 100644
--- a/prelude/collections.v
+++ b/prelude/collections.v
@@ -265,6 +265,7 @@ Ltac set_unfold :=
 [set_solver] already. We use the [naive_solver] tactic as a substitute.
 This tactic either fails or proves the goal. *)
 Tactic Notation "set_solver" "by" tactic3(tac) :=
+  try done;
   intros; setoid_subst;
   set_unfold;
   intros; setoid_subst;
@@ -278,6 +279,10 @@ Tactic Notation "set_solver" := set_solver by idtac.
 Tactic Notation "set_solver" "-" hyp_list(Hs) := clear Hs; set_solver.
 Tactic Notation "set_solver" "+" hyp_list(Hs) := clear -Hs; set_solver.
 
+Hint Extern 1000 (_ ∉ _) => set_solver : set_solver.
+Hint Extern 1000 (_ ∈ _) => set_solver : set_solver.
+Hint Extern 1000 (_ ⊆ _) => set_solver : set_solver.
+
 (** * Conversion of option and list *)
 Definition of_option `{Singleton A C, Empty C} (mx : option A) : C :=
   match mx with None => ∅ | Some x => {[ x ]} end.