Skip to content
Snippets Groups Projects
Commit ead373e4 authored by Robbert Krebbers's avatar Robbert Krebbers
Browse files

Clean up `empty_{inv,iff}` lemmas.

Write them all using `:left_right_arrow:` and consistently use the `_iff` suffix.
parent 1b3a09b4
No related branches found
No related tags found
1 merge request!307Clean up `empty{',_inv,_iff}` lemmas.
...@@ -640,8 +640,9 @@ Proof. apply map_empty; intros i. by rewrite lookup_fmap, lookup_empty. Qed. ...@@ -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} ∅. 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. 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. Proof.
split; [|intros ->; by rewrite fmap_empty].
intros Hm. apply map_eq; intros i. generalize (f_equal (lookup i) Hm). intros Hm. apply map_eq; intros i. generalize (f_equal (lookup i) Hm).
by rewrite lookup_fmap, !lookup_empty, fmap_None. by rewrite lookup_fmap, !lookup_empty, fmap_None.
Qed. Qed.
...@@ -928,13 +929,11 @@ Proof. ...@@ -928,13 +929,11 @@ Proof.
by rewrite <-list_to_map_fmap, map_to_list_to_map. by rewrite <-list_to_map_fmap, map_to_list_to_map.
Qed. Qed.
Lemma map_to_list_empty_inv_alt {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. 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 = ∅.
Proof. 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. Qed.
Lemma map_to_list_insert_inv {A} (m : M A) l i x : Lemma map_to_list_insert_inv {A} (m : M A) l i x :
...@@ -950,15 +949,15 @@ Qed. ...@@ -950,15 +949,15 @@ Qed.
Lemma map_choose {A} (m : M A) : m i x, m !! i = Some x. Lemma map_choose {A} (m : M A) : m i x, m !! i = Some x.
Proof. Proof.
intros Hemp. destruct (map_to_list m) as [|[i x] l] eqn:Hm. rewrite <-map_to_list_empty_iff.
{ destruct Hemp; eauto using map_to_list_empty_inv. } 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. exists i, x. rewrite <-elem_of_map_to_list, Hm. by left.
Qed. Qed.
Global Instance map_eq_dec_empty {A} (m : M A) : Decision (m = ) | 20. Global Instance map_eq_dec_empty {A} (m : M A) : Decision (m = ) | 20.
Proof. Proof.
refine (cast_if (decide (map_to_list m = []))); refine (cast_if (decide (map_to_list m = [])));
by rewrite <-?map_to_list_empty'. by rewrite <-?map_to_list_empty_iff.
Defined. Defined.
(** Properties of the imap function *) (** Properties of the imap function *)
...@@ -1039,14 +1038,9 @@ Proof. unfold map_imap. by rewrite map_to_list_empty. Qed. ...@@ -1039,14 +1038,9 @@ Proof. unfold map_imap. by rewrite map_to_list_empty. Qed.
(** ** Properties of the size operation *) (** ** Properties of the size operation *)
Lemma map_size_empty {A} : size ( : M A) = 0. Lemma map_size_empty {A} : size ( : M A) = 0.
Proof. unfold size, map_size. by rewrite map_to_list_empty. Qed. 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 = ∅. Lemma map_size_empty_iff {A} (m : M A) : size m = 0 m = ∅.
Proof. Proof.
split; [apply map_size_empty_inv|]. unfold size, map_size. by rewrite length_zero_iff_nil, map_to_list_empty_iff.
by intros ->; rewrite map_size_empty.
Qed. Qed.
Lemma map_size_non_empty_iff {A} (m : M A) : size m 0 m ∅. Lemma map_size_non_empty_iff {A} (m : M A) : size m 0 m ∅.
Proof. by rewrite map_size_empty_iff. Qed. Proof. by rewrite map_size_empty_iff. Qed.
...@@ -1147,7 +1141,7 @@ Proof. ...@@ -1147,7 +1141,7 @@ Proof.
{ intros help m. { intros help m.
apply (help (map_to_list m)); auto using NoDup_fst_map_to_list. } 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. 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. inversion_clear Hnodup.
apply map_to_list_insert_inv in Hml; subst m. apply Hins. apply map_to_list_insert_inv in Hml; subst m. apply Hins.
- by apply not_elem_of_list_to_map_1. - by apply not_elem_of_list_to_map_1.
...@@ -1159,7 +1153,7 @@ Proof. ...@@ -1159,7 +1153,7 @@ Proof.
revert m2. induction m1 as [|i x m ? IH] using map_ind. revert m2. induction m1 as [|i x m ? IH] using map_ind.
{ intros m2 Hm2. rewrite map_to_list_empty. simpl. { intros m2 Hm2. rewrite map_to_list_empty. simpl.
apply neq_0_lt. intros Hlen. symmetry in Hlen. 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). } rewrite Hlen in Hm2. destruct (irreflexivity () Hm2). }
intros m2 Hm2. intros m2 Hm2.
destruct (insert_subset_inv m m2 i x) as (m2'&?&?&?); auto; subst. destruct (insert_subset_inv m m2 i x) as (m2'&?&?&?); auto; subst.
...@@ -3031,11 +3025,8 @@ Section kmap. ...@@ -3031,11 +3025,8 @@ Section kmap.
Lemma kmap_empty {A} : kmap f =@{M2 A} ∅. Lemma kmap_empty {A} : kmap f =@{M2 A} ∅.
Proof. unfold kmap. by rewrite map_to_list_empty. Qed. Proof. unfold kmap. by rewrite map_to_list_empty. Qed.
Lemma kmap_empty_inv {A} (m : M1 A) : kmap f m = m = ∅. Lemma kmap_empty_iff {A} (m : M1 A) : kmap f m = m = ∅.
Proof. Proof. rewrite !map_empty. setoid_rewrite lookup_kmap_None. naive_solver. Qed.
intros Hm. apply map_empty; intros i.
apply (lookup_kmap_None _ (f i)); [|done]. by rewrite Hm, lookup_empty.
Qed.
Lemma kmap_singleton {A} i (x : A) : kmap f {[ i := x ]} = {[ f i := x ]}. Lemma kmap_singleton {A} i (x : A) : kmap f {[ i := x ]} = {[ f i := x ]}.
Proof. unfold kmap. by rewrite map_to_list_singleton. Qed. Proof. unfold kmap. by rewrite map_to_list_singleton. Qed.
......
...@@ -77,15 +77,11 @@ Proof. ...@@ -77,15 +77,11 @@ Proof.
apply elem_of_nil_inv; intros x. apply elem_of_nil_inv; intros x.
rewrite elem_of_elements, elem_of_empty; tauto. rewrite elem_of_elements, elem_of_empty; tauto.
Qed. Qed.
Lemma elements_empty_inv X : elements X = [] X ∅. Lemma elements_empty_iff X : elements X = [] X ∅.
Proof. Proof.
intros HX; apply elem_of_equiv_empty; intros x. rewrite <-Permutation_nil_r. split; [|intros ->; by rewrite elements_empty].
rewrite <-elem_of_elements, HX, elem_of_nil. tauto. intros HX. apply elem_of_equiv_empty; intros x.
Qed. rewrite <-elem_of_elements, HX. apply not_elem_of_nil.
Lemma elements_empty' X : elements X = [] X ∅.
Proof.
split; intros HX; [by apply elements_empty_inv|].
by rewrite <-Permutation_nil_r, HX, elements_empty.
Qed. Qed.
Lemma elements_union_singleton (X : C) x : Lemma elements_union_singleton (X : C) x :
...@@ -127,13 +123,12 @@ Proof. intros ?? E. apply Permutation_length. by rewrite E. Qed. ...@@ -127,13 +123,12 @@ Proof. intros ?? E. apply Permutation_length. by rewrite E. Qed.
Lemma size_empty : size ( : C) = 0. Lemma size_empty : size ( : C) = 0.
Proof. unfold size, set_size. simpl. by rewrite elements_empty. Qed. 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. Proof.
split; [|intros ->; by rewrite size_empty].
intros; apply equiv_empty; intros x; rewrite <-elem_of_elements. intros; apply equiv_empty; intros x; rewrite <-elem_of_elements.
by rewrite (nil_length_inv (elements X)), ?elem_of_nil. by rewrite (nil_length_inv (elements X)), ?elem_of_nil.
Qed. 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 ∅. Lemma size_non_empty_iff (X : C) : size X 0 X ∅.
Proof. by rewrite size_empty_iff. Qed. Proof. by rewrite size_empty_iff. Qed.
......
...@@ -406,18 +406,15 @@ Section more_lemmas. ...@@ -406,18 +406,15 @@ Section more_lemmas.
Proof. Proof.
unfold elements, gmultiset_elements; simpl. by rewrite map_to_list_empty. unfold elements, gmultiset_elements; simpl. by rewrite map_to_list_empty.
Qed. Qed.
Lemma gmultiset_elements_empty_inv X : elements X = [] X = ∅. Lemma gmultiset_elements_empty_iff X : elements X = [] X = ∅.
Proof. Proof.
split; [|intros ->; by rewrite gmultiset_elements_empty].
destruct X as [X]; unfold elements, gmultiset_elements; simpl. destruct X as [X]; unfold elements, gmultiset_elements; simpl.
intros; apply (f_equal GMultiSet). destruct (map_to_list X) as [|[]] eqn:?. 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. - naive_solver.
Qed. 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 ]. Lemma gmultiset_elements_singleton x : elements ({[+ x +]} : gmultiset A) = [ x ].
Proof. Proof.
unfold elements, gmultiset_elements; simpl. by rewrite map_to_list_singleton. unfold elements, gmultiset_elements; simpl. by rewrite map_to_list_singleton.
...@@ -478,15 +475,10 @@ Section more_lemmas. ...@@ -478,15 +475,10 @@ Section more_lemmas.
(** Properties of the size operation *) (** Properties of the size operation *)
Lemma gmultiset_size_empty : size ( : gmultiset A) = 0. Lemma gmultiset_size_empty : size ( : gmultiset A) = 0.
Proof. done. Qed. 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 = ∅. Lemma gmultiset_size_empty_iff X : size X = 0 X = ∅.
Proof. Proof.
split; [apply gmultiset_size_empty_inv|]. unfold size, gmultiset_size; simpl.
by intros ->; rewrite gmultiset_size_empty. by rewrite length_zero_iff_nil, gmultiset_elements_empty_iff.
Qed. Qed.
Lemma gmultiset_size_non_empty_iff X : size X 0 X ∅. Lemma gmultiset_size_non_empty_iff X : size X 0 X ∅.
Proof. by rewrite gmultiset_size_empty_iff. Qed. Proof. by rewrite gmultiset_size_empty_iff. Qed.
...@@ -494,7 +486,7 @@ Section more_lemmas. ...@@ -494,7 +486,7 @@ Section more_lemmas.
Lemma gmultiset_choose_or_empty X : ( x, x X) X = ∅. Lemma gmultiset_choose_or_empty X : ( x, x X) X = ∅.
Proof. Proof.
destruct (elements X) as [|x l] eqn:HX; [right|left]. 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. - exists x. rewrite <-gmultiset_elem_of_elements, HX. by left.
Qed. Qed.
Lemma gmultiset_choose X : X x, x X. Lemma gmultiset_choose X : X x, x X.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment