diff --git a/theories/fin_maps.v b/theories/fin_maps.v
index 0c491c92381ddda38a26229c3ee414080153a948..2d64906984cc3a8b2eb4f21f3b866ead79f62ca3 100644
--- a/theories/fin_maps.v
+++ b/theories/fin_maps.v
@@ -640,8 +640,9 @@ Proof. apply map_empty; intros i. by rewrite lookup_fmap, lookup_empty. Qed.
 Lemma omap_empty {A B} (f : A → option B) : omap f ∅ =@{M B} ∅.
 Proof. apply map_empty; intros i. by rewrite lookup_omap, lookup_empty. Qed.
 
-Lemma fmap_empty_inv {A B} (f : A → B) m : f <$> m =@{M B} ∅ → m = ∅.
+Lemma fmap_empty_iff {A B} (f : A → B) m : f <$> m =@{M B} ∅ ↔ m = ∅.
 Proof.
+  split; [|intros ->; by rewrite fmap_empty].
   intros Hm. apply map_eq; intros i. generalize (f_equal (lookup i) Hm).
   by rewrite lookup_fmap, !lookup_empty, fmap_None.
 Qed.
@@ -928,13 +929,11 @@ Proof.
   by rewrite <-list_to_map_fmap, map_to_list_to_map.
 Qed.
 
-Lemma map_to_list_empty_inv_alt {A}  (m : M A) : map_to_list m ≡ₚ [] → m = ∅.
-Proof. rewrite <-map_to_list_empty. apply map_to_list_inj. Qed.
-Lemma map_to_list_empty_inv {A} (m : M A) : map_to_list m = [] → m = ∅.
-Proof. intros Hm. apply map_to_list_empty_inv_alt. by rewrite Hm. Qed.
-Lemma map_to_list_empty' {A} (m : M A) : map_to_list m = [] ↔ m = ∅.
+Lemma map_to_list_empty_iff {A} (m : M A) : map_to_list m = [] ↔ m = ∅.
 Proof.
-  split; [apply map_to_list_empty_inv|]. intros ->. apply map_to_list_empty.
+  split.
+  - rewrite <-Permutation_nil_r, <-map_to_list_empty. apply map_to_list_inj.
+  - intros ->. apply map_to_list_empty.
 Qed.
 
 Lemma map_to_list_insert_inv {A} (m : M A) l i x :
@@ -950,15 +949,15 @@ Qed.
 
 Lemma map_choose {A} (m : M A) : m ≠ ∅ → ∃ i x, m !! i = Some x.
 Proof.
-  intros Hemp. destruct (map_to_list m) as [|[i x] l] eqn:Hm.
-  { destruct Hemp; eauto using map_to_list_empty_inv. }
+  rewrite <-map_to_list_empty_iff.
+  intros Hemp. destruct (map_to_list m) as [|[i x] l] eqn:Hm; [done|].
   exists i, x. rewrite <-elem_of_map_to_list, Hm. by left.
 Qed.
 
 Global Instance map_eq_dec_empty {A} (m : M A) : Decision (m = ∅) | 20.
 Proof.
   refine (cast_if (decide (map_to_list m = [])));
-    by rewrite <-?map_to_list_empty'.
+    by rewrite <-?map_to_list_empty_iff.
 Defined.
 
 (** Properties of the imap function *)
@@ -1039,14 +1038,9 @@ Proof. unfold map_imap. by rewrite map_to_list_empty. Qed.
 (** ** Properties of the size operation *)
 Lemma map_size_empty {A} : size (∅ : M A) = 0.
 Proof. unfold size, map_size. by rewrite map_to_list_empty. Qed.
-Lemma map_size_empty_inv {A} (m : M A) : size m = 0 → m = ∅.
-Proof.
-  unfold size, map_size. by rewrite length_zero_iff_nil, map_to_list_empty'.
-Qed.
 Lemma map_size_empty_iff {A} (m : M A) : size m = 0 ↔ m = ∅.
 Proof.
