diff --git a/program_logic/ghost_ownership.v b/program_logic/ghost_ownership.v index 62578f262065005aa615188e8aa4bdb8a8edb146..dda7000cea31c066d712106393feaaa98eb670d0 100644 --- a/program_logic/ghost_ownership.v +++ b/program_logic/ghost_ownership.v @@ -70,6 +70,8 @@ Global Instance own_mono γ : Proper (flip (≼) ==> (⊑)) (own γ). Proof. move=>a b [c H]. rewrite H own_op. eauto with I. Qed. Lemma always_own_unit γ a : (□ own γ (unit a))%I ≡ own γ (unit a). Proof. by rewrite /own -to_globalF_unit always_ownG_unit. Qed. +Lemma always_own γ a : unit a ≡ a → (□ own γ a)%I ≡ own γ a. +Proof. by intros <-; rewrite always_own_unit. Qed. Lemma own_valid γ a : own γ a ⊑ ✓ a. Proof. rewrite /own ownG_valid /to_globalF. @@ -83,6 +85,8 @@ Lemma own_valid_l γ a : own γ a ⊑ (✓ a ★ own γ a). Proof. by rewrite comm -own_valid_r. Qed. Global Instance own_timeless γ a : Timeless a → TimelessP (own γ a). Proof. unfold own; apply _. Qed. +Global Instance own_unit_always_stable γ a : AlwaysStable (own γ (unit a)). +Proof. by rewrite /AlwaysStable always_own_unit. Qed. (* TODO: This also holds if we just have ✓ a at the current step-idx, as Iris assertion. However, the map_updateP_alloc does not suffice to show this. *) diff --git a/program_logic/ownership.v b/program_logic/ownership.v index 2f96898b78eb1b0b98126342a70fe8cab9277481..7a971a81719343bdbff083496beb02bf5949ca59 100644 --- a/program_logic/ownership.v +++ b/program_logic/ownership.v @@ -57,6 +57,8 @@ Proof. apply uPred.always_ownM. by rewrite Res_unit !cmra_unit_empty -{2}(cmra_unit_idemp m). Qed. +Lemma always_ownG m : unit m ≡ m → (□ ownG m)%I ≡ ownG m. +Proof. by intros <-; rewrite always_ownG_unit. Qed. Lemma ownG_valid m : ownG m ⊑ ✓ m. Proof. rewrite /ownG uPred.ownM_valid res_validI /= option_validI; auto with I. @@ -65,6 +67,8 @@ Lemma ownG_valid_r m : ownG m ⊑ (ownG m ★ ✓ m). Proof. apply (uPred.always_entails_r _ _), ownG_valid. Qed. Global Instance ownG_timeless m : Timeless m → TimelessP (ownG m). Proof. rewrite /ownG; apply _. Qed. +Global Instance ownG_unit_always_stable m : AlwaysStable (ownG (unit m)). +Proof. by rewrite /AlwaysStable always_ownG_unit. Qed. (* inversion lemmas *) Lemma ownI_spec r n i P : diff --git a/program_logic/saved_prop.v b/program_logic/saved_prop.v index e313311c2a8f0fc68b6a4bbd7c8e91a9fd9419c5..c6697b393371c2e1fa612fe23393098ad6febf79 100644 --- a/program_logic/saved_prop.v +++ b/program_logic/saved_prop.v @@ -15,6 +15,12 @@ Section saved_prop. Implicit Types P Q : iPropG Λ Σ. Implicit Types γ : gname. + Global Instance : ∀ P, AlwaysStable (saved_prop_own γ P). + Proof. + intros. rewrite /AlwaysStable /saved_prop_own. + rewrite always_own; done. + Qed. + Lemma saved_prop_alloc_strong N P (G : gset gname) : True ⊑ pvs N N (∃ γ, ■(γ ∉ G) ∧ saved_prop_own γ P). Proof. by apply own_alloc_strong. Qed.