From 83fd962bf64cf044ec1a4a96e10940e1ba3eef47 Mon Sep 17 00:00:00 2001 From: Robbert Krebbers <mail@robbertkrebbers.nl> Date: Thu, 23 Jul 2020 08:39:05 +0200 Subject: [PATCH] Bump Iris + get rid of iAlways. --- opam | 2 +- theories/lang/lock.v | 2 +- theories/lifetime/frac_borrow.v | 8 ++++---- theories/lifetime/model/borrow_sep.v | 6 +++--- theories/lifetime/model/boxes.v | 8 ++++---- theories/lifetime/model/creation.v | 4 ++-- theories/lifetime/model/primitive.v | 4 ++-- theories/typing/function.v | 2 +- theories/typing/lib/arc.v | 12 ++++++------ theories/typing/lib/cell.v | 2 +- theories/typing/lib/mutex/mutex.v | 4 ++-- theories/typing/lib/mutex/mutexguard.v | 6 +++--- theories/typing/lib/rc/rc.v | 12 ++++++------ theories/typing/lib/rc/weak.v | 8 ++++---- theories/typing/lib/refcell/ref.v | 2 +- theories/typing/lib/refcell/ref_code.v | 16 ++++++++-------- theories/typing/lib/refcell/refcell.v | 4 ++-- theories/typing/lib/refcell/refmut.v | 4 ++-- theories/typing/lib/refcell/refmut_code.v | 12 ++++++------ theories/typing/lib/rwlock/rwlockreadguard.v | 2 +- theories/typing/lib/rwlock/rwlockwriteguard.v | 4 ++-- theories/typing/lib/spawn.v | 2 +- theories/typing/own.v | 6 +++--- theories/typing/product.v | 2 +- theories/typing/sum.v | 6 +++--- theories/typing/type.v | 6 +++--- theories/typing/uniq_bor.v | 8 ++++---- 27 files changed, 77 insertions(+), 77 deletions(-) diff --git a/opam b/opam index 910aadf3..1d9bf8ec 100644 --- a/opam +++ b/opam @@ -16,7 +16,7 @@ This branch uses a proper weak memory model. """ depends: [ - "coq-gpfsl" { (= "dev.2020-07-15.0.654300d3") | (= "dev") } + "coq-gpfsl" { (= "dev.2020-07-22.1.6569264a") | (= "dev") } ] build: [make "-j%{jobs}%"] diff --git a/theories/lang/lock.v b/theories/lang/lock.v index 5c7ad230..b3076cfc 100644 --- a/theories/lang/lock.v +++ b/theories/lang/lock.v @@ -67,7 +67,7 @@ Section proof. Proof. iIntros "#HR !#". iSplit; iIntros "Hlck"; iApply (lock_proto_iff with "[HR] Hlck"); [done|]. - iAlways; iSplit; iIntros; by iApply "HR". + iModIntro; iSplit; iIntros; by iApply "HR". Qed. Lemma lock_interp_comparable l γ t s v R: diff --git a/theories/lifetime/frac_borrow.v b/theories/lifetime/frac_borrow.v index e4c6fb34..59a4ce45 100644 --- a/theories/lifetime/frac_borrow.v +++ b/theories/lifetime/frac_borrow.v @@ -55,7 +55,7 @@ Section frac_bor. ▷ □ (∀ q, φ q ↔ φ' q) -∗ &frac{κ}φ -∗ &frac{κ}φ'. Proof. iIntros "#Hφφ' H". iDestruct "H" as (γ κ' V0 φ0) "(? & ? & #Hφ0φ & ?)". - iExists γ, κ', V0, φ0. iFrame. iNext. iAlways. iIntros (q). + iExists γ, κ', V0, φ0. iFrame. iNext. iModIntro. iIntros (q). iSplit; iIntros "H". - iApply "Hφφ'". by iApply "Hφ0φ". - iApply "Hφ0φ". by iApply "Hφφ'". @@ -74,7 +74,7 @@ Section frac_bor. iMod ("Hclose" with "[] [-]") as "Hφ"; last first. { iExists γ, κ', V, φ. iFrame "#". iSplitR; [|iSplitR]. - iIntros "!>!>!#*". by iApply (bi.iff_refl True%I). - - iModIntro. iNext. iAlways. iIntros (??). + - iModIntro. iNext. iModIntro. iIntros (??). rewrite !bi.intuitionistically_elim. iApply ("Hfrac'" $! _ _). - by iApply (in_at_bor_share with "[Hφ]"). } { iNext. iSplit. iDestruct "Hφ" as "[$ _]". iExists 1%Qp, 0, 0. @@ -96,7 +96,7 @@ Section frac_bor. iDestruct "H" as (κ') "(#? & #? & >_)". iExists γ, κ', V, φ. iFrame "#". iSplitR; [|iSplitR]. + iIntros "!> !> !# *". by iApply (bi.iff_refl True%I). - + iModIntro. iNext. iAlways. iIntros (??). + + iModIntro. iNext. iModIntro. iIntros (??). rewrite !bi.intuitionistically_elim. iApply ("Hfrac'" $! _ _). + by iApply in_at_bor_fake. Qed. @@ -217,7 +217,7 @@ Section frac_bor. Lemma frac_bor_lft_incl `{LatBottom Lat} κ κ' q: ⎡lft_ctx⎤ -∗ &frac{κ}(λ q', (q * q').[κ']) -∗ κ ⊑ κ'. Proof. - iIntros "#LFT#Hbor". iApply lft_incl_intro. iAlways. iIntros (q') "Hκ'". + iIntros "#LFT#Hbor". iApply lft_incl_intro. iModIntro. iIntros (q') "Hκ'". iMod (frac_bor_acc with "LFT Hbor Hκ'") as (q'') "[>Htok Hclose]". done. iExists _. iIntros "{$Htok} !> Hκ'". by iApply "Hclose". Qed. diff --git a/theories/lifetime/model/borrow_sep.v b/theories/lifetime/model/borrow_sep.v index a3fcd0ea..fdfbddf5 100644 --- a/theories/lifetime/model/borrow_sep.v +++ b/theories/lifetime/model/borrow_sep.v @@ -91,11 +91,11 @@ Proof. rewrite !own_bor_op. iDestruct "Hbor" as "[[H● H◯Q] H◯P]". iAssert (&{κ}P)%I with "[H◯P]" as "$". { rewrite /bor /raw_bor /idx_bor_own /=. iExists κ'. iFrame "Hκκ'". iExists γP. - iSplitL; [by auto with iFrame|]. iExists _. iFrame "#". iNext. iAlways. + iSplitL; [by auto with iFrame|]. iExists _. iFrame "#". iNext. iModIntro. iSplit; [|by auto]. iIntros "[_ H]". by iApply "H". } iAssert (&{κ}Q)%I with "[H◯Q]" as "$". { rewrite /bor /raw_bor /idx_bor_own /=. iExists κ'. iFrame "Hκκ'". iExists γQ. - iSplitL; [by auto with iFrame|]. iExists _. iFrame "#". iNext. iAlways. + iSplitL; [by auto with iFrame|]. iExists _. iFrame "#". iNext. iModIntro. iSplit; [|by auto]. iIntros "[_ H]". by iApply "H". } iMod ("Hclose" with "[-]"); [|done]. iModIntro ⎡_⎤%I. iExists A, I. iFrame. rewrite big_sepS_later. iApply "Hclose'". iExists Vκ. iSplit; [done|]. @@ -179,7 +179,7 @@ Proof. - iExists _. simpl. iFrame. iCombine "HV1 HV2" as "HV12". iDestruct (monPred_in_intro with "HV12") as (V12) "(HV12' & % & %)". iApply (monPred_in_elim _ V12). done. rewrite monPred_at_in. solve_lat. - - iExists _. iFrame. iNext. iAlways. + - iExists _. iFrame. iNext. iModIntro. by iSplit; iIntros "[HP HQ]"; iSplitL "HP"; (iApply "HPP'" || iApply "HQQ'"). } iMod ("Hclose" with "[-]"); [|done]. iExists A, I. iFrame. rewrite big_sepS_later. iApply "Hclose'". iExists _. iSplit; [done|]. iLeft. iSplit; [|done]. diff --git a/theories/lifetime/model/boxes.v b/theories/lifetime/model/boxes.v index 7d42ddc2..772c9b7c 100644 --- a/theories/lifetime/model/boxes.v +++ b/theories/lifetime/model/boxes.v @@ -220,7 +220,7 @@ Proof. iCombine "Hf" "HP'" as "Hf". rewrite -big_sepM_sep big_sepM_fmap; iApply (big_sepM_fupd _ _ f). iApply (@big_sepM_impl with "[$Hf]"). - iAlways; iIntros (γ b' ?) "[(Hγ' & #$ & #$) HΦ]". + iModIntro; iIntros (γ b' ?) "[(Hγ' & #$ & #$) HΦ]". iInv N as (b) "[>Hγ _]" "Hclose". iMod (box_own_auth_update γ with "[Hγ Hγ']") as "[Hγ $]"; first by iFrame. iApply "Hclose". iNext; iExists (Some $ to_latT V). by iFrame. @@ -236,7 +236,7 @@ Proof. [∗ map] γ↦b ∈ f, box_own_auth γ (◯ Excl' None) ∗ box_own_prop γ (Φ γ) ∗ inv N (slice_inv γ (Φ γ)))%I with "[> Hf]" as "[HΦ ?]". { rewrite -big_sepM_sep -big_sepM_fupd. iApply (@big_sepM_impl with "[$Hf]"). - iAlways; iIntros (γ o ?) "(Hγ' & #HγΦ & #Hinv)". + iModIntro; iIntros (γ o ?) "(Hγ' & #HγΦ & #Hinv)". assert (Ho : from_option (.⊑ V) False o) by eauto. destruct o as [V'|]=>//. rewrite -Ho. iInv N as (b) "[>Hγ HΦ]" "Hclose". @@ -261,11 +261,11 @@ Proof. - iMod (slice_delete_full with "Hs Hb") as (P') "(HQ & #Heq & Hb)"; try done. iDestruct ("HQQ'" with "HQ") as "HQ'". iMod (slice_insert_full with "HQ' Hb") as (γ') "(% & #Hs' & Hb)"; try done. - iExists γ', _. iFrame "∗#%". iIntros "!>". do 2 iNext. iAlways. iIntros (V). + iExists γ', _. iFrame "∗#%". iIntros "!>". do 2 iNext. iModIntro. iIntros (V). iRewrite "Heq". by iSplit; iIntros "[? $]"; iApply "HQQ'". - iDestruct (slice_delete_empty with "Hs Hb") as (P') "(#Heq & Hb)"; [done|]. iMod (slice_insert_empty with "Hb") as (γ') "(% & #Hs' & Hb)"; try done. - iExists γ', _. iFrame "∗#%". iIntros "!>". do 2 iNext. iAlways. iIntros (V). + iExists γ', _. iFrame "∗#%". iIntros "!>". do 2 iNext. iModIntro. iIntros (V). iRewrite "Heq". by iSplit; iIntros "[? $]"; iApply "HQQ'". Qed. diff --git a/theories/lifetime/model/creation.v b/theories/lifetime/model/creation.v index 6e71e3e0..c3525888 100644 --- a/theories/lifetime/model/creation.v +++ b/theories/lifetime/model/creation.v @@ -71,7 +71,7 @@ Proof. pose (Kalive := filter (lft_alive_in A) K). destruct (decide (Kalive = ∅)) as [HKalive|]. { iModIntro. rewrite /Iinv. iFrame. - iApply (@big_sepS_impl with "[$HK]"); iAlways. + iApply (@big_sepS_impl with "[$HK]"); iModIntro. iIntros (κ Hκ) "[(_ & _ & %)|[$ _]]". set_solver. } destruct (minimal_exists_L (⊂) Kalive) as (κ & [Hκalive HκK]%elem_of_filter & Hκmin); first done. @@ -146,7 +146,7 @@ Proof. + apply Hmono=>//; rewrite elem_of_difference elem_of_singleton; auto. - rewrite (big_sepS_delete _ K) //. iSplitL "Hinv". + by rewrite functions.fn_lookup_insert -lat_join_sqsubseteq_l. - + iApply (@big_sepS_impl with "[$HK]"). iAlways. iIntros (κ'). + + iApply (@big_sepS_impl with "[$HK]"). iModIntro. iIntros (κ'). rewrite elem_of_difference elem_of_singleton. iIntros ([??]) "H". rewrite functions.fn_lookup_insert_ne //. Qed. diff --git a/theories/lifetime/model/primitive.v b/theories/lifetime/model/primitive.v index 1d98bb66..bcda1f20 100644 --- a/theories/lifetime/model/primitive.v +++ b/theories/lifetime/model/primitive.v @@ -397,14 +397,14 @@ Lemma raw_bor_iff i P P' : Proof. iIntros "#HPP' HP". unfold raw_bor. iDestruct "HP" as (s) "[HiP HP]". iExists s. iFrame. iDestruct "HP" as (P0) "[#Hiff ?]". iExists P0. iFrame. - iNext. iAlways. iSplit; iIntros. + iNext. iModIntro. iSplit; iIntros. by iApply "HPP'"; iApply "Hiff". by iApply "Hiff"; iApply "HPP'". Qed. Lemma idx_bor_iff κ i P P' : ▷ □ (P ↔ P') -∗ &{κ,i}P -∗ &{κ,i}P'. Proof. unfold idx_bor. iIntros "#HPP' [$ HP]". iDestruct "HP" as (P0) "[#HP0P Hs]". - iExists P0. iFrame. iNext. iAlways. iSplit; iIntros. + iExists P0. iFrame. iNext. iModIntro. iSplit; iIntros. by iApply "HPP'"; iApply "HP0P". by iApply "HP0P"; iApply "HPP'". Qed. diff --git a/theories/typing/function.v b/theories/typing/function.v index 58801192..802638e6 100644 --- a/theories/typing/function.v +++ b/theories/typing/function.v @@ -281,7 +281,7 @@ Section typing. + iApply "HE'". iIntros "{$# Hf Hinh HE' LFT HE %}". iInduction κs as [|κ κs] "IH"=> //=. iSplitL. { iApply lft_incl_trans; first done. iApply lft_intersect_incl_l. } - iApply "IH". iAlways. iApply lft_incl_trans; first done. + iApply "IH". iModIntro. iApply lft_incl_trans; first done. iApply lft_intersect_incl_r. + iSplitL; last done. iExists ϝ. iSplit; first by rewrite /= left_id. iFrame "#∗". diff --git a/theories/typing/lib/arc.v b/theories/typing/lib/arc.v index c4335c6b..94937ba4 100644 --- a/theories/typing/lib/arc.v +++ b/theories/typing/lib/arc.v @@ -212,7 +212,7 @@ Section arc. Next Obligation. iIntros (ty κ κ' tid l) "#Hincl H". iDestruct "H" as (l') "[#Hl #Hshr]". iExists _. iSplit; first by iApply frac_bor_shorten. - iAlways. iIntros (F q) "% Htok". + iModIntro. iIntros (F q) "% Htok". iMod (lft_incl_acc with "Hincl Htok") as (q'') "[Htok Hclose]"; first solve_ndisj. iMod ("Hshr" with "[] Htok") as "Hshr2"; first done. iModIntro. iNext. iMod "Hshr2" as "[Htok HX]". @@ -239,7 +239,7 @@ Section arc. type_incl ty1 ty2 -∗ type_incl (arc ty1) (arc ty2). Proof. iIntros "#Hincl". iPoseProof "Hincl" as "(#Hsz & #Hoincl & #Hsincl)". - iSplit; first done. iSplit; iAlways. + iSplit; first done. iSplit; iModIntro. - iIntros "* Hvl". destruct vl as [|[[|vl|]|] [|]]; try done. iDestruct "Hvl" as "[(Hl1 & Hl2 & H† & Hc) | Hvl]". { iLeft. iFrame. iDestruct "Hsz" as %->. @@ -338,7 +338,7 @@ Section arc. Next Obligation. iIntros (ty κ κ' tid l) "#Hincl H". iDestruct "H" as (l') "[#Hl #Hshr]". iExists _. iSplit; first by iApply frac_bor_shorten. - iAlways. iIntros (F q) "% Htok". + iModIntro. iIntros (F q) "% Htok". iMod (lft_incl_acc with "Hincl Htok") as (q'') "[Htok Hclose]"; first solve_ndisj. iMod ("Hshr" with "[] Htok") as "Hshr2"; first done. iModIntro. iNext. iMod "Hshr2" as "[Htok HX]". @@ -364,7 +364,7 @@ Section arc. type_incl ty1 ty2 -∗ type_incl (weak ty1) (weak ty2). Proof. iIntros "#Hincl". iPoseProof "Hincl" as "(#Hsz & #Hoincl & #Hsincl)". - iSplit; first done. iSplit; iAlways. + iSplit; first done. iSplit; iModIntro. - iIntros "* Hvl". destruct vl as [|[[|vl|]|] [|]]; try done. iDestruct "Hvl" as (???? ν ? ?) "(#Hpersist & Htk)". iExists _, _, _, _, _, _, _. iFrame "#∗". by iApply arc_persist_type_incl. @@ -884,9 +884,9 @@ Section arc. { iIntros "_". wp_if. unlock. iFrame. iExists (_::_). rewrite heap_mapsto_vec_cons. iFrame. iExists 1%nat, _, []. rewrite /= right_id_L Max.max_0_r. auto 10 with iFrame. } - iIntros "([H† H1] & H2 & H3)". iDestruct "H1" as (vl') "[H1 Heq]". + iIntros "([H† H1] & H2 & H3)". iDestruct "H1" as (vl1) "[H1 Heq]". iDestruct "Heq" as %<-. wp_if. - wp_apply (wp_delete _ _ _ _ (_::_::vl') with "[H1 H2 H3 H†]"); [done|..]. + wp_apply (wp_delete _ _ _ _ (_::_::vl1) with "[H1 H2 H3 H†]"); [done|..]. { simpl. lia. } { rewrite 2!heap_mapsto_vec_cons shift_loc_assoc. auto with iFrame. } iFrame. iIntros "_". iExists (_::_). rewrite heap_mapsto_vec_cons. iFrame. diff --git a/theories/typing/lib/cell.v b/theories/typing/lib/cell.v index 352f6dc9..263bd1fa 100644 --- a/theories/typing/lib/cell.v +++ b/theories/typing/lib/cell.v @@ -39,7 +39,7 @@ Section cell. iDestruct ("EQ" with "HE") as "(% & #Hown & #Hshr)". iSplit; [done|iSplit; iIntros "!# * H"]. - iApply ("Hown" with "H"). - - iApply na_bor_iff; last done. iNext; iAlways; iSplit; iIntros "H"; + - iApply na_bor_iff; last done. iNext; iModIntro; iSplit; iIntros "H"; iDestruct "H" as (vl) "[??]"; iExists vl; iFrame; by iApply "Hown". Qed. Lemma cell_mono' E L ty1 ty2 : eqtype E L ty1 ty2 → subtype E L (cell ty1) (cell ty2). diff --git a/theories/typing/lib/mutex/mutex.v b/theories/typing/lib/mutex/mutex.v index 64a09714..b82ba926 100644 --- a/theories/typing/lib/mutex/mutex.v +++ b/theories/typing/lib/mutex/mutex.v @@ -95,7 +95,7 @@ Section mutex. iExists γ. iApply lock_proto_iff_proper; [|iFrame]. iApply bor_iff_proper. iApply heap_mapsto_pred_iff_proper. - iNext. iAlways; iIntros; iSplit; iIntros; by iApply "Howni". + iNext. iModIntro; iIntros; iSplit; iIntros; by iApply "Howni". Qed. Global Instance mutex_proper E L : @@ -116,7 +116,7 @@ Section mutex. iExists _. iFrame "Hincl". iDestruct "Hshr" as (γ) "Hproto". iExists γ. iApply lock_proto_iff_proper; [|iFrame]. iApply bor_iff_proper. iApply heap_mapsto_pred_iff_proper. - iNext. iAlways; iIntros; iSplit; iIntros; by iApply send_change_tid. + iNext. iModIntro; iIntros; iSplit; iIntros; by iApply send_change_tid. Qed. End mutex. diff --git a/theories/typing/lib/mutex/mutexguard.v b/theories/typing/lib/mutex/mutexguard.v index 28f36d79..de85d02c 100644 --- a/theories/typing/lib/mutex/mutexguard.v +++ b/theories/typing/lib/mutex/mutexguard.v @@ -89,7 +89,7 @@ Section mguard. intros α1 α2 Hα ty1 ty2 Hty. generalize Hty. rewrite eqtype_unfold. iIntros (Hty' q) "HL". iDestruct (Hty' with "HL") as "#Hty". clear Hty'. iDestruct (Hα with "HL") as "#Hα". iIntros "!# #HE". iDestruct ("Hα" with "HE") as "{Hα} Hα". - iDestruct ("Hty" with "HE") as "(%&#Ho&#Hs) {HE Hty}". iSplit; [done|iSplit; iAlways]. + iDestruct ("Hty" with "HE") as "(%&#Ho&#Hs) {HE Hty}". iSplit; [done|iSplit; iModIntro]. - iIntros (tid [|[[]|][]]) "H"; try done. simpl. iDestruct "H" as (β) "(#H⊑ & Hinv & Hown)". iExists β. iFrame. iSplit; last iSplit. @@ -98,10 +98,10 @@ Section mguard. iExists γ. iApply (lock_proto_lft_mono with "Hα"). iApply lock_proto_iff_proper; [|iFrame]. iApply bor_iff_proper. iNext. iApply heap_mapsto_pred_iff_proper. - iAlways; iIntros; iSplit; iIntros; by iApply "Ho". + iModIntro; iIntros; iSplit; iIntros; by iApply "Ho". + iApply bor_iff; last done. iIntros "!>". iApply heap_mapsto_pred_iff_proper. - iAlways; iIntros; iSplit; iIntros; by iApply "Ho". + iModIntro; iIntros; iSplit; iIntros; by iApply "Ho". - iIntros (κ tid l) "H". iDestruct "H" as (l') "H". iExists l'. iDestruct "H" as "[$ #H]". iIntros "!# * % Htok". iMod (lft_incl_acc with "[] Htok") as (q') "[Htok Hclose]"; first solve_ndisj. diff --git a/theories/typing/lib/rc/rc.v b/theories/typing/lib/rc/rc.v index e1f93314..a50131a6 100644 --- a/theories/typing/lib/rc/rc.v +++ b/theories/typing/lib/rc/rc.v @@ -191,7 +191,7 @@ Section rc. Next Obligation. iIntros (ty κ κ' tid l) "#Hincl H". iDestruct "H" as (l') "[#Hl #Hshr]". iExists _. iSplit; first by iApply frac_bor_shorten. - iAlways. iIntros (F q) "% Htok". + iModIntro. iIntros (F q) "% Htok". iMod (lft_incl_acc with "Hincl Htok") as (q'') "[Htok Hclose]"; first solve_ndisj. iMod ("Hshr" with "[] Htok") as "Hshr2"; first done. iModIntro. iNext. iMod "Hshr2" as "[Htok HX]". @@ -218,7 +218,7 @@ Section rc. type_incl ty1 ty2 -∗ type_incl (rc ty1) (rc ty2). Proof. iIntros "#Hincl". iPoseProof "Hincl" as "(#Hsz & #Hoincl & #Hsincl)". - iSplit; first done. iSplit; iAlways. + iSplit; first done. iSplit; iModIntro. - iIntros "* Hvl". destruct vl as [|[[|vl|]|] [|]]; try done. iDestruct "Hvl" as "[(Hl1 & Hl2 & H† & Hc) | Hvl]". { iLeft. iFrame. iDestruct "Hsz" as %->. @@ -691,7 +691,7 @@ Section code. iApply (type_cont [] [ϝ ⊑ₗ []] (λ _, [rcx ◁ box (uninit 1); r ◁ box (Σ[ ty; rc ty ])])) ; [solve_typing..| |]; last first. - { simpl. iAlways. iIntros (k arg). inv_vec arg. simpl_subst. + { simpl. iModIntro. iIntros (k arg). inv_vec arg. simpl_subst. iApply type_delete; [solve_typing..|]. iApply type_jump; solve_typing. } iIntros (k). simpl_subst. @@ -786,7 +786,7 @@ Section code. iApply (type_cont [] [ϝ ⊑ₗ []] (λ _, [rcx ◁ box (uninit 1); r ◁ box (option ty)])); [solve_typing..| |]; last first. - { simpl. iAlways. iIntros (k arg). inv_vec arg. simpl_subst. + { simpl. iModIntro. iIntros (k arg). inv_vec arg. simpl_subst. iApply type_delete; [solve_typing..|]. iApply type_jump; solve_typing. } iIntros (k). simpl_subst. @@ -876,7 +876,7 @@ Section code. iApply (type_cont [] [ϝ ⊑ₗ []] (λ _, [rcx ◁ box (uninit 1); r ◁ box (option $ &uniq{α}ty)])); [solve_typing..| |]; last first. - { simpl. iAlways. iIntros (k arg). inv_vec arg. simpl_subst. + { simpl. iModIntro. iIntros (k arg). inv_vec arg. simpl_subst. iApply type_delete; [solve_typing..|]. iApply type_jump; solve_typing. } iIntros (k). simpl_subst. @@ -1008,7 +1008,7 @@ Section code. iApply (type_cont [] [ϝ ⊑ₗ []] (λ _, [rcx ◁ box (uninit 1); r ◁ box (&uniq{α}ty)])); [solve_typing..| |]; last first. - { simpl. iAlways. iIntros (k arg). inv_vec arg. simpl_subst. + { simpl. iModIntro. iIntros (k arg). inv_vec arg. simpl_subst. iApply type_delete; [solve_typing..|]. iApply type_jump; solve_typing. } iIntros (k). simpl_subst. diff --git a/theories/typing/lib/rc/weak.v b/theories/typing/lib/rc/weak.v index 7f441063..798b16c7 100644 --- a/theories/typing/lib/rc/weak.v +++ b/theories/typing/lib/rc/weak.v @@ -63,7 +63,7 @@ Section weak. Next Obligation. iIntros (ty κ κ' tid l) "#Hincl H". iDestruct "H" as (l') "[#Hl #Hshr]". iExists _. iSplit; first by iApply frac_bor_shorten. - iAlways. iIntros (F q) "% Htok". + iModIntro. iIntros (F q) "% Htok". iMod (lft_incl_acc with "Hincl Htok") as (q'') "[Htok Hclose]"; first solve_ndisj. iMod ("Hshr" with "[] Htok") as "Hshr2"; first done. iModIntro. iNext. iMod "Hshr2" as "[Htok HX]". @@ -88,7 +88,7 @@ Section weak. type_incl ty1 ty2 -∗ type_incl (weak ty1) (weak ty2). Proof. iIntros "#Hincl". iPoseProof "Hincl" as "(Hsz & #Hoincl & #Hsincl)". - iSplit; first done. iSplit; iAlways. + iSplit; first done. iSplit; iModIntro. - iIntros "* Hvl". destruct vl as [|[[|vl|]|] [|]]; try done. iDestruct "Hvl" as (γ ν) "(#Hpersist & Htok)". iExists _, _. iFrame "Htok". by iApply rc_persist_type_incl. @@ -138,7 +138,7 @@ Section code. iApply (type_cont [] [ϝ ⊑ₗ []] (λ _, [w ◁ box (&shr{α}(weak ty)); r ◁ box (option (rc ty))])) ; [solve_typing..| |]; last first. - { simpl. iAlways. iIntros (k arg). inv_vec arg. simpl_subst. + { simpl. iModIntro. iIntros (k arg). inv_vec arg. simpl_subst. iApply type_delete; [solve_typing..|]. iApply type_jump; solve_typing. } iIntros (k). simpl_subst. @@ -386,7 +386,7 @@ Section code. iIntros (_ ϝ ret arg). inv_vec arg=>w. simpl_subst. iApply (type_cont [] [ϝ ⊑ₗ []] (λ _, [w ◁ box (uninit 1)])); [solve_typing..| |]; last first. - { simpl. iAlways. iIntros (k arg). inv_vec arg. simpl_subst. + { simpl. iModIntro. iIntros (k arg). inv_vec arg. simpl_subst. iApply type_new; [solve_typing..|]. iIntros (r). simpl_subst. iApply type_delete; [solve_typing..|]. iApply type_jump; solve_typing. } diff --git a/theories/typing/lib/refcell/ref.v b/theories/typing/lib/refcell/ref.v index 321feb64..d24833bf 100644 --- a/theories/typing/lib/refcell/ref.v +++ b/theories/typing/lib/refcell/ref.v @@ -82,7 +82,7 @@ Section ref. iIntros (α1 α2 Hα ty1 ty2 Hty q) "HL". iDestruct (Hty with "HL") as "#Hty". iDestruct (Hα with "HL") as "#Hα". iIntros "!# #HE". iDestruct ("Hα" with "HE") as "Hα1α2". - iDestruct ("Hty" with "HE") as "(%&#Ho&#Hs)". iSplit; [|iSplit; iAlways]. + iDestruct ("Hty" with "HE") as "(%&#Ho&#Hs)". iSplit; [|iSplit; iModIntro]. - done. - iIntros (tid [|[[]|][|[[]|][]]]) "H"=>//=. iDestruct "H" as (ν q' γ β ty') "(#Hshr & #H⊑ & #Hinv & Htok & Hown)". diff --git a/theories/typing/lib/refcell/ref_code.v b/theories/typing/lib/refcell/ref_code.v index 81ac8abd..c76a2634 100644 --- a/theories/typing/lib/refcell/ref_code.v +++ b/theories/typing/lib/refcell/ref_code.v @@ -316,8 +316,8 @@ Section ref_functions. iDestruct ("Hclose3" with "Hαν") as "[Hα Hν]". iMod ("Hclose2" with "Hϝ HL") as "HL". wp_rec. iDestruct "Hr" as "[Hr Hr†]". - iDestruct "Hr" as (?) "[Hr H]". iDestruct "H" as (vl1 ? ->) "[#Hr1' H]". - iDestruct "H" as (vl2 ? ->) "[#Hr2' ->]". + iDestruct "Hr" as (?) "[Hr H]". iDestruct "H" as (vl1 vl1' ->) "[#Hr1' H]". + iDestruct "H" as (vl2 vl2' ->) "[#Hr2' ->]". destruct vl1 as [|[[|lr1|]|] []], vl2 as [|[[|lr2|]|] []]=>//=. rewrite heap_mapsto_vec_cons heap_mapsto_vec_singleton. iDestruct "Hr" as "[Hr1 Hr2]". wp_read. wp_let. wp_op. wp_read. wp_let. @@ -329,15 +329,15 @@ Section ref_functions. iMod (na_bor_acc with "LFT Hinv Hβ Hna") as "(INV & Hna & Hclosena)"; [done..|]. wp_seq. wp_op. wp_read. iDestruct (refcell_inv_reading_inv with "INV Hγ") - as (q' n) "(H↦lrc & _ & [H● H◯] & H† & Hq' & Hshr')". - iDestruct "Hq'" as (q'') "(Hq'q'' & Hν1 & Hν2)". - iDestruct "Hq'q''" as %Hq'q''. iMod (own_update with "H●") as "[H● ?]". + as (q1 n) "(H↦lrc & _ & [H● H◯] & H† & Hq1 & Hshr')". + iDestruct "Hq1" as (q2) "(Hq1q2 & Hν1 & Hν2)". + iDestruct "Hq1q2" as %Hq1q2. iMod (own_update with "H●") as "[H● ?]". { apply auth_update_alloc, - (op_local_update_discrete _ _ (reading_stR (q''/2)%Qp ν))=>-[Hagv _]. + (op_local_update_discrete _ _ (reading_stR (q2/2)%Qp ν))=>-[Hagv _]. split; [split|done]. - by rewrite /= agree_idemp. - - apply frac_valid'. rewrite -Hq'q'' comm -{2}(Qp_div_2 q''). - apply Qcplus_le_mono_l. rewrite -{1}(Qcplus_0_l (q''/2)%Qp). + - apply frac_valid'. rewrite -Hq1q2 comm -{2}(Qp_div_2 q2). + apply Qcplus_le_mono_l. rewrite -{1}(Qcplus_0_l (q2/2)%Qp). apply Qcplus_le_mono_r, Qp_ge_0. } wp_let. wp_read. wp_let. wp_op. wp_write. wp_apply (wp_delete _ _ _ _ [_; _] with "[Href↦1 Href↦2 Href†]")=>//. diff --git a/theories/typing/lib/refcell/refcell.v b/theories/typing/lib/refcell/refcell.v index ec39aa1f..98853741 100644 --- a/theories/typing/lib/refcell/refcell.v +++ b/theories/typing/lib/refcell/refcell.v @@ -80,7 +80,7 @@ Section refcell_inv. iAssert (□ (&{α}((l +ₗ 1) ↦∗: ty_own ty1 tid) -∗ &{α}((l +ₗ 1) ↦∗: ty_own ty2 tid)))%I as "#Hb". { iIntros "!# H". iApply bor_iff; last done. - iNext; iAlways; iSplit; iIntros "H"; iDestruct "H" as (vl) "[Hf H]"; iExists vl; + iNext; iModIntro; iSplit; iIntros "H"; iDestruct "H" as (vl) "[Hf H]"; iExists vl; iFrame; by iApply "Hown". } iDestruct "H" as (st) "H"; iExists st; iDestruct "H" as "($&$&H)"; destruct st as [[[[ν rw] q' ] n]|]; try done; @@ -191,7 +191,7 @@ Section refcell. - iPureIntro. simpl. congruence. - destruct vl as [|[[]|]]=>//=. by iApply "Hown". - simpl. iDestruct "H" as (a γ) "[Ha H]". iExists a, γ. iFrame. - iApply na_bor_iff; last done. iNext; iAlways; iSplit; iIntros "H". + iApply na_bor_iff; last done. iNext; iModIntro; iSplit; iIntros "H". by iApply "Hty1ty2". by iApply "Hty2ty1". Qed. Lemma refcell_mono' E L ty1 ty2 : diff --git a/theories/typing/lib/refcell/refmut.v b/theories/typing/lib/refcell/refmut.v index 0f51cf44..3776c5e7 100644 --- a/theories/typing/lib/refcell/refmut.v +++ b/theories/typing/lib/refcell/refmut.v @@ -87,14 +87,14 @@ Section refmut. intros α1 α2 Hα ty1 ty2. rewrite eqtype_unfold=>Hty. iIntros (q) "HL". iDestruct (Hty with "HL") as "#Hty". iDestruct (Hα with "HL") as "#Hα". iIntros "!# #HE". iDestruct ("Hα" with "HE") as "Hα1α2". - iDestruct ("Hty" with "HE") as "(%&#Ho&#Hs)". iSplit; [|iSplit; iAlways]. + iDestruct ("Hty" with "HE") as "(%&#Ho&#Hs)". iSplit; [|iSplit; iModIntro]. - done. - iIntros (tid [|[[]|][|[[]|][]]]) "H"=>//=. iDestruct "H" as (ν γ q' β ty') "(Hb & #H⊑ & #Hinv & Hν & Hown)". iExists ν, γ, q', β, ty'. iFrame "∗#". iSplit. + iApply bor_shorten; last iApply bor_iff; last done. * iApply lft_intersect_mono; first done. iApply lft_incl_refl. - * iNext; iAlways; iSplit; iIntros "H"; iDestruct "H" as (vl) "[??]"; + * iNext; iModIntro; iSplit; iIntros "H"; iDestruct "H" as (vl) "[??]"; iExists vl; iFrame; by iApply "Ho". + by iApply lft_incl_trans. - iIntros (κ tid l) "H /=". iDestruct "H" as (lv lrc) "H". iExists lv, lrc. diff --git a/theories/typing/lib/refcell/refmut_code.v b/theories/typing/lib/refcell/refmut_code.v index 7b7b7785..d5488459 100644 --- a/theories/typing/lib/refcell/refmut_code.v +++ b/theories/typing/lib/refcell/refmut_code.v @@ -285,8 +285,8 @@ Section refmut_functions. iDestruct ("Hclose3" with "Hαν") as "[Hα Hν]". iMod ("Hclose2" with "Hϝ HL") as "HL". wp_rec. iDestruct "Hr" as "[Hr Hr†]". - iDestruct "Hr" as (?) "[Hr H]". iDestruct "H" as (vl1 ? ->) "[Hr1' H]". - iDestruct "H" as (vl2 ? ->) "[Hr2' ->]". + iDestruct "Hr" as (?) "[Hr H]". iDestruct "H" as (vl1 vl1' ->) "[Hr1' H]". + iDestruct "H" as (vl2 vl2' ->) "[Hr2' ->]". destruct vl1 as [|[[|lr1|]|] []], vl2 as [|[[|lr2|]|] []]=>//=. rewrite heap_mapsto_vec_cons heap_mapsto_vec_singleton. iDestruct "Hr" as "[Hr1 Hr2]". wp_read. wp_let. wp_op. wp_read. wp_let. @@ -302,14 +302,14 @@ Section refmut_functions. destruct st as [[[[??]?]?]|]; last by destruct Hst as [[?|] Hst]; inversion Hst. move:Hst=>/Some_pair_included [/Some_pair_included_total_1 [/to_agree_included /(leibniz_equiv _ _) [= <- <-] _] _]. - iDestruct "Hst" as "(H† & Hq & _)". iDestruct "Hq" as (q' Hqq') "[Hν1 Hν2]". + iDestruct "Hst" as "(H† & Hq & _)". iDestruct "Hq" as (q1 Hqq1) "[Hν1 Hν2]". iMod (own_update with "H●") as "[H● ?]". { apply auth_update_alloc, - (op_local_update_discrete _ _ (writing_stR (q'/2)%Qp ν))=>-[Hagv _]. + (op_local_update_discrete _ _ (writing_stR (q1/2)%Qp ν))=>-[Hagv _]. split; [split|done]. - by rewrite /= agree_idemp. - - apply frac_valid'. rewrite -Hqq' comm -{2}(Qp_div_2 q'). - apply Qcplus_le_mono_l. rewrite -{1}(Qcplus_0_l (q'/2)%Qp). + - apply frac_valid'. rewrite -Hqq1 comm -{2}(Qp_div_2 q1). + apply Qcplus_le_mono_l. rewrite -{1}(Qcplus_0_l (q1/2)%Qp). apply Qcplus_le_mono_r, Qp_ge_0. } wp_let. wp_read. wp_let. wp_op. wp_write. wp_apply (wp_delete _ _ _ _ [_; _] with "[Hrefmut↦1 Hrefmut↦2 Hrefmut†]")=>//. diff --git a/theories/typing/lib/rwlock/rwlockreadguard.v b/theories/typing/lib/rwlock/rwlockreadguard.v index d7b5b5fd..0469dc74 100644 --- a/theories/typing/lib/rwlock/rwlockreadguard.v +++ b/theories/typing/lib/rwlock/rwlockreadguard.v @@ -82,7 +82,7 @@ Section rwlockreadguard. iDestruct (proj1 Hty with "HL") as "#Hty". iDestruct (Hα with "HL") as "#Hα". iDestruct (rwlock_proto_proper with "HL") as "#Hty1ty2"; first done. iIntros "!# #HE". iDestruct ("Hα" with "HE") as "Hα1α2". - iDestruct ("Hty" with "HE") as "(%&#Ho&#Hs)". iSplit; [|iSplit; iAlways]. + iDestruct ("Hty" with "HE") as "(%&#Ho&#Hs)". iSplit; [|iSplit; iModIntro]. - done. - iIntros (tid [|[[]|][]]) "H"; try done. iDestruct "H" as (ν q' γs β) "(#Hshr & #H⊑ & Htok & Hown & Hinh & Hinv)". diff --git a/theories/typing/lib/rwlock/rwlockwriteguard.v b/theories/typing/lib/rwlock/rwlockwriteguard.v index baa57227..6cfd2e84 100644 --- a/theories/typing/lib/rwlock/rwlockwriteguard.v +++ b/theories/typing/lib/rwlock/rwlockwriteguard.v @@ -82,12 +82,12 @@ Section rwlockwriteguard. iDestruct (Hty' with "HL") as "#Hty". iDestruct (Hα with "HL") as "#Hα". iDestruct (rwlock_proto_proper with "HL") as "#Hty1ty2"; first done. iIntros "!# #HE". iDestruct ("Hα" with "HE") as "Hα1α2". - iDestruct ("Hty" with "HE") as "(%&#Ho&#Hs)". iSplit; [done|iSplit; iAlways]. + iDestruct ("Hty" with "HE") as "(%&#Ho&#Hs)". iSplit; [done|iSplit; iModIntro]. - iIntros (tid [|[[]|][]]) "H"; try done. iDestruct "H" as (γs β) "(Hb & #H⊑ & Hown & Hinv)". iExists γs, β. iFrame "Hown". iSplitL "Hb"; last iSplitR "Hinv". + iApply bor_iff; last done. - iNext; iAlways; iSplit; iIntros "H"; iDestruct "H" as (vl) "[??]"; + iNext; iModIntro; iSplit; iIntros "H"; iDestruct "H" as (vl) "[??]"; iExists vl; iFrame; by iApply "Ho". + by iApply lft_incl_trans. + iDestruct "Hinv" as (γ tyO tyS) "(W & inv)". diff --git a/theories/typing/lib/spawn.v b/theories/typing/lib/spawn.v index 772d602e..2da54c52 100644 --- a/theories/typing/lib/spawn.v +++ b/theories/typing/lib/spawn.v @@ -30,7 +30,7 @@ Section join_handle. Lemma join_handle_subtype ty1 ty2 : ▷ type_incl ty1 ty2 -∗ type_incl (join_handle ty1) (join_handle ty2). Proof. - iIntros "#Hincl". iSplit; first done. iSplit; iAlways. + iIntros "#Hincl". iSplit; first done. iSplit; iModIntro. - iIntros "* Hvl". destruct vl as [|[[|vl|]|] [|]]; try done. simpl. iDestruct "Hvl" as (γc γe) "Hvl". iExists γc, γe. iApply (join_handle_impl with "[] Hvl"). iIntros "!# * Hown" (tid'). diff --git a/theories/typing/own.v b/theories/typing/own.v index 0677b433..03080ae6 100644 --- a/theories/typing/own.v +++ b/theories/typing/own.v @@ -94,7 +94,7 @@ Section own. Lemma own_type_incl n m ty1 ty2 : ▷ ⌜n = m⌝ -∗ ▷ type_incl ty1 ty2 -∗ type_incl (own_ptr n ty1) (own_ptr m ty2). Proof. - iIntros "#Heq (#Hsz & #Ho & #Hs)". iSplit; first done. iSplit; iAlways. + iIntros "#Heq (#Hsz & #Ho & #Hs)". iSplit; first done. iSplit; iModIntro. - iIntros (?[|[[| |]|][]]) "H"; try done. simpl. iDestruct "H" as "[Hmt H†]". iNext. iDestruct ("Hsz") as %<-. iDestruct "Heq" as %->. iFrame. iApply (heap_mapsto_pred_wand with "Hmt"). @@ -141,7 +141,7 @@ Section own. Sync ty → Sync (own_ptr n ty). Proof. iIntros (Hsync κ tid1 tid2 l) "H". iDestruct "H" as (l') "[Hm #Hshr]". - iExists _. iFrame "Hm". iAlways. iIntros (F q) "% Htok". + iExists _. iFrame "Hm". iModIntro. iIntros (F q) "% Htok". iMod ("Hshr" with "[] Htok") as "Hfin"; first done. iModIntro. iNext. iMod "Hfin" as "{Hshr} [Hshr $]". by iApply Hsync. Qed. @@ -241,7 +241,7 @@ Section typing. Lemma read_own_move E L ty n : ⊢ typed_read E L (own_ptr n ty) ty (own_ptr n $ uninit ty.(ty_size)). Proof. - rewrite typed_read_eq. iAlways. + rewrite typed_read_eq. iModIntro. iIntros ([[]|] tid F qL ?) "_ _ $ $ Hown"; try done. iDestruct "Hown" as "[H↦ H†]". iDestruct "H↦" as (vl) "[>H↦ Hown]". iDestruct (ty_size_eq with "Hown") as "#>%". diff --git a/theories/typing/product.v b/theories/typing/product.v index 9abc418e..3bc52cac 100644 --- a/theories/typing/product.v +++ b/theories/typing/product.v @@ -94,7 +94,7 @@ Section product. iClear "∗". iIntros "!# #HE". iDestruct ("H1" with "HE") as "#(% & #Ho1 & #Hs1)". clear H1. iDestruct ("H2" with "HE") as "#(% & #Ho2 & #Hs2)". clear H2. - iSplit; first by (iPureIntro; simpl; f_equal). iSplit; iAlways. + iSplit; first by (iPureIntro; simpl; f_equal). iSplit; iModIntro. - iIntros (??) "H". iDestruct "H" as (vl1 vl2) "(% & Hown1 & Hown2)". iExists _, _. iSplit. done. iSplitL "Hown1". + by iApply "Ho1". diff --git a/theories/typing/sum.v b/theories/typing/sum.v index bbfa4ab4..8af91c2e 100644 --- a/theories/typing/sum.v +++ b/theories/typing/sum.v @@ -130,7 +130,7 @@ Section sum. { iInduction Htyl as [|???? Hsub] "IH". { iClear "∗". iIntros "!# _". done. } iDestruct (Hsub with "HL") as "#Hsub". iDestruct ("IH" with "HL") as "{IH} #IH". - iAlways. iIntros "#HE". iDestruct ("Hsub" with "HE") as "(% & _ & _)". + iModIntro. iIntros "#HE". iDestruct ("Hsub" with "HE") as "(% & _ & _)". iDestruct ("IH" with "HE") as %IH. iPureIntro. simpl. inversion_clear IH. by f_equal. } iDestruct (subtype_Forall2_llctx with "HL") as "#Htyl"; first done. iClear "HL". iIntros "!# #HE". @@ -146,11 +146,11 @@ Section sum. rewrite (nth_lookup_Some tyl2 _ _ ty2) //. } clear -Hleq. iClear "∗". iSplit; last iSplit. - simpl. by rewrite Hleq. - - iAlways. iIntros (tid vl) "H". iDestruct "H" as (i vl' vl'') "(% & % & Hown)". + - iModIntro. iIntros (tid vl) "H". iDestruct "H" as (i vl' vl'') "(% & % & Hown)". iExists i, vl', vl''. iSplit; first done. iSplit; first by rewrite -Hleq. iDestruct ("Hty" $! i) as "(_ & #Htyi & _)". by iApply "Htyi". - - iAlways. iIntros (κ tid l) "H". iDestruct "H" as (i) "(Hmt & Hshr)". + - iModIntro. iIntros (κ tid l) "H". iDestruct "H" as (i) "(Hmt & Hshr)". iExists i. iSplitR "Hshr". + rewrite /is_pad -Hleq. iDestruct ("Hty" $! i) as "(Hlen & _)". iDestruct "Hlen" as %<-. done. diff --git a/theories/typing/type.v b/theories/typing/type.v index 7515f0b3..b4fe9a2d 100644 --- a/theories/typing/type.v +++ b/theories/typing/type.v @@ -551,14 +551,14 @@ Section subtyping. Global Instance type_incl_persistent ty1 ty2 : Persistent (type_incl ty1 ty2) := _. Lemma type_incl_refl ty : ⊢ type_incl ty ty. - Proof. iSplit; first done. iSplit; iAlways; iIntros; done. Qed. + Proof. iSplit; first done. iSplit; iModIntro; iIntros; done. Qed. Lemma type_incl_trans ty1 ty2 ty3 : type_incl ty1 ty2 -∗ type_incl ty2 ty3 -∗ type_incl ty1 ty3. Proof. iIntros "(% & #Ho12 & #Hs12) (% & #Ho23 & #Hs23)". iSplit; first (iPureIntro; etrans; done). - iSplit; iAlways; iIntros. + iSplit; iModIntro; iIntros. - iApply "Ho23". iApply "Ho12". done. - iApply "Hs23". iApply "Hs12". done. Qed. @@ -646,7 +646,7 @@ Section subtyping. □ (∀ tid vl, st1.(st_own) tid vl -∗ st2.(st_own) tid vl) -∗ type_incl st1 st2. Proof. - iIntros "#Hst". iSplit; first done. iSplit; iAlways. + iIntros "#Hst". iSplit; first done. iSplit; iModIntro. - iIntros. iApply "Hst"; done. - iIntros (???). iDestruct 1 as (vl) "[Hf Hown]". iExists vl. iFrame "Hf". by iApply "Hst". diff --git a/theories/typing/uniq_bor.v b/theories/typing/uniq_bor.v index e0cde6e6..2667230f 100644 --- a/theories/typing/uniq_bor.v +++ b/theories/typing/uniq_bor.v @@ -50,10 +50,10 @@ Section uniq_bor. iDestruct (Hty with "HL") as "#Hty". iDestruct (Hκ with "HL") as "#Hκ". iIntros "!# #HE". iSplit; first done. iDestruct ("Hty" with "HE") as "(_ & #Ho & #Hs)"; [done..|clear Hty]. - iSpecialize ("Hκ" with "HE"). iSplit; iAlways. + iSpecialize ("Hκ" with "HE"). iSplit; iModIntro. - iIntros (? [|[[]|][]]) "H"; try done. iApply (bor_shorten with "Hκ"). iApply bor_iff; last done. - iNext. iAlways. iSplit; iIntros "H"; iDestruct "H" as (vl) "[??]"; + iNext. iModIntro. iSplit; iIntros "H"; iDestruct "H" as (vl) "[??]"; iExists vl; iFrame; by iApply "Ho". - iIntros (κ ??) "H". iAssert (κ2 ⊓ κ ⊑ κ1 ⊓ κ)%I as "#Hincl'". { iApply lft_intersect_mono. done. iApply lft_incl_refl. } @@ -80,7 +80,7 @@ Section uniq_bor. Send ty → Send (uniq_bor κ ty). Proof. iIntros (Hsend tid1 tid2 [|[[]|][]]) "H"; try done. - iApply bor_iff; last done. iNext. iAlways. iApply bi.equiv_iff. + iApply bor_iff; last done. iNext. iModIntro. iApply bi.equiv_iff. do 3 f_equiv. iSplit; iIntros "."; by iApply Hsend. Qed. @@ -88,7 +88,7 @@ Section uniq_bor. Sync ty → Sync (uniq_bor κ ty). Proof. iIntros (Hsync κ' tid1 tid2 l) "H". iDestruct "H" as (l') "[Hm #Hshr]". - iExists l'. iFrame "Hm". iAlways. iIntros (F q) "% Htok". + iExists l'. iFrame "Hm". iModIntro. iIntros (F q) "% Htok". iMod ("Hshr" with "[] Htok") as "Hfin"; first done. iClear "Hshr". iModIntro. iNext. iMod "Hfin" as "[Hshr $]". iApply Hsync. done. Qed. -- GitLab