Fil-C on Nix

Filnix wiki

the formal campaign

rocq/theories/LibcStreamAdapter.v

World-owned callback snapshots, separate from locale string names. Main's output rules do not own/update these snapshots: callers must allocate or transfer them at callback entry.

From iris.proofmode Require Import proofmode
From iris.base_logic.lib Require Import gen_heap
From Stdlib Require Import ZArith List Lia
From Nanofil Require Import Term Syntax Values Memory Runtime Identity ExternalCalls ExternalMachine Stdio Shutdown Streams Libc LibcStreams Pieces Heap ContractFrame Logic StringLogic LentLogic LibcStreamLogic LibcErrnoLogic LibcStreamTokens
Open Scope Z_scope
Open Scope list_scope

A stable native handle and a reserved ghost key. The life region is separate from the mutable observations of FILE state.

15Record stream_token: Type ≔ mkStreamToken
token_handle
 : ptr
token_base
 : Z
token_region
 : region
token_key
 : Z
22Definition stream_psd : stream_token pending : Z fifo : listZ : listpiece × pval ≔

Ordinary completed closure does not freeze orientation or error. A resource prefix is not enough to establish this observation.

32Definition stream_observationw : libc_world p : ptr snapshot : optionZ × listZ : Prop ≔
match snapshot with
Somepending, fifo
⇒
∃info, libc_stream_atw p = Someinfo ∧ stream_pendinginfo = pending ∧ outstandingstream_protocolinfo = fifo
None
⇒

Absent keys impose no snapshot requirement. A present key rejects wrong handles, malformed values and stale observations. This reads the current heap, never a fixed callback-entry snapshot.

43Definition stream_currentd : stream_token w : libc_world h : gmappiece pval : Prop ≔
match h !! PNametoken_keyd with
None
⇒
True
SomeVStreamp snapshot
⇒
p = token_handled ∧ stream_observationw p snapshot
Some_
⇒
False

Keys below the codec key (-1) do not overlap locale categories. Actual freshness against other adapters is still required by allocation.

52Definition token_wfd : stream_token : Prop ≔
55Definition stream_tokens_wirep out err b o m w h : gmappiece pval : Prop ≔
token_wfout ∧ token_wferr ∧ token_baseout ≠ token_baseerr ∧ token_keyout ≠ token_keyerr ∧ libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
64Lemma stream_closed_keys
∀ d pending fifo
closed_psd.*1 = stream_psd pending fifo.*1
Explore proof 1 tactics

Initial goal

⊢
∀d : stream_token pending : Z fifo : listZ, closed_psd.*1 = stream_psd pending fifo.*1

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity
68Lemma stream_ps_agree
∀ m d pending fifo
all_agreem stream_psd pending fifo
Explore proof 3 tactics

Initial goal

⊢
∀m : mem d : stream_token pending : Z fifo : listZ, live_atm token_based token_regiond → all_agreem stream_psd pending fifo

intros

m :
pending :
Z
fifo :
listZ
⊢
all_agreem stream_psd pending fifo

split ; exact H |

m :
pending :
Z
fifo :
listZ

split ; exact I

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros
split ; exact H |
split ; exact I
72Lemma closed_ps_agree
Explore proof 3 tactics

Initial goal

intros

split ; exact H |

split ; exact I

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros
split ; exact H |
split ; exact I
76Lemma stream_open_current
∀ d w h pending fifo
∀l v, l, v ∈ stream_psd pending fifo → h !! l = Somev
∃info, libc_stream_atw token_handled = Someinfo ∧ stream_pendinginfo = pending ∧ outstandingstream_protocolinfo = fifo
Explore proof 8 tactics

Initial goal

⊢
∀d : stream_token w : libc_world h : gmappiece pval pending : Z fifo : listZ, stream_currentd w h → ∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev → ∃info : stream_info, libc_stream_atw token_handled = Someinfo ∧ stream_pendinginfo = pending ∧ outstandingstream_protocolinfo = fifo

intros d w h pending fifo Hcurrent Howned

h :
pending :
Z
fifo :
listZ
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
⊢
∃info : stream_info, libc_stream_atw token_handled = Someinfo ∧ stream_pendinginfo = pending ∧ outstandingstream_protocolinfo = fifo

assert Hl : h !! PNametoken_keyd = SomeVStreamtoken_handled Somepending, fifo

2 open

h :
pending :
Z
fifo :
listZ
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
⊢
h !! PNametoken_keyd = SomeVStreamtoken_handled Somepending, fifo
focused goal
h :
pending :
Z
fifo :
listZ
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
Hl :
h !! PNametoken_keyd = SomeVStreamtoken_handled Somepending, fifo
⊢
∃info : stream_info, libc_stream_atw token_handled = Someinfo ∧ stream_pendinginfo = pending ∧ outstandingstream_protocolinfo = fifo