-  split; [apply map_size_empty_inv|].
-  by intros ->; rewrite map_size_empty.
+  unfold size, map_size. by rewrite length_zero_iff_nil, map_to_list_empty_iff.
 Qed.
 Lemma map_size_non_empty_iff {A} (m : M A) : size m ≠ 0 ↔ m ≠ ∅.
 Proof. by rewrite map_size_empty_iff. Qed.
@@ -1147,7 +1141,7 @@ Proof.
   { intros help m.
     apply (help (map_to_list m)); auto using NoDup_fst_map_to_list. }
   intros l. induction l as [|[i x] l IH]; intros Hnodup m Hml.
-  { apply map_to_list_empty_inv_alt in Hml. by subst. }
+  { rewrite Permutation_nil_r, map_to_list_empty_iff in Hml. by rewrite Hml. }
   inversion_clear Hnodup.
   apply map_to_list_insert_inv in Hml; subst m. apply Hins.
   - by apply not_elem_of_list_to_map_1.
@@ -1159,7 +1153,7 @@ Proof.
   revert m2. induction m1 as [|i x m ? IH] using map_ind.
   { intros m2 Hm2. rewrite map_to_list_empty. simpl.
     apply neq_0_lt. intros Hlen. symmetry in Hlen.
-    apply nil_length_inv, map_to_list_empty_inv in Hlen.
+    apply nil_length_inv, map_to_list_empty_iff in Hlen.
     rewrite Hlen in Hm2. destruct (irreflexivity (⊂) ∅ Hm2). }
   intros m2 Hm2.
   destruct (insert_subset_inv m m2 i x) as (m2'&?&?&?); auto; subst.
@@ -3031,11 +3025,8 @@ Section kmap.
 
   Lemma kmap_empty {A} : kmap f ∅ =@{M2 A} ∅.
   Proof. unfold kmap. by rewrite map_to_list_empty. Qed.
-  Lemma kmap_empty_inv {A} (m : M1 A) : kmap f m = ∅ → m = ∅.
-  Proof.
-    intros Hm. apply map_empty; intros i.
-    apply (lookup_kmap_None _ (f i)); [|done]. by rewrite Hm, lookup_empty.
-  Qed.
+  Lemma kmap_empty_iff {A} (m : M1 A) : kmap f m = ∅ ↔ m = ∅.
+  Proof. rewrite !map_empty. setoid_rewrite lookup_kmap_None. naive_solver. Qed.
 
   Lemma kmap_singleton {A} i (x : A) : kmap f {[ i := x ]} = {[ f i := x ]}.
   Proof. unfold kmap. by rewrite map_to_list_singleton. Qed.
diff --git a/theories/fin_sets.v b/theories/fin_sets.v
index 2aaa7c5361acef463dd63a664ec0e5e883af6b5e..c47c8e643bc6c25aaa0341c37e921c8e0c472e50 100644
--- a/theories/fin_sets.v
+++ b/theories/fin_sets.v
@@ -77,15 +77,11 @@ Proof.
   apply elem_of_nil_inv; intros x.
   rewrite elem_of_elements, elem_of_empty; tauto.
 Qed.
-Lemma elements_empty_inv X : elements X = [] → X ≡ ∅.
+Lemma elements_empty_iff X : elements X = [] ↔ X ≡ ∅.
 Proof.
-  intros HX; apply elem_of_equiv_empty; intros x.
-  rewrite <-elem_of_elements, HX, elem_of_nil. tauto.
-Qed.
-Lemma elements_empty' X : elements X = [] ↔ X ≡ ∅.
-Proof.
-  split; intros HX; [by apply elements_empty_inv|].
-  by rewrite <-Permutation_nil_r, HX, elements_empty.
+  rewrite <-Permutation_nil_r. split; [|intros ->; by rewrite elements_empty].
+  intros HX. apply elem_of_equiv_empty; intros x.
+  rewrite <-elem_of_elements, HX. apply not_elem_of_nil.
 Qed.
 
 Lemma elements_union_singleton (X : C) x :
@@ -127,13 +123,12 @@ Proof. intros ?? E. apply Permutation_length. by rewrite E. Qed.
 
 Lemma size_empty : size (∅ : C) = 0.
 Proof. unfold size, set_size. simpl. by rewrite elements_empty. Qed.
-Lemma size_empty_inv (X : C) : size X = 0 → X ≡ ∅.
+Lemma size_empty_iff (X : C) : size X = 0 ↔ X ≡ ∅.
 Proof.
+  split; [|intros ->; by rewrite size_empty].
   intros; apply equiv_empty; intros x; rewrite <-elem_of_elements.
   by rewrite (nil_length_inv (elements X)), ?elem_of_nil.
 Qed.
-Lemma size_empty_iff (X : C) : size X = 0 ↔ X ≡ ∅.
-Proof. split; [apply size_empty_inv|]. by intros ->; rewrite size_empty. Qed.
 Lemma size_non_empty_iff (X : C) : size X ≠ 0 ↔ X ≢ ∅.
 Proof. by rewrite size_empty_iff. Qed.
 
diff --git a/theories/gmultiset.v b/theories/gmultiset.v
index 46486b49b33f973a708c89d08bb4b76b3b233418..c6eb06ca60458c57172b019160d89ffead06a66a 100644
--- a/theories/gmultiset.v
+++ b/theories/gmultiset.v
@@ -406,18 +406,15 @@ Section more_lemmas.
   Proof.
     unfold elements, gmultiset_elements; simpl. by rewrite map_to_list_empty.
   Qed.
-  Lemma gmultiset_elements_empty_inv X : elements X = [] → X = ∅.
+  Lemma gmultiset_elements_empty_iff X : elements X = [] ↔ X = ∅.
   Proof.
+    split; [|intros ->; by rewrite gmultiset_elements_empty].
     destruct X as [X]; unfold elements, gmultiset_elements; simpl.
     intros; apply (f_equal GMultiSet). destruct (map_to_list X) as [|[]] eqn:?.
-    - by apply map_to_list_empty_inv.
+    - by apply map_to_list_empty_iff.
     - naive_solver.
   Qed.
-  Lemma gmultiset_elements_empty' X : elements X = [] ↔ X = ∅.
-  Proof.
-    split; intros HX; [by apply gmultiset_elements_empty_inv|].
-    by rewrite HX, gmultiset_elements_empty.
-  Qed.
+
   Lemma gmultiset_elements_singleton x : elements ({[+ x +]} : gmultiset A) = [ x ].
   Proof.
     unfold elements, gmultiset_elements; simpl. by rewrite map_to_list_singleton.
@@ -478,15 +475,10 @@ Section more_lemmas.
   (** Properties of the size operation *)
   Lemma gmultiset_size_empty : size (∅ : gmultiset A) = 0.
   Proof. done. Qed.
-  Lemma gmultiset_size_empty_inv X : size X = 0 → X = ∅.
-  Proof.
-    unfold size, gmultiset_size; simpl. rewrite length_zero_iff_nil.
-    apply gmultiset_elements_empty_inv.
-  Qed.
   Lemma gmultiset_size_empty_iff X : size X = 0 ↔ X = ∅.
   Proof.
-    split; [apply gmultiset_size_empty_inv|].
-    by intros ->; rewrite gmultiset_size_empty.
+    unfold size, gmultiset_size; simpl.
+    by rewrite length_zero_iff_nil, gmultiset_elements_empty_iff.
   Qed.
   Lemma gmultiset_size_non_empty_iff X : size X ≠ 0 ↔ X ≠ ∅.
   Proof. by rewrite gmultiset_size_empty_iff. Qed.
@@ -494,7 +486,7 @@ Section more_lemmas.
   Lemma gmultiset_choose_or_empty X : (∃ x, x ∈ X) ∨ X = ∅.
   Proof.
     destruct (elements X) as [|x l] eqn:HX; [right|left].
-    - by apply gmultiset_elements_empty_inv.
+    - by apply gmultiset_elements_empty_iff.
     - exists x. rewrite <-gmultiset_elem_of_elements, HX. by left.
   Qed.
   Lemma gmultiset_choose X : X ≠ ∅ → ∃ x, x ∈ X.