diff --git a/theories/rust_typing/existentials_na.v b/theories/rust_typing/existentials_na.v index 86fd51a9fde72d252e989511765801cde91ed8e0..2131ade0ecfb2a598b8e75343908b338ba51ed8f 100644 --- a/theories/rust_typing/existentials_na.v +++ b/theories/rust_typing/existentials_na.v @@ -13,7 +13,6 @@ Record na_ex_inv_def `{!typeGS Σ} (X : Type) (Y : Type) : Type := na_mk_ex_inv_ na_inv_P_lfts : list lft; na_inv_P_wf_E : elctx; - (* na_inv_P_timeless : ∀ Ï€ x y, Timeless (na_inv_P Ï€ x y); *) }. (* Stop Typeclass resolution for the [inv_P_pers] argument, to make it more deterministic. *) @@ -24,29 +23,22 @@ Definition na_mk_ex_inv_def `{!typeGS Σ} {X Y : Type} (YR : Type) `{!Inhabited inv_P_lfts (inv_P_wf_E : elctx) - (* (inv_P_timeless: TCNoResolve (∀ (Ï€ : thread_id) (x : X) (y : Y), Timeless (inv_P Ï€ x y))) *) := na_mk_ex_inv_def' _ _ _ _ _ _ - inv_xrt inv_P inv_P_lfts inv_P_wf_E (* inv_P_timeless *). + inv_xrt inv_P inv_P_lfts inv_P_wf_E. Global Arguments na_inv_xr {_ _ _ _ _}. Global Arguments na_inv_xrt {_ _ _ _ _}. Global Arguments na_inv_P {_ _ _ _}. Global Arguments na_inv_P_lfts {_ _ _ _}. Global Arguments na_inv_P_wf_E {_ _ _ _}. -(* Global Arguments na_inv_P_timeless {_ _ _ _}. *) -(* Global Existing Instance na_inv_P_timeless. *) (** Smart constructor for persistent and timeless [P] *) Program Definition na_mk_pers_ex_inv_def `{!typeGS Σ} {X : Type} {Y : Type} (YR : Type) `{!Inhabited YR} (xtr : YR → Y) - (P : X → Y → iProp Σ) - (* (_: TCNoResolve (∀ x y, Timeless (P x y))): na_ex_inv_def X Y *) := + (P : X → Y → iProp Σ) := na_mk_ex_inv_def YR xtr (λ _, P) [] [] (* _ *). -(* Next Obligation. *) -(* by rewrite /TCNoResolve. *) -(* Qed. *) Class NaExInvDefNonExpansive `{!typeGS Σ} {rt X Y : Type} (F : type rt → na_ex_inv_def X Y) : Type := { ex_inv_def_ne_lft_mor : DirectLftMorphism (λ ty, (F ty).(na_inv_P_lfts)) (λ ty, (F ty).(na_inv_P_wf_E)); @@ -495,26 +487,29 @@ Section generated_code. simp_ltypes. done. Qed. - Lemma na_ex_plain_t_open_shared F Ï€ (ty : type rt) q κ l (x : X) : - lftE ⊆ F → + Lemma na_ex_plain_t_open_shared E F Ï€ (ty : type rt) q κ l (x : X) : + lftE ⊆ E → + ↑shrN.@l ⊆ E → ↑shrN.@l ⊆ F → lft_ctx -∗ - na_own Ï€ ⊤ -∗ + na_own Ï€ F -∗ £ 1 -∗ (* Required: P.(na_inv_P) is not Timeless *) q.[κ] -∗ - l â—â‚—[Ï€, Shared κ] (#x) @ (â— (∃na; P, ty)) ={F}=∗ + l â—â‚—[Ï€, Shared κ] (#x) @ (â— (∃na; P, ty)) ={E}=∗ ∃ r : rt, P.(na_inv_P) Ï€ r x ∗ â–· (l â—â‚—[Ï€, Owned false] PlaceIn r @ (â— ty)) ∗ + (* NOTE: Make &na appears, as it's required afterwards. *) + &na{κ, Ï€, shrN.@l} (∃ r : rt, l ↦: ty_own_val ty Ï€ r ∗ na_inv_P P Ï€ r x) ∗ - ( l â—â‚—[Ï€, Owned false] #r @ (â— ty) ∗ P.(na_inv_P) Ï€ r x ={F}=∗ - q.[κ] ∗ na_own Ï€ ⊤ ). + ( l â—â‚—[Ï€, Owned false] #r @ (â— ty) ∗ P.(na_inv_P) Ï€ r x ={E}=∗ + q.[κ] ∗ na_own Ï€ F ). (* TODO: Closing view-shift here. *) Proof. - iIntros (??) "#LFT Hna Hcred Hq #Hb". + iIntros (???) "#LFT Hna Hcred Hq #Hb". iEval (rewrite ltype_own_ofty_unfold /lty_of_ty_own) in "Hb". iDestruct "Hb" as (ly Halg Hly) "(Hsc & Hlb & %v & -> & #Hb)". @@ -525,8 +520,7 @@ Section generated_code. iMod (na_bor_acc with "LFT Hbor Hq Hna") as "((%r & Hl & HP) & Hna & Hvs)"; [ solve_ndisj.. |]. iMod (lc_fupd_elim_later with "Hcred HP") as "HP". - iModIntro; iExists r. - iSplitL "HP"; first done. + iModIntro; iExists r; iFrame. iSplitL "Hl". { rewrite ltype_own_ofty_unfold /lty_of_ty_own. @@ -535,12 +529,12 @@ Section generated_code. iExists r; iR. by iModIntro. } - iIntros "(Hl & HP)". + iR; iIntros "(Hl & HP)". iEval (rewrite ltype_own_ofty_unfold /lty_of_ty_own) in "Hl". iDestruct "Hl" as (???) "(_ & _ & _ & (%r' & -> & Hl)) /=". iMod (fupd_mask_mono with "Hl") as "Hl"; first solve_ndisj. - iApply ("Hvs" with "[Hl HP]"); last done. + iApply ("Hvs" with "[Hl HP] Hna"). iExists r'; iFrame. Qed. @@ -549,8 +543,12 @@ Section generated_code. li_tactic (lctx_lft_alive_count_goal E L1 κ) (λ '(_, L2), ∀ r, introduce_with_hooks E L2 (P.(na_inv_P) Ï€ r x) (λ L3, typed_place Ï€ E L3 l - (MagicLtype (â— ty) (â— (∃na; P, ty)) (λ rfn, P.(na_inv_P) Ï€ rfn x) (λ rfn, na_own Ï€ (↑shrN.@l))) - (#x) bmin (Owned true) K + (ShadowedLtype + (OpenedLtype (â— ty) (â— ty) (â— (∃na; P, ty)) + (λ rfn x', ⌜x = x'⌠∗ P.(na_inv_P) Ï€ rfn x) + (λ rfn x', ⌜x = x'⌠∗ na_own Ï€ (↑shrN.@l))) + (#r) (â— (∃na; P, ty))) + (#x) (Owned false) (Shared κ) K (λ L2 κs li b2 bmin' rti ltyi ri strong weak, T L2 κs li b2 bmin' rti ltyi ri strong None) ))) @@ -564,32 +562,48 @@ Section generated_code. iApply fupd_place_to_wp. iMod ("HT" with "[] [] [$LFT $TIME $LLCTX] HE HL") - as "(% & % & % & >(Hcred & HR) & HL & HT)"; [ solve_ndisj.. |]. + as "(% & % & % & >(Hcred & HR) & HL & HT)"; [ done.. |]. iSpecialize ("HT" with "HR"). rewrite /li_tactic /lctx_lft_alive_count_goal. iDestruct "HT" as "(% & % & %Hal & HT)". - iMod (lctx_lft_alive_count_tok with "HE HL") as (q) "(Htok & Htokcl & HL)"; [ solve_ndisj | done |]. - iMod (na_ex_plain_t_open_shared with "LFT [] Hcred Htok Hl") as (r) "(HP & Hl & Hvs)"; [ done.. | |]. - { (* TODO: Correctly pass na_own Ï€ ⊤ *) admit. } + iMod (lctx_lft_alive_count_tok with "HE HL") as (q) "(Htok & Htokcl & HL)"; [ done.. |]. + iMod (na_ex_plain_t_open_shared with "LFT Hna Hcred Htok Hl") as (r) "(HP & Hl & #Hbor & Hvs)"; [ done.. |]. + + iEval (rewrite ltype_own_ofty_unfold /lty_of_ty_own) in "Hl". + iDestruct "Hl" as (ly) "(>%Halg & >%Hly & >#Hsc & >#Hlb & _ & (% & >%Heq & Hl))". + rewrite <- Heq; clear Heq; simpl. iMod ("HT" with "[] HE HL HP") as "(% & HL & HT)"; first done. - iApply ("HT" with "[//] [//] [$LFT $TIME $LLCTX] HE HL Hna [Hincl] [Hl]"). - { by iApply (bor_kind_incl_trans with "Hincl"). } - { admit. } + iApply ("HT" with "[//] [//] [$LFT $TIME $LLCTX] HE HL [] [Hincl] [Hl Hsc Hlb]"). + { admit. (* TODO: na_token *) } + { unfold bor_kind_incl. admit. (* NOTE: Is (Owned _) possible? *) } + { rewrite ltype_own_shadowed_unfold /shadowed_ltype_own. + rewrite ltype_own_opened_unfold /opened_ltype_own. + rewrite ltype_own_ofty_unfold /lty_of_ty_own. + + simp_ltypes; iR. + + iSplitR; iExists ly; repeat iR. + { admit. (* TODO: opened_ltype_own (ltypes.v:3213) *) } + + iExists x; iR. + rewrite /na_ex_plain_t /ty_shr. + repeat iR; by iExists ly. } iModIntro. - iIntros (L'' κs' l2 b2 bmin0 rti ltyi ri strong weak) "Hincl Hl Hc". + iIntros (L'' κs' l2 b2 bmin0 rti ltyi ri strong weak) "Hincl Hl [ Hstrong _ ]". iApply ("Hcont" with "Hincl Hl"). - admit. + + destruct strong; iSplit; [| done.. ]. + by simp_ltypes. Admitted. - (* Instances for Magic *) - Lemma typed_place_magic_owned Ï€ E L {rt_cur rt_full} - (lt_cur : ltype rt_cur) (lt_full : ltype rt_full) Cpre Cpost - (r: place_rfn rt_full) bmin0 l wl P'' (T : place_cont_t rt_full) : - typed_place Ï€ E L l lt_full r bmin0 (Owned false) P'' + Lemma typed_place_opened_shared Ï€ E L {rt_cur rt_inner rt_full} + (lt_cur : ltype rt_cur) (lt_inner: ltype rt_inner) (lt_full : ltype rt_full) Cpre Cpost + (r: place_rfn rt_cur) bmin0 l wl P'' (T : place_cont_t rt_cur) : + typed_place Ï€ E L l lt_cur r bmin0 (Owned false) P'' (λ L' κs l2 b2 bmin rti ltyi ri strong weak, T L' κs l2 b2 bmin rti ltyi ri (option_map (λ strong, mk_strong strong.(strong_rt) @@ -600,7 +614,7 @@ Section generated_code. (λ rti2 ri2, strong.(strong_rfn) _ ri2) strong.(strong_R)) strong) None) - ⊢ typed_place Ï€ E L l (MagicLtype lt_cur lt_full Cpre Cpost) r bmin0 (Owned wl) P'' T. + ⊢ typed_place Ï€ E L l (OpenedLtype lt_cur lt_inner lt_full Cpre Cpost) r bmin0 (Shared wl) P'' T. Proof. Admitted. End na_subtype. @@ -644,24 +658,30 @@ Section generated_code. Unshelve. all: print_remaining_sidecond. Qed. - (* Lemma Cell_get_proof (Ï€ : thread_id) : *) - (* Cell_get_lemma Ï€. *) - (* Proof. *) - (* Cell_get_prelude. *) + Lemma Cell_get_proof (Ï€ : thread_id) : + Cell_get_lemma Ï€. + Proof. + Cell_get_prelude. - (* repeat liRStep; liShow. *) + repeat liRStep; liShow. - (* iApply na_typed_place_ex_plain_t_shared. *) - (* liSimpl; liShow. *) + unfold Cell_inv_t; simpl. - (* repeat liRStep; liShow. *) + unfold bor_kind_min. + iApply na_typed_place_ex_plain_t_shared. + liSimpl; liShow. - (* all: print_remaining_goal. *) - (* Unshelve. all: sidecond_solver. *) - (* Unshelve. all: sidecond_hammer. *) - (* Unshelve. all: print_remaining_sidecond. *) - (* Qed. *) - End proof. + repeat liRStep; liShow. + + iApply typed_place_opened_shared. + repeat liRStep; liShow. + + (* all: print_remaining_goal. *) + (* Unshelve. all: sidecond_solver. *) + (* Unshelve. all: sidecond_hammer. *) + (* Unshelve. all: print_remaining_sidecond. *) + Admitted. + End proof. End generated_code.