diff --git a/tests/sets.v b/tests/sets.v index 9aea1a62b0bda62f4f1c373be747ed670ff9ba38..9939a187a5e4343c356c9f4b6363ac1e8e401082 100644 --- a/tests/sets.v +++ b/tests/sets.v @@ -2,3 +2,8 @@ From stdpp Require Import sets. Lemma foo `{Set_ A C} (x : A) (X Y : C) : x ∈ X ∩ Y → x ∈ X. Proof. intros Hx. set_unfold in Hx. tauto. Qed. + +(** Test [set_unfold_list_bind]. *) +Lemma elem_of_list_bind_again {A B} (x : B) (l : list A) f : + x ∈ l ≫= f ↔ ∃ y, x ∈ f y ∧ y ∈ l. +Proof. set_solver. Qed. diff --git a/theories/sets.v b/theories/sets.v index 6152085c67f807e3e25f05a3ea7ae89012c5ac17..ec22d0c24c1029d5c37ba618675c235d838d95e3 100644 --- a/theories/sets.v +++ b/theories/sets.v @@ -308,6 +308,10 @@ Section set_unfold_list. SetUnfoldElemOf x l P → SetUnfoldElemOf x (rotate n l) P. Proof. constructor. by rewrite elem_of_rotate, (set_unfold_elem_of x l P). Qed. + Global Instance set_unfold_list_bind {B} (f : A → list B) l P Q y : + (∀ x, SetUnfoldElemOf x l (P x)) → (∀ x, SetUnfoldElemOf y (f x) (Q x)) → + SetUnfoldElemOf y (l ≫= f) (∃ x, Q x ∧ P x). + Proof. constructor. rewrite elem_of_list_bind. naive_solver. Qed. End set_unfold_list. Tactic Notation "set_unfold" :=