From a43836778cdccfc83f83001ccbe14f57ef327788 Mon Sep 17 00:00:00 2001 From: Robbert Krebbers <mail@robbertkrebbers.nl> Date: Wed, 28 Sep 2016 11:46:42 +0200 Subject: [PATCH] Define big operators on uPred in terms of those on CMRAs. --- algebra/cmra_big_op.v | 118 +++++----- algebra/upred_big_op.v | 419 +++++++++--------------------------- program_logic/pviewshifts.v | 10 +- program_logic/weakestpre.v | 2 +- proofmode/coq_tactics.v | 4 +- 5 files changed, 168 insertions(+), 385 deletions(-) diff --git a/algebra/cmra_big_op.v b/algebra/cmra_big_op.v index 940225e09..122346232 100644 --- a/algebra/cmra_big_op.v +++ b/algebra/cmra_big_op.v @@ -62,8 +62,13 @@ Context {M : ucmraT}. Implicit Types xs : list M. (** * Big ops *) +Lemma big_op_Forall2 R : + Reflexive R → Proper (R ==> R ==> R) (@op M _) → + Proper (Forall2 R ==> R) (@big_op M). +Proof. rewrite /Proper /respectful. induction 3; eauto. Qed. + Global Instance big_op_ne n : Proper (dist n ==> dist n) (@big_op M). -Proof. by induction 1; simpl; repeat apply (_ : Proper (_ ==> _ ==> _) op). Qed. +Proof. apply big_op_Forall2; apply _. Qed. Global Instance big_op_proper : Proper ((≡) ==> (≡)) (@big_op M) := ne_proper _. Lemma big_op_nil : [⋅] (@nil M) = ∅. @@ -108,54 +113,48 @@ Section list. Implicit Types l : list A. Implicit Types f g : nat → A → M. + Lemma big_opL_nil f : ([⋅ list] k↦y ∈ nil, f k y) = ∅. + Proof. done. Qed. + Lemma big_opL_cons f x l : + ([⋅ list] k↦y ∈ x :: l, f k y) = f 0 x ⋅ [⋅ list] k↦y ∈ l, f (S k) y. + Proof. by rewrite /big_opL imap_cons. Qed. + Lemma big_opL_singleton f x : ([⋅ list] k↦y ∈ [x], f k y) ≡ f 0 x. + Proof. by rewrite big_opL_cons big_opL_nil right_id. Qed. + Lemma big_opL_app f l1 l2 : + ([⋅ list] k↦y ∈ l1 ++ l2, f k y) + ≡ ([⋅ list] k↦y ∈ l1, f k y) ⋅ ([⋅ list] k↦y ∈ l2, f (length l1 + k) y). + Proof. by rewrite /big_opL imap_app big_op_app. Qed. + + Lemma big_opL_forall R f g l : + Reflexive R → Proper (R ==> R ==> R) (@op M _) → + (∀ k y, l !! k = Some y → R (f k y) (g k y)) → + R ([⋅ list] k ↦ y ∈ l, f k y) ([⋅ list] k ↦ y ∈ l, g k y). + Proof. + intros ? Hop. revert f g. induction l as [|x l IH]=> f g Hf; [done|]. + rewrite !big_opL_cons. apply Hop; eauto. + Qed. + Lemma big_opL_mono f g l : (∀ k y, l !! k = Some y → f k y ≼ g k y) → ([⋅ list] k ↦ y ∈ l, f k y) ≼ [⋅ list] k ↦ y ∈ l, g k y. - Proof. - intros Hf. apply big_op_mono. - revert f g Hf. induction l as [|x l IH]=> f g Hf; first constructor. - rewrite !imap_cons; constructor; eauto. - Qed. + Proof. apply big_opL_forall; apply _. Qed. Lemma big_opL_proper f g l : (∀ k y, l !! k = Some y → f k y ≡ g k y) → ([⋅ list] k ↦ y ∈ l, f k y) ≡ ([⋅ list] k ↦ y ∈ l, g k y). - Proof. - intros Hf; apply big_op_proper. - revert f g Hf. induction l as [|x l IH]=> f g Hf; first constructor. - rewrite !imap_cons; constructor; eauto. - Qed. + Proof. apply big_opL_forall; apply _. Qed. Global Instance big_opL_ne l n : Proper (pointwise_relation _ (pointwise_relation _ (dist n)) ==> (dist n)) (big_opL (M:=M) l). - Proof. - intros f g Hf. apply big_op_ne. - revert f g Hf. induction l as [|x l IH]=> f g Hf; first constructor. - rewrite !imap_cons; constructor. by apply Hf. apply IH=> n'; apply Hf. - Qed. + Proof. intros f g Hf. apply big_opL_forall; apply _ || intros; apply Hf. Qed. Global Instance big_opL_proper' l : Proper (pointwise_relation _ (pointwise_relation _ (≡)) ==> (≡)) (big_opL (M:=M) l). - Proof. intros f1 f2 Hf. by apply big_opL_proper; intros; last apply Hf. Qed. + Proof. intros f g Hf. apply big_opL_forall; apply _ || intros; apply Hf. Qed. Global Instance big_opL_mono' l : Proper (pointwise_relation _ (pointwise_relation _ (≼)) ==> (≼)) (big_opL (M:=M) l). - Proof. intros f1 f2 Hf. by apply big_opL_mono; intros; last apply Hf. Qed. - - Lemma big_opL_nil f : ([⋅ list] k↦y ∈ nil, f k y) = ∅. - Proof. done. Qed. - - Lemma big_opL_cons f x l : - ([⋅ list] k↦y ∈ x :: l, f k y) = f 0 x ⋅ [⋅ list] k↦y ∈ l, f (S k) y. - Proof. by rewrite /big_opL imap_cons. Qed. - - Lemma big_opL_singleton f x : ([⋅ list] k↦y ∈ [x], f k y) ≡ f 0 x. - Proof. by rewrite big_opL_cons big_opL_nil right_id. Qed. - - Lemma big_opL_app f l1 l2 : - ([⋅ list] k↦y ∈ l1 ++ l2, f k y) - ≡ ([⋅ list] k↦y ∈ l1, f k y) ⋅ ([⋅ list] k↦y ∈ l2, f (length l1 + k) y). - Proof. by rewrite /big_opL imap_app big_op_app. Qed. + Proof. intros f g Hf. apply big_opL_forall; apply _ || intros; apply Hf. Qed. Lemma big_opL_lookup f l i x : l !! i = Some x → f i x ≼ [⋅ list] k↦y ∈ l, f k y. @@ -191,38 +190,40 @@ Section gmap. Implicit Types m : gmap K A. Implicit Types f g : K → A → M. + Lemma big_opM_forall R f g m : + Reflexive R → Proper (R ==> R ==> R) (@op M _) → + (∀ k x, m !! k = Some x → R (f k x) (g k x)) → + R ([⋅ map] k ↦ x ∈ m, f k x) ([⋅ map] k ↦ x ∈ m, g k x). + Proof. + intros ?? Hf. apply (big_op_Forall2 R _ _), Forall2_fmap, Forall_Forall2. + apply Forall_forall=> -[i x] ? /=. by apply Hf, elem_of_map_to_list. + Qed. + Lemma big_opM_mono f g m1 m2 : m1 ⊆ m2 → (∀ k x, m2 !! k = Some x → f k x ≼ g k x) → ([⋅ map] k ↦ x ∈ m1, f k x) ≼ [⋅ map] k ↦ x ∈ m2, g k x. Proof. - intros HX Hf. trans ([⋅ map] k↦x ∈ m2, f k x). + intros Hm Hf. trans ([⋅ map] k↦x ∈ m2, f k x). - by apply big_op_contains, fmap_contains, map_to_list_contains. - - apply big_op_mono, Forall2_fmap, Forall_Forall2. - apply Forall_forall=> -[i x] ? /=. by apply Hf, elem_of_map_to_list. + - apply big_opM_forall; apply _ || auto. Qed. Lemma big_opM_proper f g m : (∀ k x, m !! k = Some x → f k x ≡ g k x) → ([⋅ map] k ↦ x ∈ m, f k x) ≡ ([⋅ map] k ↦ x ∈ m, g k x). - Proof. - intros Hf. apply big_op_proper, equiv_Forall2, Forall2_fmap, Forall_Forall2. - apply Forall_forall=> -[i x] ? /=. by apply Hf, elem_of_map_to_list. - Qed. + Proof. apply big_opM_forall; apply _. Qed. Global Instance big_opM_ne m n : Proper (pointwise_relation _ (pointwise_relation _ (dist n)) ==> (dist n)) (big_opM (M:=M) m). - Proof. - intros f1 f2 Hf. apply big_op_ne, Forall2_fmap. - apply Forall_Forall2, Forall_true=> -[i x]; apply Hf. - Qed. + Proof. intros f g Hf. apply big_opM_forall; apply _ || intros; apply Hf. Qed. Global Instance big_opM_proper' m : Proper (pointwise_relation _ (pointwise_relation _ (≡)) ==> (≡)) (big_opM (M:=M) m). - Proof. intros f1 f2 Hf. by apply big_opM_proper; intros; last apply Hf. Qed. + Proof. intros f g Hf. apply big_opM_forall; apply _ || intros; apply Hf. Qed. Global Instance big_opM_mono' m : Proper (pointwise_relation _ (pointwise_relation _ (≼)) ==> (≼)) (big_opM (M:=M) m). - Proof. intros f1 f2 Hf. by apply big_opM_mono; intros; last apply Hf. Qed. + Proof. intros f g Hf. apply big_opM_forall; apply _ || intros; apply Hf. Qed. Lemma big_opM_empty f : ([⋅ map] k↦x ∈ ∅, f k x) = ∅. Proof. by rewrite /big_opM map_to_list_empty. Qed. @@ -296,14 +297,22 @@ Section gset. Implicit Types X : gset A. Implicit Types f : A → M. + Lemma big_opS_forall R f g X : + Reflexive R → Proper (R ==> R ==> R) (@op M _) → + (∀ x, x ∈ X → R (f x) (g x)) → + R ([⋅ set] x ∈ X, f x) ([⋅ set] x ∈ X, g x). + Proof. + intros ?? Hf. apply (big_op_Forall2 R _ _), Forall2_fmap, Forall_Forall2. + apply Forall_forall=> x ? /=. by apply Hf, elem_of_elements. + Qed. + Lemma big_opS_mono f g X Y : X ⊆ Y → (∀ x, x ∈ Y → f x ≼ g x) → ([⋅ set] x ∈ X, f x) ≼ [⋅ set] x ∈ Y, g x. Proof. intros HX Hf. trans ([⋅ set] x ∈ Y, f x). - by apply big_op_contains, fmap_contains, elements_contains. - - apply big_op_mono, Forall2_fmap, Forall_Forall2. - apply Forall_forall=> x ? /=. by apply Hf, elem_of_elements. + - apply big_opS_forall; apply _ || auto. Qed. Lemma big_opS_proper f g X Y : X ≡ Y → (∀ x, x ∈ X → x ∈ Y → f x ≡ g x) → @@ -311,23 +320,18 @@ Section gset. Proof. intros HX Hf. trans ([⋅ set] x ∈ Y, f x). - apply big_op_permutation. by rewrite HX. - - apply big_op_proper, equiv_Forall2, Forall2_fmap, Forall_Forall2. - apply Forall_forall=> x ? /=. - apply Hf; first rewrite HX; by apply elem_of_elements. + - apply big_opS_forall; try apply _ || set_solver. Qed. Lemma big_opS_ne X n : Proper (pointwise_relation _ (dist n) ==> dist n) (big_opS (M:=M) X). - Proof. - intros f1 f2 Hf. apply big_op_ne, Forall2_fmap. - apply Forall_Forall2, Forall_true=> x; apply Hf. - Qed. + Proof. intros f g Hf. apply big_opS_forall; apply _ || intros; apply Hf. Qed. Lemma big_opS_proper' X : Proper (pointwise_relation _ (≡) ==> (≡)) (big_opS (M:=M) X). - Proof. intros f1 f2 Hf. apply big_opS_proper; naive_solver. Qed. + Proof. intros f g Hf. apply big_opS_forall; apply _ || intros; apply Hf. Qed. Lemma big_opS_mono' X : Proper (pointwise_relation _ (≼) ==> (≼)) (big_opS (M:=M) X). - Proof. intros f1 f2 Hf. apply big_opS_mono; naive_solver. Qed. + Proof. intros f g Hf. apply big_opS_forall; apply _ || intros; apply Hf. Qed. Lemma big_opS_empty f : ([⋅ set] x ∈ ∅, f x) = ∅. Proof. by rewrite /big_opS elements_empty. Qed. diff --git a/algebra/upred_big_op.v b/algebra/upred_big_op.v index e0115b863..6a0c77fb0 100644 --- a/algebra/upred_big_op.v +++ b/algebra/upred_big_op.v @@ -2,56 +2,23 @@ From iris.algebra Require Export upred list cmra_big_op. From iris.prelude Require Import gmap fin_collections functions. Import uPred. -(** We define the following big operators: - -- The operator [ [★] Ps ] folds [★] over the list [Ps]. - This operator is not a quantifier, so it binds strongly. -- The operator [ [★ list] k ↦ x ∈ l, P ] asserts that [P] holds separately for - each element [x] at position [x] in the list [l]. This operator is a - quantifier, and thus has the same precedence as [∀] and [∃]. -- The operator [ [★ map] k ↦ x ∈ m, P ] asserts that [P] holds separately for - each [k ↦ x] in the map [m]. This operator is a quantifier, and thus has the - same precedence as [∀] and [∃]. -- The operator [ [★ set] x ∈ X, P ] asserts that [P] holds separately for each - [x] in the set [X]. This operator is a quantifier, and thus has the same - precedence as [∀] and [∃]. *) - -(** * Big ops over lists *) -(* These are the basic building blocks for other big ops *) -Fixpoint uPred_big_sep {M} (Ps : list (uPred M)) : uPred M := - match Ps with [] => True | P :: Ps => P ★ uPred_big_sep Ps end%I. -Instance: Params (@uPred_big_sep) 1. -Notation "'[★]' Ps" := (uPred_big_sep Ps) (at level 20) : uPred_scope. - -(** * Other big ops *) -Definition uPred_big_sepL {M A} (l : list A) - (Φ : nat → A → uPred M) : uPred M := [★] (imap Φ l). -Instance: Params (@uPred_big_sepL) 2. -Typeclasses Opaque uPred_big_sepL. -Notation "'[★' 'list' ] k ↦ x ∈ l , P" := (uPred_big_sepL l (λ k x, P)) +Notation "'[★]' Ps" := (big_op (M:=uPredUR _) Ps) (at level 20) : uPred_scope. + +Notation "'[★' 'list' ] k ↦ x ∈ l , P" := (big_opL (M:=uPredUR _) l (λ k x, P)) (at level 200, l at level 10, k, x at level 1, right associativity, format "[★ list ] k ↦ x ∈ l , P") : uPred_scope. -Notation "'[★' 'list' ] x ∈ l , P" := (uPred_big_sepL l (λ _ x, P)) +Notation "'[★' 'list' ] x ∈ l , P" := (big_opL (M:=uPredUR _) l (λ _ x, P)) (at level 200, l at level 10, x at level 1, right associativity, format "[★ list ] x ∈ l , P") : uPred_scope. -Definition uPred_big_sepM {M} `{Countable K} {A} - (m : gmap K A) (Φ : K → A → uPred M) : uPred M := - [★] (curry Φ <$> map_to_list m). -Instance: Params (@uPred_big_sepM) 6. -Typeclasses Opaque uPred_big_sepM. -Notation "'[★' 'map' ] k ↦ x ∈ m , P" := (uPred_big_sepM m (λ k x, P)) +Notation "'[★' 'map' ] k ↦ x ∈ m , P" := (big_opM (M:=uPredUR _) m (λ k x, P)) (at level 200, m at level 10, k, x at level 1, right associativity, format "[★ map ] k ↦ x ∈ m , P") : uPred_scope. -Notation "'[★' 'map' ] x ∈ m , P" := (uPred_big_sepM m (λ _ x, P)) +Notation "'[★' 'map' ] x ∈ m , P" := (big_opM (M:=uPredUR _) m (λ _ x, P)) (at level 200, m at level 10, x at level 1, right associativity, format "[★ map ] x ∈ m , P") : uPred_scope. -Definition uPred_big_sepS {M} `{Countable A} - (X : gset A) (Φ : A → uPred M) : uPred M := [★] (Φ <$> elements X). -Instance: Params (@uPred_big_sepS) 5. -Typeclasses Opaque uPred_big_sepS. -Notation "'[★' 'set' ] x ∈ X , P" := (uPred_big_sepS X (λ x, P)) +Notation "'[★' 'set' ] x ∈ X , P" := (big_opS (M:=uPredUR _) X (λ x, P)) (at level 200, X at level 10, x at level 1, right associativity, format "[★ set ] x ∈ X , P") : uPred_scope. @@ -70,31 +37,17 @@ Context {M : ucmraT}. Implicit Types Ps Qs : list (uPred M). Implicit Types A : Type. -(** ** Generic big ops over lists of upreds *) -Global Instance big_sep_proper : Proper ((≡) ==> (⊣⊢)) (@uPred_big_sep M). -Proof. by induction 1 as [|P Q Ps Qs HPQ ? IH]; rewrite /= ?HPQ ?IH. Qed. -Global Instance big_sep_ne n : Proper (dist n ==> dist n) (@uPred_big_sep M). -Proof. by induction 1 as [|P Q Ps Qs HPQ ? IH]; rewrite /= ?HPQ ?IH. Qed. -Global Instance big_sep_mono' : Proper (Forall2 (⊢) ==> (⊢)) (@uPred_big_sep M). +Global Instance big_sep_mono' : + Proper (Forall2 (⊢) ==> (⊢)) (big_op (M:=uPredUR M)). Proof. by induction 1 as [|P Q Ps Qs HPQ ? IH]; rewrite /= ?HPQ ?IH. Qed. -Global Instance big_sep_perm : Proper ((≡ₚ) ==> (⊣⊢)) (@uPred_big_sep M). -Proof. - induction 1 as [|P Ps Qs ? IH|P Q Ps|]; simpl; auto. - - by rewrite IH. - - by rewrite !assoc (comm _ P). - - etrans; eauto. -Qed. - Lemma big_sep_app Ps Qs : [★] (Ps ++ Qs) ⊣⊢ [★] Ps ★ [★] Qs. -Proof. by induction Ps as [|?? IH]; rewrite /= ?left_id -?assoc ?IH. Qed. +Proof. by rewrite big_op_app. Qed. Lemma big_sep_contains Ps Qs : Qs `contains` Ps → [★] Ps ⊢ [★] Qs. -Proof. - intros [Ps' ->]%contains_Permutation. by rewrite big_sep_app sep_elim_l. -Qed. +Proof. intros. apply uPred_included. by apply: big_op_contains. Qed. Lemma big_sep_elem_of Ps P : P ∈ Ps → [★] Ps ⊢ P. -Proof. induction 1; simpl; auto with I. Qed. +Proof. intros. apply uPred_included. by apply: big_sep_elem_of. Qed. (** ** Persistence *) Global Instance big_sep_persistent Ps : PersistentL Ps → PersistentP ([★] Ps). @@ -156,117 +109,57 @@ Section list. Implicit Types l : list A. Implicit Types Φ Ψ : nat → A → uPred M. + Lemma big_sepL_nil Φ : ([★ list] k↦y ∈ nil, Φ k y) ⊣⊢ True. + Proof. done. Qed. + Lemma big_sepL_cons Φ x l : + ([★ list] k↦y ∈ x :: l, Φ k y) ⊣⊢ Φ 0 x ★ [★ list] k↦y ∈ l, Φ (S k) y. + Proof. by rewrite big_opL_cons. Qed. + Lemma big_sepL_singleton Φ x : ([★ list] k↦y ∈ [x], Φ k y) ⊣⊢ Φ 0 x. + Proof. by rewrite big_opL_singleton. Qed. + Lemma big_sepL_app Φ l1 l2 : + ([★ list] k↦y ∈ l1 ++ l2, Φ k y) + ⊣⊢ ([★ list] k↦y ∈ l1, Φ k y) ★ ([★ list] k↦y ∈ l2, Φ (length l1 + k) y). + Proof. by rewrite big_opL_app. Qed. + Lemma big_sepL_mono Φ Ψ l : (∀ k y, l !! k = Some y → Φ k y ⊢ Ψ k y) → ([★ list] k ↦ y ∈ l, Φ k y) ⊢ [★ list] k ↦ y ∈ l, Ψ k y. - Proof. - intros HΦ. apply big_sep_mono'. - revert Φ Ψ HΦ. induction l as [|x l IH]=> Φ Ψ HΦ; first constructor. - rewrite !imap_cons; constructor; eauto. - Qed. + Proof. apply big_opL_forall; apply _. Qed. + Lemma big_sepL_proper Φ Ψ l : (∀ k y, l !! k = Some y → Φ k y ⊣⊢ Ψ k y) → ([★ list] k ↦ y ∈ l, Φ k y) ⊣⊢ ([★ list] k ↦ y ∈ l, Ψ k y). - Proof. - intros ?; apply (anti_symm (⊢)); apply big_sepL_mono; - eauto using equiv_entails, equiv_entails_sym, lookup_weaken. - Qed. + Proof. apply big_opL_proper. Qed. - Global Instance big_sepL_ne l n : - Proper (pointwise_relation _ (pointwise_relation _ (dist n)) ==> (dist n)) - (uPred_big_sepL (M:=M) l). - Proof. - intros Φ Ψ HΦ. apply big_sep_ne. - revert Φ Ψ HΦ. induction l as [|x l IH]=> Φ Ψ HΦ; first constructor. - rewrite !imap_cons; constructor. by apply HΦ. apply IH=> n'; apply HΦ. - Qed. - Global Instance big_sepL_proper' l : - Proper (pointwise_relation _ (pointwise_relation _ (⊣⊢)) ==> (⊣⊢)) - (uPred_big_sepL (M:=M) l). - Proof. intros Φ1 Φ2 HΦ. by apply big_sepL_proper; intros; last apply HΦ. Qed. Global Instance big_sepL_mono' l : Proper (pointwise_relation _ (pointwise_relation _ (⊢)) ==> (⊢)) - (uPred_big_sepL (M:=M) l). - Proof. intros Φ1 Φ2 HΦ. by apply big_sepL_mono; intros; last apply HΦ. Qed. - - Lemma big_sepL_nil Φ : ([★ list] k↦y ∈ nil, Φ k y) ⊣⊢ True. - Proof. done. Qed. - - Lemma big_sepL_cons Φ x l : - ([★ list] k↦y ∈ x :: l, Φ k y) ⊣⊢ Φ 0 x ★ [★ list] k↦y ∈ l, Φ (S k) y. - Proof. by rewrite /uPred_big_sepL imap_cons. Qed. - - Lemma big_sepL_singleton Φ x : ([★ list] k↦y ∈ [x], Φ k y) ⊣⊢ Φ 0 x. - Proof. by rewrite big_sepL_cons big_sepL_nil right_id. Qed. - - Lemma big_sepL_app Φ l1 l2 : - ([★ list] k↦y ∈ l1 ++ l2, Φ k y) - ⊣⊢ ([★ list] k↦y ∈ l1, Φ k y) ★ ([★ list] k↦y ∈ l2, Φ (length l1 + k) y). - Proof. by rewrite /uPred_big_sepL imap_app big_sep_app. Qed. + (big_opL (M:=uPredUR M) l). + Proof. intros f g Hf. apply big_opL_forall; apply _ || intros; apply Hf. Qed. Lemma big_sepL_lookup Φ l i x : l !! i = Some x → ([★ list] k↦y ∈ l, Φ k y) ⊢ Φ i x. - Proof. - intros. rewrite -(take_drop_middle l i x) // big_sepL_app big_sepL_cons. - rewrite Nat.add_0_r take_length_le; eauto using lookup_lt_Some, Nat.lt_le_incl. - by rewrite sep_elim_r sep_elim_l. - Qed. + Proof. intros. apply uPred_included. by apply: big_opL_lookup. Qed. Lemma big_sepL_elem_of (Φ : A → uPred M) l x : x ∈ l → ([★ list] y ∈ l, Φ y) ⊢ Φ x. - Proof. - intros [i ?]%elem_of_list_lookup; eauto using (big_sepL_lookup (λ _, Φ)). - Qed. + Proof. intros. apply uPred_included. by apply: big_opL_elem_of. Qed. Lemma big_sepL_fmap {B} (f : A → B) (Φ : nat → B → uPred M) l : ([★ list] k↦y ∈ f <$> l, Φ k y) ⊣⊢ ([★ list] k↦y ∈ l, Φ k (f y)). - Proof. by rewrite /uPred_big_sepL imap_fmap. Qed. + Proof. by rewrite big_opL_fmap. Qed. Lemma big_sepL_sepL Φ Ψ l : ([★ list] k↦x ∈ l, Φ k x ★ Ψ k x) ⊣⊢ ([★ list] k↦x ∈ l, Φ k x) ★ ([★ list] k↦x ∈ l, Ψ k x). - Proof. - revert Φ Ψ; induction l as [|x l IH]=> Φ Ψ. - { by rewrite !big_sepL_nil left_id. } - rewrite !big_sepL_cons IH. - by rewrite -!assoc (assoc _ (Ψ _ _)) [(Ψ _ _ ★ _)%I]comm -!assoc. - Qed. - - Lemma big_sepL_commute (Ψ: uPred M → uPred M) `{!Proper ((≡) ==> (≡)) Ψ} Φ l : - Ψ True ⊣⊢ True → - (∀ P Q, Ψ (P ★ Q) ⊣⊢ Ψ P ★ Ψ Q) → - Ψ ([★ list] k↦x ∈ l, Φ k x) ⊣⊢ ([★ list] k↦x ∈ l, Ψ (Φ k x)). - Proof. - intros ??. revert Φ. induction l as [|x l IH]=> Φ //. - by rewrite !big_sepL_cons -IH. - Qed. - Lemma big_sepL_op_commute {B : ucmraT} - (Ψ: B → uPred M) `{!Proper ((≡) ==> (≡)) Ψ} (f : nat → A → B) l : - Ψ ∅ ⊣⊢ True → - (∀ x y, Ψ (x ⋅ y) ⊣⊢ Ψ x ★ Ψ y) → - Ψ ([⋅ list] k↦x ∈ l, f k x) ⊣⊢ ([★ list] k↦x ∈ l, Ψ (f k x)). - Proof. - intros ??. revert f. induction l as [|x l IH]=> f //. - by rewrite big_sepL_cons big_opL_cons -IH. - Qed. - Lemma big_sepL_op_commute1 {B : ucmraT} - (Ψ: B → uPred M) `{!Proper ((≡) ==> (≡)) Ψ} (f : nat → A → B) l : - (∀ x y, Ψ (x ⋅ y) ⊣⊢ Ψ x ★ Ψ y) → - l ≠[] → - Ψ ([⋅ list] k↦x ∈ l, f k x) ⊣⊢ ([★ list] k↦x ∈ l, Ψ (f k x)). - Proof. - intros ??. revert f. induction l as [|x [|x' l'] IH]=> f //. - { by rewrite big_sepL_singleton big_opL_singleton. } - by rewrite big_sepL_cons big_opL_cons -IH. - Qed. + Proof. by rewrite big_opL_opL. Qed. Lemma big_sepL_later Φ l : ▷ ([★ list] k↦x ∈ l, Φ k x) ⊣⊢ ([★ list] k↦x ∈ l, ▷ Φ k x). - Proof. apply (big_sepL_commute _); auto using later_True, later_sep. Qed. + Proof. apply (big_opL_commute _). apply later_True. apply later_sep. Qed. Lemma big_sepL_always Φ l : (□ [★ list] k↦x ∈ l, Φ k x) ⊣⊢ ([★ list] k↦x ∈ l, □ Φ k x). - Proof. apply (big_sepL_commute _); auto using always_pure, always_sep. Qed. + Proof. apply (big_opL_commute _). apply always_pure. apply always_sep. Qed. Lemma big_sepL_always_if p Φ l : □?p ([★ list] k↦x ∈ l, Φ k x) ⊣⊢ ([★ list] k↦x ∈ l, □?p Φ k x). @@ -298,17 +191,16 @@ Section list. Global Instance big_sepL_nil_persistent Φ : PersistentP ([★ list] k↦x ∈ [], Φ k x). - Proof. rewrite /uPred_big_sepL. apply _. Qed. + Proof. rewrite /big_opL. apply _. Qed. Global Instance big_sepL_persistent Φ l : (∀ k x, PersistentP (Φ k x)) → PersistentP ([★ list] k↦x ∈ l, Φ k x). - Proof. rewrite /uPred_big_sepL. apply _. Qed. - + Proof. rewrite /big_opL. apply _. Qed. Global Instance big_sepL_nil_timeless Φ : TimelessP ([★ list] k↦x ∈ [], Φ k x). - Proof. rewrite /uPred_big_sepL. apply _. Qed. + Proof. rewrite /big_opL. apply _. Qed. Global Instance big_sepL_timeless Φ l : (∀ k x, TimelessP (Φ k x)) → TimelessP ([★ list] k↦x ∈ l, Φ k x). - Proof. rewrite /uPred_big_sepL. apply _. Qed. + Proof. rewrite /big_opL. apply _. Qed. End list. @@ -322,134 +214,74 @@ Section gmap. m2 ⊆ m1 → (∀ k x, m2 !! k = Some x → Φ k x ⊢ Ψ k x) → ([★ map] k ↦ x ∈ m1, Φ k x) ⊢ [★ map] k ↦ x ∈ m2, Ψ k x. Proof. - intros HX HΦ. trans ([★ map] k↦x ∈ m2, Φ k x)%I. - - by apply big_sep_contains, fmap_contains, map_to_list_contains. - - apply big_sep_mono', Forall2_fmap, Forall_Forall2. - apply Forall_forall=> -[i x] ? /=. by apply HΦ, elem_of_map_to_list. + intros Hm HΦ. trans ([★ map] k↦x ∈ m2, Φ k x)%I. + - apply uPred_included. apply: big_op_contains. + by apply fmap_contains, map_to_list_contains. + - apply big_opM_forall; apply _ || auto. Qed. + Lemma big_sepM_proper Φ Ψ m : (∀ k x, m !! k = Some x → Φ k x ⊣⊢ Ψ k x) → ([★ map] k ↦ x ∈ m, Φ k x) ⊣⊢ ([★ map] k ↦ x ∈ m, Ψ k x). - Proof. - intros ?; apply (anti_symm (⊢)); apply big_sepM_mono; - eauto using equiv_entails, equiv_entails_sym, lookup_weaken. - Qed. + Proof. apply big_opM_proper. Qed. - Global Instance big_sepM_ne m n : - Proper (pointwise_relation _ (pointwise_relation _ (dist n)) ==> (dist n)) - (uPred_big_sepM (M:=M) m). - Proof. - intros Φ1 Φ2 HΦ. apply big_sep_ne, Forall2_fmap. - apply Forall_Forall2, Forall_true=> -[i x]; apply HΦ. - Qed. - Global Instance big_sepM_proper' m : - Proper (pointwise_relation _ (pointwise_relation _ (⊣⊢)) ==> (⊣⊢)) - (uPred_big_sepM (M:=M) m). - Proof. intros Φ1 Φ2 HΦ. by apply big_sepM_proper; intros; last apply HΦ. Qed. Global Instance big_sepM_mono' m : Proper (pointwise_relation _ (pointwise_relation _ (⊢)) ==> (⊢)) - (uPred_big_sepM (M:=M) m). - Proof. intros Φ1 Φ2 HΦ. by apply big_sepM_mono; intros; last apply HΦ. Qed. + (big_opM (M:=uPredUR M) m). + Proof. intros f g Hf. apply big_opM_forall; apply _ || intros; apply Hf. Qed. Lemma big_sepM_empty Φ : ([★ map] k↦x ∈ ∅, Φ k x) ⊣⊢ True. - Proof. by rewrite /uPred_big_sepM map_to_list_empty. Qed. + Proof. by rewrite big_opM_empty. Qed. Lemma big_sepM_insert Φ m i x : m !! i = None → ([★ map] k↦y ∈ <[i:=x]> m, Φ k y) ⊣⊢ Φ i x ★ [★ map] k↦y ∈ m, Φ k y. - Proof. intros ?; by rewrite /uPred_big_sepM map_to_list_insert. Qed. + Proof. apply: big_opM_insert. Qed. Lemma big_sepM_delete Φ m i x : m !! i = Some x → ([★ map] k↦y ∈ m, Φ k y) ⊣⊢ Φ i x ★ [★ map] k↦y ∈ delete i m, Φ k y. - Proof. - intros. rewrite -big_sepM_insert ?lookup_delete //. - by rewrite insert_delete insert_id. - Qed. + Proof. apply: big_opM_delete. Qed. Lemma big_sepM_lookup Φ m i x : m !! i = Some x → ([★ map] k↦y ∈ m, Φ k y) ⊢ Φ i x. - Proof. intros. by rewrite big_sepM_delete // sep_elim_l. Qed. + Proof. intros. apply uPred_included. by apply: big_opM_lookup. Qed. Lemma big_sepM_singleton Φ i x : ([★ map] k↦y ∈ {[i:=x]}, Φ k y) ⊣⊢ Φ i x. - Proof. - rewrite -insert_empty big_sepM_insert/=; last auto using lookup_empty. - by rewrite big_sepM_empty right_id. - Qed. + Proof. by rewrite big_opM_singleton. Qed. Lemma big_sepM_fmap {B} (f : A → B) (Φ : K → B → uPred M) m : ([★ map] k↦y ∈ f <$> m, Φ k y) ⊣⊢ ([★ map] k↦y ∈ m, Φ k (f y)). - Proof. - rewrite /uPred_big_sepM map_to_list_fmap -list_fmap_compose. - f_equiv; apply reflexive_eq, list_fmap_ext. by intros []. done. - Qed. + Proof. by rewrite big_opM_fmap. Qed. Lemma big_sepM_insert_override (Φ : K → uPred M) m i x y : m !! i = Some x → ([★ map] k↦_ ∈ <[i:=y]> m, Φ k) ⊣⊢ ([★ map] k↦_ ∈ m, Φ k). - Proof. - intros. rewrite -insert_delete big_sepM_insert ?lookup_delete //. - by rewrite -big_sepM_delete. - Qed. + Proof. apply: big_opM_insert_override. Qed. Lemma big_sepM_fn_insert {B} (Ψ : K → A → B → uPred M) (f : K → B) m i x b : m !! i = None → ([★ map] k↦y ∈ <[i:=x]> m, Ψ k y (<[i:=b]> f k)) ⊣⊢ (Ψ i x b ★ [★ map] k↦y ∈ m, Ψ k y (f k)). - Proof. - intros. rewrite big_sepM_insert // fn_lookup_insert. - apply sep_proper, big_sepM_proper; auto=> k y ?. - by rewrite fn_lookup_insert_ne; last set_solver. - Qed. + Proof. apply: big_opM_fn_insert. Qed. + Lemma big_sepM_fn_insert' (Φ : K → uPred M) m i x P : m !! i = None → ([★ map] k↦y ∈ <[i:=x]> m, <[i:=P]> Φ k) ⊣⊢ (P ★ [★ map] k↦y ∈ m, Φ k). - Proof. apply (big_sepM_fn_insert (λ _ _, id)). Qed. + Proof. apply: big_opM_fn_insert'. Qed. Lemma big_sepM_sepM Φ Ψ m : ([★ map] k↦x ∈ m, Φ k x ★ Ψ k x) ⊣⊢ ([★ map] k↦x ∈ m, Φ k x) ★ ([★ map] k↦x ∈ m, Ψ k x). - Proof. - rewrite /uPred_big_sepM. - induction (map_to_list m) as [|[i x] l IH]; csimpl; rewrite ?right_id //. - by rewrite IH -!assoc (assoc _ (Ψ _ _)) [(Ψ _ _ ★ _)%I]comm -!assoc. - Qed. - - Lemma big_sepM_commute (Ψ: uPred M → uPred M) `{!Proper ((≡) ==> (≡)) Ψ} Φ m : - Ψ True ⊣⊢ True → - (∀ P Q, Ψ (P ★ Q) ⊣⊢ Ψ P ★ Ψ Q) → - Ψ ([★ map] k↦x ∈ m, Φ k x) ⊣⊢ ([★ map] k↦x ∈ m, Ψ (Φ k x)). - Proof. - intros ??. rewrite /uPred_big_sepM. - induction (map_to_list m) as [|[i x] l IH]; rewrite //= -?IH; auto. - Qed. - Lemma big_sepM_op_commute {B : ucmraT} - (Ψ: B → uPred M) `{!Proper ((≡) ==> (≡)) Ψ} (f : K → A → B) m : - Ψ ∅ ⊣⊢ True → - (∀ x y, Ψ (x ⋅ y) ⊣⊢ Ψ x ★ Ψ y) → - Ψ ([⋅ map] k↦x ∈ m, f k x) ⊣⊢ ([★ map] k↦x ∈ m, Ψ (f k x)). - Proof. - intros ??. rewrite /big_opM /uPred_big_sepM. - induction (map_to_list m) as [|[i x] l IH]; rewrite //= -?IH; auto. - Qed. - Lemma big_sepM_op_commute1 {B : ucmraT} - (Ψ: B → uPred M) `{!Proper ((≡) ==> (≡)) Ψ} (f : K → A → B) m : - (∀ x y, Ψ (x ⋅ y) ⊣⊢ Ψ x ★ Ψ y) → - m ≠∅ → - Ψ ([⋅ map] k↦x ∈ m, f k x) ⊣⊢ ([★ map] k↦x ∈ m, Ψ (f k x)). - Proof. - rewrite -map_to_list_empty'. intros ??. rewrite /big_opM /uPred_big_sepM. - induction (map_to_list m) as [|[i x] [|i' x'] IH]; - csimpl in *; rewrite ?right_id -?IH //. - Qed. + Proof. apply: big_opM_opM. Qed. Lemma big_sepM_later Φ m : ▷ ([★ map] k↦x ∈ m, Φ k x) ⊣⊢ ([★ map] k↦x ∈ m, ▷ Φ k x). - Proof. apply (big_sepM_commute _); auto using later_True, later_sep. Qed. + Proof. apply (big_opM_commute _). apply later_True. apply later_sep. Qed. Lemma big_sepM_always Φ m : (□ [★ map] k↦x ∈ m, Φ k x) ⊣⊢ ([★ map] k↦x ∈ m, □ Φ k x). - Proof. apply (big_sepM_commute _); auto using always_pure, always_sep. Qed. + Proof. apply (big_opM_commute _). apply always_pure. apply always_sep. Qed. Lemma big_sepM_always_if p Φ m : □?p ([★ map] k↦x ∈ m, Φ k x) ⊣⊢ ([★ map] k↦x ∈ m, □?p Φ k x). @@ -462,14 +294,14 @@ Section gmap. intros. apply (anti_symm _). { apply forall_intro=> k; apply forall_intro=> x. apply impl_intro_l, pure_elim_l=> ?; by apply big_sepM_lookup. } - rewrite /uPred_big_sepM. setoid_rewrite <-elem_of_map_to_list. - induction (map_to_list m) as [|[i x] l IH]; csimpl; auto. - rewrite -always_and_sep_l; apply and_intro. - - rewrite (forall_elim i) (forall_elim x) pure_equiv; last by left. - by rewrite True_impl. + induction m as [|i x m ? IH] using map_ind; [rewrite ?big_sepM_empty; auto|]. + rewrite big_sepM_insert // -always_and_sep_l. apply and_intro. + - rewrite (forall_elim i) (forall_elim x) lookup_insert. + by rewrite pure_equiv // True_impl. - rewrite -IH. apply forall_mono=> k; apply forall_mono=> y. - apply impl_intro_l, pure_elim_l=> ?. rewrite pure_equiv; last by right. - by rewrite True_impl. + apply impl_intro_l, pure_elim_l=> ?. + rewrite lookup_insert_ne; last by intros ?; simplify_map_eq. + by rewrite pure_equiv // True_impl. Qed. Lemma big_sepM_impl Φ Ψ m : @@ -484,14 +316,13 @@ Section gmap. Global Instance big_sepM_empty_persistent Φ : PersistentP ([★ map] k↦x ∈ ∅, Φ k x). - Proof. rewrite /uPred_big_sepM map_to_list_empty. apply _. Qed. + Proof. rewrite /big_opM map_to_list_empty. apply _. 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_nil_timeless Φ : TimelessP ([★ map] k↦x ∈ ∅, Φ k x). - Proof. rewrite /uPred_big_sepM map_to_list_empty. apply _. Qed. + Proof. rewrite /big_opM map_to_list_empty. apply _. 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. @@ -509,104 +340,56 @@ Section gset. ([★ set] x ∈ X, Φ x) ⊢ [★ set] x ∈ Y, Ψ x. Proof. intros HX HΦ. trans ([★ set] x ∈ Y, Φ x)%I. - - by apply big_sep_contains, fmap_contains, elements_contains. - - apply big_sep_mono', Forall2_fmap, Forall_Forall2. - apply Forall_forall=> x ? /=. by apply HΦ, elem_of_elements. + - apply uPred_included. apply: big_op_contains. + by apply fmap_contains, elements_contains. + - apply big_opS_forall; apply _ || auto. Qed. + + Lemma big_sepS_mono' X : + Proper (pointwise_relation _ (⊢) ==> (⊢)) (big_opS (M:=uPredUR M) X). + Proof. intros f g Hf. apply big_opS_forall; apply _ || intros; apply Hf. Qed. + Lemma big_sepS_proper Φ Ψ X Y : X ≡ Y → (∀ x, x ∈ X → x ∈ Y → Φ x ⊣⊢ Ψ x) → ([★ set] x ∈ X, Φ x) ⊣⊢ ([★ set] x ∈ Y, Ψ x). - Proof. - move=> /collection_equiv_spec [??] ?; apply (anti_symm (⊢)); - apply big_sepS_mono; eauto using equiv_entails, equiv_entails_sym. - Qed. - - Lemma big_sepS_ne X n : - Proper (pointwise_relation _ (dist n) ==> dist n) (uPred_big_sepS (M:=M) X). - Proof. - intros Φ1 Φ2 HΦ. apply big_sep_ne, Forall2_fmap. - apply Forall_Forall2, Forall_true=> x; apply HΦ. - Qed. - Lemma big_sepS_proper' X : - Proper (pointwise_relation _ (⊣⊢) ==> (⊣⊢)) (uPred_big_sepS (M:=M) X). - Proof. intros Φ1 Φ2 HΦ. apply big_sepS_proper; naive_solver. Qed. - Lemma big_sepS_mono' X : - Proper (pointwise_relation _ (⊢) ==> (⊢)) (uPred_big_sepS (M:=M) X). - Proof. intros Φ1 Φ2 HΦ. apply big_sepS_mono; naive_solver. Qed. + Proof. apply: big_opS_proper. Qed. Lemma big_sepS_empty Φ : ([★ set] x ∈ ∅, Φ x) ⊣⊢ True. - Proof. by rewrite /uPred_big_sepS elements_empty. Qed. + Proof. by rewrite big_opS_empty. Qed. Lemma big_sepS_insert Φ X x : x ∉ X → ([★ set] y ∈ {[ x ]} ∪ X, Φ y) ⊣⊢ (Φ x ★ [★ set] y ∈ X, Φ y). - Proof. intros. by rewrite /uPred_big_sepS elements_union_singleton. Qed. + Proof. apply: big_opS_insert. Qed. + Lemma big_sepS_fn_insert {B} (Ψ : A → B → uPred M) f X x b : x ∉ X → ([★ set] y ∈ {[ x ]} ∪ X, Ψ y (<[x:=b]> f y)) ⊣⊢ (Ψ x b ★ [★ set] y ∈ X, Ψ y (f y)). - Proof. - intros. rewrite big_sepS_insert // fn_lookup_insert. - apply sep_proper, big_sepS_proper; auto=> y ??. - by rewrite fn_lookup_insert_ne; last set_solver. - Qed. + Proof. apply: big_opS_fn_insert. Qed. + Lemma big_sepS_fn_insert' Φ X x P : x ∉ X → ([★ set] y ∈ {[ x ]} ∪ X, <[x:=P]> Φ y) ⊣⊢ (P ★ [★ set] y ∈ X, Φ y). - Proof. apply (big_sepS_fn_insert (λ y, id)). Qed. + Proof. apply: big_opS_fn_insert'. Qed. Lemma big_sepS_delete Φ X x : x ∈ X → ([★ set] y ∈ X, Φ y) ⊣⊢ Φ x ★ [★ set] y ∈ X ∖ {[ x ]}, Φ y. - Proof. - intros. rewrite -big_sepS_insert; last set_solver. - by rewrite -union_difference_L; last set_solver. - Qed. + Proof. apply: big_opS_delete. Qed. Lemma big_sepS_elem_of Φ X x : x ∈ X → ([★ set] y ∈ X, Φ y) ⊢ Φ x. - Proof. intros. by rewrite big_sepS_delete // sep_elim_l. Qed. + Proof. intros. apply uPred_included. by apply: big_opS_elem_of. Qed. Lemma big_sepS_singleton Φ x : ([★ set] y ∈ {[ x ]}, Φ y) ⊣⊢ Φ x. - Proof. intros. by rewrite /uPred_big_sepS elements_singleton /= right_id. Qed. + Proof. apply: big_opS_singleton. Qed. Lemma big_sepS_sepS Φ Ψ X : ([★ set] y ∈ X, Φ y ★ Ψ y) ⊣⊢ ([★ set] y ∈ X, Φ y) ★ ([★ set] y ∈ X, Ψ y). - Proof. - rewrite /uPred_big_sepS. - induction (elements X) as [|x l IH]; csimpl; first by rewrite ?right_id. - by rewrite IH -!assoc (assoc _ (Ψ _)) [(Ψ _ ★ _)%I]comm -!assoc. - Qed. - - Lemma big_sepS_commute (Ψ: uPred M → uPred M) `{!Proper ((≡) ==> (≡)) Ψ} Φ X : - Ψ True ⊣⊢ True → - (∀ P Q, Ψ (P ★ Q) ⊣⊢ Ψ P ★ Ψ Q) → - Ψ ([★ set] x ∈ X, Φ x) ⊣⊢ ([★ set] x ∈ X, Ψ (Φ x)). - Proof. - intros ??. rewrite /uPred_big_sepS. - induction (elements X) as [|x l IH]; rewrite //= -?IH; auto. - Qed. - Lemma big_sepS_op_commute {B : ucmraT} - (Ψ: B → uPred M) `{!Proper ((≡) ==> (≡)) Ψ} (f : A → B) X : - Ψ ∅ ⊣⊢ True → - (∀ x y, Ψ (x ⋅ y) ⊣⊢ Ψ x ★ Ψ y) → - Ψ ([⋅ set] x ∈ X, f x) ⊣⊢ ([★ set] x ∈ X, Ψ (f x)). - Proof. - intros ??. rewrite /big_opS /uPred_big_sepS. - induction (elements X) as [|x l IH]; rewrite //= -?IH; auto. - Qed. - Lemma big_sepS_op_commute1 {B : ucmraT} - (Ψ: B → uPred M) `{!Proper ((≡) ==> (≡)) Ψ} (f : A → B) X : - (∀ x y, Ψ (x ⋅ y) ⊣⊢ Ψ x ★ Ψ y) → - X ≢ ∅ → - Ψ ([⋅ set] x ∈ X, f x) ⊣⊢ ([★ set] x ∈ X, Ψ (f x)). - Proof. - rewrite -elements_empty'. intros ??. rewrite /big_opS /uPred_big_sepS. - induction (elements X) as [|x [|x' l] IH]; - csimpl in *; rewrite ?right_id -?IH //. - Qed. + Proof. apply: big_opS_opS. Qed. Lemma big_sepS_later Φ X : ▷ ([★ set] y ∈ X, Φ y) ⊣⊢ ([★ set] y ∈ X, ▷ Φ y). - Proof. apply (big_sepS_commute _); auto using later_True, later_sep. Qed. + Proof. apply (big_opS_commute _). apply later_True. apply later_sep. Qed. Lemma big_sepS_always Φ X : □ ([★ set] y ∈ X, Φ y) ⊣⊢ ([★ set] y ∈ X, □ Φ y). - Proof. apply (big_sepS_commute _); auto using always_pure, always_sep. Qed. + Proof. apply (big_opS_commute _). apply always_pure. apply always_sep. Qed. Lemma big_sepS_always_if q Φ X : □?q ([★ set] y ∈ X, Φ y) ⊣⊢ ([★ set] y ∈ X, □?q Φ y). @@ -618,13 +401,12 @@ Section gset. intros. apply (anti_symm _). { apply forall_intro=> x. apply impl_intro_l, pure_elim_l=> ?; by apply big_sepS_elem_of. } - rewrite /uPred_big_sepS. setoid_rewrite <-elem_of_elements. - induction (elements X) as [|x l IH]; csimpl; auto. - rewrite -always_and_sep_l; apply and_intro. - - rewrite (forall_elim x) pure_equiv; last by left. by rewrite True_impl. - - rewrite -IH. apply forall_mono=> y. - apply impl_intro_l, pure_elim_l=> ?. rewrite pure_equiv; last by right. - by rewrite True_impl. + induction X as [|x m ? IH] using collection_ind_L. + { rewrite big_sepS_empty; auto. } + rewrite big_sepS_insert // -always_and_sep_l. apply and_intro. + - by rewrite (forall_elim x) pure_equiv ?True_impl; last set_solver. + - rewrite -IH. apply forall_mono=> y. apply impl_intro_l, pure_elim_l=> ?. + by rewrite pure_equiv ?True_impl; last set_solver. Qed. Lemma big_sepS_impl Φ Ψ X : @@ -637,15 +419,14 @@ Section gset. Qed. Global Instance big_sepS_empty_persistent Φ : PersistentP ([★ set] x ∈ ∅, Φ x). - Proof. rewrite /uPred_big_sepS elements_empty. apply _. Qed. + Proof. rewrite /big_opS elements_empty. apply _. Qed. Global Instance big_sepS_persistent Φ X : (∀ x, PersistentP (Φ x)) → PersistentP ([★ set] x ∈ X, Φ x). - Proof. rewrite /uPred_big_sepS. apply _. Qed. - + Proof. rewrite /big_opS. apply _. Qed. Global Instance big_sepS_nil_timeless Φ : TimelessP ([★ set] x ∈ ∅, Φ x). - Proof. rewrite /uPred_big_sepS elements_empty. apply _. Qed. + Proof. rewrite /big_opS elements_empty. apply _. Qed. Global Instance big_sepS_timeless Φ X : (∀ x, TimelessP (Φ x)) → TimelessP ([★ set] x ∈ X, Φ x). - Proof. rewrite /uPred_big_sepS. apply _. Qed. + Proof. rewrite /big_opS. apply _. Qed. End gset. End big_op. diff --git a/program_logic/pviewshifts.v b/program_logic/pviewshifts.v index ef4f749d1..971cbaa60 100644 --- a/program_logic/pviewshifts.v +++ b/program_logic/pviewshifts.v @@ -126,15 +126,13 @@ Proof. by rewrite pvs_frame_r pvs_frame_l pvs_trans. Qed. Lemma pvs_big_sepM `{Countable K} {A} E (Φ : K → A → iProp Σ) (m : gmap K A) : ([★ map] k↦x ∈ m, |={E}=> Φ k x) ={E}=> [★ map] k↦x ∈ m, Φ k x. Proof. - rewrite /uPred_big_sepM. - induction (map_to_list m) as [|[i x] l IH]; csimpl; auto using pvs_intro. - by rewrite IH pvs_sep. + apply (big_opM_forall (λ P Q, P ={E}=> Q)); auto using pvs_intro. + intros P1 P2 HP Q1 Q2 HQ. by rewrite HP HQ -pvs_sep. Qed. Lemma pvs_big_sepS `{Countable A} E (Φ : A → iProp Σ) X : ([★ set] x ∈ X, |={E}=> Φ x) ={E}=> [★ set] x ∈ X, Φ x. Proof. - rewrite /uPred_big_sepS. - induction (elements X) as [|x l IH]; csimpl; csimpl; auto using pvs_intro. - by rewrite IH pvs_sep. + apply (big_opS_forall (λ P Q, P ={E}=> Q)); auto using pvs_intro. + intros P1 P2 HP Q1 Q2 HQ. by rewrite HP HQ -pvs_sep. Qed. End pvs. diff --git a/program_logic/weakestpre.v b/program_logic/weakestpre.v index 8d9119a44..432700e15 100644 --- a/program_logic/weakestpre.v +++ b/program_logic/weakestpre.v @@ -24,7 +24,7 @@ Proof. apply pvs_ne, sep_ne, later_contractive; auto=> i ?. apply forall_ne=> e2; apply forall_ne=> σ2; apply forall_ne=> efs. apply wand_ne, pvs_ne, sep_ne, sep_ne; auto; first by apply Hwp. - apply big_sepL_ne=> ? ef. by apply Hwp. + apply big_opL_ne=> ? ef. by apply Hwp. Qed. Definition wp_def `{irisG Λ Σ} : diff --git a/proofmode/coq_tactics.v b/proofmode/coq_tactics.v index 5f1a0ca2d..867ba424e 100644 --- a/proofmode/coq_tactics.v +++ b/proofmode/coq_tactics.v @@ -426,8 +426,8 @@ Proof. repeat apply sep_mono; try apply always_mono. - rewrite -later_intro; apply pure_mono; destruct 1; constructor; naive_solver eauto using env_Forall2_wf, env_Forall2_fresh. - - induction Hp; rewrite /= ?later_sep; auto using sep_mono, later_intro. - - induction Hs; rewrite /= ?later_sep; auto using sep_mono, later_intro. + - induction Hp; rewrite /= ?later_sep. apply later_intro. by apply sep_mono. + - induction Hs; rewrite /= ?later_sep. apply later_intro. by apply sep_mono. Qed. Lemma tac_next Δ Δ' Q Q' : -- GitLab