diff --git a/theories/base_logic/lib/own.v b/theories/base_logic/lib/own.v index a9d78acb9ff6502969e1c11c83253d1c951d4cbf..9f570de8b87c38d2b37a22d43fc01210c4ab7666 100644 --- a/theories/base_logic/lib/own.v +++ b/theories/base_logic/lib/own.v @@ -110,6 +110,36 @@ Proof. rewrite !own_eq /own_def; apply _. Qed. Global Instance own_core_persistent γ a : CoreId a → Persistent (own γ a). Proof. rewrite !own_eq /own_def; apply _. Qed. +Lemma later_own γ a : ▷ own γ a -∗ ◇ (∃ b, own γ b ∧ ▷ (a ≡ b)). +Proof. + rewrite own_eq /own_def later_ownM. apply exist_elim=> r. + assert (NonExpansive (λ r : iResUR Σ, r (inG_id H) !! γ)). + { intros n r1 r2 Hr. f_equiv. by specialize (Hr (inG_id _)). } + rewrite (f_equiv (λ r : iResUR Σ, r (inG_id H) !! γ) _ r). + rewrite {1}/iRes_singleton ofe_fun_lookup_singleton lookup_singleton. + rewrite option_equivI. case Hb: (r (inG_id _) !! γ)=> [b|]; last first. + { by rewrite and_elim_r /sbi_except_0 -or_intro_l. } + rewrite -except_0_intro -(exist_intro (cmra_transport (eq_sym inG_prf) b)). + apply and_mono. + - rewrite /iRes_singleton. assert (∀ {A A' : cmraT} (Heq : A' = A) (a : A), + cmra_transport Heq (cmra_transport (eq_sym Heq) a) = a) as -> + by (by intros ?? ->). + apply ownM_mono=> /=. + exists (ofe_fun_insert (inG_id _) (delete γ (r (inG_id H))) r). + intros i'. rewrite ofe_fun_lookup_op. + destruct (decide (i' = inG_id _)) as [->|?]. + + rewrite ofe_fun_lookup_insert ofe_fun_lookup_singleton. + intros γ'. rewrite lookup_op. destruct (decide (γ' = γ)) as [->|?]. + * by rewrite lookup_singleton lookup_delete Hb. + * by rewrite lookup_singleton_ne // lookup_delete_ne // left_id. + + rewrite ofe_fun_lookup_insert_ne //. + by rewrite ofe_fun_lookup_singleton_ne // left_id. + - apply later_mono. + by assert (∀ {A A' : cmraT} (Heq : A' = A) (a' : A') (a : A), + cmra_transport Heq a' ≡ a ⊢@{iPropI Σ} + a' ≡ cmra_transport (eq_sym Heq) a) as -> by (by intros ?? ->). +Qed. + (** ** Allocation *) (* 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. *)