{apply Howned

2 open

h :
pending :
Z
fifo :
listZ
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
⊢
PNametoken_keyd, VStreamtoken_handled Somepending, fifo ∈ stream_psd pending fifo
deferred goal
h :
pending :
Z
fifo :
listZ
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
Hl :
h !! PNametoken_keyd = SomeVStreamtoken_handled Somepending, fifo
⊢
∃info : stream_info, libc_stream_atw token_handled = Someinfo ∧ stream_pendinginfo = pending ∧ outstandingstream_protocolinfo = fifo

unfold stream_ps

2 open

h :
pending :
Z
fifo :
listZ
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
deferred goal
h :
pending :
Z
fifo :
listZ
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
Hl :
h !! PNametoken_keyd = SomeVStreamtoken_handled Somepending, fifo
⊢
∃info : stream_info, libc_stream_atw token_handled = Someinfo ∧ stream_pendinginfo = pending ∧ outstandingstream_protocolinfo = fifo

set_solver

deferred goal
h :
pending :
Z
fifo :
listZ
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
Hl :
h !! PNametoken_keyd = SomeVStreamtoken_handled Somepending, fifo
⊢
∃info : stream_info, libc_stream_atw token_handled = Someinfo ∧ stream_pendinginfo = pending ∧ outstandingstream_protocolinfo = fifo

unfold stream_current in Hcurrent

h :
pending :
Z
fifo :
listZ
Hcurrent :
match h !! PNametoken_keyd with
SomeVStreamp snapshot
⇒
p = token_handled ∧ stream_observationw p snapshot
None
⇒
True
_
⇒
False
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
Hl :
h !! PNametoken_keyd = SomeVStreamtoken_handled Somepending, fifo
⊢
∃info : stream_info, libc_stream_atw token_handled = Someinfo ∧ stream_pendinginfo = pending ∧ outstandingstream_protocolinfo = fifo

rewrite Hl in Hcurrent

h :
pending :
Z
fifo :
listZ
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
Hl :
h !! PNametoken_keyd = SomeVStreamtoken_handled Somepending, fifo
Hcurrent :
⊢
∃info : stream_info, libc_stream_atw token_handled = Someinfo ∧ stream_pendinginfo = pending ∧ outstandingstream_protocolinfo = fifo

exact proj2Hcurrent

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros d w h pending fifo Hcurrent Howned
assert Hl : h !! PNametoken_keyd = SomeVStreamtoken_handled Somepending, fifo
{apply Howned
unfold stream_ps
set_solver
unfold stream_current in Hcurrent
rewrite Hl in Hcurrent
exact proj2Hcurrent
88Lemma stream_closed_current
∀ d w h
∀l v, l, v ∈ closed_psd → h !! l = Somev
Explore proof 8 tactics

Initial goal

⊢
∀d : stream_token w : libc_world h : gmappiece pval, stream_currentd w h → ∀l : piece v : pval, l, v ∈ closed_psd → h !! l = Somev → libc_stream_atw token_handled = None ∧ outstandinglibc_stream_statew token_handled = [ ]

intros d w h Hcurrent Howned

h :
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ closed_psd → h !! l = Somev

assert Hl : h !! PNametoken_keyd = SomeVStreamtoken_handled None

2 open

h :
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ closed_psd → h !! l = Somev
⊢
focused goal
h :
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ closed_psd → h !! l = Somev
Hl :

{apply Howned

2 open

h :
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ closed_psd → h !! l = Somev
deferred goal
h :
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ closed_psd → h !! l = Somev
Hl :

unfold closed_ps

2 open

h :
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ closed_psd → h !! l = Somev
deferred goal
h :
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ closed_psd → h !! l = Somev
Hl :

set_solver

deferred goal
h :
Hcurrent :
Howned :
∀l : piece v : pval, l, v ∈ closed_psd → h !! l = Somev
Hl :

unfold stream_current in Hcurrent

h :
Hcurrent :
match h !! PNametoken_keyd with
SomeVStreamp snapshot
⇒
p = token_handled ∧ stream_observationw p snapshot
None
⇒
True
_
⇒
False
Howned :
∀l : piece v : pval, l, v ∈ closed_psd → h !! l = Somev
Hl :

rewrite Hl in Hcurrent

h :
Howned :
∀l : piece v : pval, l, v ∈ closed_psd → h !! l = Somev
Hl :

exact proj2Hcurrent

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros d w h Hcurrent Howned
assert Hl : h !! PNametoken_keyd = SomeVStreamtoken_handled None
{apply Howned
unfold closed_ps
set_solver
unfold stream_current in Hcurrent
rewrite Hl in Hcurrent
exact proj2Hcurrent

Recording independently live handles and CURRENT observations preserves the complete entry envelope. It does not recover unavailable fragments or change the world interpretation used by an existing WP.

102Lemma stream_entry_frame
∀ rep out err b o m w h op oq ep eq
let h′ ≔ overwritestream_psout op oq ++ stream_pserr ep eq h in
agreesm h′ ∧ stream_tokens_wirep out err b o m w h′
Proof 57 steps Qed
intros rep out err b o m w h op oq ep eq Ha Howf & Hewf & Hbase & Hkey & Hout & Herr & _ & _ & Hprivate Hol Hel Hoo Heo h′
{intros l v Hl Hmem
apply stream_data_lookup in Hl as Hl & Hno & Hne
unfold h' in Hl
apply lookup_overwrite in Hl as Hin | _ Hold
–apply list_elem_of_In in Hin
cbn [ stream_ps app ] in Hin
destruct Hin as E | E | E | E | ; injection E as ← ← ; contradiction
–exists v
rewrite stream_data_lookup_ne ; assumption
split
{intros l v Hl
unfold h' in Hl
apply lookup_overwrite in Hl as Hin | _ Hold ; | exact Hal v Hold
eapply all_agree_elem ; | exact Hin
split ; apply stream_ps_agree ; assumption
split ; exact Howf |
split ; exact Hewf |
split ; exact Hbase |
split ; exact Hkey |
split ; exact Hout |
split ; exact Herr |
split
{unfold stream_current , h'
cbn [ stream_ps app overwrite fst snd ]
rewrite lookup_insert_ne ; | discriminate
rewrite lookup_insert_eq
exact conjeq_refl Hoo
split
{unfold stream_current , h'
cbn [ stream_ps app overwrite fst snd ]
rewrite lookup_insert_ne ; | discriminate
rewrite lookup_insert_ne ; | congruence
rewrite lookup_insert_ne ; | discriminate
rewrite lookup_insert_eq
exact conjeq_refl Heo
intros d Hd
destruct Hprivated Hd as Hwi Hrel
split ; eapply errno_wi_heap ; eauto |
intros base l v Hin Hl Hmem
unfold h' in Hl
apply lookup_overwrite in Hl as Hnew | _ Hold ; | exact Hrelbase l v Hin Hold Hmem
apply list_elem_of_In in Hnew
cbn [ stream_ps app ] in Hnew
destruct Hnew as E | E | E | E | ; injection E as ← ← ; try contradiction
–intros E
subst base
eapply libc_handle_not_released ; exact proj1Hwi | left ; reflexivity | | exact Hin
rewrite Hout
exact proj1Howf
–intros E
subst base
eapply libc_handle_not_released ; exact proj1Hwi | right ; reflexivity | | exact Hin
rewrite Herr
exact proj1Hewf
147Section snapshot_allocation
148Context `{!gen_heapGSpiece pval Σ}

Fresh ghost recording is not native allocation: both live_at facts and both current observations are independent premises. Freshness is against the authoritative heap, so no existing life is duplicated.

153Lemma stream_entry_alloc
∀ rep out err b o m w h op oq ep eq
stream_tokens_wirep out err b o m w h
∀l v, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
gen_heap_interph ⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝
Explore proof 14 tactics

Initial goal

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
⊢
agreesm h → stream_tokens_wirep out err b o m w h → live_atm token_baseout token_regionout → live_atm token_baseerr token_regionerr → stream_observationw token_handleout Someop, oq → stream_observationw token_handleerr Someep, eq → ∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

intros Ha Hw Hol Hel Hoo Heo Hfresh

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
⊢
gen_heap_interph ⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

iIntros Hh

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Hh :
gen_heap_interph
∗
|⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

destruct Hw as Howf & Hewf & Hbase & Hkey & Hrest eqn: E

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
Hh :
gen_heap_interph
∗
|⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

iMod pts_alloch stream_psout op oq ++ stream_pserr ep eq with Hh as [Hh Hps]

3 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
⊢
base.NoDupstream_psout op oq ++ stream_pserr ep eq.*1
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
⊢
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
Hh :
gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h
Hps :
ptsstream_psout op oq ++ stream_pserr ep eq
∗
|⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

–clear - Hbase Hkey

3 open

out, err :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Hbase :
Hkey :
token_keyout ≠ token_keyerr
⊢
base.NoDupstream_psout op oq ++ stream_pserr ep eq.*1
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
⊢
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
Hh :
gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h
Hps :
ptsstream_psout op oq ++ stream_pserr ep eq
∗
|⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

cbn [ stream_ps app fmap fst ]

3 open

out, err :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Hbase :
Hkey :
token_keyout ≠ token_keyerr
⊢
base.NoDuplist_fmappiece × pval%type piece fst PLivetoken_baseout, VLivetoken_regionout :: PNametoken_keyout, VStreamtoken_handleout Someop, oq :: stream_pserr ep eq
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
⊢
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
Hh :
gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h
Hps :
ptsstream_psout op oq ++ stream_pserr ep eq
∗
|⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

repeat constructor ; set_solver

2 open

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
⊢
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
Hh :
gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h
Hps :
ptsstream_psout op oq ++ stream_pserr ep eq
∗
|⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

–exact Hfresh

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
Hh :
gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h
Hps :
ptsstream_psout op oq ++ stream_pserr ep eq
∗
|⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

–rewrite pts_app

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
Hh :
gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h
Hps :
ptsstream_psout op oq ∗ ptsstream_pserr ep eq
∗
|⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

iDestruct Hps as [Ho He]

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
Hh :
gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h
Ho :
ptsstream_psout op oq
He :
ptsstream_pserr ep eq
∗
|⇛ gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

iModIntro

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
Hh :
gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h
Ho :
ptsstream_psout op oq
He :
ptsstream_pserr ep eq
∗
gen_heap_interpoverwritestream_psout op oq ++ stream_pserr ep eq h ∗ ptsstream_psout op oq ∗ ptsstream_pserr ep eq ∗ ⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

iFrame

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
∗
⌜agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h⌝

iPureIntro

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
rep :
mem → libc_world → Prop
out, err :
b, o :
Z
m :
h :
op :
Z
oq :
listZ
ep :
Z
eq :
listZ
Ha :
Hw :
stream_tokens_wirep out err b o m w h
Hoo :
Heo :
Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout op oq ++ stream_pserr ep eq → h !! l = None
Howf :
Hewf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Hrest :
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h
E :
Hw = conjHowf conjHewf conjHbase conjHkey Hrest
⊢
agreesm overwritestream_psout op oq ++ stream_pserr ep eq h ∧ stream_tokens_wirep out err b o m w overwritestream_psout op oq ++ stream_pserr ep eq h

eapply stream_entry_frame ; eauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Ha Hw Hol Hel Hoo Heo Hfresh
iIntros Hh
destruct Hw as Howf & Hewf & Hbase & Hkey & Hrest eqn: E
iMod pts_alloch stream_psout op oq ++ stream_pserr ep eq with Hh as [Hh Hps]
–clear - Hbase Hkey
cbn [ stream_ps app fmap fst ]
repeat constructor ; set_solver
–exact Hfresh
–rewrite pts_app
iDestruct Hps as [Ho He]
iModIntro
iFrame
iPureIntro
eapply stream_entry_frame ; eauto

Callback entry allocates the reserved snapshot key, while retaining an already owned life piece. Neither the life nor a fresh ghost resource can be fabricated by the pure interpretation.

179Lemma stream_snapshot_alloc
∀ d pending fifo w h
h !! PNametoken_keyd = None
stream_observationw token_handled Somepending, fifo
gen_heap_interph ∗ ptsPLivetoken_based, VLivetoken_regiond ⇛ gen_heap_interp<[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h ∗ ptsstream_psd pending fifo ∗ ⌜stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h⌝
Explore proof 13 tactics

Initial goal

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
⊢
h !! PNametoken_keyd = None → stream_observationw token_handled Somepending, fifo → gen_heap_interph ∗ ptsPLivetoken_based, VLivetoken_regiond ⇛ gen_heap_interp<[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h ∗ ptsstream_psd pending fifo ∗ ⌜stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h⌝

intros Hfresh Hobs

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
⊢
gen_heap_interph ∗ ptsPLivetoken_based, VLivetoken_regiond ⇛ gen_heap_interp<[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h ∗ ptsstream_psd pending fifo ∗ ⌜stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h⌝

iIntros [Hh Hlife]

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
Hh :
gen_heap_interph
∗
|⇛ gen_heap_interp<[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h ∗ ptsstream_psd pending fifo ∗ ⌜stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h⌝

iMod gen_heap_alloc_ PNametoken_keyd VStreamtoken_handled Somepending, fifo with Hh as (Hh & Hname & _) ; exact Hfresh |

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
Hh :
gen_heap_interp<[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h
Hname :
pointstoPNametoken_keyd DfracOwn1 VStreamtoken_handled Somepending, fifo
∗
|⇛ gen_heap_interp<[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h ∗ ptsstream_psd pending fifo ∗ ⌜stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h⌝

iModIntro

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
Hh :
gen_heap_interp<[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h
Hname :
pointstoPNametoken_keyd DfracOwn1 VStreamtoken_handled Somepending, fifo
∗
gen_heap_interp<[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h ∗ ptsstream_psd pending fifo ∗ ⌜stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h⌝

iSplitL Hh ; iExact Hh |

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
Hname :
pointstoPNametoken_keyd DfracOwn1 VStreamtoken_handled Somepending, fifo
∗
ptsstream_psd pending fifo ∗ ⌜stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h⌝

iSplitL Hlife Hname

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
Hname :
pointstoPNametoken_keyd DfracOwn1 VStreamtoken_handled Somepending, fifo
∗
ptsstream_psd pending fifo
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
∗
⌜stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h⌝

–rewrite / stream_ps / pts /=

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
Hlife :
pointstoPLivetoken_based DfracOwn1 VLivetoken_regiond ∗ emp
Hname :
pointstoPNametoken_keyd DfracOwn1 VStreamtoken_handled Somepending, fifo
∗
pointstoPLivetoken_based DfracOwn1 VLivetoken_regiond ∗ pointstoPNametoken_keyd DfracOwn1 VStreamtoken_handled Somepending, fifo ∗ emp
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
∗
⌜stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h⌝

iDestruct Hlife as [Hlife _]

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
Hlife :
Hname :
pointstoPNametoken_keyd DfracOwn1 VStreamtoken_handled Somepending, fifo
∗
pointstoPLivetoken_based DfracOwn1 VLivetoken_regiond ∗ pointstoPNametoken_keyd DfracOwn1 VStreamtoken_handled Somepending, fifo ∗ emp
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
∗
⌜stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h⌝

iFrame

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
∗
⌜stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h⌝

–iPureIntro

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
⊢
stream_currentd w <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h

unfold stream_current

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
⊢
match <[PNametoken_keyd ≔ VStreamtoken_handled Somepending, fifo]>h !! PNametoken_keyd with
SomeVStreamp snapshot
⇒
p = token_handled ∧ stream_observationw p snapshot
None
⇒
True
_
⇒
False

rewrite lookup_insert_eq

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
pending :
Z
fifo :
listZ
h :
Hfresh :
h !! PNametoken_keyd = None
Hobs :
stream_observationw token_handled Somepending, fifo
⊢

exact conjeq_refl Hobs

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hfresh Hobs
iIntros [Hh Hlife]
iMod gen_heap_alloc_ PNametoken_keyd VStreamtoken_handled Somepending, fifo with Hh as (Hh & Hname & _) ; exact Hfresh |
iModIntro
iSplitL Hh ; iExact Hh |
iSplitL Hlife Hname
–rewrite / stream_ps / pts /=
iDestruct Hlife as [Hlife _]
iFrame
–iPureIntro
rewrite lookup_insert_eq
exact conjeq_refl Hobs

The other registered stream keeps its observable state and private inventory. Distinct addresses rule out stdout-priority aliasing.

200Lemma stream_other_frame
Proof 38 steps Qed
intros p q w w′ Hwhich Hdistinct Hout & Herr & _ & _ & _ & _ & _ & _ & Hother
assert Hne : same_filelibc_stderrw libc_stdoutw = false
{unfold same_file
apply andb_false_iff
left
apply Z.eqb_neq
congruence
destruct Hwhich as → → | → →
–rewrite same_file_refl in Hother
destruct Hother as Hfile & Hopen & Hstate
{unfold libc_file_at
rewrite Hout Herr Hne same_file_refl Hopen Hfile
reflexivity
rewrite Hout Herr Hne same_file_refl Hstate
reflexivity
split ; exact Hlookup |
split ; | exact Hprotocol
rewrite Hlookup Hout Hprotocol
reflexivity
–rewrite Hne in Hother
destruct Hother as Hfile & Hopen & Hstate
{unfold libc_file_at
rewrite Hout same_file_refl Hopen Hfile
reflexivity
rewrite Hout same_file_refl Hstate
reflexivity
split ; exact Hlookup |
split ; | exact Hprotocol
rewrite Hlookup Hout Hprotocol
reflexivity
230Module LibcStreamAdapterOn R : Runtime LG : StreamFrameLogicR
231Module M ≔ LG.L.M
232Module T ≔ LibcStreamTokensOn R LG

Query contracts permit no allocation; in particular delegation cannot add a newly born release identity to either FILE.

236Lemma effects_no_alloc
∀ sources roots releases s m born s′ m′ born′
M.E.effectssources roots releases λ_ _ ⇒ False s m born s′ m′ born′
born′ = born
Explore proof 2 tactics

Initial goal

⊢
∀sources roots : listspan releases : listZ s : R.state m : mem born : listZ s′ : R.state m′ : mem born′ : listZ, M.E.effectssources roots releases λ_ _ : Z ⇒ False s m born s′ m′ born′ → born′ = born

intros sources roots releases s m born s′ m′ born′ He

sources, roots :
listspan
releases :
listZ
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
born′ :
listZ
He :
M.E.effectssources roots releases λ_ _ : Z ⇒ False s m born s′ m′ born′
⊢
born′ = born

induction He ; reflexivity | exact IHHe | contradiction

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros sources roots releases s m born s′ m′ born′ He
induction He ; reflexivity | exact IHHe | contradiction

Both mirrors and both private-memory frames survive either query. No unchanged-memory premise rules out the native locking writes.

246Theorem query_frame
∀ rep requests wide out err b o d spec r args s m w trace ending s′ m′ w′ h
d = out ∨ d = err
spec = ferror_contractlibc_stream_modelrep requests wide ∨ spec = fpending_contractlibc_stream_modelrep requests wide
M.E.invokespec r args WPtrtoken_handled s m w trace ending s′ m′ w′
R.readys m
stream_tokens_wirep out err b o m w h
agreesm′ h ∧ live_disjointm′ ∧ R.readys′ m′ ∧ stream_tokens_wirep out err b o m′ w′ h
Proof 71 steps Qed
intros rep requests wide out err b o d spec r args s m w trace ending s′ m′ w′ h Hd Hspec Hcall Ha Hdis Hr Houtwf & Herrwf & Hbase & Hkey & Hout & Herr & Houtcurrent & Herrcurrent & Hprivate
destruct Hprivated Hd as Hselected Hrelease
destruct T.query_framerep requests wide token_baseout token_baseerr token_handled b o spec r args s m w trace ending s' m' w' h Hspec Hcall Ha Hdis Hr Hselected as Ha′ & Hdis′ & Hr′ & Hselected′
split ; exact Ha' |
split ; exact Hdis' |
split ; exact Hr' |
destruct M.E.invoke_prefix_ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as born & Hp
destruct M.E.prefix_preserve_ _ _ _ _ _ _ _ _ _ _ Hp Hr as _ Hpers
assert Hborn : born = [ ]
{destruct Hp as He _
destruct Hspec as → | → ; eapply effects_no_alloc ; exact He
subst born
assert Hprefix : query_prefixlibc_stream_modelrep requests wide WPtrtoken_handled m w [ ] trace m' w'
{destruct Hspec as → | → ; exact proj2Hp
destruct Hprefix as p & info & Hxs & Hinfo & Hopen & Hframe & Hdelegate & _
injection Hxs as ←
assert Hready′ := proj1Hopen
assert Hdistinct : ptr_addrlibc_stdoutw ≠ ptr_addrlibc_stderrw
{destruct proj1Hselected as _ & _ & _ & _ & _ & _ & _ & _ & Hdistinct & _
exact Hdistinct
{intros q Hq Hne
apply stream_other_frame with p := token_handled ; | exact Hdistinct | exact Hframe
destruct Hd as → | → ; destruct Hq as → | → ; try contradiction ; left | right ; split ; congruence
assert Hchoice : ∀q, q = out ∨ q = err → q = d ∨ q ≠ d
{intros q Hq
destruct Hd as → | → ; destruct Hq as → | → ; try left ; reflexivity ; right ; intros Heq ; apply Hbase ; congruence
{intros q Hq
destruct Hchoiceq Hq as [ ->| Hne ]
–split ; rewrite Hinfo ; exact proj1proj2Hopen |
pose proof proj1proj2proj2Hopen as Hprotocol
change stream_protocolinfo = libc_stream_statew' token_handled in Hprotocol
rewrite <- Hprotocol
unfold libc_stream_at in Hinfo
destruct libc_file_atw token_handled ; injection Hinfo as ← ; reflexivity | discriminate
–exact proj2Hotherq Hq Hne
assert Hcurrent : ∀q, q = out ∨ q = err → stream_currentq w' h
{intros q Hq
assert Hc : stream_currentq w h by destruct Hq as → | → ; assumption
destruct Hviewsq Hq as Hlookup Hstate
unfold stream_current in *
destruct h !! PNametoken_keyq as v | ; | exact I
destruct v ; try contradiction
destruct Hc as → Hobs
split ; reflexivity |
unfold stream_observation in *
destruct pending as physical fifo | ; rewrite Hlookup ; exact Hobs | rewrite Hstate ; exact Hobs
split ; exact Houtwf |
split ; exact Herrwf |
split ; exact Hbase |
split ; exact Hkey |
split ; rewrite proj1Hframe ; exact Hout |
split ; rewrite proj1proj2Hframe ; exact Herr |
split ; apply Hcurrent ; left ; reflexivity |
split ; apply Hcurrent ; right ; reflexivity |
intros q Hq
destruct Hchoiceq Hq as [ ->| Hne ]
–split ; exact Hselected' |
intros base l v Hin Hl Hmem
destruct proj2proj2Hdelegate base Hin as Hold | Hnil ; exact Hreleasebase l v Hold Hl Hmem | contradiction
–destruct Hotherq Hq Hne as Hfile _
destruct Hprivateq Hq as Hwi Hrel
assert Hroots : libc_stream_aux_rootsw' token_handleq = libc_stream_aux_rootsw token_handleq by unfold libc_stream_aux_roots ; rewrite Hfile ; reflexivity
assert Hrels : libc_stream_releasesw' token_handleq = libc_stream_releasesw token_handleq by unfold libc_stream_releases ; rewrite Hfile ; reflexivity
split ; | rewrite Hrels ; exact Hrel
eapply errno_wi_fixed ; exact Hwi | | exact Hpers | exact Hready' | | exact Hroots | exact Hrels
exact Ha
+exact proj1proj2proj2proj2Hframe

Only an ordinary return establishes completed closure. Sample all four endpoint errno bytes, update the selected name, and retain the opposite snapshot and both native lives. This is a pure heap frame; updating an owned name in Iris still requires its points-to resource.

330Theorem close_frame
∀ rep requests wide out err b o d r args s m w trace values s′ m′ w′ h xs
d = out ∨ d = err
M.E.invokefclose_contractlibc_stream_modelrep requests wide r args WPtrtoken_handled s m w trace CallReturnvalues s′ m′ w′
R.readys m
stream_tokens_wirep out err b o m w h
lengthxs = 4%nat
∀l v, l, v ∈ byte_psb o xs → h !! l = Somev
∃ys, lengthys = 4%nat ∧ byte_psb o ys.*1 = byte_psb o xs.*1 ∧ agreesm′ <[PNametoken_keyd ≔ VStreamtoken_handled None]>overwritebyte_psb o ys h ∧ live_disjointm′ ∧ R.readys′ m′ ∧ stream_tokens_wirep out err b o m′ w′ <[PNametoken_keyd ≔ VStreamtoken_handled None]>overwritebyte_psb o ys h
Proof 122 steps Qed
intros rep requests wide out err b o d r args s m w trace values s′ m′ w′ h xs Hd Hcall Ha Hdis Hr Houtwf & Herrwf & Hbase & Hkey & Hout & Herr & Houtcurrent & Herrcurrent & Hprivate Hlen Howned
destruct Hprivated Hd as Hselected Hrelease
destruct T.close_framerep requests wide token_baseout token_baseerr token_handled b o r args s m w trace CallReturnvalues s' m' w' h xs ltac:rewrite Hout ; exact proj1Houtwf ltac:rewrite Herr ; exact proj1Herrwf Hcall Ha Hdis Hr Hselected Hlen Howned as ys & Hys & Hkeys & Ha′ & Hdis′ & Hr′ & Hselected′
set h0 := overwritebyte_psb o ys h in *
set h1 := <[PNametoken_keyd ≔ VStreamtoken_handled None]>h0
assert Hkeys0 : memory_keys_fromh0 h
{intros l v Hl Hmem
unfold h0 in Hl
destruct lookup_overwrite_ _ _ _ Hl as Hin | _ Hold ; | eauto
assert Hkey0 : l ∈ byte_psb o xs.*1
{rewrite <- Hkeys
apply list_elem_of_fmap
exists l, v
auto
apply list_elem_of_fmap in Hkey0 as l0 old & E & Hinold
simpl in E
subst l0
exists old
exact Hownedl old Hinold
assert Hkeys1 : memory_keys_fromh1 h0
{intros l v Hl Hmem
unfold h1 in Hl
apply lookup_insert_Some in Hl as He Hv | _ Hold ; subst l ; contradiction | eauto
{intros l v Hl Hmem
apply stream_data_lookup in Hl as Hl & Hno & Hne
destruct Hkeys1l v Hl Hmem as old Hold
exists old
rewrite stream_data_lookup_ne ; assumption
{intros l v Hl Hmem
apply stream_data_lookup in Hl as Hl & Hno & Hne
destruct Hkeys1l v Hl Hmem as old Hold
destruct Hkeys0l old Hold Hmem as entry Hentry
exists entry
rewrite stream_data_lookup_ne ; assumption
exists ys
split ; exact Hys |
split ; exact Hkeys |
split
{intros l v Hl
unfold h1 in Hl
apply lookup_insert_Some in Hl as He Hv | _ Hold ; subst l v ; exact I | exact Ha'l v Hold
split ; exact Hdis' |
split ; exact Hr' |
destruct M.E.invoke_prefix_ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as born & Hp
destruct M.E.prefix_preserve_ _ _ _ _ _ _ _ _ _ _ Hp Hr as _ Hpers
destruct Hp as _ & p & info & final & Hxs & _ & _ & _ & Hready′ & Hframe & _
injection Hxs as ←
destruct T.EL.S.fclose_invocation_ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as born0 & p & info0 & final0 & n & Hxs & _ & Hsettle & Hstate & _ & Hclosed & _ | why & Hbad & _ ; | discriminate Hbad
injection Hxs as ←
change libc_stream_atw' token_handled = None in Hclosed
assert Hfifo : outstandinglibc_stream_statew' token_handled = [ ]
{change libc_stream_statew' token_handled = final0 in Hstate
rewrite Hstate
eapply stream_settlement_complete ; exact Hsettle
assert Hdistinct : ptr_addrlibc_stdoutw ≠ ptr_addrlibc_stderrw
{destruct proj1Hselected as _ & _ & _ & _ & _ & _ & _ & _ & Hdistinct & _
exact Hdistinct
assert Hchoice : ∀q, q = out ∨ q = err → q = d ∨ q ≠ d
{intros q Hq
destruct Hd as → | → ; destruct Hq as → | → ; try left ; reflexivity ; right ; intros Heq ; apply Hbase ; congruence
{intros q Hq Hne
apply stream_other_frame with p := token_handled ; | exact Hdistinct | exact Hframe
destruct Hd as → | → ; destruct Hq as → | → ; try contradiction ; left | right ; split ; congruence
assert Hcurrent : ∀q, q = out ∨ q = err → stream_currentq w' h1
{intros q Hq
destruct Hchoiceq Hq as [ ->| Hne ]
–unfold stream_current , h1
rewrite lookup_insert_eq
exact conjeq_refl conjHclosed Hfifo
–assert Hkeyne : token_keyd ≠ token_keyq
{destruct Hd as → | → ; destruct Hq as → | → ; congruence
assert Hc : stream_currentq w h by destruct Hq as → | → ; assumption
destruct Hotherq Hq Hne as _ & Hlookup & Hprotocol
unfold stream_current in *
unfold h1
rewrite lookup_insert_ne ; | congruence
unfold h0
+destruct h !! PNametoken_keyq as v | ; | exact I
destruct v ; try contradiction
destruct Hc as → Hobs
split ; reflexivity |
unfold stream_observation in *
destruct pending as physical fifo | ; rewrite Hlookup ; exact Hobs | rewrite Hprotocol ; exact Hobs
+rewrite byte_ps_keys
intros Hin
apply list_elem_of_fmap in Hin as i & E & _
discriminate E
split ; exact Houtwf |
split ; exact Herrwf |
split ; exact Hbase |
split ; exact Hkey |
split ; rewrite proj1Hframe ; exact Hout |
split ; rewrite proj1proj2Hframe ; exact Herr |
split ; apply Hcurrent ; left ; reflexivity |
split ; apply Hcurrent ; right ; reflexivity |
intros q Hq
destruct Hchoiceq Hq as [ ->| Hne ]
–split ; eapply errno_wi_heap ; exact Hselected' | exact Hdata1 |
unfold libc_stream_at in Hclosed
destruct libc_file_atw' token_handled ; discriminate Hclosed |
intros base l v Hin
contradiction
–destruct Hotherq Hq Hne as Hfile _
destruct Hprivateq Hq as Hwi Hrel
assert Hroots : libc_stream_aux_rootsw' token_handleq = libc_stream_aux_rootsw token_handleq by unfold libc_stream_aux_roots ; rewrite Hfile ; reflexivity
assert Hrels : libc_stream_releasesw' token_handleq = libc_stream_releasesw token_handleq by unfold libc_stream_releases ; rewrite Hfile ; reflexivity
split
+eapply errno_wi_heap ; | exact Hdata0
eapply errno_wi_fixed ; exact Hwi | | exact Hpers | exact Hready' | | exact Hroots | exact Hrels
exact Ha
∗exact proj1proj2proj2proj2Hframe
+rewrite Hrels
intros base l v Hin Hl Hmem
destruct Hkeys1l v Hl Hmem as old Hold
destruct Hkeys0l old Hold Hmem as entry Hentry
exact Hrelbase l entry Hin Hentry Hmem

Token ownership plus the current world interpretation admits the concrete libc call; openness is not another consumer assumption.

454Theorem open_admitted
∀ rep requests wide out err b o d pending fifo m w h
d = out ∨ d = err
stream_tokens_wirep out err b o m w h
∀l v, l, v ∈ stream_psd pending fifo → h !! l = Somev
Explore proof 6 tactics

Initial goal

⊢
∀rep : mem → libc_world → Prop requests : libc_world → ptr → Z → Z → Prop wide : libc_world → ptr → stream_state → stream_state → bool → Prop out err : stream_token b o : Z d : stream_token pending : Z fifo : listZ m : mem w : libc_world h : gmappiece pval, d = out ∨ d = err → stream_tokens_wirep out err b o m w h → ∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev → stream_call_prelibc_stream_modelrep requests wide WPtrtoken_handled m w

intros rep requests wide out err b o d pending fifo m w h Hd _ & _ & _ & _ & _ & _ & Hout & Herr & Hprivate Howned

rep :
mem → libc_world → Prop
requests :
libc_world → ptr → Z → Z → Prop
wide :
libc_world → ptr → stream_state → stream_state → bool → Prop
out, err :
b, o :
Z
pending :
Z
fifo :
listZ
m :
h :
Hd :
d = out ∨ d = err
Hout :
Herr :
Hprivate :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev

pose proof proj1proj1Hprivated Hd as Hready

rep :
mem → libc_world → Prop
requests :
libc_world → ptr → Z → Z → Prop
wide :
libc_world → ptr → stream_state → stream_state → bool → Prop
out, err :
b, o :
Z
pending :
Z
fifo :
listZ
m :
h :
Hd :
d = out ∨ d = err
Hout :
Herr :
Hprivate :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
Hready :

assert Hcurrent : stream_currentd w h by destruct Hd as → | → ; assumption

rep :
mem → libc_world → Prop
requests :
libc_world → ptr → Z → Z → Prop
wide :
libc_world → ptr → stream_state → stream_state → bool → Prop
out, err :
b, o :
Z
pending :
Z
fifo :
listZ
m :
h :
Hd :
d = out ∨ d = err
Hout :
Herr :
Hprivate :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
Hready :
Hcurrent :

destruct stream_open_currentd w h pending fifo Hcurrent Howned as info & Hinfo & _

rep :
mem → libc_world → Prop
requests :
libc_world → ptr → Z → Z → Prop
wide :
libc_world → ptr → stream_state → stream_state → bool → Prop
out, err :
b, o :
Z
pending :
Z
fifo :
listZ
m :
h :
Hd :
d = out ∨ d = err
Hout :
Herr :
Hprivate :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
Hready :
Hcurrent :
Hinfo :

unfold libc_stream_at in Hinfo

rep :
mem → libc_world → Prop
requests :
libc_world → ptr → Z → Z → Prop
wide :
libc_world → ptr → stream_state → stream_state → bool → Prop
out, err :
b, o :
Z
pending :
Z
fifo :
listZ
m :
h :
Hd :
d = out ∨ d = err
Hout :
Herr :
Hprivate :
Howned :
∀l : piece v : pval, l, v ∈ stream_psd pending fifo → h !! l = Somev
Hready :
Hcurrent :
Hinfo :
=
Someinfo

destruct libc_file_atw token_handled as file | eqn: Hfile ; eapply libc_stream_admitted ; eauto | discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros rep requests wide out err b o d pending fifo m w h Hd _ & _ & _ & _ & _ & _ & Hout & Herr & Hprivate Howned
pose proof proj1proj1Hprivated Hd as Hready
assert Hcurrent : stream_currentd w h by destruct Hd as → | → ; assumption
destruct stream_open_currentd w h pending fifo Hcurrent Howned as info & Hinfo & _
unfold libc_stream_at in Hinfo
destruct libc_file_atw token_handled as file | eqn: Hfile ; eapply libc_stream_admitted ; eauto | discriminate

The native representation's poll stability remains an explicit realization premise. Everything else follows from unchanged regions.

470Lemma errno_wi_safepoint
∀ rep p b o
∀s m s′ m′ w, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
Explore proof 18 tactics

Initial goal

⊢
∀rep : mem → libc_world → Prop p : ptr b o : Z, ∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w → LG.SafepointStablelibc_errno_wirep p b o

intros rep p b o Hstable

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w

split

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
⊢
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world h : gmappiece pval, R.safepoints m s′ m′ → libc_errno_wirep p b o m w h → libc_errno_wirep p b o m′ w h

intros s m s′ m′ w h Hsp Hready & He & Hroots & Hrelease & Hoff

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
⊢
libc_errno_wirep p b o m′ w h

split ; eapply Hstable ; eauto |

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

split ; exact He |

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

split ; | split ; exact Hrelease |

2 open

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
focused goal
rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

–intros root a Hin Hspan l & v & reg & Hl & Hmem & E Hlive & Hrange

2 open

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
root :
a :
Z
Hin :
Hspan :
v :
reg :
Hl :
h !! l = Somev
Hmem :
E :
Hlive :
r_lifereg = Live
Hrange :
piece_idl ≤ a < r_endreg
⊢
False
deferred goal
rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

apply Hrootsroot a Hin Hspan

2 open

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
root :
a :
Z
Hin :
Hspan :
v :
reg :
Hl :
h !! l = Somev
Hmem :
E :
Hlive :
r_lifereg = Live
Hrange :
piece_idl ≤ a < r_endreg
⊢
deferred goal
rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

exists l, v, reg

2 open

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
root :
a :
Z
Hin :
Hspan :
v :
reg :
Hl :
h !! l = Somev
Hmem :
E :
Hlive :
r_lifereg = Live
Hrange :
piece_idl ≤ a < r_endreg
⊢
h !! l = Somev ∧ mem_piecel ∧ live_atm piece_idl reg ∧ piece_idl ≤ a < r_endreg
deferred goal
rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

split ; exact Hl |

2 open

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
root :
a :
Z
Hin :
Hspan :
v :
reg :
Hl :
h !! l = Somev
Hmem :
E :
Hlive :
r_lifereg = Live
Hrange :
piece_idl ≤ a < r_endreg
⊢
mem_piecel ∧ live_atm piece_idl reg ∧ piece_idl ≤ a < r_endreg
deferred goal
rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

split ; exact Hmem |

2 open

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
root :
a :
Z
Hin :
Hspan :
v :
reg :
Hl :
h !! l = Somev
Hmem :
E :
Hlive :
r_lifereg = Live
Hrange :
piece_idl ≤ a < r_endreg
⊢
live_atm piece_idl reg ∧ piece_idl ≤ a < r_endreg
deferred goal
rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

split ; | exact Hrange

2 open

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
root :
a :
Z
Hin :
Hspan :
v :
reg :
Hl :
h !! l = Somev
Hmem :
E :
Hlive :
r_lifereg = Live
Hrange :
piece_idl ≤ a < r_endreg
⊢
deferred goal
rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

split ; | exact Hlive

2 open

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
root :
a :
Z
Hin :
Hspan :
v :
reg :
Hl :
h !! l = Somev
Hmem :
E :
Hlive :
r_lifereg = Live
Hrange :
piece_idl ≤ a < r_endreg
deferred goal
rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

rewrite R.collector_live_ _ _ _ Hsp in E

2 open

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
root :
a :
Z
Hin :
Hspan :
v :
reg :
Hl :
h !! l = Somev
Hmem :
Hlive :
r_lifereg = Live
Hrange :
piece_idl ≤ a < r_endreg
deferred goal
rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

exact E

deferred goal
rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb

–intros l v Hl Hnot

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
v :
Hl :
h !! l = Somev
Hnot :
l ∉ errno_keysb o
⊢
match l with
PByteb0 o0 | PAuxb0 o0
⇒
∀reg : region, live_atm′ b0 reg → 0 ≤ o0 → b0 + o0 < r_endreg → ¬span_containserrno_spanb o b0 + o0
_
⇒
True

destruct l as base | base off | base off | key ; try exact I

2 open

rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
base, off :
Z
v :
Hl :
h !! PBytebase off = Somev
Hnot :
PBytebase off ∉ errno_keysb o
⊢
∀reg : region, live_atm′ base reg → 0 ≤ off → base + off < r_endreg → ¬span_containserrno_spanb o base + off
focused goal
rep :
mem → libc_world → Prop
p :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Hready :
He :
libc_errnow.1 = ptr_addr ≔ b + o; ptr_cap ≔ Objb
base, off :
Z
v :
Hl :
h !! PAuxbase off = Somev
Hnot :
PAuxbase off ∉ errno_keysb o
⊢
∀reg : region, live_atm′ base reg → 0 ≤ off → base + off < r_endreg → ¬span_containserrno_spanb o base + off

all: intros reg E Hlive Ho Hend Hout ; rewrite R.collector_live_ _ _ _ Hsp in E ; exact Hoff_ v Hl Hnot reg conjE Hlive Ho Hend Hout

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros rep p b o Hstable
split
intros s m s′ m′ w h Hsp Hready & He & Hroots & Hrelease & Hoff
split ; eapply Hstable ; eauto |
split ; exact He |
split ; | split ; exact Hrelease |
–intros root a Hin Hspan l & v & reg & Hl & Hmem & E Hlive & Hrange
apply Hrootsroot a Hin Hspan
exists l, v, reg
split ; exact Hl |
split ; exact Hmem |
split ; | exact Hrange
split ; | exact Hlive
rewrite R.collector_live_ _ _ _ Hsp in E
exact E
–intros l v Hl Hnot
destruct l as base | base off | base off | key ; try exact I
all: intros reg E Hlive Ho Hend Hout ; rewrite R.collector_live_ _ _ _ Hsp in E ; exact Hoff_ v Hl Hnot reg conjE Hlive Ho Hend Hout
488Theorem tokens_safepoint
∀ rep out err b o
∀s m s′ m′ w, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
Explore proof 16 tactics

Initial goal

⊢
∀rep : mem → libc_world → Prop out err : stream_token b o : Z, ∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w → LG.SafepointStablestream_tokens_wirep out err b o

intros rep out err b o Hstable

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w

split

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
⊢
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world h : gmappiece pval, R.safepoints m s′ m′ → stream_tokens_wirep out err b o m w h → stream_tokens_wirep out err b o m′ w h

intros s m s′ m′ w h Hsp Houtwf & Herrwf & Hbase & Hkey & Hout & Herr & Houtcurrent & Herrcurrent & Hprivate

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
⊢
stream_tokens_wirep out err b o m′ w h

split ; exact Houtwf |

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
⊢
token_wferr ∧ token_baseout ≠ token_baseerr ∧ token_keyout ≠ token_keyerr ∧ libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m′ w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h

split ; exact Herrwf |

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
⊢
token_baseout ≠ token_baseerr ∧ token_keyout ≠ token_keyerr ∧ libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m′ w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h

split ; exact Hbase |

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
⊢
token_keyout ≠ token_keyerr ∧ libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m′ w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h

split ; exact Hkey |

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
⊢
libc_stdoutw = token_handleout ∧ libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m′ w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h

split ; exact Hout |

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
⊢
libc_stderrw = token_handleerr ∧ stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m′ w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h

split ; exact Herr |

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
⊢
stream_currentout w h ∧ stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m′ w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h

split ; exact Houtcurrent |

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
⊢
stream_currenterr w h ∧ ∀d : stream_token, d = out ∨ d = err → libc_errno_wirep token_handled b o m′ w stream_data_heaptoken_baseout token_baseerr h ∧ ids_apartlibc_stream_releasesw token_handled h

split ; exact Herrcurrent |

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
⊢

intros d Hd

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
Hd :
d = out ∨ d = err

destruct Hprivated Hd as Hwi Hrelease

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
Hd :
d = out ∨ d = err

split ; | exact Hrelease

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
Hd :
d = out ∨ d = err

pose proof errno_wi_safepointrep token_handled b o Hstable as Hpoll

rep :
mem → libc_world → Prop
out, err :
b, o :
Z
Hstable :
∀s : R.state m : mem s′ : R.state m′ : mem w : libc_world, R.safepoints m s′ m′ → libc_stream_readyrep m w → libc_stream_readyrep m′ w
s :
R.state
m :
s′ :
R.state
m′ :
h :
Hsp :
R.safepoints m s′ m′
Houtwf :
Herrwf :
Hbase :
Hkey :
token_keyout ≠ token_keyerr
Houtcurrent :
Herrcurrent :
Hprivate :
Hd :
d = out ∨ d = err

exact @LG.wi_safepoint_ _ Hpoll s m s′ m′ w _ Hsp Hwi

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros rep out err b o Hstable
split
intros s m s′ m′ w h Hsp Houtwf & Herrwf & Hbase & Hkey & Hout & Herr & Houtcurrent & Herrcurrent & Hprivate
split ; exact Houtwf |
split ; exact Herrwf |
split ; exact Hbase |
split ; exact Hkey |
split ; exact Hout |
split ; exact Herr |
split ; exact Houtcurrent |
split ; exact Herrcurrent |
intros d Hd
destruct Hprivated Hd as Hwi Hrelease
split ; | exact Hrelease
pose proof errno_wi_safepointrep token_handled b o Hstable as Hpoll
exact @LG.wi_safepoint_ _ Hpoll s m s′ m′ w _ Hsp Hwi

Discriminating world observations: physical pending is seven, the logical FIFO has two bytes, and a completed close consumes both.

506Module StreamTokenChecks
507Module F ≔ LibcStreamChecks
508Module A ≔ LibcStreamAdapterOn InterpRuntime StreamHandleChecks.LG
510Definition out ≔
512Definition err ≔
514Definition open_heap: gmappiece pval ≔
<[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap
518Example open_snapshots_current: stream_currentout F.worldtrue open_heap ∧ stream_currenterr F.worldtrue open_heap
Explore proof 10 tactics

Initial goal

⊢

unfold stream_current , open_heap

⊢
match <[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap !! PNametoken_keyout with
SomeVStreamp snapshot
⇒
p = token_handleout ∧ stream_observationF.worldtrue p snapshot
None
⇒
True
_
⇒
False
∧
match <[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap !! PNametoken_keyerr with
SomeVStreamp snapshot
⇒
p = token_handleerr ∧ stream_observationF.worldtrue p snapshot
None
⇒
True
_
⇒
False

cbn [ out err token_key ]

⊢
match <[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap !! PName−2 with
SomeVStreamp snapshot
⇒
p = token_handleout ∧ stream_observationF.worldtrue p snapshot
None
⇒
True
_
⇒
False
∧
match <[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap !! PName−3 with
SomeVStreamp snapshot
⇒
p = token_handleerr ∧ stream_observationF.worldtrue p snapshot
None
⇒
True
_
⇒
False

rewrite lookup_insert_eq

⊢
∧
match <[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap !! PName−3 with
SomeVStreamp snapshot
⇒
p = token_handleerr ∧ stream_observationF.worldtrue p snapshot
None
⇒
True
_
⇒
False

rewrite lookup_insert_ne ; | discriminate

⊢
∧
match <[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap !! PName−3 with
SomeVStreamp snapshot
⇒
p = token_handleerr ∧ stream_observationF.worldtrue p snapshot
None
⇒
True
_
⇒
False

rewrite lookup_insert_eq

split ; split ; reflexivity |

2 open

⊢
stream_observationF.worldtrue token_handleout Some7, 65; 66
focused goal
⊢
stream_observationF.worldtrue token_handleerr Some3, [ ]

–exists mkStreamInfo1 mkStreamByteOriented 65; 66 true 7

2 open

deferred goal
⊢
stream_observationF.worldtrue token_handleerr Some3, [ ]

repeat split ; reflexivity

deferred goal
⊢
stream_observationF.worldtrue token_handleerr Some3, [ ]

–exists mkStreamInfo2 stdout_initial 3

repeat split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
cbn [ out err token_key ]
rewrite lookup_insert_eq
rewrite lookup_insert_ne ; | discriminate
rewrite lookup_insert_eq
split ; split ; reflexivity |
–exists mkStreamInfo1 mkStreamByteOriented 65; 66 true 7
repeat split ; reflexivity
repeat split ; reflexivity
528Example stale_physical_count_rejected: ¬stream_currentout F.worldtrue <[PName−2 ≔ VStreamtoken_handleout Some2, 65; 66]>open_heap
Explore proof 7 tactics

Initial goal

⊢
¬stream_currentout F.worldtrue <[PName−2 ≔ VStreamtoken_handleout Some2, 65; 66]>open_heap

unfold stream_current

⊢
¬match <[PName−2 ≔ VStreamtoken_handleout Some2, 65; 66]>open_heap !! PNametoken_keyout with SomeVStreamp snapshot ⇒ p = token_handleout ∧ stream_observationF.worldtrue p snapshot | None ⇒ True | _ ⇒ False end

cbn [ out token_key ]

⊢
¬match <[PName−2 ≔ VStreamtoken_handleout Some2, 65; 66]>open_heap !! PName−2 with SomeVStreamp snapshot ⇒ p = token_handleout ∧ stream_observationF.worldtrue p snapshot | None ⇒ True | _ ⇒ False end

rewrite lookup_insert_eq

intros _ & info & Hinfo & Hpending & _

Hinfo :
libc_stream_atF.worldtrue token_handleout = Someinfo
Hpending :
⊢
False

change SomemkStreamInfo1 mkStreamByteOriented 65; 66 true 7 = Someinfo in Hinfo

Hinfo :
Somestream_identifier ≔ 1; stream_protocol ≔ orientation ≔ ByteOriented; outstanding ≔ 65; 66; stream_error ≔ true; stream_pending ≔ 7 = Someinfo
Hpending :
⊢
False

injection Hinfo as ←

Hpending :
⊢
False

discriminate Hpending

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
cbn [ out token_key ]
rewrite lookup_insert_eq
intros _ & info & Hinfo & Hpending & _
change SomemkStreamInfo1 mkStreamByteOriented 65; 66 true 7 = Someinfo in Hinfo
injection Hinfo as ←
discriminate Hpending
538Example stale_fifo_rejected: ¬stream_currentout F.worldtrue <[PName−2 ≔ VStreamtoken_handleout Some7, 66; 65]>open_heap
Explore proof 7 tactics

Initial goal

⊢
¬stream_currentout F.worldtrue <[PName−2 ≔ VStreamtoken_handleout Some7, 66; 65]>open_heap

unfold stream_current

⊢
¬match <[PName−2 ≔ VStreamtoken_handleout Some7, 66; 65]>open_heap !! PNametoken_keyout with SomeVStreamp snapshot ⇒ p = token_handleout ∧ stream_observationF.worldtrue p snapshot | None ⇒ True | _ ⇒ False end

cbn [ out token_key ]

⊢
¬match <[PName−2 ≔ VStreamtoken_handleout Some7, 66; 65]>open_heap !! PName−2 with SomeVStreamp snapshot ⇒ p = token_handleout ∧ stream_observationF.worldtrue p snapshot | None ⇒ True | _ ⇒ False end

rewrite lookup_insert_eq

intros _ & info & Hinfo & _ & Hfifo

Hinfo :
libc_stream_atF.worldtrue token_handleout = Someinfo
Hfifo :
⊢
False

change SomemkStreamInfo1 mkStreamByteOriented 65; 66 true 7 = Someinfo in Hinfo

Hinfo :
Somestream_identifier ≔ 1; stream_protocol ≔ orientation ≔ ByteOriented; outstanding ≔ 65; 66; stream_error ≔ true; stream_pending ≔ 7 = Someinfo
Hfifo :
⊢
False

injection Hinfo as ←

⊢
False

discriminate Hfifo

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
cbn [ out token_key ]
rewrite lookup_insert_eq
intros _ & info & Hinfo & _ & Hfifo
change SomemkStreamInfo1 mkStreamByteOriented 65; 66 true 7 = Someinfo in Hinfo
injection Hinfo as ←
discriminate Hfifo
548Example completed_closed_snapshot: stream_currentout F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>open_heap
Explore proof 5 tactics

Initial goal

⊢

unfold stream_current

⊢
SomeVStreamp snapshot
⇒
p = token_handleout ∧ stream_observationF.worldfalse p snapshot
None
⇒
True
_
⇒
False

cbn [ out token_key ]

⊢
match <[PName−2 ≔ VStreamtoken_handleout None]>open_heap !! PName−2 with
SomeVStreamp snapshot
⇒
p = token_handleout ∧ stream_observationF.worldfalse p snapshot
None
⇒
True
_
⇒
False

rewrite lookup_insert_eq

split ; reflexivity |

split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
cbn [ out token_key ]
rewrite lookup_insert_eq
split ; reflexivity |
split ; reflexivity
556Example closed_token_rejected_while_open: ¬stream_currentout F.worldtrue <[PName−2 ≔ VStreamtoken_handleout None]>open_heap
Explore proof 5 tactics

Initial goal

⊢

unfold stream_current

⊢
¬match <[PName−2 ≔ VStreamtoken_handleout None]>open_heap !! PNametoken_keyout with SomeVStreamp snapshot ⇒ p = token_handleout ∧ stream_observationF.worldtrue p snapshot | None ⇒ True | _ ⇒ False end

cbn [ out token_key ]

⊢
¬match <[PName−2 ≔ VStreamtoken_handleout None]>open_heap !! PName−2 with SomeVStreamp snapshot ⇒ p = token_handleout ∧ stream_observationF.worldtrue p snapshot | None ⇒ True | _ ⇒ False end

rewrite lookup_insert_eq

intros _ & Hclosed & _

Hclosed :
libc_stream_atF.worldtrue token_handleout = None
⊢
False

discriminate Hclosed

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
cbn [ out token_key ]
rewrite lookup_insert_eq
intros _ & Hclosed & _
discriminate Hclosed
564Example malformed_snapshot_rejected: ¬stream_currentout F.worldtrue <[PName−2 ≔ VNametoken_handleout 65]>open_heap
Explore proof 4 tactics

Initial goal

⊢

unfold stream_current

⊢
¬match <[PName−2 ≔ VNametoken_handleout 65]>open_heap !! PNametoken_keyout with SomeVStreamp snapshot ⇒ p = token_handleout ∧ stream_observationF.worldtrue p snapshot | None ⇒ True | _ ⇒ False end

cbn [ out token_key ]

⊢
¬match <[PName−2 ≔ VNametoken_handleout 65]>open_heap !! PName−2 with SomeVStreamp snapshot ⇒ p = token_handleout ∧ stream_observationF.worldtrue p snapshot | None ⇒ True | _ ⇒ False end

rewrite lookup_insert_eq

⊢
¬False

exact λH ⇒ H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
cbn [ out token_key ]
rewrite lookup_insert_eq
exact λH ⇒ H

The entire interpretation has an inhabitant with both open tokens, both native lives and owned errno, not merely each mirror alone.

570Lemma private_lookup
∀ l v
stream_data_heap1024 2048 open_heap !! l = Somev
HelloErrnoChecks.heap !! l = Somev
Explore proof 9 tactics

Initial goal

⊢
∀l : piece v : pval, mem_piecel → stream_data_heap1024 2048 open_heap !! l = Somev → HelloErrnoChecks.heap !! l = Somev

intros l v Hmem Hl

v :
Hmem :
Hl :
stream_data_heap1024 2048 open_heap !! l = Somev
⊢
HelloErrnoChecks.heap !! l = Somev

apply stream_data_lookup in Hl as Hl & Hout & Herr

v :
Hmem :
Hl :
open_heap !! l = Somev
Hout :
l ≠ PLive1024
Herr :
l ≠ PLive2048
⊢
HelloErrnoChecks.heap !! l = Somev

unfold open_heap in Hl

v :
Hmem :
Hl :
<[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap !! l = Somev
Hout :
l ≠ PLive1024
Herr :
l ≠ PLive2048
⊢
HelloErrnoChecks.heap !! l = Somev

apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l ; contradiction |

v :
Hmem :
Hl :
<[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap !! l = Somev
Hout :
l ≠ PLive1024
Herr :
l ≠ PLive2048
⊢
HelloErrnoChecks.heap !! l = Somev

apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l ; contradiction |

v :
Hmem :
Hl :
Hout :
l ≠ PLive1024
Herr :
l ≠ PLive2048
⊢
HelloErrnoChecks.heap !! l = Somev

unfold StreamHandleChecks.heap in Hl

v :
Hmem :
Hl :
<[PLive1024 ≔ VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live]><[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! l = Somev
Hout :
l ≠ PLive1024
Herr :
l ≠ PLive2048
⊢
HelloErrnoChecks.heap !! l = Somev

apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l ; contradiction |

v :
Hmem :
Hl :
<[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! l = Somev
Hout :
l ≠ PLive1024
Herr :
l ≠ PLive2048
⊢
HelloErrnoChecks.heap !! l = Somev

apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l ; contradiction |

v :
Hmem :
Hl :
StreamHandleChecks.E.heap !! l = Somev
Hout :
l ≠ PLive1024
Herr :
l ≠ PLive2048
⊢
HelloErrnoChecks.heap !! l = Somev

exact Hl

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros l v Hmem Hl
apply stream_data_lookup in Hl as Hl & Hout & Herr
unfold open_heap in Hl
apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l ; contradiction |
apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l ; contradiction |
apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l ; contradiction |
apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l ; contradiction |
exact Hl
584Lemma full_wi
stream_tokens_wiλ_ _ ⇒ True out err 5120 0 conversion_mem F.worldtrue open_heap
Explore proof 25 tactics

Initial goal

⊢
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue open_heap

assert Hkeys : ∀l v, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

2 open

⊢
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue open_heap

{intros l v Hl Hmem

2 open

v :
Hl :
stream_data_heap1024 2048 open_heap !! l = Somev
Hmem :
⊢
l ∈ errno_keys5120 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue open_heap

apply private_lookupl v Hmem in Hl

2 open

v :
Hl :
HelloErrnoChecks.heap !! l = Somev
Hmem :
⊢
l ∈ errno_keys5120 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue open_heap

unfold HelloErrnoChecks.heap in Hl

2 open

v :
Hl :
list_to_mapbyte_ps5120 0 0; 0; 0; 0 !! l = Somev
Hmem :
⊢
l ∈ errno_keys5120 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue open_heap

apply elem_of_list_to_map_2 in Hl

2 open

v :
Hl :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
Hmem :
⊢
l ∈ errno_keys5120 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue open_heap

change l ∈ byte_ps5120 0 0; 0; 0; 0.*1

2 open

v :
Hl :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
Hmem :
⊢
l ∈ byte_ps5120 0 0; 0; 0; 0.*1
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue open_heap

apply list_elem_of_fmap

2 open

v :
Hl :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
Hmem :
⊢
∃x : piece × pval, l = x.1 ∧ x ∈ byte_ps5120 0 0; 0; 0; 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue open_heap

exists l, v

2 open

v :
Hl :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
Hmem :
⊢
l = l, v.1 ∧ l, v ∈ byte_ps5120 0 0; 0; 0; 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue open_heap

auto

deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue open_heap

split ; split ; reflexivity | simpl ; lia |

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

split ; split ; reflexivity | simpl ; lia |

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

split ; discriminate |

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

split ; discriminate |

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

split ; reflexivity |

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

split ; reflexivity |

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

split ; exact proj1open_snapshots_current |

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

split ; exact proj2open_snapshots_current |

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

intros d → | →

2 open

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

all: split ; | intros base l v Hin ; change Inbase [ ] in Hin ; contradiction

2 open

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

all: split ; apply F.ready |

2 open

focused goal

all: split ; reflexivity |

2 open

focused goal

all: split ; intros root a Hin ; change Inroot [ ] in Hin ; contradiction |

2 open

focused goal

all: split ; intros base l v Hin ; change Inbase [ ] in Hin ; contradiction |

2 open

focused goal

all: intros l v Hl Hnot ; destruct l as base | base off | base off | key ; try exact I

4 open

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
base, off :
Z
v :
Hnot :
PBytebase off ∉ errno_keys5120 0
⊢
∀reg : region, live_atconversion_mem base reg → 0 ≤ off → base + off < r_endreg → ¬span_containserrno_span5120 0 base + off
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
base, off :
Z
v :
Hnot :
PAuxbase off ∉ errno_keys5120 0
⊢
∀reg : region, live_atconversion_mem base reg → 0 ≤ off → base + off < r_endreg → ¬span_containserrno_span5120 0 base + off
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
base, off :
Z
v :
Hnot :
PBytebase off ∉ errno_keys5120 0
⊢
∀reg : region, live_atconversion_mem base reg → 0 ≤ off → base + off < r_endreg → ¬span_containserrno_span5120 0 base + off
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
base, off :
Z
v :
Hnot :
PAuxbase off ∉ errno_keys5120 0
⊢
∀reg : region, live_atconversion_mem base reg → 0 ≤ off → base + off < r_endreg → ¬span_containserrno_span5120 0 base + off

all: exfalso ; apply Hnot ; eapply Hkeys ; exact Hl | exact I

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
assert Hkeys : ∀l v, stream_data_heap1024 2048 open_heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
{intros l v Hl Hmem
apply private_lookupl v Hmem in Hl
apply elem_of_list_to_map_2 in Hl
change l ∈ byte_ps5120 0 0; 0; 0; 0.*1
apply list_elem_of_fmap
exists l, v
auto
split ; split ; reflexivity | simpl ; lia |
split ; split ; reflexivity | simpl ; lia |
split ; discriminate |
split ; discriminate |
split ; reflexivity |
split ; reflexivity |
split ; exact proj1open_snapshots_current |
split ; exact proj2open_snapshots_current |
intros d → | →
all: split ; | intros base l v Hin ; change Inbase [ ] in Hin ; contradiction
all: split ; apply F.ready |
all: split ; reflexivity |
all: split ; intros root a Hin ; change Inroot [ ] in Hin ; contradiction |
all: split ; intros base l v Hin ; change Inbase [ ] in Hin ; contradiction |
all: intros l v Hl Hnot ; destruct l as base | base off | base off | key ; try exact I
all: exfalso ; apply Hnot ; eapply Hkeys ; exact Hl | exact I
606Example full_open_admitted: stream_call_preF.model WPtrtoken_handleout conversion_mem F.worldtrue
Explore proof 15 tactics

Initial goal

eapply A.open_admitted with out := out err := err b := 5120 o := 0 pending := 7 fifo := 65; 66 h := open_heap ; left ; reflexivity | exact full_wi |

⊢
∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 → open_heap !! l = Somev

intros l v Hin

v :
Hin :
l, v ∈ stream_psout 7 65; 66
⊢
open_heap !! l = Somev

unfold stream_ps in Hin

apply elem_of_cons in Hin as He | Hin

2 open

⊢
open_heap !! l = Somev
focused goal
v :
Hin :
l, v ∈ PNametoken_keyout, VStreamtoken_handleout Some7, 65; 66
⊢
open_heap !! l = Somev

–injection He as He Hv

2 open

v :
He :
l = PLive1024
Hv :
v = VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live
⊢
open_heap !! l = Somev
deferred goal
v :
Hin :
l, v ∈ PNametoken_keyout, VStreamtoken_handleout Some7, 65; 66
⊢
open_heap !! l = Somev

subst l v

2 open

⊢
open_heap !! PLive1024 = SomeVLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live
deferred goal
v :
Hin :
l, v ∈ PNametoken_keyout, VStreamtoken_handleout Some7, 65; 66
⊢
open_heap !! l = Somev

unfold open_heap , StreamHandleChecks.heap

2 open

⊢
<[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]><[PLive1024 ≔ VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live]><[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! PLive1024 = SomeVLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live
deferred goal
v :
Hin :
l, v ∈ PNametoken_keyout, VStreamtoken_handleout Some7, 65; 66
⊢
open_heap !! l = Somev

rewrite lookup_insert_ne ; | discriminate

2 open

⊢
<[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]><[PLive1024 ≔ VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live]><[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! PLive1024 = SomeVLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live
deferred goal
v :
Hin :
l, v ∈ PNametoken_keyout, VStreamtoken_handleout Some7, 65; 66
⊢
open_heap !! l = Somev

rewrite lookup_insert_ne ; | discriminate

2 open

⊢
<[PLive1024 ≔ VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live]><[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! PLive1024 = SomeVLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live
deferred goal
v :
Hin :
l, v ∈ PNametoken_keyout, VStreamtoken_handleout Some7, 65; 66
⊢
open_heap !! l = Somev

apply lookup_insert_eq

deferred goal
v :
Hin :
l, v ∈ PNametoken_keyout, VStreamtoken_handleout Some7, 65; 66
⊢
open_heap !! l = Somev

–apply elem_of_cons in Hin as He | Hin ; | apply not_elem_of_nil in Hin ; contradiction

v :
He :
⊢
open_heap !! l = Somev

injection He as He Hv

v :
He :
l = PName−2
Hv :
v = VStreamptr_addr ≔ 1024; ptr_cap ≔ Obj1024 Some7, 65; 66
⊢
open_heap !! l = Somev

subst l v

⊢
open_heap !! PName−2 = SomeVStreamptr_addr ≔ 1024; ptr_cap ≔ Obj1024 Some7, 65; 66

unfold open_heap

⊢
<[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap !! PName−2 = SomeVStreamptr_addr ≔ 1024; ptr_cap ≔ Obj1024 Some7, 65; 66

apply lookup_insert_eq

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
eapply A.open_admitted with out := out err := err b := 5120 o := 0 pending := 7 fifo := 65; 66 h := open_heap ; left ; reflexivity | exact full_wi |
intros l v Hin
unfold stream_ps in Hin
apply elem_of_cons in Hin as He | Hin
–injection He as He Hv
subst l v
rewrite lookup_insert_ne ; | discriminate
rewrite lookup_insert_ne ; | discriminate
apply lookup_insert_eq
–apply elem_of_cons in Hin as He | Hin ; | apply not_elem_of_nil in Hin ; contradiction
injection He as He Hv
subst l v
unfold open_heap
apply lookup_insert_eq
620Lemma open_heap_agrees
Explore proof 5 tactics

Initial goal

intros l v Hl

v :
Hl :
open_heap !! l = Somev

unfold open_heap in Hl

v :
Hl :
<[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap !! l = Somev

apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l v ; exact I |

v :
Hl :
<[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]>StreamHandleChecks.heap !! l = Somev

apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l v ; exact I |

exact StreamHandleChecks.heap_agreesl v Hl

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros l v Hl
unfold open_heap in Hl
apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l v ; exact I |
apply lookup_insert_Some in Hl as He Hv | _ Hl ; subst l v ; exact I |

An actual stderr query frames the paired interpretation even though stdout's physical count and outstanding FIFO differ from stderr's.

Explore proof 10 tactics

Initial goal

assert Hcall : A.M.E.invokefpending_contractF.model CVoid ArgP Const0 WPtrtoken_handleerr InterpRuntime.start conversion_mem F.worldtrue [ ] CallReturnWInt3 InterpRuntime.start conversion_mem F.worldtrue

2 open

focused goal

{apply StreamHandleChecks.C.fpending_unchanged with file := F.err_file

4 open

focused goal
⊢
libc_stream_readyλ_ : mem _ : libc_world ⇒ True conversion_mem F.worldtrue
focused goal
deferred goal

–split ; left ; reflexivity |

4 open

⊢
∃v : value, ArgP Const0 = ArgP v
deferred goal
⊢
libc_stream_readyλ_ : mem _ : libc_world ⇒ True conversion_mem F.worldtrue
deferred goal
deferred goal

exists Const0

4 open

deferred goal
⊢
libc_stream_readyλ_ : mem _ : libc_world ⇒ True conversion_mem F.worldtrue
deferred goal
deferred goal

reflexivity

3 open

deferred goal
⊢
libc_stream_readyλ_ : mem _ : libc_world ⇒ True conversion_mem F.worldtrue
deferred goal
deferred goal

–apply F.ready

2 open

deferred goal
deferred goal

–reflexivity

deferred goal

split ; exact Hcall |

destruct A.query_frameλ_ _ ⇒ True λ_ _ _ _ ⇒ False λ_ _ _ _ _ ⇒ False out err 5120 0 err _ _ _ _ _ _ _ _ _ _ _ open_heap or_introreq_refl or_introreq_refl Hcall open_heap_agrees HelloErrnoChecks.disjoint HelloErrnoChecks.ready full_wi as _ & _ & _ & Hw

exact Hw

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
–split ; left ; reflexivity |
exists Const0
reflexivity
–apply F.ready
–reflexivity
split ; exact Hcall |
destruct A.query_frameλ_ _ ⇒ True λ_ _ _ _ ⇒ False λ_ _ _ _ _ ⇒ False out err 5120 0 err _ _ _ _ _ _ _ _ _ _ _ open_heap or_introreq_refl or_introreq_refl Hcall open_heap_agrees HelloErrnoChecks.disjoint HelloErrnoChecks.ready full_wi as _ & _ & _ & Hw
exact Hw

The other query contract and stdout selection use the same frame.

Explore proof 10 tactics

Initial goal

assert Hcall : A.M.E.invokeferror_contractF.model CVoid ArgP Const0 WPtrtoken_handleout InterpRuntime.start conversion_mem F.worldtrue [ ] CallReturnWInt1 InterpRuntime.start conversion_mem F.worldtrue

2 open

focused goal

{apply StreamHandleChecks.C.ferror_unchanged with file := F.out_file

4 open

focused goal
⊢
libc_stream_readyλ_ : mem _ : libc_world ⇒ True conversion_mem F.worldtrue
focused goal
deferred goal

–split ; left ; reflexivity |

4 open

⊢
∃v : value, ArgP Const0 = ArgP v
deferred goal
⊢
libc_stream_readyλ_ : mem _ : libc_world ⇒ True conversion_mem F.worldtrue
deferred goal
deferred goal

exists Const0

4 open

deferred goal
⊢
libc_stream_readyλ_ : mem _ : libc_world ⇒ True conversion_mem F.worldtrue
deferred goal
deferred goal

reflexivity

3 open

deferred goal
⊢
libc_stream_readyλ_ : mem _ : libc_world ⇒ True conversion_mem F.worldtrue
deferred goal
deferred goal

–apply F.ready

2 open

deferred goal
deferred goal

–reflexivity

deferred goal

split ; exact Hcall |

destruct A.query_frameλ_ _ ⇒ True λ_ _ _ _ ⇒ False λ_ _ _ _ _ ⇒ False out err 5120 0 out _ _ _ _ _ _ _ _ _ _ _ open_heap or_introleq_refl or_introleq_refl Hcall open_heap_agrees HelloErrnoChecks.disjoint HelloErrnoChecks.ready full_wi as _ & _ & _ & Hw

exact Hw

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
–split ; left ; reflexivity |
exists Const0
reflexivity
–apply F.ready
–reflexivity
split ; exact Hcall |
destruct A.query_frameλ_ _ ⇒ True λ_ _ _ _ ⇒ False λ_ _ _ _ _ ⇒ False out err 5120 0 out _ _ _ _ _ _ _ _ _ _ _ open_heap or_introleq_refl or_introleq_refl Hcall open_heap_agrees HelloErrnoChecks.disjoint HelloErrnoChecks.ready full_wi as _ & _ & _ & Hw
exact Hw

An actual authorized scalar write changes every errno byte, including the last one. It changes neither FILE storage nor locale strings.

675Definition changed_errno: mem ≔
Explore proof 9 tactics

Initial goal

destruct F.files_ready as Hout Herr

split ; clear Herr | clear Hout

2 open

focused goal

all: destruct Hout as Hnon & Hn & Hreg & Haccess & Hbytes & Hrest || destruct Herr as Hnon & Hn & Hreg & Haccess & Hbytes & Hrest

2 open

focused goal

all: split ; exact Hnon |

2 open

focused goal

all: split ; | destruct Hrest as Hp & _ & _ & _ & Ha ; split ; exact Hp | ; split ; constructor | ; split ; constructor | ; split ; constructor | exact Ha

2 open

focused goal

all: split ; exact Hn |

2 open

focused goal

all: split ; exact Hreg |

2 open

focused goal

all: split ; exact Haccess |

2 open

focused goal

all: intros i Hi ; assert i = 0 as → by lia ; vm_compute ; split ; congruence

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
destruct F.files_ready as Hout Herr
split ; clear Herr | clear Hout
all: destruct Hout as Hnon & Hn & Hreg & Haccess & Hbytes & Hrest || destruct Herr as Hnon & Hn & Hreg & Haccess & Hbytes & Hrest
all: split ; exact Hnon |
all: split ; | destruct Hrest as Hp & _ & _ & _ & Ha ; split ; exact Hp | ; split ; constructor | ; split ; constructor | ; split ; constructor | exact Ha
all: split ; exact Hn |
all: split ; exact Hreg |
all: split ; exact Haccess |
all: intros i Hi ; assert i = 0 as → by lia ; vm_compute ; split ; congruence
694Lemma changed_ready
∀ opened
libc_stream_readyλ_ _ ⇒ True changed_errno F.worldopened
Proof 26 steps Qed
intros opened
destruct F.readyopened as Hrep & Hlocale & He & Hout & Herr & Hu & Hstatus & Hphase & Hdistinct & Hroots & _
split ; exact Hrep |
split
–destruct Hlocale as _ & _ & _ & _ & _ & Haligned
split ; exact I |
split ; constructor |
split
+intros category _
vm_compute
repeat split ; congruence
+split ; constructor |
split ; constructor | exact Haligned
–split ; exact He |
split ; exact Hout |
split ; exact Herr |
split ; exact Hu |
split ; exact Hstatus |
split ; exact Hphase |
split ; exact Hdistinct |
split ; exact Hroots |
split ; intros _ ; exact proj1changed_files_ready |
split ; intros _ ; exact proj2changed_files_ready |
intros p file Hfile base Hin
unfold libc_file_at in Hfile
destruct same_filep libc_stdoutF.worldopened ; destruct opened | destruct same_filep libc_stderrF.worldopened ; try discriminate ; injection Hfile as ← ; contradiction

The contract allows success or EOF after settling the old FIFO. Both controls use the supplied HelloClose machine, not F.M.

Proof 51 steps Qed
intros n Hn
eapply A.M.E.invoke_normal with born := [ ]
–split ; left ; reflexivity |
exists Const0
reflexivity
–split
+eapply A.M.E.effects_local ; apply local_store_bytes | constructor
intros a Ha
left
exists errno_span5120 0
split ; left ; reflexivity |
split
∗exact proj1proj2proj1proj2proj2F.readytrue
simpl
lia
split ; reflexivity |
split ; reflexivity |
split ; apply F.close_settles |
split ; reflexivity |
split ; apply changed_ready |
split ; apply F.close_frame |
split ; split ; intros root | split ; intros x ; contradiction |
split ; reflexivity |
split ; left ; reflexivity |
intros a Hin Houtside
reflexivity
split ; reflexivity |
split ; reflexivity |
split ; apply F.close_settles |
split ; reflexivity |
split ; exact Hn |
split ; reflexivity |
split ; intros base |
split ; apply changed_ready |
split ; apply F.close_frame |
auto
–intros why Hbad
discriminate
–intros values Hvalues
injection Hvalues as ←
split
+exists WIntn
split ; reflexivity |
destruct Hn as → | → ; reflexivity
+repeat constructor
–intros status Hbad
discriminate
749Example completed_close_preserves_pair: ∀n, n = 0 ∨ n = stream_eof → ∃ys, ys = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ _ ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys open_heap
Explore proof 37 tactics

Initial goal

⊢
∀n : Z, n = 0 ∨ n = stream_eof → ∃ys : listZ, ys = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys open_heap

intros n Hn

n :
Z
Hn :
n = 0 ∨ n = stream_eof
⊢
∃ys : listZ, ys = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys open_heap

destruct A.close_frameλ_ _ ⇒ True λ_ _ _ _ ⇒ False λ_ _ _ _ _ ⇒ False out err 5120 0 out _ _ _ _ _ _ _ _ _ _ open_heap 0; 0; 0; 0 or_introleq_refl changed_closen Hn open_heap_agrees HelloErrnoChecks.disjoint HelloErrnoChecks.ready full_wi eq_refl as ys & Hlen & Hkeys & Hagree & _ & _ & Hwi

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
⊢
∀l : piece v : pval, l, v ∈ byte_ps5120 0 0; 0; 0; 0 → open_heap !! l = Somev
focused goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

–intros l v Hin

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
v :
Hin :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
⊢
open_heap !! l = Somev
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

unfold open_heap , StreamHandleChecks.heap

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
v :
Hin :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
⊢
<[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]><[PLive1024 ≔ VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live]><[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! l = Somev
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

pose proof MemLogic.byte_ps_elem_ _ _ _ _ Hin as i & x & Hi & El & Ev

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
v :
Hin :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
i :
nat
x :
Z
Hi :
0; 0; 0; 0 !! i = Somex
El :
l = PByte5120 0 + i
Ev :
v = VBytex
⊢
<[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]><[PLive1024 ≔ VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live]><[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! l = Somev
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

subst l v

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
i :
nat
x :
Z
Hin :
PByte5120 0 + i, VBytex ∈ byte_ps5120 0 0; 0; 0; 0
Hi :
0; 0; 0; 0 !! i = Somex
⊢
<[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]><[PLive1024 ≔ VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live]><[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! PByte5120 0 + i = SomeVBytex
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

rewrite lookup_insert_ne ; | discriminate

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
i :
nat
x :
Z
Hin :
PByte5120 0 + i, VBytex ∈ byte_ps5120 0 0; 0; 0; 0
Hi :
0; 0; 0; 0 !! i = Somex
⊢
<[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]><[PLive1024 ≔ VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live]><[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! PByte5120 0 + i = SomeVBytex
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

rewrite lookup_insert_ne ; | discriminate

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
i :
nat
x :
Z
Hin :
PByte5120 0 + i, VBytex ∈ byte_ps5120 0 0; 0; 0; 0
Hi :
0; 0; 0; 0 !! i = Somex
⊢
<[PLive1024 ≔ VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live]><[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! PByte5120 0 + i = SomeVBytex
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

rewrite lookup_insert_ne ; | discriminate

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
i :
nat
x :
Z
Hin :
PByte5120 0 + i, VBytex ∈ byte_ps5120 0 0; 0; 0; 0
Hi :
0; 0; 0; 0 !! i = Somex
⊢
<[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! PByte5120 0 + i = SomeVBytex
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

rewrite lookup_insert_ne ; | discriminate

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
i :
nat
x :
Z
Hin :
PByte5120 0 + i, VBytex ∈ byte_ps5120 0 0; 0; 0; 0
Hi :
0; 0; 0; 0 !! i = Somex
⊢
StreamHandleChecks.E.heap !! PByte5120 0 + i = SomeVBytex
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

unfold HelloErrnoChecks.heap

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
i :
nat
x :
Z
Hin :
PByte5120 0 + i, VBytex ∈ byte_ps5120 0 0; 0; 0; 0
Hi :
0; 0; 0; 0 !! i = Somex
⊢
list_to_mapbyte_ps5120 0 0; 0; 0; 0 !! PByte5120 0 + i = SomeVBytex
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

apply elem_of_list_to_map_1 ; | exact Hin

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
i :
nat
x :
Z
Hin :
PByte5120 0 + i, VBytex ∈ byte_ps5120 0 0; 0; 0; 0
Hi :
0; 0; 0; 0 !! i = Somex
⊢
base.NoDupbyte_ps5120 0 0; 0; 0; 0.*1
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

change base.NoDupPByte5120 0; PByte5120 1; PByte5120 2; PByte5120 3

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
i :
nat
x :
Z
Hin :
PByte5120 0 + i, VBytex ∈ byte_ps5120 0 0; 0; 0; 0
Hi :
0; 0; 0; 0 !! i = Somex
⊢
base.NoDupPByte5120 0; PByte5120 1; PByte5120 2; PByte5120 3
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

repeat apply base.NoDup_cons_2 ; set_solver |

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
i :
nat
x :
Z
Hin :
PByte5120 0 + i, VBytex ∈ byte_ps5120 0 0; 0; 0; 0
Hi :
0; 0; 0; 0 !! i = Somex
⊢
base.NoDup[ ]
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

apply base.NoDup_nil_2

deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
∃ys0 : listZ, ys0 = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys0 open_heap

–exists ys

n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
ys = 4; 3; 2; 1 ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 ys open_heap

split ; | exact Hwi

n :
Z
Hn :
n = 0 ∨ n = stream_eof
ys :
listZ
Hlen :
lengthys = 4%nat
Hkeys :
byte_ps5120 0 ys.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hwi :
⊢
ys = 4; 3; 2; 1

destruct ys as | a | b | c | d rest ; try discriminate Hlen

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
rest :
listZ
Hlen :
lengtha :: b :: c :: d :: rest = 4%nat
Hkeys :
byte_ps5120 0 a :: b :: c :: d :: rest.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hagree :
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a :: b :: c :: d :: rest open_heap
⊢
a :: b :: c :: d :: rest = 4; 3; 2; 1

assert rest = [ ] as → by destruct rest ; reflexivity | discriminate Hlen

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
⊢
a; b; c; d = 4; 3; 2; 1

assert Hbyte : ∀i x, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
⊢
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
focused goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

{intros i x Hin

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
⊢
x = m_byteschanged_errno 5120 + i
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

assert Hl : <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex

3 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
⊢
<[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
focused goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
Hl :
<[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
⊢
x = m_byteschanged_errno 5120 + i
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

{rewrite lookup_insert_ne ; | discriminate

3 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
⊢
overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
Hl :
<[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
⊢
x = m_byteschanged_errno 5120 + i
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

change PByte5120 i, VBytex ∈ PByte5120 0, VBytea; PByte5120 1, VByteb; PByte5120 2, VBytec; PByte5120 3, VByted in Hin

3 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ PByte5120 0, VBytea; PByte5120 1, VByteb; PByte5120 2, VBytec; PByte5120 3, VByted
⊢
overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
Hl :
<[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
⊢
x = m_byteschanged_errno 5120 + i
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

repeat apply elem_of_cons in Hin as E | Hin ; injection E as Ei Ex ; subst i x ; cbn [ byte_ps overwrite fst snd ] ; repeat rewrite lookup_insert_ne ; | discriminate ; apply lookup_insert_eq |

3 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ [ ]
⊢
overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
Hl :
<[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
⊢
x = m_byteschanged_errno 5120 + i
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

apply not_elem_of_nil in Hin

3 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
False
⊢
overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
Hl :
<[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
⊢
x = m_byteschanged_errno 5120 + i
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

contradiction

2 open

deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
Hl :
<[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
⊢
x = m_byteschanged_errno 5120 + i
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

destruct Hagree_ _ Hl as _ Hvalue

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
Hl :
<[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
Hvalue :
⊢
x = m_byteschanged_errno 5120 + i
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

destruct HvaluemkRegion5120 5128 Heap Live eq_refl eq_refl as _ & _ & Hv

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
Hl :
<[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
Hvalue :
Hv :
m_byteschanged_errno 5120 + i = x
⊢
x = m_byteschanged_errno 5120 + i
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

symmetry

2 open

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
i, x :
Z
Hin :
PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d
Hl :
<[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
Hvalue :
Hv :
m_byteschanged_errno 5120 + i = x
⊢
m_byteschanged_errno 5120 + i = x
deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

exact Hv

deferred goal
n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
⊢
a; b; c; d = 4; 3; 2; 1

assert Ha : a = 4 by apply Hbyte0 a ; change PByte5120 0, VBytea ∈ PByte5120 0, VBytea; PByte5120 1, VByteb; PByte5120 2, VBytec; PByte5120 3, VByted ; apply list_elem_of_In ; simpl ; auto 10

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
Ha :
a = 4
⊢
a; b; c; d = 4; 3; 2; 1

assert Hb : b = 3 by apply Hbyte1 b ; change PByte5120 1, VByteb ∈ PByte5120 0, VBytea; PByte5120 1, VByteb; PByte5120 2, VBytec; PByte5120 3, VByted ; apply list_elem_of_In ; simpl ; auto 10

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
Ha :
a = 4
Hb :
b = 3
⊢
a; b; c; d = 4; 3; 2; 1

assert Hc : c = 2 by apply Hbyte2 c ; change PByte5120 2, VBytec ∈ PByte5120 0, VBytea; PByte5120 1, VByteb; PByte5120 2, VBytec; PByte5120 3, VByted ; apply list_elem_of_In ; simpl ; auto 10

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
Ha :
a = 4
Hb :
b = 3
Hc :
c = 2
⊢
a; b; c; d = 4; 3; 2; 1

assert Hd : d = 1 by apply Hbyte3 d ; change PByte5120 3, VByted ∈ PByte5120 0, VBytea; PByte5120 1, VByteb; PByte5120 2, VBytec; PByte5120 3, VByted ; apply list_elem_of_In ; simpl ; auto 10

n :
Z
Hn :
n = 0 ∨ n = stream_eof
a, b, c, d :
Z
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap
Hkeys :
byte_ps5120 0 a; b; c; d.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
lengtha; b; c; d = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
Ha :
a = 4
Hb :
b = 3
Hc :
c = 2
Hd :
d = 1
⊢
a; b; c; d = 4; 3; 2; 1

subst

n :
Z
Hn :
n = 0 ∨ n = stream_eof
Hwi :
stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 changed_errno F.worldfalse <[PNametoken_keyout ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 4; 3; 2; 1 open_heap
Hkeys :
byte_ps5120 0 4; 3; 2; 1.*1 = byte_ps5120 0 0; 0; 0; 0.*1
Hlen :
length4; 3; 2; 1 = 4%nat
Hbyte :
∀i x : Z, PByte5120 i, VBytex ∈ byte_ps5120 0 4; 3; 2; 1 → x = m_byteschanged_errno 5120 + i
⊢
4; 3; 2; 1 = 4; 3; 2; 1

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros n Hn
destruct A.close_frameλ_ _ ⇒ True λ_ _ _ _ ⇒ False λ_ _ _ _ _ ⇒ False out err 5120 0 out _ _ _ _ _ _ _ _ _ _ open_heap 0; 0; 0; 0 or_introleq_refl changed_closen Hn open_heap_agrees HelloErrnoChecks.disjoint HelloErrnoChecks.ready full_wi eq_refl as ys & Hlen & Hkeys & Hagree & _ & _ & Hwi
–intros l v Hin
pose proof MemLogic.byte_ps_elem_ _ _ _ _ Hin as i & x & Hi & El & Ev
subst l v
rewrite lookup_insert_ne ; | discriminate
rewrite lookup_insert_ne ; | discriminate
rewrite lookup_insert_ne ; | discriminate
rewrite lookup_insert_ne ; | discriminate
apply elem_of_list_to_map_1 ; | exact Hin
change base.NoDupPByte5120 0; PByte5120 1; PByte5120 2; PByte5120 3
repeat apply base.NoDup_cons_2 ; set_solver |
apply base.NoDup_nil_2
–exists ys
split ; | exact Hwi
destruct ys as | a | b | c | d rest ; try discriminate Hlen
assert rest = [ ] as → by destruct rest ; reflexivity | discriminate Hlen
assert Hbyte : ∀i x, PByte5120 i, VBytex ∈ byte_ps5120 0 a; b; c; d → x = m_byteschanged_errno 5120 + i
{intros i x Hin
assert Hl : <[PName−2 ≔ VStreamtoken_handleout None]>overwritebyte_ps5120 0 a; b; c; d open_heap !! PByte5120 i = SomeVBytex
{rewrite lookup_insert_ne ; | discriminate
change PByte5120 i, VBytex ∈ PByte5120 0, VBytea; PByte5120 1, VByteb; PByte5120 2, VBytec; PByte5120 3, VByted in Hin
repeat apply elem_of_cons in Hin as E | Hin ; injection E as Ei Ex ; subst i x ; cbn [ byte_ps overwrite fst snd ] ; repeat rewrite lookup_insert_ne ; | discriminate ; apply lookup_insert_eq |
apply not_elem_of_nil in Hin
contradiction
destruct Hagree_ _ Hl as _ Hvalue
destruct HvaluemkRegion5120 5128 Heap Live eq_refl eq_refl as _ & _ & Hv
symmetry
exact Hv
assert Ha : a = 4 by apply Hbyte0 a ; change PByte5120 0, VBytea ∈ PByte5120 0, VBytea; PByte5120 1, VByteb; PByte5120 2, VBytec; PByte5120 3, VByted ; apply list_elem_of_In ; simpl ; auto 10
assert Hb : b = 3 by apply Hbyte1 b ; change PByte5120 1, VByteb ∈ PByte5120 0, VBytea; PByte5120 1, VByteb; PByte5120 2, VBytec; PByte5120 3, VByted ; apply list_elem_of_In ; simpl ; auto 10
assert Hc : c = 2 by apply Hbyte2 c ; change PByte5120 2, VBytec ∈ PByte5120 0, VBytea; PByte5120 1, VByteb; PByte5120 2, VBytec; PByte5120 3, VByted ; apply list_elem_of_In ; simpl ; auto 10
assert Hd : d = 1 by apply Hbyte3 d ; change PByte5120 3, VByted ∈ PByte5120 0, VBytea; PByte5120 1, VByteb; PByte5120 2, VBytec; PByte5120 3, VByted ; apply list_elem_of_In ; simpl ; auto 10
subst
reflexivity

Updating only the stream name would leave stale owned errno. The last byte alone distinguishes that incorrect replacement.

805Example stale_errno_close_heap_rejected: ¬agreeschanged_errno <[PName−2 ≔ VStreamtoken_handleout None]>open_heap
Explore proof 8 tactics

Initial goal

intros Ha

assert Hl : <[PName−2 ≔ VStreamtoken_handleout None]>open_heap !! PByte5120 3 = SomeVByte0

2 open

focused goal
⊢
False

{unfold open_heap , StreamHandleChecks.heap , HelloErrnoChecks.heap

2 open

⊢
<[PName−2 ≔ VStreamtoken_handleout None]><[PName−2 ≔ VStreamtoken_handleout Some7, 65; 66]><[PName−3 ≔ VStreamtoken_handleerr Some3, [ ]]><[PLive1024 ≔ VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live]><[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>list_to_mapbyte_ps5120 0 0; 0; 0; 0 !! PByte5120 3 = SomeVByte0
deferred goal
⊢
False

repeat rewrite lookup_insert_ne ; | discriminate

2 open

⊢
<[PByte5120 3%nat + 0, VByte0.1 ≔ PByte5120 3%nat + 0, VByte0.2]>∅ !! PByte5120 3 = SomeVByte0
deferred goal
⊢
False

apply lookup_insert_eq

deferred goal
⊢
False

destruct Ha_ _ Hl as _ Hbyte

Hl :
<[PName−2 ≔ VStreamtoken_handleout None]>open_heap !! PByte5120 3 = SomeVByte0
Hbyte :
⊢
False

destruct HbytemkRegion5120 5128 Heap Live eq_refl eq_refl as _ & _ & Hvalue

Hl :
<[PName−2 ≔ VStreamtoken_handleout None]>open_heap !! PByte5120 3 = SomeVByte0
Hbyte :
Hvalue :
m_byteschanged_errno 5120 + 3 = 0
⊢
False

discriminate Hvalue

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Ha
assert Hl : <[PName−2 ≔ VStreamtoken_handleout None]>open_heap !! PByte5120 3 = SomeVByte0
repeat rewrite lookup_insert_ne ; | discriminate
apply lookup_insert_eq
destruct Ha_ _ Hl as _ Hbyte
destruct HbytemkRegion5120 5128 Heap Live eq_refl eq_refl as _ & _ & Hvalue
discriminate Hvalue

Entry begins with actual errno ownership, but no recorded FILE lives or observations. The observations are selected from the current world.

820Lemma entry_keys
∀ l v
HelloErrnoChecks.heap !! l = Somev
∃i, l = PByte5120 i
Explore proof 5 tactics

Initial goal

⊢
∀l : piece v : pval, HelloErrnoChecks.heap !! l = Somev → ∃i : Z, l = PByte5120 i

intros l v Hl

v :
Hl :
HelloErrnoChecks.heap !! l = Somev
⊢
∃i : Z, l = PByte5120 i

unfold HelloErrnoChecks.heap in Hl

v :
Hl :
list_to_mapbyte_ps5120 0 0; 0; 0; 0 !! l = Somev
⊢
∃i : Z, l = PByte5120 i

apply elem_of_list_to_map_2 in Hl

v :
Hl :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
⊢
∃i : Z, l = PByte5120 i

destruct MemLogic.byte_ps_elem_ _ _ _ _ Hl as i & x & _ & → & _

v :
i :
nat
Hl :
PByte5120 0 + i, v ∈ byte_ps5120 0 0; 0; 0; 0
x :
Z
⊢
∃i0 : Z, PByte5120 0 + i = PByte5120 i0

eauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros l v Hl
apply elem_of_list_to_map_2 in Hl
destruct MemLogic.byte_ps_elem_ _ _ _ _ Hl as i & x & _ & → & _
eauto
827Lemma entry_wi
stream_tokens_wiλ_ _ ⇒ True out err 5120 0 conversion_mem F.worldtrue HelloErrnoChecks.heap
Explore proof 29 tactics

Initial goal

⊢

assert Hkeys : ∀l v, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

2 open

⊢
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢

{intros l v Hl _

2 open

v :
Hl :
stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev
⊢
l ∈ errno_keys5120 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢

apply stream_data_lookup in Hl as Hl _

2 open

v :
Hl :
HelloErrnoChecks.heap !! l = Somev
⊢
l ∈ errno_keys5120 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢

unfold HelloErrnoChecks.heap in Hl

2 open

v :
Hl :
list_to_mapbyte_ps5120 0 0; 0; 0; 0 !! l = Somev
⊢
l ∈ errno_keys5120 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢

apply elem_of_list_to_map_2 in Hl

2 open

v :
Hl :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
⊢
l ∈ errno_keys5120 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢

change l ∈ byte_ps5120 0 0; 0; 0; 0.*1

2 open

v :
Hl :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
⊢
l ∈ byte_ps5120 0 0; 0; 0; 0.*1
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢

apply list_elem_of_fmap

2 open

v :
Hl :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
⊢
∃x : piece × pval, l = x.1 ∧ x ∈ byte_ps5120 0 0; 0; 0; 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢

exists l, v

2 open

v :
Hl :
l, v ∈ byte_ps5120 0 0; 0; 0; 0
⊢
l = l, v.1 ∧ l, v ∈ byte_ps5120 0 0; 0; 0; 0
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢

auto

deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢

split ; split ; reflexivity | simpl ; lia |

split ; split ; reflexivity | simpl ; lia |

split ; discriminate |

split ; discriminate |

split ; reflexivity |

split ; reflexivity |

split

2 open

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
focused goal

{unfold stream_current

2 open

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢
SomeVStreamp snapshot
⇒
p = token_handleout ∧ stream_observationF.worldtrue p snapshot
None
⇒
True
_
⇒
False
deferred goal

destruct HelloErrnoChecks.heap !! PNametoken_keyout as v | eqn: E ; destruct entry_keys_ _ E as i Hbad ; discriminate Hbad | exact I

deferred goal

split

2 open

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

{unfold stream_current

2 open

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
⊢
SomeVStreamp snapshot
⇒
p = token_handleerr ∧ stream_observationF.worldtrue p snapshot
None
⇒
True
_
⇒
False
deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

destruct HelloErrnoChecks.heap !! PNametoken_keyerr as v | eqn: E ; destruct entry_keys_ _ E as i Hbad ; discriminate Hbad | exact I

deferred goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

intros d → | →

2 open

focused goal

all: split ; | intros base l v Hin ; change Inbase [ ] in Hin ; contradiction

2 open

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0

all: split ; apply F.ready |

2 open

focused goal

all: split ; reflexivity |

2 open

focused goal

all: split ; intros root a Hin ; change Inroot [ ] in Hin ; contradiction |

2 open

focused goal

all: split ; intros base l v Hin ; change Inbase [ ] in Hin ; contradiction |

2 open

focused goal

all: intros l v Hl Hnot ; destruct l as base | base off | base off | key ; try exact I

4 open

Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
base, off :
Z
v :
Hnot :
PBytebase off ∉ errno_keys5120 0
⊢
∀reg : region, live_atconversion_mem base reg → 0 ≤ off → base + off < r_endreg → ¬span_containserrno_span5120 0 base + off
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
base, off :
Z
v :
Hnot :
PAuxbase off ∉ errno_keys5120 0
⊢
∀reg : region, live_atconversion_mem base reg → 0 ≤ off → base + off < r_endreg → ¬span_containserrno_span5120 0 base + off
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
base, off :
Z
v :
Hnot :
PBytebase off ∉ errno_keys5120 0
⊢
∀reg : region, live_atconversion_mem base reg → 0 ≤ off → base + off < r_endreg → ¬span_containserrno_span5120 0 base + off
focused goal
Hkeys :
∀l : piece v : pval, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
base, off :
Z
v :
Hnot :
PAuxbase off ∉ errno_keys5120 0
⊢
∀reg : region, live_atconversion_mem base reg → 0 ≤ off → base + off < r_endreg → ¬span_containserrno_span5120 0 base + off

all: exfalso ; apply Hnot ; eapply Hkeys ; exact Hl | exact I

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
assert Hkeys : ∀l v, stream_data_heap1024 2048 HelloErrnoChecks.heap !! l = Somev → mem_piecel → l ∈ errno_keys5120 0
{intros l v Hl _
apply stream_data_lookup in Hl as Hl _
apply elem_of_list_to_map_2 in Hl
change l ∈ byte_ps5120 0 0; 0; 0; 0.*1
apply list_elem_of_fmap
exists l, v
auto
split ; split ; reflexivity | simpl ; lia |
split ; split ; reflexivity | simpl ; lia |
split ; discriminate |
split ; discriminate |
split ; reflexivity |
split ; reflexivity |
split
destruct HelloErrnoChecks.heap !! PNametoken_keyout as v | eqn: E ; destruct entry_keys_ _ E as i Hbad ; discriminate Hbad | exact I
split
destruct HelloErrnoChecks.heap !! PNametoken_keyerr as v | eqn: E ; destruct entry_keys_ _ E as i Hbad ; discriminate Hbad | exact I
intros d → | →
all: split ; | intros base l v Hin ; change Inbase [ ] in Hin ; contradiction
all: split ; apply F.ready |
all: split ; reflexivity |
all: split ; intros root a Hin ; change Inroot [ ] in Hin ; contradiction |
all: split ; intros base l v Hin ; change Inbase [ ] in Hin ; contradiction |
all: intros l v Hl Hnot ; destruct l as base | base off | base off | key ; try exact I
all: exfalso ; apply Hnot ; eapply Hkeys ; exact Hl | exact I
854Lemma entry_fresh
∀ l v
l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ]
HelloErrnoChecks.heap !! l = None
Explore proof 6 tactics

Initial goal

⊢
∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → HelloErrnoChecks.heap !! l = None

intros l v Hin

v :
Hin :
l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ]
⊢
HelloErrnoChecks.heap !! l = None

destruct HelloErrnoChecks.heap !! l as old | eqn: E ; | reflexivity

v :
Hin :
l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ]
old :
E :
HelloErrnoChecks.heap !! l = Someold
⊢
Someold = None

destruct entry_keys_ _ E as i →

v :
i :
Z
Hin :
PByte5120 i, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ]
old :
E :
HelloErrnoChecks.heap !! PByte5120 i = Someold
⊢
Someold = None

apply list_elem_of_In in Hin

v :
i :
Z
Hin :
InPByte5120 i, v stream_psout 7 65; 66 ++ stream_pserr 3 [ ]
old :
E :
HelloErrnoChecks.heap !! PByte5120 i = Someold
⊢
Someold = None

cbn [ stream_ps app out err token_base token_key ] in Hin

v :
i :
Z
Hin :
InPByte5120 i, v PLive1024, VLivetoken_regionout :: PName−2, VStreamtoken_handleout Some7, 65; 66 :: stream_pserr 3 [ ]
old :
E :
HelloErrnoChecks.heap !! PByte5120 i = Someold
⊢
Someold = None

destruct Hin as Hbad | Hbad | Hbad | Hbad | ; discriminate Hbad

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros l v Hin
destruct HelloErrnoChecks.heap !! l as old | eqn: E ; | reflexivity
destruct entry_keys_ _ E as i →
apply list_elem_of_In in Hin
cbn [ stream_ps app out err token_base token_key ] in Hin
destruct Hin as Hbad | Hbad | Hbad | Hbad | ; discriminate Hbad
863Section entry_iris
864Context `{!gen_heapGSpiece pval Σ}

Both real tokens are produced while independently owned errno is retained. This is not just a construction of a pure endpoint map.

868Example entry_produces_pair: gen_heap_interpHelloErrnoChecks.heap ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ⇛ ∃h, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ _ ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝
Explore proof 13 tactics

Initial goal

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
gen_heap_interpHelloErrnoChecks.heap ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ⇛ ∃h : gmappiece pval, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝

iIntros [Hh Herrno]

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
Hh :
gen_heap_interpHelloErrnoChecks.heap
Herrno :
ptsbyte_ps5120 0 0; 0; 0; 0
∗
|⇛ ∃h : gmappiece pval, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝

iMod stream_entry_allocλ_ _ ⇒ True out err 5120 0 conversion_mem F.worldtrue HelloErrnoChecks.heap 7 65; 66 3 [ ] HelloErrnoChecks.heap_agrees entry_wi with Hh as (Hh & Ho & He & %Hnew)

6 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
stream_observationF.worldtrue token_handleout Some7, 65; 66
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
stream_observationF.worldtrue token_handleerr Some3, [ ]
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → HelloErrnoChecks.heap !! l = None
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
Herrno :
ptsbyte_ps5120 0 0; 0; 0; 0
Hh :
gen_heap_interpoverwritestream_psout 7 65; 66 ++ stream_pserr 3 [ ] HelloErrnoChecks.heap
Ho :
He :
∗
|⇛ ∃h : gmappiece pval, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝

–split ; reflexivity

5 open

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
stream_observationF.worldtrue token_handleout Some7, 65; 66
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
stream_observationF.worldtrue token_handleerr Some3, [ ]
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → HelloErrnoChecks.heap !! l = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
Herrno :
ptsbyte_ps5120 0 0; 0; 0; 0
Hh :
gen_heap_interpoverwritestream_psout 7 65; 66 ++ stream_pserr 3 [ ] HelloErrnoChecks.heap
Ho :
He :
∗
|⇛ ∃h : gmappiece pval, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝

–split ; reflexivity

4 open

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
stream_observationF.worldtrue token_handleout Some7, 65; 66
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
stream_observationF.worldtrue token_handleerr Some3, [ ]
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → HelloErrnoChecks.heap !! l = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
Herrno :
ptsbyte_ps5120 0 0; 0; 0; 0
Hh :
gen_heap_interpoverwritestream_psout 7 65; 66 ++ stream_pserr 3 [ ] HelloErrnoChecks.heap
Ho :
He :
∗
|⇛ ∃h : gmappiece pval, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝

–exists mkStreamInfo1 mkStreamByteOriented 65; 66 true 7

4 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
stream_observationF.worldtrue token_handleerr Some3, [ ]
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → HelloErrnoChecks.heap !! l = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
Herrno :
ptsbyte_ps5120 0 0; 0; 0; 0
Hh :
gen_heap_interpoverwritestream_psout 7 65; 66 ++ stream_pserr 3 [ ] HelloErrnoChecks.heap
Ho :
He :
∗
|⇛ ∃h : gmappiece pval, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝

repeat split ; reflexivity

3 open

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
stream_observationF.worldtrue token_handleerr Some3, [ ]
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → HelloErrnoChecks.heap !! l = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
Herrno :
ptsbyte_ps5120 0 0; 0; 0; 0
Hh :
gen_heap_interpoverwritestream_psout 7 65; 66 ++ stream_pserr 3 [ ] HelloErrnoChecks.heap
Ho :
He :
∗
|⇛ ∃h : gmappiece pval, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝

–exists mkStreamInfo2 stdout_initial 3

3 open

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → HelloErrnoChecks.heap !! l = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
Herrno :
ptsbyte_ps5120 0 0; 0; 0; 0
Hh :
gen_heap_interpoverwritestream_psout 7 65; 66 ++ stream_pserr 3 [ ] HelloErrnoChecks.heap
Ho :
He :
∗
|⇛ ∃h : gmappiece pval, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝

repeat split ; reflexivity

2 open

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → HelloErrnoChecks.heap !! l = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
Herrno :
ptsbyte_ps5120 0 0; 0; 0; 0
Hh :
gen_heap_interpoverwritestream_psout 7 65; 66 ++ stream_pserr 3 [ ] HelloErrnoChecks.heap
Ho :
He :
∗
|⇛ ∃h : gmappiece pval, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝

–exact entry_fresh

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
Herrno :
ptsbyte_ps5120 0 0; 0; 0; 0
Hh :
gen_heap_interpoverwritestream_psout 7 65; 66 ++ stream_pserr 3 [ ] HelloErrnoChecks.heap
Ho :
He :
∗
|⇛ ∃h : gmappiece pval, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝

–iModIntro

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
Herrno :
ptsbyte_ps5120 0 0; 0; 0; 0
Hh :
gen_heap_interpoverwritestream_psout 7 65; 66 ++ stream_pserr 3 [ ] HelloErrnoChecks.heap
Ho :
He :
∗
∃h : gmappiece pval, gen_heap_interph ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem h ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue h⌝

iExists _

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
Herrno :
ptsbyte_ps5120 0 0; 0; 0; 0
Hh :
gen_heap_interpoverwritestream_psout 7 65; 66 ++ stream_pserr 3 [ ] HelloErrnoChecks.heap
Ho :
He :
∗
gen_heap_interp?g ∗ ptsstream_psout 7 65; 66 ∗ ptsstream_pserr 3 [ ] ∗ ptsbyte_ps5120 0 0; 0; 0; 0 ∗ ⌜agreesconversion_mem ?g ∧ stream_tokens_wiλ_ : mem _ : libc_world ⇒ True out err 5120 0 conversion_mem F.worldtrue ?g⌝
shelved goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢

iFrame

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗

done

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
iIntros [Hh Herrno]
iMod stream_entry_allocλ_ _ ⇒ True out err 5120 0 conversion_mem F.worldtrue HelloErrnoChecks.heap 7 65; 66 3 [ ] HelloErrnoChecks.heap_agrees entry_wi with Hh as (Hh & Ho & He & %Hnew)
–split ; reflexivity
–split ; reflexivity
–exists mkStreamInfo1 mkStreamByteOriented 65; 66 true 7
repeat split ; reflexivity
repeat split ; reflexivity
–exact entry_fresh
–iModIntro
iExists _
iFrame
done

An existing key cannot be freshly recorded, even if its native object is live and the caller has no fragment for the old value.

891Example occupied_life_not_fresh: ¬∀l v, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → StreamHandleChecks.heap !! l = None
Explore proof 7 tactics

Initial goal

⊢
¬∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → StreamHandleChecks.heap !! l = None

intros Hfresh

Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → StreamHandleChecks.heap !! l = None
⊢
False

specialize HfreshPLive1024 VLivetoken_regionout

Hfresh :
PLive1024, VLivetoken_regionout ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → StreamHandleChecks.heap !! PLive1024 = None
⊢
False

assert Hin : PLive1024, VLivetoken_regionout ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] by apply list_elem_of_In ; simpl ; auto

Hfresh :
PLive1024, VLivetoken_regionout ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → StreamHandleChecks.heap !! PLive1024 = None
Hin :
⊢
False

specialize HfreshHin

Hfresh :
Hin :
⊢
False

unfold StreamHandleChecks.heap in Hfresh

Hfresh :
<[PLive1024 ≔ VLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live]><[PLive2048 ≔ VLiver_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live]>StreamHandleChecks.E.heap !! PLive1024 = None
Hin :
⊢
False

rewrite lookup_insert_eq in Hfresh

Hin :
Hfresh :
SomeVLiver_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live = None
⊢
False

discriminate Hfresh

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hfresh
specialize HfreshPLive1024 VLivetoken_regionout
assert Hin : PLive1024, VLivetoken_regionout ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] by apply list_elem_of_In ; simpl ; auto
specialize HfreshHin
unfold StreamHandleChecks.heap in Hfresh
rewrite lookup_insert_eq in Hfresh
discriminate Hfresh
903Example occupied_name_not_fresh: ¬∀l v, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → <[PName−2 ≔ VCodecTAtom"C"]>HelloErrnoChecks.heap !! l = None
Explore proof 6 tactics

Initial goal

⊢
¬∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → <[PName−2 ≔ VCodecTAtom"C"]>HelloErrnoChecks.heap !! l = None

intros Hfresh

Hfresh :
∀l : piece v : pval, l, v ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → <[PName−2 ≔ VCodecTAtom"C"]>HelloErrnoChecks.heap !! l = None
⊢
False

specialize HfreshPName−2 VStreamtoken_handleout Some7, 65; 66

Hfresh :
PName−2, VStreamtoken_handleout Some7, 65; 66 ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → <[PName−2 ≔ VCodecTAtom"C"]>HelloErrnoChecks.heap !! PName−2 = None
⊢
False

assert Hin : PName−2, VStreamtoken_handleout Some7, 65; 66 ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] by apply list_elem_of_In ; simpl ; auto

Hfresh :
PName−2, VStreamtoken_handleout Some7, 65; 66 ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] → <[PName−2 ≔ VCodecTAtom"C"]>HelloErrnoChecks.heap !! PName−2 = None
Hin :
PName−2, VStreamtoken_handleout Some7, 65; 66 ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ]
⊢
False

specialize HfreshHin

Hfresh :
<[PName−2 ≔ VCodecTAtom"C"]>HelloErrnoChecks.heap !! PName−2 = None
Hin :
PName−2, VStreamtoken_handleout Some7, 65; 66 ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ]
⊢
False

rewrite lookup_insert_eq in Hfresh

Hin :
PName−2, VStreamtoken_handleout Some7, 65; 66 ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ]
Hfresh :
SomeVCodecTAtom"C" = None
⊢
False

discriminate Hfresh

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hfresh
specialize HfreshPName−2 VStreamtoken_handleout Some7, 65; 66
assert Hin : PName−2, VStreamtoken_handleout Some7, 65; 66 ∈ stream_psout 7 65; 66 ++ stream_pserr 3 [ ] by apply list_elem_of_In ; simpl ; auto
specialize HfreshHin
rewrite lookup_insert_eq in Hfresh
discriminate Hfresh
914Example aliased_handles_rejected: ∀rep b o m w h, ¬stream_tokens_wirep out out b o m w h
Explore proof 3 tactics

Initial goal

⊢
∀rep : mem → libc_world → Prop b o : Z m : mem w : libc_world h : gmappiece pval, ¬stream_tokens_wirep out out b o m w h

intros rep b o m w h _ & _ & Hbad & _

rep :
mem → libc_world → Prop
b, o :
Z
m :
h :
⊢
False

apply Hbad

rep :
mem → libc_world → Prop
b, o :
Z
m :
h :

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros rep b o m w h _ & _ & Hbad & _
apply Hbad
reflexivity
918Example completed_close_not_readmitted: ¬stream_call_preF.model WPtrtoken_handleout changed_errno F.worldfalse
Explore proof 3 tactics

Initial goal

intros p & info & Hargs & _ & Hopen & _

p :
Hopen :
stream_atF.model F.worldfalse p = Someinfo
⊢
False

injection Hargs as ←

Hopen :
stream_atF.model F.worldfalse ptr_addr ≔ 1024; ptr_cap ≔ Obj1024 = Someinfo
⊢
False

discriminate Hopen

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros p & info & Hargs & _ & Hopen & _
injection Hargs as ←
discriminate Hopen