Library zoo_std.ivar_1
Require Import zoo.prelude.
Require Import zoo.common.countable.
Require Import zoo.iris.base_logic.lib.oneshot.
Require Import zoo.iris.base_logic.lib.subpreds.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_std.ivar_1__code.
Require Import zoo_std.ivar_1__types.
Require Import zoo.options.
Implicit Type b : bool.
Implicit Type v : val.
Implicit Type o state : option val.
Class Ivar1G Σ `{zoo۰G : !ZooG Σ} :=
{ #[local] ivar_1۰G۰lstate۰G :: OneshotG Σ unit val
; #[local] ivar_1۰G۰consumer۰G :: SubpredsG Σ val
}.
Definition ivar_1۰Σ :=
#[oneshot۰Σ unit val
; subpreds۰Σ val
].
#[global] Instance subGーivar_1۰Σ Σ `{zoo۰G : !ZooG Σ} :
subG ivar_1۰Σ Σ →
Ivar1G Σ .
Module base.
Section ivar_1۰G.
Context `{ivar_1۰G : Ivar1G Σ}.
Implicit Type t : location.
Implicit Type Ψ Χ Ξ : val → iProp Σ.
Record ivar_1۰name :=
{ ivar_1۰name۰lstate : gname
; ivar_1۰name۰consumer : gname
}.
Implicit Type γ : ivar_1۰name.
#[global] Instance ivar_1۰nameーeq_dec : EqDecision ivar_1۰name :=
ltac:(solve_decision).
#[global] Instance ivar_1۰nameーcountable :
Countable ivar_1۰name.
#[local] Definition lstate۰unset₁' γ_lstate :=
oneshot۰pending γ_lstate (DfracOwn (1/3)) ().
#[local] Definition lstate۰unset₁ γ :=
lstate۰unset₁' γ.(ivar_1۰name۰lstate).
#[local] Definition lstate۰unset₂' γ_lstate :=
oneshot۰pending γ_lstate (DfracOwn (2/3)) ().
#[local] Definition lstate۰unset₂ γ :=
lstate۰unset₂' γ.(ivar_1۰name۰lstate).
#[local] Definition lstate۰set' γ_lstate :=
oneshot۰shot γ_lstate.
#[local] Definition lstate۰set γ :=
lstate۰set' γ.(ivar_1۰name۰lstate).
#[local] Definition consumer۰auth' :=
subpreds۰auth.
#[local] Definition consumer۰auth γ :=
consumer۰auth' γ.(ivar_1۰name۰consumer).
#[local] Definition consumer۰frag' :=
subpreds۰frag.
#[local] Definition consumer۰frag γ :=
consumer۰frag' γ.(ivar_1۰name۰consumer).
#[local] Definition inv۰state۰unset γ :=
lstate۰unset₁ γ.
#[local] Instance : CustomIpat "inv۰state۰unset" :=
" {>;}Hlstate_unset₁ ".
#[local] Definition inv۰state۰set γ Ξ v : iProp Σ :=
lstate۰set γ v ∗
□ Ξ v.
#[local] Instance : CustomIpat "inv۰state۰set" :=
" ( {>;}#Hlstate_set{_{}} & #HΞ{_{}} ) ".
#[local] Definition inv۰state γ Ξ state :=
match state with
| None ⇒
inv۰state۰unset γ
| Some v ⇒
inv۰state۰set γ Ξ v
end.
#[local] Definition inv۰inner t γ Ψ Ξ : iProp Σ :=
∃ state,
t ↦ᵣ state ∗
consumer۰auth γ Ψ state ∗
inv۰state γ Ξ state.
#[local] Instance : CustomIpat "inv۰inner" :=
" ( %state & Ht & Hconsumer_auth & Hstate ) ".
Definition ivar_1۰inv t γ Ψ Ξ : iProp Σ :=
inv nroot (inv۰inner t γ Ψ Ξ).
#[local] Instance : CustomIpat "inv" :=
" #Hinv ".
Definition ivar_1۰producer :=
lstate۰unset₂.
#[local] Instance : CustomIpat "producer" :=
" Hlstate_unset₂{_{}} ".
Definition ivar_1۰consumer :=
consumer۰frag.
#[local] Instance : CustomIpat "consumer" :=
" Hconsumer{}_frag ".
Definition ivar_1۰result :=
lstate۰set.
#[local] Instance : CustomIpat "result" :=
" #Hlstate_set{_{}} ".
Definition ivar_1۰resolved γ : iProp Σ :=
∃ v,
ivar_1۰result γ v.
#[global] Instance ivar_1۰invーcontractive t γ n :
Proper (
(pointwise_relation _ (dist_later n)) ==>
(pointwise_relation _ (dist_later n)) ==>
(≡{n}≡)
) (ivar_1۰inv t γ).
#[global] Instance ivar_1۰invーproper t γ :
Proper (
(pointwise_relation _ (≡)) ==>
(pointwise_relation _ (≡)) ==>
(≡)
) (ivar_1۰inv t γ).
#[global] Instance ivar_1۰consumerーcontractive γ n :
Proper (
(pointwise_relation _ (dist_later n)) ==>
(≡{n}≡)
) (ivar_1۰consumer γ).
#[global] Instance ivar_1۰consumerーproper γ :
Proper (
(pointwise_relation _ (≡)) ==>
(≡)
) (ivar_1۰consumer γ).
#[global] Instance ivar_1۰producerーtimeless γ :
Timeless (ivar_1۰producer γ).
#[global] Instance ivar_1۰resultーtimeless γ v :
Timeless (ivar_1۰result γ v).
#[global] Instance ivar_1۰invーpersistent t γ Ψ Ξ :
Persistent (ivar_1۰inv t γ Ψ Ξ).
#[global] Instance ivar_1۰resultーpersistent γ v :
Persistent (ivar_1۰result γ v).
#[local] Lemma lstateーalloc :
⊢ |==>
∃ γ_lstate,
lstate۰unset₁' γ_lstate ∗
lstate۰unset₂' γ_lstate.
#[local] Lemma lstate۰unset₂ーexclusive γ :
lstate۰unset₂ γ -∗
lstate۰unset₂ γ -∗
False.
#[local] Lemma lstate۰setーagree γ v1 v2 :
lstate۰set γ v1 -∗
lstate۰set γ v2 -∗
⌜v1 = v2⌝.
#[local] Lemma lstateーunset₁ーset γ v :
lstate۰unset₁ γ -∗
lstate۰set γ v -∗
False.
#[local] Lemma lstateーunset₂ーset γ v :
lstate۰unset₂ γ -∗
lstate۰set γ v -∗
False.
#[local] Lemma lstateーupdate {γ} v :
lstate۰unset₁ γ -∗
lstate۰unset₂ γ ==∗
lstate۰set γ v.
#[local] Lemma consumerーalloc Ψ :
⊢ |==>
∃ γ_consumer,
consumer۰auth' γ_consumer Ψ None ∗
consumer۰frag' γ_consumer Ψ.
#[local] Lemma consumerーwand {γ Ψ state Χ1} Χ2 E :
▷ consumer۰auth γ Ψ state -∗
consumer۰frag γ Χ1 -∗
(∀ v, Χ1 v -∗ Χ2 v) ={E}=∗
▷ consumer۰auth γ Ψ state ∗
consumer۰frag γ Χ2.
#[local] Lemma consumerーdivide {γ Ψ state} Χs E :
▷ consumer۰auth γ Ψ state -∗
consumer۰frag γ (λ v, [∗ list] Χ ∈ Χs, Χ v) ={E}=∗
▷ consumer۰auth γ Ψ state ∗
[∗ list] Χ ∈ Χs, consumer۰frag γ Χ.
#[local] Lemma consumerーproduce {γ Ψ} v :
consumer۰auth γ Ψ None -∗
Ψ v -∗
consumer۰auth γ Ψ (Some v).
#[local] Lemma consumerーconsume γ Ψ v Χ E :
▷ consumer۰auth γ Ψ (Some v) -∗
consumer۰frag γ Χ ={E}=∗
▷ consumer۰auth γ Ψ (Some v) ∗
▷^2 Χ v.
Lemma ivar_1۰producerーexclusive γ :
ivar_1۰producer γ -∗
ivar_1۰producer γ -∗
False.
Lemma ivar_1۰consumerーwand {t γ Ψ Ξ Χ1} Χ2 :
ivar_1۰inv t γ Ψ Ξ -∗
ivar_1۰consumer γ Χ1 -∗
(∀ v, Χ1 v -∗ Χ2 v) ={⊤}=∗
ivar_1۰consumer γ Χ2.
Lemma ivar_1۰consumerーdivide {t γ Ψ Ξ} Χs :
ivar_1۰inv t γ Ψ Ξ -∗
ivar_1۰consumer γ (λ v, [∗ list] Χ ∈ Χs, Χ v) ={⊤}=∗
[∗ list] Χ ∈ Χs, ivar_1۰consumer γ Χ.
Lemma ivar_1۰resultーagree γ v1 v2 :
ivar_1۰result γ v1 -∗
ivar_1۰result γ v2 -∗
⌜v1 = v2⌝.
Lemma ivar_1ーproducerーresult γ v :
ivar_1۰producer γ -∗
ivar_1۰result γ v -∗
False.
Lemma ivar_1ーinvーresult t γ Ψ Ξ v :
ivar_1۰inv t γ Ψ Ξ -∗
ivar_1۰result γ v ={⊤}=∗
▷ □ Ξ v.
Lemma ivar_1ーinvーresultーconsumer t γ Ψ Ξ v Χ :
ivar_1۰inv t γ Ψ Ξ -∗
ivar_1۰result γ v -∗
ivar_1۰consumer γ Χ ={⊤}=∗
▷^2 Χ v ∗
▷ □ Ξ v.
Lemma ivar_1٠createーspec Ψ Ξ :
{{{
True
}}}
ivar_1٠create ()
{{{
t γ
, RET #t;
meta_token t ⊤ ∗
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰producer γ ∗
ivar_1۰consumer γ Ψ
}}}.
Lemma ivar_1٠makeーspec Ψ Ξ v :
{{{
▷ Ψ v ∗
▷ □ Ξ v
}}}
ivar_1٠make v
{{{
t γ
, RET #t;
meta_token t ⊤ ∗
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰result γ v ∗
ivar_1۰consumer γ Ψ
}}}.
Lemma ivar_1٠try_getーspec t γ Ψ Ξ :
{{{
ivar_1۰inv t γ Ψ Ξ
}}}
ivar_1٠try_get #t
{{{
o
, RET o;
if o is Some v then
£ 2 ∗
ivar_1۰result γ v
else
True
}}}.
Lemma ivar_1٠try_getーspecーresult t γ Ψ Ξ v :
{{{
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰result γ v
}}}
ivar_1٠try_get #t
{{{
RET Some v;
£ 2
}}}.
Lemma ivar_1٠is_unsetーspec t γ Ψ Ξ :
{{{
ivar_1۰inv t γ Ψ Ξ
}}}
ivar_1٠is_unset #t
{{{
b
, RET #b;
if b then
True
else
£ 2 ∗
ivar_1۰resolved γ
}}}.
Lemma ivar_1٠is_unsetーspecーresult t γ Ψ Ξ v :
{{{
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰result γ v
}}}
ivar_1٠is_unset #t
{{{
RET false;
£ 2
}}}.
Lemma ivar_1٠is_setーspec t γ Ψ Ξ :
{{{
ivar_1۰inv t γ Ψ Ξ
}}}
ivar_1٠is_set #t
{{{
b
, RET #b;
if b then
£ 2 ∗
ivar_1۰resolved γ
else
True
}}}.
Lemma ivar_1٠is_setーspecーresult t γ Ψ Ξ v :
{{{
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰result γ v
}}}
ivar_1٠is_set #t
{{{
RET true;
£ 2
}}}.
Lemma ivar_1٠getーspec t γ Ψ Ξ v :
{{{
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰result γ v
}}}
ivar_1٠get #t
{{{
RET v;
£ 2
}}}.
Lemma ivar_1٠setーspec t γ Ψ Ξ v :
{{{
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰producer γ ∗
▷ Ψ v ∗
▷ □ Ξ v
}}}
ivar_1٠set #t v
{{{
RET ();
ivar_1۰result γ v
}}}.
End ivar_1۰G.
#[global] Opaque ivar_1۰inv.
#[global] Opaque ivar_1۰producer.
#[global] Opaque ivar_1۰consumer.
#[global] Opaque ivar_1۰result.
End base.
Require zoo_std.ivar_1__opaque.
Section ivar_1۰G.
Context `{ivar_1۰G : Ivar1G Σ}.
Implicit Type 𝑡 : location.
Implicit Type t : val.
Implicit Type γ : base.ivar_1۰name.
Implicit Type Ψ Χ Ξ : val → iProp Σ.
Definition ivar_1۰inv t Ψ Ξ : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.ivar_1۰inv 𝑡 γ Ψ Ξ.
#[local] Instance : CustomIpat "inv" :=
" ( %l{} & %γ{} & {%Heq{};->} & #Hmeta{_{}} & Hinv{_{}} ) ".
Definition ivar_1۰producer t : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.ivar_1۰producer γ.
#[local] Instance : CustomIpat "producer" :=
" ( %l{;_} & %γ{;_} & {%Heq{};->} & #Hmeta{_{}} & Hproducer{_{}} ) ".
Definition ivar_1۰consumer t Χ : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.ivar_1۰consumer γ Χ.
#[local] Instance : CustomIpat "consumer" :=
" ( %l{;_} & %γ{;_} & {%Heq{};->} & #Hmeta{_{}} & Hconsumer{_{}} ) ".
Definition ivar_1۰result t v : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.ivar_1۰result γ v.
#[local] Instance : CustomIpat "result" :=
" ( %l{;_} & %γ{;_} & {%Heq{};->} & #Hmeta{_{}} & Hresult{_{}} ) ".
Definition ivar_1۰resolved t : iProp Σ :=
∃ v,
ivar_1۰result t v.
#[global] Instance ivar_1۰invーcontractive t n :
Proper (
(pointwise_relation _ (dist_later n)) ==>
(pointwise_relation _ (dist_later n)) ==>
(≡{n}≡)
) (ivar_1۰inv t).
#[global] Instance ivar_1۰invーproper t :
Proper (
(pointwise_relation _ (≡)) ==>
(pointwise_relation _ (≡)) ==>
(≡)
) (ivar_1۰inv t).
#[global] Instance ivar_1۰consumerーcontractive t n :
Proper (
(pointwise_relation _ (dist_later n)) ==>
(≡{n}≡)
) (ivar_1۰consumer t).
#[global] Instance ivar_1۰consumerーproper t :
Proper (
(pointwise_relation _ (≡)) ==>
(≡)
) (ivar_1۰consumer t).
#[global] Instance ivar_1۰producerーtimeless t :
Timeless (ivar_1۰producer t).
#[global] Instance ivar_1۰resultーtimeless t v :
Timeless (ivar_1۰result t v).
#[global] Instance ivar_1۰invーpersistent t Ψ Ξ :
Persistent (ivar_1۰inv t Ψ Ξ).
#[global] Instance ivar_1۰resultーpersistent t v :
Persistent (ivar_1۰result t v).
Lemma ivar_1۰producerーexclusive t :
ivar_1۰producer t -∗
ivar_1۰producer t -∗
False.
Lemma ivar_1۰consumerーwand {t Ψ Ξ Χ1} Χ2 :
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰consumer t Χ1 -∗
(∀ v, Χ1 v -∗ Χ2 v) ={⊤}=∗
ivar_1۰consumer t Χ2.
Lemma ivar_1۰consumerーdivide {t Ψ Ξ} Χs :
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰consumer t (λ v, [∗ list] Χ ∈ Χs, Χ v) ={⊤}=∗
[∗ list] Χ ∈ Χs, ivar_1۰consumer t Χ.
Lemma ivar_1۰consumerーsplit {t Ψ Ξ} Χ1 Χ2 :
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰consumer t (λ v, Χ1 v ∗ Χ2 v) ={⊤}=∗
ivar_1۰consumer t Χ1 ∗
ivar_1۰consumer t Χ2.
Lemma ivar_1۰resultーagree t v1 v2 :
ivar_1۰result t v1 -∗
ivar_1۰result t v2 -∗
⌜v1 = v2⌝.
Lemma ivar_1ーproducerーresult t v :
ivar_1۰producer t -∗
ivar_1۰result t v -∗
False.
Lemma ivar_1ーinvーresult t Ψ Ξ v :
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰result t v ={⊤}=∗
▷ □ Ξ v.
Lemma ivar_1ーinvーresult' t Ψ Ξ v :
£ 1 -∗
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰result t v ={⊤}=∗
□ Ξ v.
Lemma ivar_1ーinvーresultーconsumer t Ψ Ξ v Χ :
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰result t v -∗
ivar_1۰consumer t Χ ={⊤}=∗
▷^2 Χ v ∗
▷ □ Ξ v.
Lemma ivar_1ーinvーresultーconsumer' t Ψ Ξ v Χ :
£ 2 -∗
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰result t v -∗
ivar_1۰consumer t Χ ={⊤}=∗
Χ v ∗
□ Ξ v.
Lemma ivar_1٠createーspec Ψ Ξ :
{{{
True
}}}
ivar_1٠create ()
{{{
t
, RET t;
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰producer t ∗
ivar_1۰consumer t Ψ
}}}.
Lemma ivar_1٠makeーspec Ψ Ξ v :
{{{
▷ Ψ v ∗
▷ □ Ξ v
}}}
ivar_1٠make v
{{{
t
, RET t;
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰result t v ∗
ivar_1۰consumer t Ψ
}}}.
Lemma ivar_1٠try_getーspec t Ψ Ξ :
{{{
ivar_1۰inv t Ψ Ξ
}}}
ivar_1٠try_get t
{{{
o
, RET o;
if o is Some v then
£ 2 ∗
ivar_1۰result t v
else
True
}}}.
Lemma ivar_1٠try_getーspecーresult t Ψ Ξ v :
{{{
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰result t v
}}}
ivar_1٠try_get t
{{{
RET Some v;
£ 2
}}}.
Lemma ivar_1٠is_unsetーspec t Ψ Ξ :
{{{
ivar_1۰inv t Ψ Ξ
}}}
ivar_1٠is_unset t
{{{
b
, RET #b;
if b then
True
else
£ 2 ∗
ivar_1۰resolved t
}}}.
Lemma ivar_1٠is_unsetーspecーresult t Ψ Ξ v :
{{{
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰result t v
}}}
ivar_1٠is_unset t
{{{
RET false;
£ 2
}}}.
Lemma ivar_1٠is_setーspec t Ψ Ξ :
{{{
ivar_1۰inv t Ψ Ξ
}}}
ivar_1٠is_set t
{{{
b
, RET #b;
if b then
£ 2 ∗
ivar_1۰resolved t
else
True
}}}.
Lemma ivar_1٠is_setーspecーresult t Ψ Ξ v :
{{{
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰result t v
}}}
ivar_1٠is_set t
{{{
RET true;
£ 2
}}}.
Lemma ivar_1٠getーspec t Ψ Ξ v :
{{{
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰result t v
}}}
ivar_1٠get t
{{{
RET v;
£ 2
}}}.
Lemma ivar_1٠setーspec t Ψ Ξ v :
{{{
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰producer t ∗
▷ Ψ v ∗
▷ □ Ξ v
}}}
ivar_1٠set t v
{{{
RET ();
ivar_1۰result t v
}}}.
End ivar_1۰G.
#[global] Opaque ivar_1۰inv.
#[global] Opaque ivar_1۰producer.
#[global] Opaque ivar_1۰consumer.
#[global] Opaque ivar_1۰result.
Require Import zoo.common.countable.
Require Import zoo.iris.base_logic.lib.oneshot.
Require Import zoo.iris.base_logic.lib.subpreds.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_std.ivar_1__code.
Require Import zoo_std.ivar_1__types.
Require Import zoo.options.
Implicit Type b : bool.
Implicit Type v : val.
Implicit Type o state : option val.
Class Ivar1G Σ `{zoo۰G : !ZooG Σ} :=
{ #[local] ivar_1۰G۰lstate۰G :: OneshotG Σ unit val
; #[local] ivar_1۰G۰consumer۰G :: SubpredsG Σ val
}.
Definition ivar_1۰Σ :=
#[oneshot۰Σ unit val
; subpreds۰Σ val
].
#[global] Instance subGーivar_1۰Σ Σ `{zoo۰G : !ZooG Σ} :
subG ivar_1۰Σ Σ →
Ivar1G Σ .
Module base.
Section ivar_1۰G.
Context `{ivar_1۰G : Ivar1G Σ}.
Implicit Type t : location.
Implicit Type Ψ Χ Ξ : val → iProp Σ.
Record ivar_1۰name :=
{ ivar_1۰name۰lstate : gname
; ivar_1۰name۰consumer : gname
}.
Implicit Type γ : ivar_1۰name.
#[global] Instance ivar_1۰nameーeq_dec : EqDecision ivar_1۰name :=
ltac:(solve_decision).
#[global] Instance ivar_1۰nameーcountable :
Countable ivar_1۰name.
#[local] Definition lstate۰unset₁' γ_lstate :=
oneshot۰pending γ_lstate (DfracOwn (1/3)) ().
#[local] Definition lstate۰unset₁ γ :=
lstate۰unset₁' γ.(ivar_1۰name۰lstate).
#[local] Definition lstate۰unset₂' γ_lstate :=
oneshot۰pending γ_lstate (DfracOwn (2/3)) ().
#[local] Definition lstate۰unset₂ γ :=
lstate۰unset₂' γ.(ivar_1۰name۰lstate).
#[local] Definition lstate۰set' γ_lstate :=
oneshot۰shot γ_lstate.
#[local] Definition lstate۰set γ :=
lstate۰set' γ.(ivar_1۰name۰lstate).
#[local] Definition consumer۰auth' :=
subpreds۰auth.
#[local] Definition consumer۰auth γ :=
consumer۰auth' γ.(ivar_1۰name۰consumer).
#[local] Definition consumer۰frag' :=
subpreds۰frag.
#[local] Definition consumer۰frag γ :=
consumer۰frag' γ.(ivar_1۰name۰consumer).
#[local] Definition inv۰state۰unset γ :=
lstate۰unset₁ γ.
#[local] Instance : CustomIpat "inv۰state۰unset" :=
" {>;}Hlstate_unset₁ ".
#[local] Definition inv۰state۰set γ Ξ v : iProp Σ :=
lstate۰set γ v ∗
□ Ξ v.
#[local] Instance : CustomIpat "inv۰state۰set" :=
" ( {>;}#Hlstate_set{_{}} & #HΞ{_{}} ) ".
#[local] Definition inv۰state γ Ξ state :=
match state with
| None ⇒
inv۰state۰unset γ
| Some v ⇒
inv۰state۰set γ Ξ v
end.
#[local] Definition inv۰inner t γ Ψ Ξ : iProp Σ :=
∃ state,
t ↦ᵣ state ∗
consumer۰auth γ Ψ state ∗
inv۰state γ Ξ state.
#[local] Instance : CustomIpat "inv۰inner" :=
" ( %state & Ht & Hconsumer_auth & Hstate ) ".
Definition ivar_1۰inv t γ Ψ Ξ : iProp Σ :=
inv nroot (inv۰inner t γ Ψ Ξ).
#[local] Instance : CustomIpat "inv" :=
" #Hinv ".
Definition ivar_1۰producer :=
lstate۰unset₂.
#[local] Instance : CustomIpat "producer" :=
" Hlstate_unset₂{_{}} ".
Definition ivar_1۰consumer :=
consumer۰frag.
#[local] Instance : CustomIpat "consumer" :=
" Hconsumer{}_frag ".
Definition ivar_1۰result :=
lstate۰set.
#[local] Instance : CustomIpat "result" :=
" #Hlstate_set{_{}} ".
Definition ivar_1۰resolved γ : iProp Σ :=
∃ v,
ivar_1۰result γ v.
#[global] Instance ivar_1۰invーcontractive t γ n :
Proper (
(pointwise_relation _ (dist_later n)) ==>
(pointwise_relation _ (dist_later n)) ==>
(≡{n}≡)
) (ivar_1۰inv t γ).
#[global] Instance ivar_1۰invーproper t γ :
Proper (
(pointwise_relation _ (≡)) ==>
(pointwise_relation _ (≡)) ==>
(≡)
) (ivar_1۰inv t γ).
#[global] Instance ivar_1۰consumerーcontractive γ n :
Proper (
(pointwise_relation _ (dist_later n)) ==>
(≡{n}≡)
) (ivar_1۰consumer γ).
#[global] Instance ivar_1۰consumerーproper γ :
Proper (
(pointwise_relation _ (≡)) ==>
(≡)
) (ivar_1۰consumer γ).
#[global] Instance ivar_1۰producerーtimeless γ :
Timeless (ivar_1۰producer γ).
#[global] Instance ivar_1۰resultーtimeless γ v :
Timeless (ivar_1۰result γ v).
#[global] Instance ivar_1۰invーpersistent t γ Ψ Ξ :
Persistent (ivar_1۰inv t γ Ψ Ξ).
#[global] Instance ivar_1۰resultーpersistent γ v :
Persistent (ivar_1۰result γ v).
#[local] Lemma lstateーalloc :
⊢ |==>
∃ γ_lstate,
lstate۰unset₁' γ_lstate ∗
lstate۰unset₂' γ_lstate.
#[local] Lemma lstate۰unset₂ーexclusive γ :
lstate۰unset₂ γ -∗
lstate۰unset₂ γ -∗
False.
#[local] Lemma lstate۰setーagree γ v1 v2 :
lstate۰set γ v1 -∗
lstate۰set γ v2 -∗
⌜v1 = v2⌝.
#[local] Lemma lstateーunset₁ーset γ v :
lstate۰unset₁ γ -∗
lstate۰set γ v -∗
False.
#[local] Lemma lstateーunset₂ーset γ v :
lstate۰unset₂ γ -∗
lstate۰set γ v -∗
False.
#[local] Lemma lstateーupdate {γ} v :
lstate۰unset₁ γ -∗
lstate۰unset₂ γ ==∗
lstate۰set γ v.
#[local] Lemma consumerーalloc Ψ :
⊢ |==>
∃ γ_consumer,
consumer۰auth' γ_consumer Ψ None ∗
consumer۰frag' γ_consumer Ψ.
#[local] Lemma consumerーwand {γ Ψ state Χ1} Χ2 E :
▷ consumer۰auth γ Ψ state -∗
consumer۰frag γ Χ1 -∗
(∀ v, Χ1 v -∗ Χ2 v) ={E}=∗
▷ consumer۰auth γ Ψ state ∗
consumer۰frag γ Χ2.
#[local] Lemma consumerーdivide {γ Ψ state} Χs E :
▷ consumer۰auth γ Ψ state -∗
consumer۰frag γ (λ v, [∗ list] Χ ∈ Χs, Χ v) ={E}=∗
▷ consumer۰auth γ Ψ state ∗
[∗ list] Χ ∈ Χs, consumer۰frag γ Χ.
#[local] Lemma consumerーproduce {γ Ψ} v :
consumer۰auth γ Ψ None -∗
Ψ v -∗
consumer۰auth γ Ψ (Some v).
#[local] Lemma consumerーconsume γ Ψ v Χ E :
▷ consumer۰auth γ Ψ (Some v) -∗
consumer۰frag γ Χ ={E}=∗
▷ consumer۰auth γ Ψ (Some v) ∗
▷^2 Χ v.
Lemma ivar_1۰producerーexclusive γ :
ivar_1۰producer γ -∗
ivar_1۰producer γ -∗
False.
Lemma ivar_1۰consumerーwand {t γ Ψ Ξ Χ1} Χ2 :
ivar_1۰inv t γ Ψ Ξ -∗
ivar_1۰consumer γ Χ1 -∗
(∀ v, Χ1 v -∗ Χ2 v) ={⊤}=∗
ivar_1۰consumer γ Χ2.
Lemma ivar_1۰consumerーdivide {t γ Ψ Ξ} Χs :
ivar_1۰inv t γ Ψ Ξ -∗
ivar_1۰consumer γ (λ v, [∗ list] Χ ∈ Χs, Χ v) ={⊤}=∗
[∗ list] Χ ∈ Χs, ivar_1۰consumer γ Χ.
Lemma ivar_1۰resultーagree γ v1 v2 :
ivar_1۰result γ v1 -∗
ivar_1۰result γ v2 -∗
⌜v1 = v2⌝.
Lemma ivar_1ーproducerーresult γ v :
ivar_1۰producer γ -∗
ivar_1۰result γ v -∗
False.
Lemma ivar_1ーinvーresult t γ Ψ Ξ v :
ivar_1۰inv t γ Ψ Ξ -∗
ivar_1۰result γ v ={⊤}=∗
▷ □ Ξ v.
Lemma ivar_1ーinvーresultーconsumer t γ Ψ Ξ v Χ :
ivar_1۰inv t γ Ψ Ξ -∗
ivar_1۰result γ v -∗
ivar_1۰consumer γ Χ ={⊤}=∗
▷^2 Χ v ∗
▷ □ Ξ v.
Lemma ivar_1٠createーspec Ψ Ξ :
{{{
True
}}}
ivar_1٠create ()
{{{
t γ
, RET #t;
meta_token t ⊤ ∗
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰producer γ ∗
ivar_1۰consumer γ Ψ
}}}.
Lemma ivar_1٠makeーspec Ψ Ξ v :
{{{
▷ Ψ v ∗
▷ □ Ξ v
}}}
ivar_1٠make v
{{{
t γ
, RET #t;
meta_token t ⊤ ∗
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰result γ v ∗
ivar_1۰consumer γ Ψ
}}}.
Lemma ivar_1٠try_getーspec t γ Ψ Ξ :
{{{
ivar_1۰inv t γ Ψ Ξ
}}}
ivar_1٠try_get #t
{{{
o
, RET o;
if o is Some v then
£ 2 ∗
ivar_1۰result γ v
else
True
}}}.
Lemma ivar_1٠try_getーspecーresult t γ Ψ Ξ v :
{{{
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰result γ v
}}}
ivar_1٠try_get #t
{{{
RET Some v;
£ 2
}}}.
Lemma ivar_1٠is_unsetーspec t γ Ψ Ξ :
{{{
ivar_1۰inv t γ Ψ Ξ
}}}
ivar_1٠is_unset #t
{{{
b
, RET #b;
if b then
True
else
£ 2 ∗
ivar_1۰resolved γ
}}}.
Lemma ivar_1٠is_unsetーspecーresult t γ Ψ Ξ v :
{{{
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰result γ v
}}}
ivar_1٠is_unset #t
{{{
RET false;
£ 2
}}}.
Lemma ivar_1٠is_setーspec t γ Ψ Ξ :
{{{
ivar_1۰inv t γ Ψ Ξ
}}}
ivar_1٠is_set #t
{{{
b
, RET #b;
if b then
£ 2 ∗
ivar_1۰resolved γ
else
True
}}}.
Lemma ivar_1٠is_setーspecーresult t γ Ψ Ξ v :
{{{
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰result γ v
}}}
ivar_1٠is_set #t
{{{
RET true;
£ 2
}}}.
Lemma ivar_1٠getーspec t γ Ψ Ξ v :
{{{
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰result γ v
}}}
ivar_1٠get #t
{{{
RET v;
£ 2
}}}.
Lemma ivar_1٠setーspec t γ Ψ Ξ v :
{{{
ivar_1۰inv t γ Ψ Ξ ∗
ivar_1۰producer γ ∗
▷ Ψ v ∗
▷ □ Ξ v
}}}
ivar_1٠set #t v
{{{
RET ();
ivar_1۰result γ v
}}}.
End ivar_1۰G.
#[global] Opaque ivar_1۰inv.
#[global] Opaque ivar_1۰producer.
#[global] Opaque ivar_1۰consumer.
#[global] Opaque ivar_1۰result.
End base.
Require zoo_std.ivar_1__opaque.
Section ivar_1۰G.
Context `{ivar_1۰G : Ivar1G Σ}.
Implicit Type 𝑡 : location.
Implicit Type t : val.
Implicit Type γ : base.ivar_1۰name.
Implicit Type Ψ Χ Ξ : val → iProp Σ.
Definition ivar_1۰inv t Ψ Ξ : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.ivar_1۰inv 𝑡 γ Ψ Ξ.
#[local] Instance : CustomIpat "inv" :=
" ( %l{} & %γ{} & {%Heq{};->} & #Hmeta{_{}} & Hinv{_{}} ) ".
Definition ivar_1۰producer t : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.ivar_1۰producer γ.
#[local] Instance : CustomIpat "producer" :=
" ( %l{;_} & %γ{;_} & {%Heq{};->} & #Hmeta{_{}} & Hproducer{_{}} ) ".
Definition ivar_1۰consumer t Χ : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.ivar_1۰consumer γ Χ.
#[local] Instance : CustomIpat "consumer" :=
" ( %l{;_} & %γ{;_} & {%Heq{};->} & #Hmeta{_{}} & Hconsumer{_{}} ) ".
Definition ivar_1۰result t v : iProp Σ :=
∃ 𝑡 γ,
⌜t = #𝑡⌝ ∗
𝑡 ↪ γ ∗
base.ivar_1۰result γ v.
#[local] Instance : CustomIpat "result" :=
" ( %l{;_} & %γ{;_} & {%Heq{};->} & #Hmeta{_{}} & Hresult{_{}} ) ".
Definition ivar_1۰resolved t : iProp Σ :=
∃ v,
ivar_1۰result t v.
#[global] Instance ivar_1۰invーcontractive t n :
Proper (
(pointwise_relation _ (dist_later n)) ==>
(pointwise_relation _ (dist_later n)) ==>
(≡{n}≡)
) (ivar_1۰inv t).
#[global] Instance ivar_1۰invーproper t :
Proper (
(pointwise_relation _ (≡)) ==>
(pointwise_relation _ (≡)) ==>
(≡)
) (ivar_1۰inv t).
#[global] Instance ivar_1۰consumerーcontractive t n :
Proper (
(pointwise_relation _ (dist_later n)) ==>
(≡{n}≡)
) (ivar_1۰consumer t).
#[global] Instance ivar_1۰consumerーproper t :
Proper (
(pointwise_relation _ (≡)) ==>
(≡)
) (ivar_1۰consumer t).
#[global] Instance ivar_1۰producerーtimeless t :
Timeless (ivar_1۰producer t).
#[global] Instance ivar_1۰resultーtimeless t v :
Timeless (ivar_1۰result t v).
#[global] Instance ivar_1۰invーpersistent t Ψ Ξ :
Persistent (ivar_1۰inv t Ψ Ξ).
#[global] Instance ivar_1۰resultーpersistent t v :
Persistent (ivar_1۰result t v).
Lemma ivar_1۰producerーexclusive t :
ivar_1۰producer t -∗
ivar_1۰producer t -∗
False.
Lemma ivar_1۰consumerーwand {t Ψ Ξ Χ1} Χ2 :
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰consumer t Χ1 -∗
(∀ v, Χ1 v -∗ Χ2 v) ={⊤}=∗
ivar_1۰consumer t Χ2.
Lemma ivar_1۰consumerーdivide {t Ψ Ξ} Χs :
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰consumer t (λ v, [∗ list] Χ ∈ Χs, Χ v) ={⊤}=∗
[∗ list] Χ ∈ Χs, ivar_1۰consumer t Χ.
Lemma ivar_1۰consumerーsplit {t Ψ Ξ} Χ1 Χ2 :
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰consumer t (λ v, Χ1 v ∗ Χ2 v) ={⊤}=∗
ivar_1۰consumer t Χ1 ∗
ivar_1۰consumer t Χ2.
Lemma ivar_1۰resultーagree t v1 v2 :
ivar_1۰result t v1 -∗
ivar_1۰result t v2 -∗
⌜v1 = v2⌝.
Lemma ivar_1ーproducerーresult t v :
ivar_1۰producer t -∗
ivar_1۰result t v -∗
False.
Lemma ivar_1ーinvーresult t Ψ Ξ v :
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰result t v ={⊤}=∗
▷ □ Ξ v.
Lemma ivar_1ーinvーresult' t Ψ Ξ v :
£ 1 -∗
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰result t v ={⊤}=∗
□ Ξ v.
Lemma ivar_1ーinvーresultーconsumer t Ψ Ξ v Χ :
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰result t v -∗
ivar_1۰consumer t Χ ={⊤}=∗
▷^2 Χ v ∗
▷ □ Ξ v.
Lemma ivar_1ーinvーresultーconsumer' t Ψ Ξ v Χ :
£ 2 -∗
ivar_1۰inv t Ψ Ξ -∗
ivar_1۰result t v -∗
ivar_1۰consumer t Χ ={⊤}=∗
Χ v ∗
□ Ξ v.
Lemma ivar_1٠createーspec Ψ Ξ :
{{{
True
}}}
ivar_1٠create ()
{{{
t
, RET t;
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰producer t ∗
ivar_1۰consumer t Ψ
}}}.
Lemma ivar_1٠makeーspec Ψ Ξ v :
{{{
▷ Ψ v ∗
▷ □ Ξ v
}}}
ivar_1٠make v
{{{
t
, RET t;
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰result t v ∗
ivar_1۰consumer t Ψ
}}}.
Lemma ivar_1٠try_getーspec t Ψ Ξ :
{{{
ivar_1۰inv t Ψ Ξ
}}}
ivar_1٠try_get t
{{{
o
, RET o;
if o is Some v then
£ 2 ∗
ivar_1۰result t v
else
True
}}}.
Lemma ivar_1٠try_getーspecーresult t Ψ Ξ v :
{{{
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰result t v
}}}
ivar_1٠try_get t
{{{
RET Some v;
£ 2
}}}.
Lemma ivar_1٠is_unsetーspec t Ψ Ξ :
{{{
ivar_1۰inv t Ψ Ξ
}}}
ivar_1٠is_unset t
{{{
b
, RET #b;
if b then
True
else
£ 2 ∗
ivar_1۰resolved t
}}}.
Lemma ivar_1٠is_unsetーspecーresult t Ψ Ξ v :
{{{
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰result t v
}}}
ivar_1٠is_unset t
{{{
RET false;
£ 2
}}}.
Lemma ivar_1٠is_setーspec t Ψ Ξ :
{{{
ivar_1۰inv t Ψ Ξ
}}}
ivar_1٠is_set t
{{{
b
, RET #b;
if b then
£ 2 ∗
ivar_1۰resolved t
else
True
}}}.
Lemma ivar_1٠is_setーspecーresult t Ψ Ξ v :
{{{
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰result t v
}}}
ivar_1٠is_set t
{{{
RET true;
£ 2
}}}.
Lemma ivar_1٠getーspec t Ψ Ξ v :
{{{
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰result t v
}}}
ivar_1٠get t
{{{
RET v;
£ 2
}}}.
Lemma ivar_1٠setーspec t Ψ Ξ v :
{{{
ivar_1۰inv t Ψ Ξ ∗
ivar_1۰producer t ∗
▷ Ψ v ∗
▷ □ Ξ v
}}}
ivar_1٠set t v
{{{
RET ();
ivar_1۰result t v
}}}.
End ivar_1۰G.
#[global] Opaque ivar_1۰inv.
#[global] Opaque ivar_1۰producer.
#[global] Opaque ivar_1۰consumer.
#[global] Opaque ivar_1۰result.