diff --git a/algebra/upred_big_op.v b/algebra/upred_big_op.v index 93e3c72ebb584884afb9317cd2f0947db0041215..aa77bcfb29cd4070a8e5fc0e4495b369a48be8cd 100644 --- a/algebra/upred_big_op.v +++ b/algebra/upred_big_op.v @@ -40,11 +40,15 @@ Notation "'[★' 'set' ] x ∈ X , P" := (uPred_big_sepS X (λ x, P)) (at level 200, X at level 10, x at level 1, right associativity, format "[★ set ] x ∈ X , P") : uPred_scope. -(** * Persistence of lists of uPreds *) +(** * Persistence and timelessness of lists of uPreds *) Class PersistentL {M} (Ps : list (uPred M)) := persistentL : Forall PersistentP Ps. Arguments persistentL {_} _ {_}. +Class TimelessL {M} (Ps : list (uPred M)) := + timelessL : Forall TimelessP Ps. +Arguments timelessL {_} _ {_}. + (** * Properties *) Section big_op. Context {M : ucmraT}. @@ -104,6 +108,54 @@ Proof. induction 1; simpl; auto with I. Qed. Lemma big_sep_elem_of Ps P : P ∈ Ps → [★] Ps ⊢ P. Proof. induction 1; simpl; auto with I. Qed. +(** ** Persistence *) +Global Instance big_and_persistent Ps : PersistentL Ps → PersistentP ([∧] Ps). +Proof. induction 1; apply _. Qed. +Global Instance big_sep_persistent Ps : PersistentL Ps → PersistentP ([★] Ps). +Proof. induction 1; apply _. Qed. + +Global Instance nil_persistent : PersistentL (@nil (uPred M)). +Proof. constructor. Qed. +Global Instance cons_persistent P Ps : + PersistentP P → PersistentL Ps → PersistentL (P :: Ps). +Proof. by constructor. Qed. +Global Instance app_persistent Ps Ps' : + PersistentL Ps → PersistentL Ps' → PersistentL (Ps ++ Ps'). +Proof. apply Forall_app_2. Qed. + +Global Instance fmap_persistent {A} (f : A → uPred M) xs : + (∀ x, PersistentP (f x)) → PersistentL (f <$> xs). +Proof. unfold PersistentL=> ?; induction xs; constructor; auto. Qed. +Global Instance zip_with_persistent {A B} (f : A → B → uPred M) xs ys : + (∀ x y, PersistentP (f x y)) → PersistentL (zip_with f xs ys). +Proof. + unfold PersistentL=> ?; revert ys; induction xs=> -[|??]; constructor; auto. +Qed. + +(** ** Timelessness *) +Global Instance big_and_timeless Ps : TimelessL Ps → TimelessP ([∧] Ps). +Proof. induction 1; apply _. Qed. +Global Instance big_sep_timeless Ps : TimelessL Ps → TimelessP ([★] Ps). +Proof. induction 1; apply _. Qed. + +Global Instance nil_timeless : TimelessL (@nil (uPred M)). +Proof. constructor. Qed. +Global Instance cons_timeless P Ps : + TimelessP P → TimelessL Ps → TimelessL (P :: Ps). +Proof. by constructor. Qed. +Global Instance app_timeless Ps Ps' : + TimelessL Ps → TimelessL Ps' → TimelessL (Ps ++ Ps'). +Proof. apply Forall_app_2. Qed. + +Global Instance fmap_timeless {A} (f : A → uPred M) xs : + (∀ x, TimelessP (f x)) → TimelessL (f <$> xs). +Proof. unfold TimelessL=> ?; induction xs; constructor; auto. Qed. +Global Instance zip_with_timeless {A B} (f : A → B → uPred M) xs ys : + (∀ x y, TimelessP (f x y)) → TimelessL (zip_with f xs ys). +Proof. + unfold TimelessL=> ?; revert ys; induction xs=> -[|??]; constructor; auto. +Qed. + (** ** Big ops over finite maps *) Section gmap. Context `{Countable K} {A : Type}. @@ -253,6 +305,14 @@ Section gmap. rewrite -big_sepM_forall -big_sepM_sepM. apply big_sepM_mono; auto=> k x ?. by rewrite -always_wand_impl always_elim wand_elim_l. Qed. + + Global Instance big_sepM_persistent Φ m : + (∀ k x, PersistentP (Φ k x)) → PersistentP ([★ map] k↦x ∈ m, Φ k x). + Proof. intros. apply big_sep_persistent, fmap_persistent=>-[??] /=; auto. Qed. + + Global Instance big_sepM_timeless Φ m : + (∀ k x, TimelessP (Φ k x)) → TimelessP ([★ map] k↦x ∈ m, Φ k x). + Proof. intro. apply big_sep_timeless, fmap_timeless=> -[??] /=; auto. Qed. End gmap. (** ** Big ops over finite sets *) @@ -372,25 +432,13 @@ Section gset. rewrite -big_sepS_forall -big_sepS_sepS. apply big_sepS_mono; auto=> x ?. by rewrite -always_wand_impl always_elim wand_elim_l. Qed. -End gset. -(** ** Persistence *) -Global Instance big_and_persistent Ps : PersistentL Ps → PersistentP ([∧] Ps). -Proof. induction 1; apply _. Qed. -Global Instance big_sep_persistent Ps : PersistentL Ps → PersistentP ([★] Ps). -Proof. induction 1; apply _. Qed. + Global Instance big_sepS_persistent Φ X : + (∀ x, PersistentP (Φ x)) → PersistentP ([★ set] x ∈ X, Φ x). + Proof. rewrite /uPred_big_sepS. apply _. Qed. -Global Instance nil_persistent : PersistentL (@nil (uPred M)). -Proof. constructor. Qed. -Global Instance cons_persistent P Ps : - PersistentP P → PersistentL Ps → PersistentL (P :: Ps). -Proof. by constructor. Qed. -Global Instance app_persistent Ps Ps' : - PersistentL Ps → PersistentL Ps' → PersistentL (Ps ++ Ps'). -Proof. apply Forall_app_2. Qed. -Global Instance zip_with_persistent {A B} (f : A → B → uPred M) xs ys : - (∀ x y, PersistentP (f x y)) → PersistentL (zip_with f xs ys). -Proof. - unfold PersistentL=> ?; revert ys; induction xs=> -[|??]; constructor; auto. -Qed. + Global Instance big_sepS_timeless Φ X : + (∀ x, TimelessP (Φ x)) → TimelessP ([★ set] x ∈ X, Φ x). + Proof. rewrite /uPred_big_sepS. apply _. Qed. +End gset. End big_op.