diff --git a/base_logic/lib/boxes.v b/base_logic/lib/boxes.v index 3ae9b0c7ba297e8176f4a2d0f209ad9a18fd6366..5cbff7ecded0e7c8f6e5ffab278afaa9e46d5653 100644 --- a/base_logic/lib/boxes.v +++ b/base_logic/lib/boxes.v @@ -104,7 +104,7 @@ Proof. iFrame; eauto. Qed. -Lemma box_delete E f P Q γ : +Lemma box_delete_empty E f P Q γ : ↑N ⊆ E → f !! γ = Some false → slice N γ Q ∗ ▷ box N f P ={E}=∗ ∃ P', @@ -143,18 +143,6 @@ Proof. iFrame; eauto. Qed. -Lemma box_insert_full E f P Q : - ↑N ⊆ E → - ▷ Q ∗ ▷ box N f P ={E}=∗ ∃ γ, ⌜f !! γ = None⌠∗ - slice N γ Q ∗ ▷ box N (<[γ:=true]> f) (Q ∗ P). -Proof. - iIntros (?) "[HQ Hbox]". - iMod (box_insert_empty with "Hbox") as (γ) "(% & #Hslice & Hbox)". - iExists γ. iFrame "%#". - iMod (box_fill with "[$Hslice $HQ $Hbox]"). done. - by apply lookup_insert. by rewrite insert_insert. -Qed. - Lemma box_empty E f P Q γ : ↑N ⊆ E → f !! γ = Some true → @@ -175,6 +163,33 @@ Proof. iFrame; eauto. Qed. +Lemma box_insert_full E f P Q : + ↑N ⊆ E → + ▷ Q ∗ ▷ box N f P ={E}=∗ ∃ γ, ⌜f !! γ = None⌠∗ + slice N γ Q ∗ ▷ box N (<[γ:=true]> f) (Q ∗ P). +Proof. + iIntros (?) "[HQ Hbox]". + iMod (box_insert_empty with "Hbox") as (γ) "(% & #Hslice & Hbox)". + iExists γ. iFrame "%#". + iMod (box_fill with "[$Hslice $HQ $Hbox]"). done. + by apply lookup_insert. by rewrite insert_insert. +Qed. + +Lemma box_delete_full E f P Q γ : + ↑N ⊆ E → + f !! γ = Some true → + slice N γ Q ∗ ▷ box N f P ={E}=∗ + ▷ Q ∗ ∃ P', ▷ ▷ (P ≡ (Q ∗ P')) ∗ ▷ box N (delete γ f) P'. +Proof. + iIntros (??) "[#Hslice Hbox]". + iMod (box_empty with "[$Hslice $Hbox]") as "[$ Hbox]"; try done. + iMod (box_delete_empty with "[$Hslice $Hbox]") as (P') "[Heq Hbox]". + done. by apply lookup_insert. + iExists P'. rewrite delete_insert. iFrame. + iMod (box_fill with "[$Hslice $HQ $Hbox]"). done. + by rewrite insert_insert. +Qed. + Lemma box_fill_all E f P : ↑N ⊆ E → box N f P ∗ ▷ P ={E}=∗ box N (const true <$> f) P.