diff --git a/coq/ra/gps/fractional.v b/coq/ra/gps/fractional.v index 9c29ed37956a1dfc308be26bb3496a7b1ae2162f..b5b03d3032bfe068d507fcd67af17f99002e124a 100644 --- a/coq/ra/gps/fractional.v +++ b/coq/ra/gps/fractional.v @@ -1,7 +1,9 @@ +From iris.proofmode Require Import tactics. From ra.gps Require Export inst_shared. +From ra Require Import abs_view. Section Fractional. - Context {Σ : gFunctors} {Prtcl : protocolT} `{fG : !foundationG Σ} `{GPSG : !gpsG Σ Prtcl PF} + Context `{fG : !foundationG Σ} `{GPSG : !gpsG Σ Prtcl PF} `{persG : persistorG Σ} `{agreeG : gps_agreeG Σ Prtcl} `{CInvG : cinvG Σ} @@ -146,6 +148,46 @@ Section Fractional. iPureIntro. do 3 (etrans; eauto). Qed. + Lemma GPS_FP_Read_abs `{absG : absViewG Σ} + l q (P : vPred) (Q : pr_state Prtcl → Z → vPred) + s (E : coPset) β (HN : ↑physN ⊆ E) (HNl: ↑fracN .@ l ⊆ E): + {{{{ (â–· ∀ s', â– (s ⊑ s') → + (∀ v, F_past l s' v ∗ P ={E ∖ ↑fracN .@ l}=∗ Q s' v) + ∨ (∀ s'' v, â– (s' ⊑ s'') → F l s'' v ∗ P ={E ∖ ↑fracN .@ l}=∗ False)) + ∗ â–· É (∀ s' v, â– (s ⊑ s') ∗ F_past l s' v + ={E ∖ ↑fracN .@ l}=∗ F_past l s' v ∗ F_past l s' v ) + ∗ P ∗ ⌞vGPS_FP l s q⌟ β ∗ aSeen β }}}} + ([ #l ]_at) @ E + {{{{ s' v, RET #v ; + â– (s ⊑ s') ∗ ⌞vGPS_FP l s q⌟ β ∗ Q s' v }}}}%C. + Proof. + intros; iViewUp; iIntros "#kI kS (VS & VSDup & oP & oR & Seen) Post". + iDestruct "oR" as (V0) "(abs & oR)". + iDestruct "Seen" as (V1) "(% & abs2)". + iDestruct (absView_agree with "[$abs $abs2]") as "%". subst V1. + iMod (fractor_open with "[$oR]") + as (X) "(gpsRaw & RRaw & HClose)"; first exact HNl. + + iDestruct "RRaw" as (γ γ_x e_x) "(% & Hex & RA)". + iDestruct "gpsRaw" as (γ' γ_x' ζ) "(>% & oI & Writer)". + subst X. apply encode_inj in H1. inversion H1. subst γ' γ_x'. + + iDestruct "RA" as (V_r v_r) "(% & % & #oR)". + + iApply (RawProto_Read IP l P Q s _ _ V_r v_r γ γ_x + with "[$VS $oI $kI $kS $oP $oR VSDup]"); [solve_ndisj|by etrans|..]. + { iNext. by iSpecialize ("VSDup" $! _). } + iNext. + iIntros (s' v Vr V') "(#HV' & kS' & #Hs' & oI & oQ & #oR' & % & %)". + iApply ("Post" $! V' with "HV' * kS'"). iFrame "Hs' oQ". + iExists V0. iFrame "abs". + iApply "HClose". iSplitL "oI Writer". + + iNext. iExists γ, γ_x, ζ. by iFrame "oI Writer". + + iExists γ, γ_x, e_x. iFrame "Hex". + iSplit; first done. + iExists V_r, v_r. iFrame (H0 H2) "oR". + Qed. + Lemma GPS_FP_Write l q s s' v (E : coPset) (P: vPred) (Q : pr_state Prtcl → vPred) (HN : ↑physN ⊆ E) (HNl: ↑fracN .@ l ⊆ E) (HFinal : final_st s'): diff --git a/coq/ra/na.v b/coq/ra/na.v index 646fb330fd478d84c21f7cb7229a52f17c6c9243..32a26e148e9190cdcd85ffe3b2bc6b0b5aa9e858 100644 --- a/coq/ra/na.v +++ b/coq/ra/na.v @@ -2,7 +2,7 @@ From iris.program_logic Require Import weakestpre. From iris.base_logic Require Import lib.invariants. From iris.proofmode Require Import tactics. -From ra Require Import viewpred proofmode weakestpre fractor. +From ra Require Import viewpred proofmode weakestpre fractor abs_view. From ra Require Export notation. From ra.base Require Export ghosts na_read na_write. @@ -10,7 +10,7 @@ Section Helpers. Context {Σ : gFunctors}. Set Default Proof Using "Type". Definition valloc_local_aux h V: iProp Σ := ⌜alloc_local h VâŒ%I. - + Definition vPred_valloc_local h : @vPred_Mono Σ (valloc_local_aux h). Proof. @@ -25,21 +25,21 @@ End Helpers. Section Exclusive. Context {Σ : gFunctors} `{fG : foundationG Σ}. Set Default Proof Using "Type". - + Definition own_loc_prim l h: @vPred Σ := (∃ i, valloc_local h ∧ (☠Hist l h) ∗ (☠Info l 1%Qp i)). - + Definition own_loc_na l v: @vPred Σ := ∃ V, own_loc_prim l {[v, V]}. Definition own_loc l : @vPred Σ := (∃ h, own_loc_prim l h). - + Global Instance From_own_loc_prim_exist: ∀ V, FromExist (own_loc_prim l h V) (λ i, (valloc_local h ∧ (☠Hist l h) ∗ (☠Info l 1%Qp i)) V)%VP. Proof. apply _. Qed. - + Global Instance Into_own_loc_prim_exist: ∀ V, IntoExist (own_loc_prim l h V) (λ i, (valloc_local h ∧ (☠Hist l h) ∗ (☠Info l 1%Qp i)) V)%VP. @@ -71,7 +71,7 @@ Section Exclusive. Global Instance own_loc_prim_timeless l h V : TimelessP (own_loc_prim l h V). Proof. apply _. Qed. - + Global Instance own_loc_timeless l V : TimelessP (own_loc l V). Proof. apply _. Qed. @@ -88,7 +88,7 @@ Typeclasses Opaque own_loc_prim own_loc_na own_loc. Section Fractional. Context {Σ : gFunctors} `{fG : foundationG Σ} `{cG : cinvG Σ}. Set Default Proof Using "Type". - + Notation frac_inv h := (λ l _, Hist l h)%I. Notation frac_local v := (λ _ _ X, ⌜X = encode vâŒ)%I. @@ -117,6 +117,22 @@ Proof. destruct 1 as (vx & Vx & ? & ?). abstract set_solver. Qed. +Lemma alloc_local_singleton_na_safe l v V V': + alloc_local {[v, V]} V' → na_safe l {[v, V]} V'. +Proof. + move => [v1 [V1 [H1 [H2 _]]]]. + exists (v1, V1). repeat split; [auto|abstract set_solver+H1|auto]. +Qed. + +Lemma alloc_local_singleton_value_init v V V': + alloc_local {[VInj v, V]} V' → init_local {[VInj v, V]} V'. +Proof. + move => [v1 [V1 [H1 [H2 _]]]]. + exists v1, V1. repeat split; [auto|auto|]. + apply elem_of_singleton_1 in H1. by inversion H1. +Qed. + + Section ExclusiveRules. Context `{foundationG Σ}. Set Default Proof Using "Type". @@ -137,11 +153,11 @@ Section ExclusiveRules. Proof. intros. iViewUp; iIntros "#kI kS oNA Post". iDestruct "oNA" as (V_0 i) "(% & oH & oI)". - iApply wp_mask_mono; last (iApply (f_read_na with "[$kI $kS $oH]")); first auto. - - destruct H1 as (v1 & V1 & H1 & H2 & H3). iSplit; iPureIntro. - + exists (v1, V1). repeat split; [auto|abstract set_solver+H1|auto]. - + exists v1, V1. repeat split; [auto|auto|]. - apply elem_of_singleton_1 in H1. by inversion H1. + iApply wp_mask_mono; + last (iApply (f_read_na with "[$kI $kS $oH]")); first auto. + - iSplit; iPureIntro; + by [apply alloc_local_singleton_na_safe| + apply alloc_local_singleton_value_init]. - iNext. iIntros (v_r V') "(% & kS' & oH & % & H)". iDestruct "H" as (V_1) "(% & % & %)". move: H6 => /value_at_hd_singleton [[->] ->]. @@ -231,18 +247,17 @@ Section FractionalRules. ↑ physN ⊆ E → ↑fracN .@ l ⊆ E → {{{{ l ↦{q} v }}}} - ([ #l]_na) @ E - {{{{ z, RET (#z); â– (z = v) ∗ (l ↦{q} v) }}}}. + [ #l ]_na @ E + {{{{ z, RET (#z); â– (z = v) ∗ l ↦{q} v }}}}. Proof. intros. iViewUp; iIntros "#kI kS oNA Post". iDestruct "oNA" as (V_0) "(% & oNA)". iMod (fractor_open with "oNA") as (X) "(oH & HX & HClose)"; [solve_ndisj|]. iApply wp_mask_mono; last (iApply (f_read_na with "[$kI $kS $oH]")); first solve_ndisj. - - destruct H1 as (v1 & V1 & H1 & H2 & H3). iSplit; iPureIntro. - + exists (v1, V1). repeat split; [auto|abstract set_solver+H1|auto]. - + exists v1, V1. repeat split; [auto|auto|]. - apply elem_of_singleton_1 in H1. by inversion H1. + - iSplit; iPureIntro; + by [apply alloc_local_singleton_na_safe| + apply alloc_local_singleton_value_init]. - iNext. iIntros (v_r V') "(% & kS' & oH & % & H)". iDestruct "H" as (V_1) "(% & % & %)". move: H6 => /value_at_hd_singleton [[->] ->]. @@ -254,6 +269,35 @@ Section FractionalRules. exists (VInj v_r), V_1. by rewrite elem_of_singleton. Qed. + Lemma na_read_abs_frac `{absG : absViewG Σ} (E : coPset) l q v β : + ↑ physN ⊆ E → + ↑fracN .@ l ⊆ E → + {{{{ ⌞l ↦{q} v⌟ β ∗ aSeen β }}}} + [ #l ]_na @ E + {{{{ z, RET (#z); â– (z = v) ∗ ⌞l ↦{q} v⌟ β }}}}. + Proof. + intros. iViewUp; iIntros "#kI kS (ol & Seen) Post". + iDestruct "ol" as (V0) "(abs & ol)". + iDestruct "Seen" as (V1) "(% & abs2)". + iDestruct (absView_agree with "[$abs $abs2]") as "%". subst V0. + iDestruct "ol" as (V0) "[% ol]". + iMod (fractor_open with "ol") as (X) "(oH & HX & HClose)"; [solve_ndisj|]. + iApply wp_mask_mono; last (iApply (f_read_na with "[$kI $kS $oH]")); + first solve_ndisj. + - iSplit; iPureIntro; + [apply alloc_local_singleton_na_safe| + apply alloc_local_singleton_value_init]; + by apply (alloc_local_Mono _ _ V1). + - iNext. iIntros (v_r V') "(% & kS' & oH & % & H)". + iDestruct "H" as (V_1) "(% & % & %)". + move: H7 => /value_at_hd_singleton [[?] ?]. subst v_r V_1. + iApply ("Post" with "[%] * kS'"); [done|]. + iMod ("HClose" $! (λ _ _ X, ⌜X = encode (VInj v)âŒ)%I with "[$oH $HX]") + as "ol". + iModIntro. iSplitL ""; first done. + iExists _. iFrame "abs". iExists _. by iFrame "ol". + Qed. + Lemma na_frac_from_non (E: coPset) l v: ↑ physN ⊆ E → (☠PSCtx ∗ l ↦ v ={E}=> l ↦{1} v)%VP. @@ -307,5 +351,6 @@ Section FractionalRules. End FractionalRules. + Arguments na_read [_ _ _ _ _] _ [_ _ _]. Arguments na_write [_ _ _ _ _] _ [_ _ _]. \ No newline at end of file