diff --git a/theories/program_logic/adequacy.v b/theories/program_logic/adequacy.v index b7e9d42c7d69b27319d7d97b63457104fdb3cb38..9d5a3bceefbd710bf46caf7bf5ad8d8cc7a74e02 100644 --- a/theories/program_logic/adequacy.v +++ b/theories/program_logic/adequacy.v @@ -1,3 +1,4 @@ +From stdpp Require Import namespaces. From iris.program_logic Require Export weakestpre. From iris.algebra Require Import gmap auth agree gset coPset. From iris.base_logic.lib Require Import wsat. @@ -203,3 +204,20 @@ Proof. iDestruct "Hwp" as (Istate) "(HIstate & Hwp & Hclose)". iApply (@wptp_invariance _ _ (IrisG _ _ Hinv Istate)); eauto with iFrame. Qed. + +(* An equivalent version that does not require finding [fupd_intro_mask'], but +can be confusing to use. *) +Corollary wp_invariance' Σ Λ `{invPreG Σ} s e σ1 t2 σ2 φ : + (∀ `{Hinv : invG Σ}, + (|={⊤}=> ∃ stateI : state Λ → iProp Σ, + let _ : irisG Λ Σ := IrisG _ _ Hinv stateI in + stateI σ1 ∗ WP e @ s; ⊤ {{ _, True }} ∗ (stateI σ2 -∗ ∃ E, |={⊤,E}=> ⌜φâŒ))%I) → + rtc step ([e], σ1) (t2, σ2) → + φ. +Proof. + intros Hwp. eapply wp_invariance; first done. + intros Hinv. iMod (Hwp Hinv) as (stateI) "(? & ? & Hφ)". + iModIntro. iExists stateI. iFrame. iIntros "Hσ". + iDestruct ("Hφ" with "Hσ") as (E) ">Hφ". + iMod (fupd_intro_mask') as "_"; last by iModIntro. solve_ndisj. +Qed.