diff --git a/theories/sets.v b/theories/sets.v
index 09049410e38688f738c8a9cbbaf68eb0fbdd0353..5651531fc79e51465e487a3baa1bf3bc0bc0138c 100644
--- a/theories/sets.v
+++ b/theories/sets.v
@@ -1169,23 +1169,11 @@ Proof.
   intros xs. exists (fresh xs). split; [set_solver|]. apply infinite_is_fresh.
 Qed.
 
-Lemma dec_pred_finite {A} (P : A → Prop) {Hdec : ∀ x, Decision (P x)} :
-  pred_finite P ↔ ∃ (xs : list A), ∀ x, P x ↔ x ∈ xs.
+Lemma dec_pred_finite {A} (P : A → Prop) `{!∀ x, Decision (P x)} :
+  pred_finite P ↔ ∃ xs : list A, ∀ x, P x ↔ x ∈ xs.
 Proof.
   split; intros [xs Hxs]; [|exists xs; set_solver].
-  cut (∀ n, ∃ ys, (∀ x, P x → x ∈ ys ++ drop n xs) ∧ (∀ x, x ∈ ys → P x)).
-  { intros H. specialize (H (length xs)) as (ys & H1 & H2).
-    rewrite drop_all, app_nil_r in H1. exists ys. set_solver. }
-  intros n. induction n as [ | n (ys & IH1 & IH2)].
-  { exists []. rewrite drop_0. set_solver. }
-  destruct (decide (n < length xs)) as [[y Hn]%lookup_lt_is_Some | ?].
-  { destruct (decide (P y)) as [Hy | Hy].
-    { exists (ys ++ [y]). pose proof (assoc app) as <-. cbn.
-      rewrite <-drop_S; set_solver. }
-    { exists ys. split; [|done]. intros x Hx.
-      specialize (IH1 x Hx) as [? | Hx_elem_of]%elem_of_app; [set_solver|].
-      erewrite drop_S in Hx_elem_of; set_solver. } }
-  { exists ys. revert IH1. rewrite !drop_ge, app_nil_r; [done|lia..]. }
+  exists (filter P xs). intros x. rewrite elem_of_list_filter. naive_solver.
 Qed.
 
 Lemma finite_sig_pred_finite {A} (P : A → Prop) `{Finite (sig P)} :