Library zoo_saturn.inf_ws_deque_2
Require Import zoo.prelude.
Require Import zoo.common.countable.
Require Import zoo.common.relations.
Require Import zoo.iris.bi.big_op.
Require Import zoo.iris.base_logic.lib.auth_twins.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_saturn.inf_ws_deque_2__code.
Require Import zoo_saturn.inf_ws_deque_2__types.
Require Import zoo.options.
Import inf_ws_deque_1.base.
Implicit Type slot : location.
Implicit Type slots : list location.
Implicit Type v : val.
Implicit Type vs ws : list val.
Class InfWsDeque2G Σ `{zoo۰G : !ZooG Σ} :=
{ #[local] inf_ws_deque_2۰G۰base۰G :: InfWsDeque1G Σ
; #[local] inf_ws_deque_2۰G۰model۰G :: AuthTwinsG Σ (leibnizO (list val)) suffix
}.
Definition inf_ws_deque_2۰Σ :=
#[inf_ws_deque_1۰Σ
; auth_twins۰Σ (leibnizO (list val)) suffix
].
#[global] Instance subGーinf_ws_deque_2۰Σ Σ `{zoo۰G : !ZooG Σ} :
subG inf_ws_deque_2۰Σ Σ →
InfWsDeque2G Σ .
Module base.
Section inf_ws_deque_2۰G.
Context `{inf_ws_deque_2۰G : InfWsDeque2G Σ}.
Implicit Type t : location.
Record inf_ws_deque_2۰name :=
{ inf_ws_deque_2۰name۰base : inf_ws_deque_1۰name
; inf_ws_deque_2۰name۰model : auth_twins۰name
}.
Implicit Type γ : inf_ws_deque_2۰name.
#[global] Instance inf_ws_deque_2۰nameーeq_dec : EqDecision inf_ws_deque_2۰name :=
ltac:(solve_decision).
#[global] Instance inf_ws_deque_2۰nameーcountable :
Countable inf_ws_deque_2۰name.
#[local] Definition model₁' γ_model vs :=
auth_twins۰twin₁ _ γ_model vs.
#[local] Definition model₁ γ :=
model₁' γ.(inf_ws_deque_2۰name۰model).
#[local] Definition model₂' γ_model vs :=
auth_twins۰twin₂ _ γ_model vs.
#[local] Definition model₂ γ :=
model₂' γ.(inf_ws_deque_2۰name۰model).
#[local] Definition owner' γ_owner ws :=
auth_twins۰auth _ γ_owner ws.
#[local] Definition owner γ :=
owner' γ.(inf_ws_deque_2۰name۰model).
#[local] Definition inv۰inner γ : iProp Σ :=
∃ vs slots,
inf_ws_deque_1۰model γ.(inf_ws_deque_2۰name۰base) (#*@{location} slots) ∗
model₂ γ vs ∗
[∗ list] slot; v ∈ slots; vs, slot ↦ᵣ v.
#[local] Instance : CustomIpat "inv۰inner" :=
" ( %vs{} & %slots{} & >Hbase_model & >Hmodel₂ & >Hslots ) ".
Definition inf_ws_deque_2۰inv t γ ι : iProp Σ :=
inf_ws_deque_1۰inv t γ.(inf_ws_deque_2۰name۰base) (ι.@"base") ∗
inv (ι.@"inv") (inv۰inner γ).
#[local] Instance : CustomIpat "inv" :=
" ( #Hbase_inv & #Hinv ) ".
Definition inf_ws_deque_2۰model :=
model₁.
#[local] Instance : CustomIpat "model" :=
" Hmodel₁{_{}} ".
Definition inf_ws_deque_2۰owner γ ws : iProp Σ :=
∃ slots_owner,
inf_ws_deque_1۰owner γ.(inf_ws_deque_2۰name۰base) (#*@{location} slots_owner) ∗
owner γ ws.
#[local] Instance : CustomIpat "owner" :=
" ( %slots_owner{_{}} & Hbase_owner{_{}} & Howner{_{}} ) ".
#[global] Instance inf_ws_deque_2۰modelーtimeless γ vs :
Timeless (inf_ws_deque_2۰model γ vs).
#[global] Instance inf_ws_deque_2۰ownerーtimeless γ ws :
Timeless (inf_ws_deque_2۰owner γ ws).
#[global] Instance inf_ws_deque_2۰invーpersistent t γ ι :
Persistent (inf_ws_deque_2۰inv t γ ι).
#[local] Lemma modelーownerーalloc :
⊢ |==>
∃ γ_model,
model₁' γ_model [] ∗
model₂' γ_model [] ∗
owner' γ_model [].
#[local] Lemma model₁ーvalid γ ws vs :
owner γ ws -∗
model₁ γ vs -∗
⌜vs `suffix_of` ws⌝.
#[local] Lemma model₁ーexclusive γ vs1 vs2 :
model₁ γ vs1 -∗
model₁ γ vs2 -∗
False.
#[local] Lemma modelーagree γ vs1 vs2 :
model₁ γ vs1 -∗
model₂ γ vs2 -∗
⌜vs1 = vs2⌝.
#[local] Lemma modelーownerーagree γ ws vs1 vs2 :
owner γ ws -∗
model₁ γ vs1 -∗
model₂ γ vs2 -∗
⌜vs1 `suffix_of` ws⌝ ∗
⌜vs1 = vs2⌝.
#[local] Lemma modelーpush {γ ws vs1 vs2} v :
owner γ ws -∗
model₁ γ vs1 -∗
model₂ γ vs2 ==∗
owner γ (vs1 ++ [v]) ∗
model₁ γ (vs1 ++ [v]) ∗
model₂ γ (vs1 ++ [v]).
#[local] Lemma modelーsteal γ vs1 vs2 :
model₁ γ vs1 -∗
model₂ γ vs2 ==∗
model₁ γ (tail vs1) ∗
model₂ γ (tail vs1).
#[local] Lemma modelーpop γ ws vs1 vs2 :
owner γ ws -∗
model₁ γ vs1 -∗
model₂ γ vs2 ==∗
owner γ (removelast vs1) ∗
model₁ γ (removelast vs1) ∗
model₂ γ (removelast vs1).
#[local] Lemma ownerーupdate γ ws vs :
owner γ ws -∗
model₁ γ vs -∗
model₂ γ vs ==∗
owner γ vs ∗
model₁ γ vs ∗
model₂ γ vs.
#[local] Lemma ownerーexclusive γ ws1 ws2 :
owner γ ws1 -∗
owner γ ws2 -∗
False.
Lemma inf_ws_deque_2۰modelーexclusive γ vs1 vs2 :
inf_ws_deque_2۰model γ vs1 -∗
inf_ws_deque_2۰model γ vs2 -∗
False.
Lemma inf_ws_deque_2۰ownerーexclusive γ ws1 ws2 :
inf_ws_deque_2۰owner γ ws1 -∗
inf_ws_deque_2۰owner γ ws2 -∗
False.
Lemma inf_ws_deque_2ーownerーmodel γ ws vs :
inf_ws_deque_2۰owner γ ws -∗
inf_ws_deque_2۰model γ vs -∗
⌜vs `suffix_of` ws⌝.
Lemma inf_ws_deque_2٠createーspec ι :
{{{
True
}}}
inf_ws_deque_2٠create ()
{{{
t γ
, RET #t;
meta_token t ⊤ ∗
inf_ws_deque_2۰inv t γ ι ∗
inf_ws_deque_2۰model γ [] ∗
inf_ws_deque_2۰owner γ []
}}}.
Lemma inf_ws_deque_2٠sizeーspec t γ ι ws :
<<<
inf_ws_deque_2۰inv t γ ι ∗
inf_ws_deque_2۰owner γ ws
| ∀∀ vs,
inf_ws_deque_2۰model γ vs
>>>
inf_ws_deque_2٠size #t @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model γ vs
| RET #(length vs);
inf_ws_deque_2۰owner γ vs
>>>.
Lemma inf_ws_deque_2٠is_emptyーspec t γ ι ws :
<<<
inf_ws_deque_2۰inv t γ ι ∗
inf_ws_deque_2۰owner γ ws
| ∀∀ vs,
inf_ws_deque_2۰model γ vs
>>>
inf_ws_deque_2٠is_empty #t @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model γ vs
| RET #(bool_decide (vs = []%list));
inf_ws_deque_2۰owner γ vs
>>>.
Lemma inf_ws_deque_2٠pushーspec t γ ι ws v :
<<<
inf_ws_deque_2۰inv t γ ι ∗
inf_ws_deque_2۰owner γ ws
| ∀∀ vs,
inf_ws_deque_2۰model γ vs
>>>
inf_ws_deque_2٠push #t v @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model γ (vs ++ [v])
| RET ();
inf_ws_deque_2۰owner γ (vs ++ [v])
>>>.
Lemma inf_ws_deque_2٠stealーspec t γ ι :
<<<
inf_ws_deque_2۰inv t γ ι
| ∀∀ vs,
inf_ws_deque_2۰model γ vs
>>>
inf_ws_deque_2٠steal #t @ ↑ι
<<<
inf_ws_deque_2۰model γ (tail vs)
| RET head vs;
True
>>>.
Lemma inf_ws_deque_2٠popーspec t γ ι ws :
<<<
inf_ws_deque_2۰inv t γ ι ∗
inf_ws_deque_2۰owner γ ws
| ∀∀ vs,
inf_ws_deque_2۰model γ vs
>>>
inf_ws_deque_2٠pop #t @ ↑ι
<<<
∃∃ o ws',
⌜vs `suffix_of` ws⌝ ∗
match o with
| None ⇒
⌜vs = []⌝ ∗
⌜ws' = []⌝ ∗
inf_ws_deque_2۰model γ []
| Some v ⇒
∃ vs',
⌜vs = vs' ++ [v]⌝ ∗
⌜ws' = vs'⌝ ∗
inf_ws_deque_2۰model γ vs'
end
| RET o;
inf_ws_deque_2۰owner γ ws'
>>>.
End inf_ws_deque_2۰G.
#[global] Opaque inf_ws_deque_2۰inv.
#[global] Opaque inf_ws_deque_2۰model.
#[global] Opaque inf_ws_deque_2۰owner.
End base.
Require zoo_saturn.inf_ws_deque_2__opaque.
Section inf_ws_deque_2۰G.
Context `{inf_ws_deque_2۰G : InfWsDeque2G Σ}.
Implicit Type 𝑡 : location.
Implicit Type t : val.
Definition inf_ws_deque_2۰inv t ι : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.inf_ws_deque_2۰inv 𝑡 γ ι.
#[local] Instance : CustomIpat "inv" :=
" ( %𝑡{} & %γ{} & {%Heq{};->} & #Hmeta{_{}} & Hinv{_{}} ) ".
Definition inf_ws_deque_2۰model t vs : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.inf_ws_deque_2۰model γ vs.
#[local] Instance : CustomIpat "model" :=
" ( %𝑡{} & %γ{} & {%Heq{};->} & #Hmeta{_{}} & Hmodel{_{}} ) ".
Definition inf_ws_deque_2۰owner t ws : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.inf_ws_deque_2۰owner γ ws.
#[local] Instance : CustomIpat "owner" :=
" ( %𝑡{} & %γ{} & {%Heq{};->} & #Hmeta{_{}} & Howner{_{}} ) ".
#[global] Instance inf_ws_deque_2۰modelーtimeless γ vs :
Timeless (inf_ws_deque_2۰model γ vs).
#[global] Instance inf_ws_deque_2۰ownerーtimeless γ ws :
Timeless (inf_ws_deque_2۰owner γ ws).
#[global] Instance inf_ws_deque_2۰invーpersistent t ι :
Persistent (inf_ws_deque_2۰inv t ι).
Lemma inf_ws_deque_2۰modelーexclusive t vs1 vs2 :
inf_ws_deque_2۰model t vs1 -∗
inf_ws_deque_2۰model t vs2 -∗
False.
Lemma inf_ws_deque_2۰ownerーexclusive t ws1 ws2 :
inf_ws_deque_2۰owner t ws1 -∗
inf_ws_deque_2۰owner t ws2 -∗
False.
Lemma inf_ws_deque_2ーownerーmodel γ ws vs :
inf_ws_deque_2۰owner γ ws -∗
inf_ws_deque_2۰model γ vs -∗
⌜vs `suffix_of` ws⌝.
Lemma inf_ws_deque_2٠createーspec ι :
{{{
True
}}}
inf_ws_deque_2٠create ()
{{{
t
, RET t;
inf_ws_deque_2۰inv t ι ∗
inf_ws_deque_2۰model t [] ∗
inf_ws_deque_2۰owner t []
}}}.
Lemma inf_ws_deque_2٠sizeーspec t ι ws :
<<<
inf_ws_deque_2۰inv t ι ∗
inf_ws_deque_2۰owner t ws
| ∀∀ vs,
inf_ws_deque_2۰model t vs
>>>
inf_ws_deque_2٠size t @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model t vs
| RET #(length vs);
inf_ws_deque_2۰owner t vs
>>>.
Lemma inf_ws_deque_2٠is_emptyーspec t ι ws :
<<<
inf_ws_deque_2۰inv t ι ∗
inf_ws_deque_2۰owner t ws
| ∀∀ vs,
inf_ws_deque_2۰model t vs
>>>
inf_ws_deque_2٠is_empty t @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model t vs
| RET #(bool_decide (vs = []%list));
inf_ws_deque_2۰owner t vs
>>>.
Lemma inf_ws_deque_2٠pushーspec t ι ws v :
<<<
inf_ws_deque_2۰inv t ι ∗
inf_ws_deque_2۰owner t ws
| ∀∀ vs,
inf_ws_deque_2۰model t vs
>>>
inf_ws_deque_2٠push t v @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model t (vs ++ [v])
| RET ();
inf_ws_deque_2۰owner t (vs ++ [v])
>>>.
Lemma inf_ws_deque_2٠stealーspec t ι :
<<<
inf_ws_deque_2۰inv t ι
| ∀∀ vs,
inf_ws_deque_2۰model t vs
>>>
inf_ws_deque_2٠steal t @ ↑ι
<<<
inf_ws_deque_2۰model t (tail vs)
| RET head vs;
True
>>>.
Lemma inf_ws_deque_2٠popーspec t ι ws :
<<<
inf_ws_deque_2۰inv t ι ∗
inf_ws_deque_2۰owner t ws
| ∀∀ vs,
inf_ws_deque_2۰model t vs
>>>
inf_ws_deque_2٠pop t @ ↑ι
<<<
∃∃ o ws',
⌜vs `suffix_of` ws⌝ ∗
match o with
| None ⇒
⌜vs = []⌝ ∗
⌜ws' = []⌝ ∗
inf_ws_deque_2۰model t []
| Some v ⇒
∃ vs',
⌜vs = vs' ++ [v]⌝ ∗
⌜ws' = vs'⌝ ∗
inf_ws_deque_2۰model t vs'
end
| RET o;
inf_ws_deque_2۰owner t ws'
>>>.
End inf_ws_deque_2۰G.
#[global] Opaque inf_ws_deque_2۰inv.
#[global] Opaque inf_ws_deque_2۰model.
#[global] Opaque inf_ws_deque_2۰owner.
Require Import zoo.common.countable.
Require Import zoo.common.relations.
Require Import zoo.iris.bi.big_op.
Require Import zoo.iris.base_logic.lib.auth_twins.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_saturn.inf_ws_deque_2__code.
Require Import zoo_saturn.inf_ws_deque_2__types.
Require Import zoo.options.
Import inf_ws_deque_1.base.
Implicit Type slot : location.
Implicit Type slots : list location.
Implicit Type v : val.
Implicit Type vs ws : list val.
Class InfWsDeque2G Σ `{zoo۰G : !ZooG Σ} :=
{ #[local] inf_ws_deque_2۰G۰base۰G :: InfWsDeque1G Σ
; #[local] inf_ws_deque_2۰G۰model۰G :: AuthTwinsG Σ (leibnizO (list val)) suffix
}.
Definition inf_ws_deque_2۰Σ :=
#[inf_ws_deque_1۰Σ
; auth_twins۰Σ (leibnizO (list val)) suffix
].
#[global] Instance subGーinf_ws_deque_2۰Σ Σ `{zoo۰G : !ZooG Σ} :
subG inf_ws_deque_2۰Σ Σ →
InfWsDeque2G Σ .
Module base.
Section inf_ws_deque_2۰G.
Context `{inf_ws_deque_2۰G : InfWsDeque2G Σ}.
Implicit Type t : location.
Record inf_ws_deque_2۰name :=
{ inf_ws_deque_2۰name۰base : inf_ws_deque_1۰name
; inf_ws_deque_2۰name۰model : auth_twins۰name
}.
Implicit Type γ : inf_ws_deque_2۰name.
#[global] Instance inf_ws_deque_2۰nameーeq_dec : EqDecision inf_ws_deque_2۰name :=
ltac:(solve_decision).
#[global] Instance inf_ws_deque_2۰nameーcountable :
Countable inf_ws_deque_2۰name.
#[local] Definition model₁' γ_model vs :=
auth_twins۰twin₁ _ γ_model vs.
#[local] Definition model₁ γ :=
model₁' γ.(inf_ws_deque_2۰name۰model).
#[local] Definition model₂' γ_model vs :=
auth_twins۰twin₂ _ γ_model vs.
#[local] Definition model₂ γ :=
model₂' γ.(inf_ws_deque_2۰name۰model).
#[local] Definition owner' γ_owner ws :=
auth_twins۰auth _ γ_owner ws.
#[local] Definition owner γ :=
owner' γ.(inf_ws_deque_2۰name۰model).
#[local] Definition inv۰inner γ : iProp Σ :=
∃ vs slots,
inf_ws_deque_1۰model γ.(inf_ws_deque_2۰name۰base) (#*@{location} slots) ∗
model₂ γ vs ∗
[∗ list] slot; v ∈ slots; vs, slot ↦ᵣ v.
#[local] Instance : CustomIpat "inv۰inner" :=
" ( %vs{} & %slots{} & >Hbase_model & >Hmodel₂ & >Hslots ) ".
Definition inf_ws_deque_2۰inv t γ ι : iProp Σ :=
inf_ws_deque_1۰inv t γ.(inf_ws_deque_2۰name۰base) (ι.@"base") ∗
inv (ι.@"inv") (inv۰inner γ).
#[local] Instance : CustomIpat "inv" :=
" ( #Hbase_inv & #Hinv ) ".
Definition inf_ws_deque_2۰model :=
model₁.
#[local] Instance : CustomIpat "model" :=
" Hmodel₁{_{}} ".
Definition inf_ws_deque_2۰owner γ ws : iProp Σ :=
∃ slots_owner,
inf_ws_deque_1۰owner γ.(inf_ws_deque_2۰name۰base) (#*@{location} slots_owner) ∗
owner γ ws.
#[local] Instance : CustomIpat "owner" :=
" ( %slots_owner{_{}} & Hbase_owner{_{}} & Howner{_{}} ) ".
#[global] Instance inf_ws_deque_2۰modelーtimeless γ vs :
Timeless (inf_ws_deque_2۰model γ vs).
#[global] Instance inf_ws_deque_2۰ownerーtimeless γ ws :
Timeless (inf_ws_deque_2۰owner γ ws).
#[global] Instance inf_ws_deque_2۰invーpersistent t γ ι :
Persistent (inf_ws_deque_2۰inv t γ ι).
#[local] Lemma modelーownerーalloc :
⊢ |==>
∃ γ_model,
model₁' γ_model [] ∗
model₂' γ_model [] ∗
owner' γ_model [].
#[local] Lemma model₁ーvalid γ ws vs :
owner γ ws -∗
model₁ γ vs -∗
⌜vs `suffix_of` ws⌝.
#[local] Lemma model₁ーexclusive γ vs1 vs2 :
model₁ γ vs1 -∗
model₁ γ vs2 -∗
False.
#[local] Lemma modelーagree γ vs1 vs2 :
model₁ γ vs1 -∗
model₂ γ vs2 -∗
⌜vs1 = vs2⌝.
#[local] Lemma modelーownerーagree γ ws vs1 vs2 :
owner γ ws -∗
model₁ γ vs1 -∗
model₂ γ vs2 -∗
⌜vs1 `suffix_of` ws⌝ ∗
⌜vs1 = vs2⌝.
#[local] Lemma modelーpush {γ ws vs1 vs2} v :
owner γ ws -∗
model₁ γ vs1 -∗
model₂ γ vs2 ==∗
owner γ (vs1 ++ [v]) ∗
model₁ γ (vs1 ++ [v]) ∗
model₂ γ (vs1 ++ [v]).
#[local] Lemma modelーsteal γ vs1 vs2 :
model₁ γ vs1 -∗
model₂ γ vs2 ==∗
model₁ γ (tail vs1) ∗
model₂ γ (tail vs1).
#[local] Lemma modelーpop γ ws vs1 vs2 :
owner γ ws -∗
model₁ γ vs1 -∗
model₂ γ vs2 ==∗
owner γ (removelast vs1) ∗
model₁ γ (removelast vs1) ∗
model₂ γ (removelast vs1).
#[local] Lemma ownerーupdate γ ws vs :
owner γ ws -∗
model₁ γ vs -∗
model₂ γ vs ==∗
owner γ vs ∗
model₁ γ vs ∗
model₂ γ vs.
#[local] Lemma ownerーexclusive γ ws1 ws2 :
owner γ ws1 -∗
owner γ ws2 -∗
False.
Lemma inf_ws_deque_2۰modelーexclusive γ vs1 vs2 :
inf_ws_deque_2۰model γ vs1 -∗
inf_ws_deque_2۰model γ vs2 -∗
False.
Lemma inf_ws_deque_2۰ownerーexclusive γ ws1 ws2 :
inf_ws_deque_2۰owner γ ws1 -∗
inf_ws_deque_2۰owner γ ws2 -∗
False.
Lemma inf_ws_deque_2ーownerーmodel γ ws vs :
inf_ws_deque_2۰owner γ ws -∗
inf_ws_deque_2۰model γ vs -∗
⌜vs `suffix_of` ws⌝.
Lemma inf_ws_deque_2٠createーspec ι :
{{{
True
}}}
inf_ws_deque_2٠create ()
{{{
t γ
, RET #t;
meta_token t ⊤ ∗
inf_ws_deque_2۰inv t γ ι ∗
inf_ws_deque_2۰model γ [] ∗
inf_ws_deque_2۰owner γ []
}}}.
Lemma inf_ws_deque_2٠sizeーspec t γ ι ws :
<<<
inf_ws_deque_2۰inv t γ ι ∗
inf_ws_deque_2۰owner γ ws
| ∀∀ vs,
inf_ws_deque_2۰model γ vs
>>>
inf_ws_deque_2٠size #t @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model γ vs
| RET #(length vs);
inf_ws_deque_2۰owner γ vs
>>>.
Lemma inf_ws_deque_2٠is_emptyーspec t γ ι ws :
<<<
inf_ws_deque_2۰inv t γ ι ∗
inf_ws_deque_2۰owner γ ws
| ∀∀ vs,
inf_ws_deque_2۰model γ vs
>>>
inf_ws_deque_2٠is_empty #t @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model γ vs
| RET #(bool_decide (vs = []%list));
inf_ws_deque_2۰owner γ vs
>>>.
Lemma inf_ws_deque_2٠pushーspec t γ ι ws v :
<<<
inf_ws_deque_2۰inv t γ ι ∗
inf_ws_deque_2۰owner γ ws
| ∀∀ vs,
inf_ws_deque_2۰model γ vs
>>>
inf_ws_deque_2٠push #t v @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model γ (vs ++ [v])
| RET ();
inf_ws_deque_2۰owner γ (vs ++ [v])
>>>.
Lemma inf_ws_deque_2٠stealーspec t γ ι :
<<<
inf_ws_deque_2۰inv t γ ι
| ∀∀ vs,
inf_ws_deque_2۰model γ vs
>>>
inf_ws_deque_2٠steal #t @ ↑ι
<<<
inf_ws_deque_2۰model γ (tail vs)
| RET head vs;
True
>>>.
Lemma inf_ws_deque_2٠popーspec t γ ι ws :
<<<
inf_ws_deque_2۰inv t γ ι ∗
inf_ws_deque_2۰owner γ ws
| ∀∀ vs,
inf_ws_deque_2۰model γ vs
>>>
inf_ws_deque_2٠pop #t @ ↑ι
<<<
∃∃ o ws',
⌜vs `suffix_of` ws⌝ ∗
match o with
| None ⇒
⌜vs = []⌝ ∗
⌜ws' = []⌝ ∗
inf_ws_deque_2۰model γ []
| Some v ⇒
∃ vs',
⌜vs = vs' ++ [v]⌝ ∗
⌜ws' = vs'⌝ ∗
inf_ws_deque_2۰model γ vs'
end
| RET o;
inf_ws_deque_2۰owner γ ws'
>>>.
End inf_ws_deque_2۰G.
#[global] Opaque inf_ws_deque_2۰inv.
#[global] Opaque inf_ws_deque_2۰model.
#[global] Opaque inf_ws_deque_2۰owner.
End base.
Require zoo_saturn.inf_ws_deque_2__opaque.
Section inf_ws_deque_2۰G.
Context `{inf_ws_deque_2۰G : InfWsDeque2G Σ}.
Implicit Type 𝑡 : location.
Implicit Type t : val.
Definition inf_ws_deque_2۰inv t ι : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.inf_ws_deque_2۰inv 𝑡 γ ι.
#[local] Instance : CustomIpat "inv" :=
" ( %𝑡{} & %γ{} & {%Heq{};->} & #Hmeta{_{}} & Hinv{_{}} ) ".
Definition inf_ws_deque_2۰model t vs : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.inf_ws_deque_2۰model γ vs.
#[local] Instance : CustomIpat "model" :=
" ( %𝑡{} & %γ{} & {%Heq{};->} & #Hmeta{_{}} & Hmodel{_{}} ) ".
Definition inf_ws_deque_2۰owner t ws : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.inf_ws_deque_2۰owner γ ws.
#[local] Instance : CustomIpat "owner" :=
" ( %𝑡{} & %γ{} & {%Heq{};->} & #Hmeta{_{}} & Howner{_{}} ) ".
#[global] Instance inf_ws_deque_2۰modelーtimeless γ vs :
Timeless (inf_ws_deque_2۰model γ vs).
#[global] Instance inf_ws_deque_2۰ownerーtimeless γ ws :
Timeless (inf_ws_deque_2۰owner γ ws).
#[global] Instance inf_ws_deque_2۰invーpersistent t ι :
Persistent (inf_ws_deque_2۰inv t ι).
Lemma inf_ws_deque_2۰modelーexclusive t vs1 vs2 :
inf_ws_deque_2۰model t vs1 -∗
inf_ws_deque_2۰model t vs2 -∗
False.
Lemma inf_ws_deque_2۰ownerーexclusive t ws1 ws2 :
inf_ws_deque_2۰owner t ws1 -∗
inf_ws_deque_2۰owner t ws2 -∗
False.
Lemma inf_ws_deque_2ーownerーmodel γ ws vs :
inf_ws_deque_2۰owner γ ws -∗
inf_ws_deque_2۰model γ vs -∗
⌜vs `suffix_of` ws⌝.
Lemma inf_ws_deque_2٠createーspec ι :
{{{
True
}}}
inf_ws_deque_2٠create ()
{{{
t
, RET t;
inf_ws_deque_2۰inv t ι ∗
inf_ws_deque_2۰model t [] ∗
inf_ws_deque_2۰owner t []
}}}.
Lemma inf_ws_deque_2٠sizeーspec t ι ws :
<<<
inf_ws_deque_2۰inv t ι ∗
inf_ws_deque_2۰owner t ws
| ∀∀ vs,
inf_ws_deque_2۰model t vs
>>>
inf_ws_deque_2٠size t @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model t vs
| RET #(length vs);
inf_ws_deque_2۰owner t vs
>>>.
Lemma inf_ws_deque_2٠is_emptyーspec t ι ws :
<<<
inf_ws_deque_2۰inv t ι ∗
inf_ws_deque_2۰owner t ws
| ∀∀ vs,
inf_ws_deque_2۰model t vs
>>>
inf_ws_deque_2٠is_empty t @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model t vs
| RET #(bool_decide (vs = []%list));
inf_ws_deque_2۰owner t vs
>>>.
Lemma inf_ws_deque_2٠pushーspec t ι ws v :
<<<
inf_ws_deque_2۰inv t ι ∗
inf_ws_deque_2۰owner t ws
| ∀∀ vs,
inf_ws_deque_2۰model t vs
>>>
inf_ws_deque_2٠push t v @ ↑ι
<<<
⌜vs `suffix_of` ws⌝ ∗
inf_ws_deque_2۰model t (vs ++ [v])
| RET ();
inf_ws_deque_2۰owner t (vs ++ [v])
>>>.
Lemma inf_ws_deque_2٠stealーspec t ι :
<<<
inf_ws_deque_2۰inv t ι
| ∀∀ vs,
inf_ws_deque_2۰model t vs
>>>
inf_ws_deque_2٠steal t @ ↑ι
<<<
inf_ws_deque_2۰model t (tail vs)
| RET head vs;
True
>>>.
Lemma inf_ws_deque_2٠popーspec t ι ws :
<<<
inf_ws_deque_2۰inv t ι ∗
inf_ws_deque_2۰owner t ws
| ∀∀ vs,
inf_ws_deque_2۰model t vs
>>>
inf_ws_deque_2٠pop t @ ↑ι
<<<
∃∃ o ws',
⌜vs `suffix_of` ws⌝ ∗
match o with
| None ⇒
⌜vs = []⌝ ∗
⌜ws' = []⌝ ∗
inf_ws_deque_2۰model t []
| Some v ⇒
∃ vs',
⌜vs = vs' ++ [v]⌝ ∗
⌜ws' = vs'⌝ ∗
inf_ws_deque_2۰model t vs'
end
| RET o;
inf_ws_deque_2۰owner t ws'
>>>.
End inf_ws_deque_2۰G.
#[global] Opaque inf_ws_deque_2۰inv.
#[global] Opaque inf_ws_deque_2۰model.
#[global] Opaque inf_ws_deque_2۰owner.