Fil-C on Nix

Filnix wiki

the formal campaign

rocq/theories/ExitMemory.v

A selected memory view of user-glibc's exit registry, not an executor or proof of native satisfaction. Layout is read from the pinned stdlib/exit.h and checked by compiling its extracted declarations with Fil-C: entry 32, block 1040, next/idx/fns at 0/8/16. Physical slots and logical pending registrations are distinct. Synchronization, callback admission and ownership remain separate obligations.

From Stdlib Require Import String ZArith List Bool Lia
From Nanofil Require Import Term Syntax Values Memory Runtime Identity ExternalCalls ExternalMachine Startup Stdio Shutdown
Import ListNotations
Open Scope Z_scope
Open Scope list_scope

Tags 0/1 are skipped by the exit loop. A reserved slot is not an installed callback; arbitrary unknown flavors are not admitted. Tokens are ghost registration instances, never native slot indices/addresses.

18Inductive exit_slot: Type ≔
|FreeSlot
|ReservedSlot
|OnSlot
token : nat symbol : name function argument : ptr
|AtSlot
token : nat symbol : name function : ptr
|CxaSlot
token : nat symbol : name function argument dso : ptr

A decoded function capability is not an admitted code specification.

25Definition exit_function_slotm a symbol function : Prop ≔
pointer_slotm a function ∧ ptr_capfunction = Fnsymbol

Only the flavor-selected fields matter. In particular free/reserved slots impose no requirements on stale payloads. Cxa's DSO pointer is represented but not dereferenced by ordinary exit. Native pointer mangling is a no-op in this selected source, not in arbitrary glibc.

32Definition exit_slot_memorym : mem a : Z slot : exit_slot : Prop ≔
match slot with
⇒
load_bytesm a 8 = 0
OnSlot_ symbol function argument
⇒
load_bytesm a 8 = 2 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument
AtSlot_ symbol function
⇒
load_bytesm a 8 = 3 ∧ exit_function_slotm a + 8 symbol function
CxaSlot_ symbol function argument dso
⇒
load_bytesm a 8 = 4 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument ∧ pointer_slotm a + 24 dso

Flavor, not the public API's spelling, selects the callback form. This pin's atexit stores ef_cxa with null argument and DSO; adapting that to logical AtExit requires a separate calling-convention contract.

49Definition exit_slot_pendingslot : exit_slot : listregistration ≔
match slot with
OnSlottoken symbol _ argument
⇒
mkRegistrationtoken OnExitsymbol WPtrargument
AtSlottoken symbol _
⇒
CxaSlottoken symbol _ argument _
⇒
mkRegistrationtoken CxaExitsymbol WPtrargument

Native slots are stored oldest first; exit scans downward, skipping holes.

58Definition exit_pendingslots : listexit_slot : listregistration ≔
flat_mapexit_slot_pending revslots

The slots below idx, not an assertion that idx counts live callbacks.

62Record exit_block: Type ≔ mkExitBlock
block_ptr
 : ptr
block_slots
 : listexit_slot

Full readable containing-object bounds/alignment are independent of pointer-slot decoding. Slots at or above idx are deliberately ignored. Writable spans are NOT inferred from this read-only view.

67Definition exit_block_memorym : mem block : exit_block next : ptr : Prop ≔
let p ≔ block_ptrblock in
ptr_capp = Objptr_addrp ∧ access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok ∧ pointer_slotm ptr_addrp next ∧ load_bytesm ptr_addrp + 8 8 = Z.of_natlengthblock_slotsblock ∧ lengthblock_slotsblock ≤ 32%nat ∧ ∀i slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot

The actual next-slot value for this finite suffix.

78Definition exit_headblocks : listexit_block : ptr ≔
match blocks with
[ ]
⇒
block :: _
⇒

A finite null-terminated chain, linked by decoded pointer capabilities.

82Fixpoint exit_chain_memorym : mem blocks : listexit_block : Prop ≔
match blocks with
[ ]
⇒
True
block :: rest
⇒

Block identities are distinct, not merely the pointers' address bits in next slots. Base capabilities in exit_block_memory tie them together.

90Definition exit_registry_memorym head blocks : Prop ≔
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok ∧ pointer_slotm ptr_addrhead exit_headblocks ∧ exit_chain_memorym blocks ∧ NoDupmapλblock ⇒ ptr_addrblock_ptrblock blocks

Blocks are visited head-first; each block is scanned in reverse slot order.

96Definition exit_registry_pendingblocks : listregistration ≔
flat_mapλblock ⇒ exit_pendingblock_slotsblock blocks

Callback specifications and retained argument requirements are independent of decoded Fn capabilities. Active evidence is detached from any old slot: idx has already decreased, and cxa may already have cleared it.

102Definition exit_callbacks_admittedadmitted : mem → registration → Prop m blocks active : optionregistration : Prop ≔
Foralladmittedm exit_registry_pendingblocks
∧
match active with
None
⇒
True
Someentry
⇒
admittedm entry

Release eligibility AFTER unlinking, not a memory transition. Explicit ownership, an exhausted live Heap base, enough extent, a distinct nonempty successor chain and the updated head are all required. Merely reading a block, finding it live, or observing next != NULL confers no ownership.

111Definition exit_block_releasableowned m head block rest : Prop ≔
Inptr_addrblock_ptrblock owned ∧ block_slotsblock = [ ] ∧ rest ≠ [ ] ∧ exit_registry_memorym head rest ∧ exit_block_memorym block exit_headrest ∧ NoDupmapλnode ⇒ ptr_addrblock_ptrnode block :: rest ∧ ∃reg, object_regionptr_addrblock_ptrblock m_regionsm = Somereg ∧ r_kindreg = Heap ∧ r_lifereg = Live ∧ ptr_addrblock_ptrblock + 1040 ≤ r_endreg

A free hole at the next index consumes no pending registration.

120Lemma exit_pending_skip_free
∀ slots
Explore proof 4 tactics

Initial goal

⊢
∀slots : listexit_slot, exit_pendingslots ++ FreeSlot = exit_pendingslots

intros

slots :
⊢

unfold exit_pending

slots :
⊢
flat_mapexit_slot_pending revslots ++ FreeSlot = flat_mapexit_slot_pending revslots

rewrite rev_app_distr

slots :
⊢
flat_mapexit_slot_pending revFreeSlot ++ revslots = flat_mapexit_slot_pending revslots

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros
rewrite rev_app_distr
reflexivity

Reserved physical slots are skipped too, not treated as installed code.

125Lemma exit_pending_skip_reserved
∀ slots
Explore proof 4 tactics

Initial goal

⊢
∀slots : listexit_slot, exit_pendingslots ++ ReservedSlot = exit_pendingslots

intros

slots :

unfold exit_pending

slots :
⊢
flat_mapexit_slot_pending revslots ++ ReservedSlot = flat_mapexit_slot_pending revslots

rewrite rev_app_distr

slots :
⊢
flat_mapexit_slot_pending revReservedSlot ++ revslots = flat_mapexit_slot_pending revslots

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros
rewrite rev_app_distr
reflexivity

Popping an installed slot detaches its registration before callback entry. This is a projection lemma, not construction of native write effects.

131Lemma exit_pending_pop
∀ slots slot entry
exit_slot_pendingslot = entry
exit_pendingslots ++ slot = entry :: exit_pendingslots
Explore proof 6 tactics

Initial goal

⊢
∀slots : listexit_slot slot : exit_slot entry : registration, exit_slot_pendingslot = entry → exit_pendingslots ++ slot = entry :: exit_pendingslots

intros slots slot entry H

slots :
slot :
H :
exit_slot_pendingslot = entry
⊢
exit_pendingslots ++ slot = entry :: exit_pendingslots

unfold exit_pending

slots :
slot :
H :
exit_slot_pendingslot = entry
⊢
flat_mapexit_slot_pending revslots ++ slot = entry :: flat_mapexit_slot_pending revslots

rewrite rev_app_distr

slots :
slot :
H :
exit_slot_pendingslot = entry
⊢
flat_mapexit_slot_pending revslot ++ revslots = entry :: flat_mapexit_slot_pending revslots

simpl

slots :
slot :
H :
exit_slot_pendingslot = entry
⊢
exit_slot_pendingslot ++ flat_mapexit_slot_pending revslots = entry :: flat_mapexit_slot_pending revslots

rewrite H

slots :
slot :
H :
exit_slot_pendingslot = entry
⊢
entry ++ flat_mapexit_slot_pending revslots = entry :: flat_mapexit_slot_pending revslots

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros slots slot entry H
rewrite rev_app_distr
simpl
rewrite H
reflexivity

Decoding a represented slot also supplies checked containing-object access.

140Lemma exit_slot_checked
∀ m block next i slot
exit_block_memorym block next
nth_errorblock_slotsblock i = Someslot
access_resm ptr_addrblock_ptrblock ptr_capblock_ptrblock 1040 Read 8 = Someok ∧ exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Explore proof 2 tactics

Initial goal

⊢
∀m : mem block : exit_block next : ptr i : nat slot : exit_slot, exit_block_memorym block next → nth_errorblock_slotsblock i = Someslot → access_resm ptr_addrblock_ptrblock ptr_capblock_ptrblock 1040 Read 8 = Someok ∧ exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

intros m block next i slot _ & Hread & _ & _ & _ & Hslots Hi

m :
block :
next :
i :
nat
slot :
Hread :
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hi :
nth_errorblock_slotsblock i = Someslot
⊢
access_resm ptr_addrblock_ptrblock ptr_capblock_ptrblock 1040 Read 8 = Someok ∧ exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m block next i slot _ & Hread & _ & _ & _ & Hslots Hi
auto

Being the last node prevents release even if the caller owns a live heap block.

147Example exit_last_block_retained: ∀owned m head block, ¬exit_block_releasableowned m head block [ ]
Explore proof 3 tactics

Initial goal

⊢
∀owned : listZ m : mem head : ptr block : exit_block, ¬exit_block_releasableowned m head block [ ]

intros owned m head block _ & _ & Hnonempty & _

owned :
listZ
m :
head :
block :
Hnonempty :
[ ] ≠ [ ]
⊢
False

apply Hnonempty

owned :
listZ
m :
head :
block :
Hnonempty :
[ ] ≠ [ ]
⊢
[ ] = [ ]

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros owned m head block _ & _ & Hnonempty & _
apply Hnonempty
reflexivity

A readable, writable or live block is still not a release permission.

152Example exit_unowned_block_retained: ∀m head block rest, ¬exit_block_releasable[ ] m head block rest
Explore proof 2 tactics

Initial goal

⊢
∀m : mem head : ptr block : exit_block rest : listexit_block, ¬exit_block_releasable[ ] m head block rest

intros m head block rest Howned _

m :
head :
block :
rest :
Howned :
⊢
False

exact Howned

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m head block rest Howned _
exact Howned

The array's fixed native capacity rejects idx=33, independently of memory.

157Example exit_oversized_index_rejected: ∀m p next, ¬exit_block_memorym mkExitBlockp repeatFreeSlot 33 next
Explore proof 3 tactics

Initial goal

⊢
∀m : mem p next : ptr, ¬exit_block_memorym block_ptr ≔ p; block_slots ≔ repeatFreeSlot 33 next

intros m p next _ & _ & _ & _ & Hlength & _

m :
p, next :
Hlength :
Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ repeatFreeSlot 33 ≤ 32%nat
⊢
False

simpl in Hlength

m :
p, next :
Hlength :
33 ≤ 32%nat
⊢
False

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m p next _ & _ & _ & _ & Hlength & _
simpl in Hlength
lia

Repeated blocks cannot form a selected registry, even if slot bytes look linked.

162Example exit_repeated_block_rejected: ∀m head block, ¬exit_registry_memorym head block; block
Explore proof 3 tactics

Initial goal

⊢
∀m : mem head : ptr block : exit_block, ¬exit_registry_memorym head block; block

intros m head block _ & _ & _ & Hdistinct

m :
head :
block :
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block; block
⊢
False

inversion Hdistinct ; subst

m :
head :
block :
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block; block
H2 :
⊢
False

match goal withHnot : ¬In_ _ |- _⇒apply Hnot ; left ; reflexivityend

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m head block _ & _ & _ & Hdistinct
inversion Hdistinct ; subst
match goal withHnot : ¬In_ _ |- _⇒apply Hnot ; left ; reflexivityend

Constructing one pop, before callback execution

The native index decrement; older is the prefix left after the pop.

172Definition exit_pop_indexm p older : listexit_slot : mem ≔
store_bytesm ptr_addrp + 8 8 Z.of_natlengtholder

Native cxa removal also clears its flavor, after decrementing idx. Payload bytes and every auxiliary capability remain untouched.

177Definition exit_pop_memorym p older selected : mem ≔
let m1 ≔ exit_pop_indexm p older in
match selected with
CxaSlot_ _ _ _ _
⇒
store_bytesm1 ptr_addrp + 16 + 32 × Z.of_natlengtholder 8 0
_
⇒
m1

Only idx and, for cxa, the removed flavor need write authority. A readable containing block is not this permission.

186Definition exit_pop_writesp older : listexit_slot selected : listspan ≔
::
match selected with
CxaSlot_ _ _ _ _
⇒
mkSpanmkPtrptr_addrp + 16 + 32 × Z.of_natlengtholder ptr_capp 8
_
⇒
[ ]

The head cell and other block storage must not alias this block. Distinct object identities alone do not establish byte separation.

196Definition exit_pop_separatedhead p rest : Prop ≔
ptr_addrhead + 8 ≤ ptr_addrp ∨ ptr_addrp + 1040 ≤ ptr_addrhead ∧ Forallλblock ⇒ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrp ∨ ptr_addrp + 1040 ≤ ptr_addrblock_ptrblock rest

A byte store preserves all reads disjoint from its actual footprint.

202Lemma exit_load_bytes_disjoint
∀ m a n x b size
0 ≤ size
b + size ≤ a ∨ a + n ≤ b
load_bytesstore_bytesm a n x b size = load_bytesm b size
Explore proof 9 tactics

Initial goal

⊢
∀m : mem a n x b size : Z, 0 ≤ size → b + size ≤ a ∨ a + n ≤ b → load_bytesstore_bytesm a n x b size = load_bytesm b size

intros m a n x b size Hsize Hdis

m :
a, n, x, b, size :
Z
Hsize :
0 ≤ size
Hdis :
b + size ≤ a ∨ a + n ≤ b
⊢
load_bytesstore_bytesm a n x b size = load_bytesm b size

apply load_bytes_agree ; exact Hsize |

m :
a, n, x, b, size :
Z
Hsize :
0 ≤ size
Hdis :
b + size ≤ a ∨ a + n ≤ b
⊢
∀i : Z, 0 ≤ i < size → m_bytesstore_bytesm a n x b + i = m_bytesm b + i

intros i Hi

m :
a, n, x, b, size :
Z
Hsize :
0 ≤ size
Hdis :
b + size ≤ a ∨ a + n ≤ b
i :
Z
Hi :
0 ≤ i < size
⊢
m_bytesstore_bytesm a n x b + i = m_bytesm b + i

simpl

m :
a, n, x, b, size :
Z
Hsize :
0 ≤ size
Hdis :
b + size ≤ a ∨ a + n ≤ b
i :
Z
Hi :
0 ≤ i < size
⊢
a ≤? b + i && b + i <? a + n
→
byte_ofx b + i − a
else
m_bytesm b + i
=
m_bytesm b + i

destruct a ≤? b + i && b + i <? a + n eqn: E ; | reflexivity

m :
a, n, x, b, size :
Z
Hsize :
0 ≤ size
Hdis :
b + size ≤ a ∨ a + n ≤ b
i :
Z
Hi :
0 ≤ i < size
E :
a ≤? b + i && b + i <? a + n = true
⊢
byte_ofx b + i − a = m_bytesm b + i

apply Bool.andb_true_iff in E as Hlo Hhi

m :
a, n, x, b, size :
Z
Hsize :
0 ≤ size
Hdis :
b + size ≤ a ∨ a + n ≤ b
i :
Z
Hi :
0 ≤ i < size
Hlo :
a ≤? b + i = true
Hhi :
b + i <? a + n = true
⊢
byte_ofx b + i − a = m_bytesm b + i

apply Z.leb_le in Hlo

m :
a, n, x, b, size :
Z
Hsize :
0 ≤ size
Hdis :
b + size ≤ a ∨ a + n ≤ b
i :
Z
Hi :
0 ≤ i < size
Hlo :
a ≤ b + i
Hhi :
b + i <? a + n = true
⊢
byte_ofx b + i − a = m_bytesm b + i

apply Z.ltb_lt in Hhi

m :
a, n, x, b, size :
Z
Hsize :
0 ≤ size
Hdis :
b + size ≤ a ∨ a + n ≤ b
i :
Z
Hi :
0 ≤ i < size
Hlo :
a ≤ b + i
Hhi :
b + i < a + n
⊢
byte_ofx b + i − a = m_bytesm b + i

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m a n x b size Hsize Hdis
apply load_bytes_agree ; exact Hsize |
intros i Hi
simpl
destruct a ≤? b + i && b + i <? a + n eqn: E ; | reflexivity
apply Bool.andb_true_iff in E as Hlo Hhi
apply Z.leb_le in Hlo
apply Z.ltb_lt in Hhi
lia

A pointer slot depends on its eight bytes and its own shadow entry.

213Lemma exit_pointer_agree
∀ m m′ a p
m_auxm′ a = m_auxm a
∀b, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
pointer_slotm′ a p
Explore proof 10 tactics

Initial goal

⊢
∀m m′ : mem a : Z p : ptr, m_auxm′ a = m_auxm a → ∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b → pointer_slotm a p → pointer_slotm′ a p

intros m m′ a p Haux Hb Hp & Hload & Hcap

m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
pointer_slotm′ a p

split ; exact Hp |

m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
load_bytesm′ a 8 = ptr_addrp ∧ m_auxm′ a = ptr_capp

split

2 open

m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
load_bytesm′ a 8 = ptr_addrp
focused goal
m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
m_auxm′ a = ptr_capp

–rewrite <- Hload

2 open

m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
load_bytesm′ a 8 = load_bytesm a 8
deferred goal
m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
m_auxm′ a = ptr_capp

apply load_bytes_agree ; lia |

2 open

m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
∀i : Z, 0 ≤ i < 8 → m_bytesm′ a + i = m_bytesm a + i
deferred goal
m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
m_auxm′ a = ptr_capp

intros i Hi

2 open

m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesm′ a + i = m_bytesm a + i
deferred goal
m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
m_auxm′ a = ptr_capp

apply Hb

2 open

m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
i :
Z
Hi :
0 ≤ i < 8
⊢
a ≤ a + i < a + 8
deferred goal
m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
m_auxm′ a = ptr_capp

lia

deferred goal
m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
m_auxm′ a = ptr_capp

–rewrite Haux

m, m′ :
a :
Z
p :
Haux :
m_auxm′ a = m_auxm a
Hb :
∀b : Z, a ≤ b < a + 8 → m_bytesm′ b = m_bytesm b
Hp :
0 ≤ ptr_addrp < 2 ^ 64
Hload :
Hcap :
m_auxm a = ptr_capp
⊢
m_auxm a = ptr_capp

exact Hcap

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ a p Haux Hb Hp & Hload & Hcap
split ; exact Hp |
split
–rewrite <- Hload
apply load_bytes_agree ; lia |
intros i Hi
apply Hb
lia
–rewrite Haux
exact Hcap

Physical slot decoding is framed by its 32 bytes and unchanged shadow.

224Lemma exit_slot_memory_agree
∀ m m′ a slot
∀b, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
∀b, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
exit_slot_memorym′ a slot
Explore proof 31 tactics

Initial goal

⊢
∀m m′ : mem a : Z slot : exit_slot, ∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b → ∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b → exit_slot_memorym a slot → exit_slot_memorym′ a slot

intros m m′ a slot Haux Hb Hslot

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
⊢
exit_slot_memorym′ a slot

assert Hload : ∀off, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
⊢
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
focused goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
⊢
exit_slot_memorym′ a slot

{intros off Hoff

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
off :
Z
Hoff :
0 ≤ off ≤ 24
⊢
load_bytesm′ a + off 8 = load_bytesm a + off 8
deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
⊢
exit_slot_memorym′ a slot

apply load_bytes_agree ; lia |

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
off :
Z
Hoff :
0 ≤ off ≤ 24
⊢
∀i : Z, 0 ≤ i < 8 → m_bytesm′ a + off + i = m_bytesm a + off + i
deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
⊢
exit_slot_memorym′ a slot

intros i Hi

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
off :
Z
Hoff :
0 ≤ off ≤ 24
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesm′ a + off + i = m_bytesm a + off + i
deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
⊢
exit_slot_memorym′ a slot

apply Hb

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
off :
Z
Hoff :
0 ≤ off ≤ 24
i :
Z
Hi :
0 ≤ i < 8
⊢
a ≤ a + off + i < a + 32
deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
⊢
exit_slot_memorym′ a slot

lia

deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
⊢
exit_slot_memorym′ a slot

assert Hptr : ∀off p, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
⊢
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
focused goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
⊢
exit_slot_memorym′ a slot

{intros off p Hoff

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
off :
Z
p :
Hoff :
0 ≤ off ≤ 24
⊢
pointer_slotm a + off p → pointer_slotm′ a + off p
deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
⊢
exit_slot_memorym′ a slot

apply exit_pointer_agree ; apply Haux ; lia |

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
off :
Z
p :
Hoff :
0 ≤ off ≤ 24
⊢
∀b : Z, a + off ≤ b < a + off + 8 → m_bytesm′ b = m_bytesm b
deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
⊢
exit_slot_memorym′ a slot

intros b Hrange

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
off :
Z
p :
Hoff :
0 ≤ off ≤ 24
b :
Z
Hrange :
a + off ≤ b < a + off + 8
⊢
m_bytesm′ b = m_bytesm b
deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
⊢
exit_slot_memorym′ a slot

apply Hb

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
off :
Z
p :
Hoff :
0 ≤ off ≤ 24
b :
Z
Hrange :
a + off ≤ b < a + off + 8
⊢
a ≤ b < a + 32
deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
⊢
exit_slot_memorym′ a slot

lia

deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
⊢
exit_slot_memorym′ a slot

assert Hzero : load_bytesm′ a 8 = load_bytesm a 8

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
⊢
load_bytesm′ a 8 = load_bytesm a 8
focused goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
exit_slot_memorym′ a slot

{replace a with a + 0 by lia

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
⊢
load_bytesm′ a + 0 8 = load_bytesm a + 0 8
deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
exit_slot_memorym′ a slot

apply Hload

2 open

m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
⊢
0 ≤ 0 ≤ 24
deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
exit_slot_memorym′ a slot

lia

deferred goal
m, m′ :
a :
Z
slot :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
exit_slot_memorym′ a slot

destruct slot ; simpl in * ; rewrite Hzero ; try exact Hslot

3 open

m, m′ :
a :
Z
token :
nat
symbol :
function, argument :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 2 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 2 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument
focused goal
m, m′ :
a :
Z
token :
nat
symbol :
function :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 3 ∧ exit_function_slotm a + 8 symbol function
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 3 ∧ exit_function_slotm′ a + 8 symbol function
focused goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 4 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument ∧ pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 4 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

–destruct Hslot as Htag & Hfn Hcap & Harg

3 open

m, m′ :
a :
Z
token :
nat
symbol :
function, argument :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 2
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Harg :
pointer_slotm a + 16 argument
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 2 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument
deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 3 ∧ exit_function_slotm a + 8 symbol function
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 3 ∧ exit_function_slotm′ a + 8 symbol function
deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 4 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument ∧ pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 4 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

split ; exact Htag |

3 open

m, m′ :
a :
Z
token :
nat
symbol :
function, argument :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 2
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Harg :
pointer_slotm a + 16 argument
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument
deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 3 ∧ exit_function_slotm a + 8 symbol function
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 3 ∧ exit_function_slotm′ a + 8 symbol function
deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 4 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument ∧ pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 4 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

split

4 open

m, m′ :
a :
Z
token :
nat
symbol :
function, argument :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 2
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Harg :
pointer_slotm a + 16 argument
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
exit_function_slotm′ a + 8 symbol function
focused goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 2
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Harg :
pointer_slotm a + 16 argument
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
pointer_slotm′ a + 16 argument
deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 3 ∧ exit_function_slotm a + 8 symbol function
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 3 ∧ exit_function_slotm′ a + 8 symbol function
deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 4 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument ∧ pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 4 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

+split ; apply Hptr ; lia | exact Hfn | exact Hcap

3 open

deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 2
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Harg :
pointer_slotm a + 16 argument
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
pointer_slotm′ a + 16 argument
deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 3 ∧ exit_function_slotm a + 8 symbol function
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 3 ∧ exit_function_slotm′ a + 8 symbol function
deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 4 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument ∧ pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 4 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

+apply Hptr ; lia | exact Harg

2 open

deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 3 ∧ exit_function_slotm a + 8 symbol function
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 3 ∧ exit_function_slotm′ a + 8 symbol function
deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 4 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument ∧ pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 4 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

–destruct Hslot as Htag & Hfn Hcap

2 open

m, m′ :
a :
Z
token :
nat
symbol :
function :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 3
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 3 ∧ exit_function_slotm′ a + 8 symbol function
deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 4 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument ∧ pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 4 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

split ; exact Htag |

2 open

m, m′ :
a :
Z
token :
nat
symbol :
function :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 3
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
exit_function_slotm′ a + 8 symbol function
deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 4 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument ∧ pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 4 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

split ; apply Hptr ; lia | exact Hfn | exact Hcap

deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Hslot :
load_bytesm a 8 = 4 ∧ exit_function_slotm a + 8 symbol function ∧ pointer_slotm a + 16 argument ∧ pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 4 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

–destruct Hslot as Htag & Hfn Hcap & Harg & Hdso

m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 4
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Harg :
pointer_slotm a + 16 argument
Hdso :
pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
load_bytesm a 8 = 4 ∧ exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

split ; exact Htag |

m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 4
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Harg :
pointer_slotm a + 16 argument
Hdso :
pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
exit_function_slotm′ a + 8 symbol function ∧ pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

split

2 open

m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 4
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Harg :
pointer_slotm a + 16 argument
Hdso :
pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
exit_function_slotm′ a + 8 symbol function
focused goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 4
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Harg :
pointer_slotm a + 16 argument
Hdso :
pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

+split ; apply Hptr ; lia | exact Hfn | exact Hcap

deferred goal
m, m′ :
a :
Z
token :
nat
symbol :
function, argument, dso :
Haux :
∀b : Z, a ≤ b < a + 32 → m_auxm′ b = m_auxm b
Hb :
∀b : Z, a ≤ b < a + 32 → m_bytesm′ b = m_bytesm b
Htag :
load_bytesm a 8 = 4
Hfn :
pointer_slotm a + 8 function
Hcap :
ptr_capfunction = Fnsymbol
Harg :
pointer_slotm a + 16 argument
Hdso :
pointer_slotm a + 24 dso
Hload :
∀off : Z, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
Hptr :
∀off : Z p : ptr, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
Hzero :
load_bytesm′ a 8 = load_bytesm a 8
⊢
pointer_slotm′ a + 16 argument ∧ pointer_slotm′ a + 24 dso

+split ; apply Hptr ; try lia ; assumption

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ a slot Haux Hb Hslot
assert Hload : ∀off, 0 ≤ off ≤ 24 → load_bytesm′ a + off 8 = load_bytesm a + off 8
{intros off Hoff
apply load_bytes_agree ; lia |
intros i Hi
apply Hb
lia
assert Hptr : ∀off p, 0 ≤ off ≤ 24 → pointer_slotm a + off p → pointer_slotm′ a + off p
{intros off p Hoff
apply exit_pointer_agree ; apply Haux ; lia |
intros b Hrange
apply Hb
lia
assert Hzero : load_bytesm′ a 8 = load_bytesm a 8
{replace a with a + 0 by lia
apply Hload
lia
destruct slot ; simpl in * ; rewrite Hzero ; try exact Hslot
–destruct Hslot as Htag & Hfn Hcap & Harg
split ; exact Htag |
split
+split ; apply Hptr ; lia | exact Hfn | exact Hcap
+apply Hptr ; lia | exact Harg
–destruct Hslot as Htag & Hfn Hcap
split ; exact Htag |
split ; apply Hptr ; lia | exact Hfn | exact Hcap
–destruct Hslot as Htag & Hfn Hcap & Harg & Hdso
split ; exact Htag |
split
+split ; apply Hptr ; lia | exact Hfn | exact Hcap
+split ; apply Hptr ; try lia ; assumption

A block view is preserved by an exact frame over its full storage.

252Lemma exit_block_memory_agree
∀ m m′ block next
∀a, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
∀a, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
exit_block_memorym block next
exit_block_memorym′ block next
Explore proof 27 tactics

Initial goal

⊢
∀m m′ : mem block : exit_block next : ptr, m_regionsm′ = m_regionsm → ∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a → ∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a → exit_block_memorym block next → exit_block_memorym′ block next

intros m m′ block next Hregions Haux Hb Hcap & Hread & Hnext & Hidx & Hlen & Hslots

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
exit_block_memorym′ block next

split ; exact Hcap |

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
access_resm′ ptr_addrblock_ptrblock ptr_capblock_ptrblock 1040 Read 8 = Someok ∧ pointer_slotm′ ptr_addrblock_ptrblock next ∧ load_bytesm′ ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

split

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
focused goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
pointer_slotm′ ptr_addrblock_ptrblock next ∧ load_bytesm′ ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

–unfold access_res

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
pointer_slotm′ ptr_addrblock_ptrblock next ∧ load_bytesm′ ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

rewrite Hregions

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
pointer_slotm′ ptr_addrblock_ptrblock next ∧ load_bytesm′ ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

exact Hread

deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
pointer_slotm′ ptr_addrblock_ptrblock next ∧ load_bytesm′ ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

–split

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
focused goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
load_bytesm′ ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

+apply exit_pointer_agreem m′ ; apply Haux ; lia | | exact Hnext

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
∀b : Z, ptr_addrblock_ptrblock ≤ b < ptr_addrblock_ptrblock + 8 → m_bytesm′ b = m_bytesm b
deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
load_bytesm′ ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

intros b Hrange

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
b :
Z
Hrange :
ptr_addrblock_ptrblock ≤ b < ptr_addrblock_ptrblock + 8
⊢
m_bytesm′ b = m_bytesm b
deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
load_bytesm′ ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

apply Hb

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
b :
Z
Hrange :
ptr_addrblock_ptrblock ≤ b < ptr_addrblock_ptrblock + 8
⊢
ptr_addrblock_ptrblock ≤ b < ptr_addrblock_ptrblock + 1040
deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
load_bytesm′ ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

lia

deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
load_bytesm′ ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

+split

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
load_bytesm′ ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
focused goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

∗rewrite <- Hidx

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

apply load_bytes_agree ; lia |

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
∀i : Z, 0 ≤ i < 8 → m_bytesm′ ptr_addrblock_ptrblock + 8 + i = m_bytesm ptr_addrblock_ptrblock + 8 + i
deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

intros i Hi

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesm′ ptr_addrblock_ptrblock + 8 + i = m_bytesm ptr_addrblock_ptrblock + 8 + i
deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

apply Hb

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
Z
Hi :
0 ≤ i < 8
⊢
ptr_addrblock_ptrblock ≤ ptr_addrblock_ptrblock + 8 + i < ptr_addrblock_ptrblock + 1040
deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

lia

deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

∗split ; exact Hlen |

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

intros i slot Hi

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
⊢
exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

assert i < lengthblock_slotsblock%nat by apply nth_error_Some ; congruence

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
i < Datatypes.lengthblock_slotsblock%nat
⊢
exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

apply Nat2Z.inj_lt in H

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
⊢
exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

apply Nat2Z.inj_le in Hlen

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Z.of_natDatatypes.lengthblock_slotsblock ≤ Z.of_nat32
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
⊢
exit_slot_memorym′ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

apply exit_slot_memory_agreem m′ ; | | auto ; intros a Ha

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Z.of_natDatatypes.lengthblock_slotsblock ≤ Z.of_nat32
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
a :
Z
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ a < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32
⊢
m_auxm′ a = m_auxm a
focused goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Z.of_natDatatypes.lengthblock_slotsblock ≤ Z.of_nat32
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
a :
Z
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ a < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32
⊢
m_bytesm′ a = m_bytesm a

--apply Haux

2 open

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Z.of_natDatatypes.lengthblock_slotsblock ≤ Z.of_nat32
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
a :
Z
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ a < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32
⊢
ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040
deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Z.of_natDatatypes.lengthblock_slotsblock ≤ Z.of_nat32
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
a :
Z
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ a < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32
⊢
m_bytesm′ a = m_bytesm a

lia

deferred goal
m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Z.of_natDatatypes.lengthblock_slotsblock ≤ Z.of_nat32
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
a :
Z
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ a < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32
⊢
m_bytesm′ a = m_bytesm a

--apply Hb

m, m′ :
block :
next :
Hregions :
Haux :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxm′ a = m_auxm a
Hb :
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesm′ a = m_bytesm a
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Z.of_natDatatypes.lengthblock_slotsblock ≤ Z.of_nat32
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
a :
Z
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ a < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32
⊢
ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ block next Hregions Haux Hb Hcap & Hread & Hnext & Hidx & Hlen & Hslots
split ; exact Hcap |
split
–unfold access_res
rewrite Hregions
exact Hread
–split
+apply exit_pointer_agreem m′ ; apply Haux ; lia | | exact Hnext
intros b Hrange
apply Hb
lia
+split
∗rewrite <- Hidx
apply load_bytes_agree ; lia |
intros i Hi
apply Hb
lia
∗split ; exact Hlen |
intros i slot Hi
assert i < lengthblock_slotsblock%nat by apply nth_error_Some ; congruence
apply Nat2Z.inj_lt in H
apply Nat2Z.inj_le in Hlen
apply exit_slot_memory_agreem m′ ; | | auto ; intros a Ha
--apply Haux
lia
--apply Hb
lia

Exact metadata frames keep regions and shadow everywhere, and bytes outside the one or two narrow roots, not merely outside the block.

277Lemma exit_pop_frame
∀ m p older selected
m_regionsexit_pop_memorym p older selected = m_regionsm ∧ m_auxexit_pop_memorym p older selected = m_auxm ∧ ∀a, ¬∃root, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a
Explore proof 22 tactics

Initial goal

⊢
∀m : mem p : ptr older : listexit_slot selected : exit_slot, m_regionsexit_pop_memorym p older selected = m_regionsm ∧ m_auxexit_pop_memorym p older selected = m_auxm ∧ ∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a

intros m p older selected

m :
p :
older :
selected :
⊢
m_regionsexit_pop_memorym p older selected = m_regionsm ∧ m_auxexit_pop_memorym p older selected = m_auxm ∧ ∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a

split ; destruct selected ; reflexivity |

m :
p :
older :
selected :
⊢
m_auxexit_pop_memorym p older selected = m_auxm ∧ ∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a

split ; destruct selected ; reflexivity |

m :
p :
older :
selected :
⊢
∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a

intros a Hout

m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
⊢
m_bytesexit_pop_memorym p older selected a = m_bytesm a

assert Hidx : ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false

2 open

m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
⊢
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
focused goal
m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
⊢
m_bytesexit_pop_memorym p older selected a = m_bytesm a

{apply Bool.not_true_is_false

2 open

m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
⊢
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 ≠ true
deferred goal
m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
⊢
m_bytesexit_pop_memorym p older selected a = m_bytesm a

intros H

2 open

m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
H :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = true
⊢
False
deferred goal
m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
⊢
m_bytesexit_pop_memorym p older selected a = m_bytesm a

apply Bool.andb_true_iff in H as Hlo Hhi

2 open

m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hlo :
ptr_addrp + 8 ≤? a = true
Hhi :
a <? ptr_addrp + 8 + 8 = true
⊢
False
deferred goal
m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
⊢
m_bytesexit_pop_memorym p older selected a = m_bytesm a

apply Z.leb_le in Hlo

2 open

m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hlo :
ptr_addrp + 8 ≤ a
Hhi :
a <? ptr_addrp + 8 + 8 = true
⊢
False
deferred goal
m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
⊢
m_bytesexit_pop_memorym p older selected a = m_bytesm a

apply Z.ltb_lt in Hhi

2 open

m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hlo :
ptr_addrp + 8 ≤ a
Hhi :
a < ptr_addrp + 8 + 8
⊢
False
deferred goal
m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
⊢
m_bytesexit_pop_memorym p older selected a = m_bytesm a

apply Hout

2 open

m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hlo :
ptr_addrp + 8 ≤ a
Hhi :
a < ptr_addrp + 8 + 8
⊢
∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
deferred goal
m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
⊢
m_bytesexit_pop_memorym p older selected a = m_bytesm a

exists mkSpanmkPtrptr_addrp + 8 ptr_capp 8

2 open

m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hlo :
ptr_addrp + 8 ≤ a
Hhi :
a < ptr_addrp + 8 + 8
⊢
Inspan_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 exit_pop_writesp older selected ∧ span_containsspan_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 a
deferred goal
m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
⊢
m_bytesexit_pop_memorym p older selected a = m_bytesm a

split ; left ; reflexivity | exact conjHlo Hhi

deferred goal
m :
p :
older :
selected :
a :
Z
Hout :
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
⊢
m_bytesexit_pop_memorym p older selected a = m_bytesm a

destruct selected ; cbn - [ Z.mul ] in * ; rewrite Hidx ; try reflexivity

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
a :
Z
Hout :
¬∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
⊢
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤? a && a <? ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
→
0
else
=

destruct ptr_addrp + 16 + 32 × Z.of_natlengtholder ≤? a && a <? ptr_addrp + 16 + 32 × Z.of_natlengtholder + 8 eqn: E ; | reflexivity

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
a :
Z
Hout :
¬∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
E :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤? a && a <? ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8 = true
⊢
0 = m_bytesm a

exfalso

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
a :
Z
Hout :
¬∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
E :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤? a && a <? ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8 = true
⊢
False

apply Hout

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
a :
Z
Hout :
¬∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
E :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤? a && a <? ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8 = true
⊢
∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a

apply Bool.andb_true_iff in E as Hlo Hhi

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
a :
Z
Hout :
¬∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
Hlo :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤? a = true
Hhi :
a <? ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8 = true
⊢
∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a

apply Z.leb_le in Hlo

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
a :
Z
Hout :
¬∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
Hlo :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a
Hhi :
a <? ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8 = true
⊢
∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a

apply Z.ltb_lt in Hhi

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
a :
Z
Hout :
¬∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
Hlo :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a
Hhi :
a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
⊢
∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a

eexists

2 open

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
a :
Z
Hout :
¬∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
Hlo :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a
Hhi :
a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
⊢
span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = ?root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = ?root ∨ False ∧ span_contains?root a
shelved goal
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
a :
Z
Hout :
¬∃root : span, span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 = root ∨ False ∧ span_containsroot a
Hidx :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
Hlo :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a
Hhi :
a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
⊢

split ; right ; left ; reflexivity | exact conjHlo Hhi

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m p older selected
split ; destruct selected ; reflexivity |
split ; destruct selected ; reflexivity |
intros a Hout
assert Hidx : ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = false
{apply Bool.not_true_is_false
intros H
apply Bool.andb_true_iff in H as Hlo Hhi
apply Z.leb_le in Hlo
apply Z.ltb_lt in Hhi
apply Hout
split ; left ; reflexivity | exact conjHlo Hhi
destruct selected ; cbn - [ Z.mul ] in * ; rewrite Hidx ; try reflexivity
destruct ptr_addrp + 16 + 32 × Z.of_natlengtholder ≤? a && a <? ptr_addrp + 16 + 32 × Z.of_natlengtholder + 8 eqn: E ; | reflexivity
exfalso
apply Hout
apply Bool.andb_true_iff in E as Hlo Hhi
apply Z.leb_le in Hlo
apply Z.ltb_lt in Hhi
eexists
split ; right ; left ; reflexivity | exact conjHlo Hhi

Every constructed write lies inside the original nonempty block.

299Lemma exit_pop_outside_block
∀ m p older selected a
lengtholder < 32%nat
a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a
m_bytesexit_pop_memorym p older selected a = m_bytesm a
Explore proof 11 tactics

Initial goal

⊢
∀m : mem p : ptr older : listexit_slot selected : exit_slot, Datatypes.lengtholder < 32%nat → ∀a : Z, a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a → m_bytesexit_pop_memorym p older selected a = m_bytesm a

intros m p older selected Hlen a Hout

m :
p :
older :
selected :
Hlen :
Datatypes.lengtholder < 32%nat
a :
Z
Hout :
a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a
⊢
m_bytesexit_pop_memorym p older selected a = m_bytesm a

apply proj2proj2exit_pop_framem p older selected

m :
p :
older :
selected :
Hlen :
Datatypes.lengtholder < 32%nat
a :
Z
Hout :
a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a
⊢
¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a

intros root & Hin & Ha

m :
p :
older :
selected :
Hlen :
Datatypes.lengtholder < 32%nat
a :
Z
Hout :
a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a
root :
Hin :
Inroot exit_pop_writesp older selected
Ha :
⊢
False

unfold exit_pop_writes in Hin

m :
p :
older :
selected :
Hlen :
Datatypes.lengtholder < 32%nat
a :
Z
Hout :
a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a
root :
Hin :
Inroot
span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8
::
match selected with
CxaSlot_ _ _ _ _
⇒
span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8
_
⇒
[ ]
Ha :
⊢
False

destruct Hin as [ <-| Hin ] ; unfold span_contains in Ha ; simpl in Ha ; lia |

m :
p :
older :
selected :
Hlen :
Datatypes.lengtholder < 32%nat
a :
Z
Hout :
a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a
root :
Hin :
Inroot
match selected with
CxaSlot_ _ _ _ _
⇒
span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8
_
⇒
[ ]
Ha :
⊢
False

destruct selected ; try contradiction

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hlen :
Datatypes.lengtholder < 32%nat
a :
Z
Hout :
a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a
root :
Hin :
Inroot span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8
Ha :
⊢
False

destruct Hin as [ <-| [ ] ]

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hlen :
Datatypes.lengtholder < 32%nat
a :
Z
Hout :
a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a
Ha :
span_containsspan_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 a
⊢
False

unfold span_contains in Ha

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hlen :
Datatypes.lengtholder < 32%nat
a :
Z
Hout :
a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a
Ha :
ptr_addrspan_ptrspan_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 ≤ a < ptr_addrspan_ptrspan_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 + span_sizespan_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8
⊢
False

cbn - [ Z.mul ] in Ha

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hlen :
Datatypes.lengtholder < 32%nat
a :
Z
Hout :
a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a
Ha :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
⊢
False

apply Nat2Z.inj_lt in Hlen

m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hlen :
Z.of_natDatatypes.lengtholder < Z.of_nat32
a :
Z
Hout :
a < ptr_addrp ∨ ptr_addrp + 1040 ≤ a
Ha :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
⊢
False

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m p older selected Hlen a Hout
apply proj2proj2exit_pop_framem p older selected
intros root & Hin & Ha
unfold exit_pop_writes in Hin
destruct Hin as [ <-| Hin ] ; unfold span_contains in Ha ; simpl in Ha ; lia |
destruct selected ; try contradiction
destruct Hin as [ <-| [ ] ]
unfold span_contains in Ha
cbn - [ Z.mul ] in Ha
apply Nat2Z.inj_lt in Hlen
lia

Decrementing idx leaves every older slot decoded, including free holes.

313Lemma exit_pop_index_represented
∀ m p older selected next
exit_block_memorym mkExitBlockp older ++ selected next
Explore proof 29 tactics

Initial goal

⊢
∀m : mem p : ptr older : listexit_slot selected : exit_slot next : ptr, exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next → exit_block_memoryexit_pop_indexm p older block_ptr ≔ p; block_slots ≔ older next

intros m p older selected next Hcap & Hread & Hnext & Hidx & Hlen & Hslots

m :
p :
older :
selected :
next :
Hcap :
ptr_capblock_ptrblock_ptr ≔ p; block_slots ≔ older ++ selected = Objptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older ++ selected
Hread :
access_resm ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older ++ selected ptr_capblock_ptrblock_ptr ≔ p; block_slots ≔ older ++ selected 1040 Read 8 = Someok
Hnext :
pointer_slotm ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older ++ selected next
Hidx :
load_bytesm ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older ++ selected + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ++ selected
Hlen :
Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ++ selected ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older ++ selected i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older ++ selected + 16 + 32 × Z.of_nati slot
⊢
exit_block_memoryexit_pop_indexm p older block_ptr ≔ p; block_slots ≔ older next

cbn - [ Z.mul ] in *

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder ++ selected ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
exit_block_memoryexit_pop_indexm p older block_ptr ≔ p; block_slots ≔ older next

rewrite length_app in Hlen

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + Datatypes.lengthselected ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
exit_block_memoryexit_pop_indexm p older block_ptr ≔ p; block_slots ≔ older next

simpl in Hlen

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
exit_block_memoryexit_pop_indexm p older block_ptr ≔ p; block_slots ≔ older next

split ; exact Hcap |

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
access_resexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older ptr_capblock_ptrblock_ptr ≔ p; block_slots ≔ older 1040 Read 8 = Someok ∧ pointer_slotexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older next ∧ load_bytesexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ∧ Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older i = Someslot → exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

split ; exact Hread |

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
pointer_slotexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older next ∧ load_bytesexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ∧ Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older i = Someslot → exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

split

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
focused goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
load_bytesexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ∧ Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older i = Someslot → exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

–apply pointer_slot_bytes_disjointm ptr_addrp + 8 8 Z.of_natlengtholder ptr_addrp next ; lia | left ; lia | exact Hnext

deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
load_bytesexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ∧ Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older i = Someslot → exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

–split

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
load_bytesexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older
focused goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older i = Someslot → exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

+unfold exit_pop_index

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
load_bytesstore_bytesm ptr_addrp + 8 8 Z.of_natDatatypes.lengtholder ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older
deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older i = Someslot → exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

rewrite stored_bytes_value by lia

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
Z.of_natDatatypes.lengtholder mod 256 ^ 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older
deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older i = Someslot → exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

apply Z.mod_small

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
0 ≤ Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older < 256 ^ 8
deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older i = Someslot → exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

split ; lia | apply Nat2Z.inj_le in Hlen ; cbn ; lia

deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older i = Someslot → exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

+split ; simpl ; lia |

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older i = Someslot → exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

intros i slot Hi

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorblock_slotsblock_ptr ≔ p; block_slots ≔ older i = Someslot
⊢
exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

change nth_errorolder i = Someslot in Hi

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
exit_slot_memoryexit_pop_indexm p older ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

apply exit_slot_memory_agreem ; intros ; reflexivity | |

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
∀b : Z, ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati ≤ b < ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati + 32 → m_bytesexit_pop_indexm p older b = m_bytesm b
focused goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

∗intros a Ha

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
a :
Z
Ha :
ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati ≤ a < ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati + 32
⊢
deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

cbn - [ Z.mul ] in Ha

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_nati ≤ a < ptr_addrp + 16 + 32 × Z.of_nati + 32
⊢
deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

simpl

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_nati ≤ a < ptr_addrp + 16 + 32 × Z.of_nati + 32
⊢
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8
→
byte_ofZ.of_natDatatypes.lengtholder a − ptr_addrp + 8
else
=
deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

destruct ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 eqn: E ; | reflexivity

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_nati ≤ a < ptr_addrp + 16 + 32 × Z.of_nati + 32
E :
ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 = true
⊢
byte_ofZ.of_natDatatypes.lengtholder a − ptr_addrp + 8 = m_bytesm a
deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

apply Bool.andb_true_iff in E as Hlo Hhi

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_nati ≤ a < ptr_addrp + 16 + 32 × Z.of_nati + 32
Hlo :
ptr_addrp + 8 ≤? a = true
Hhi :
a <? ptr_addrp + 8 + 8 = true
⊢
byte_ofZ.of_natDatatypes.lengtholder a − ptr_addrp + 8 = m_bytesm a
deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

apply Z.leb_le in Hlo

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_nati ≤ a < ptr_addrp + 16 + 32 × Z.of_nati + 32
Hlo :
ptr_addrp + 8 ≤ a
Hhi :
a <? ptr_addrp + 8 + 8 = true
⊢
byte_ofZ.of_natDatatypes.lengtholder a − ptr_addrp + 8 = m_bytesm a
deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

apply Z.ltb_lt in Hhi

2 open

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_nati ≤ a < ptr_addrp + 16 + 32 × Z.of_nati + 32
Hlo :
ptr_addrp + 8 ≤ a
Hhi :
a < ptr_addrp + 8 + 8
⊢
byte_ofZ.of_natDatatypes.lengtholder a − ptr_addrp + 8 = m_bytesm a
deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

lia

deferred goal
m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ p; block_slots ≔ older + 16 + 32 × Z.of_nati slot

∗apply Hslots

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
nth_errorolder ++ selected i = Someslot

rewrite nth_error_app1 ; exact Hi |

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
i < Datatypes.lengtholder%nat

apply nth_error_Some

m :
p :
older :
selected :
next :
Hcap :
Hread :
access_resm ptr_addrp ptr_capp 1040 Read 8 = Someok
Hnext :
Hidx :
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm ptr_addrp + 8 + Z.of_natn′
PosDef.Pos.to_nat8 0
=
Z.of_natDatatypes.lengtholder ++ selected
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorolder ++ selected i = Someslot → exit_slot_memorym ptr_addrp + 16 + 32 × Z.of_nati slot
i :
nat
slot :
Hi :
nth_errorolder i = Someslot
⊢
nth_errorolder i ≠ None

congruence

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m p older selected next Hcap & Hread & Hnext & Hidx & Hlen & Hslots
cbn - [ Z.mul ] in *
rewrite length_app in Hlen
simpl in Hlen
split ; exact Hcap |
split ; exact Hread |
split
–apply pointer_slot_bytes_disjointm ptr_addrp + 8 8 Z.of_natlengtholder ptr_addrp next ; lia | left ; lia | exact Hnext
–split
rewrite stored_bytes_value by lia
apply Z.mod_small
split ; lia | apply Nat2Z.inj_le in Hlen ; cbn ; lia
+split ; simpl ; lia |
intros i slot Hi
change nth_errorolder i = Someslot in Hi
apply exit_slot_memory_agreem ; intros ; reflexivity | |
∗intros a Ha
cbn - [ Z.mul ] in Ha
simpl
destruct ptr_addrp + 8 ≤? a && a <? ptr_addrp + 8 + 8 eqn: E ; | reflexivity
apply Bool.andb_true_iff in E as Hlo Hhi
apply Z.leb_le in Hlo
apply Z.ltb_lt in Hhi
lia
∗apply Hslots
rewrite nth_error_app1 ; exact Hi |
apply nth_error_Some
congruence

A store beyond the represented prefix preserves its block view.

334Lemma exit_block_store_after
∀ m block next a n x
exit_block_memorym block next
0 ≤ n
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natlengthblock_slotsblock ≤ a
Explore proof 17 tactics

Initial goal

⊢
∀m : mem block : exit_block next : ptr a n x : Z, exit_block_memorym block next → 0 ≤ n → ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a → exit_block_memorystore_bytesm a n x block next

intros m block next a n x Hcap & Hread & Hnext & Hidx & Hlen & Hslots Hn Ha

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
⊢

split ; exact Hcap |

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
⊢
access_resstore_bytesm a n x ptr_addrblock_ptrblock ptr_capblock_ptrblock 1040 Read 8 = Someok ∧ pointer_slotstore_bytesm a n x ptr_addrblock_ptrblock next ∧ load_bytesstore_bytesm a n x ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorystore_bytesm a n x ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

split ; exact Hread |

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
⊢
pointer_slotstore_bytesm a n x ptr_addrblock_ptrblock next ∧ load_bytesstore_bytesm a n x ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorystore_bytesm a n x ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

split

2 open

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
focused goal
m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
⊢
load_bytesstore_bytesm a n x ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorystore_bytesm a n x ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

–apply pointer_slot_bytes_disjoint ; lia | left ; lia | exact Hnext

deferred goal
m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
⊢
load_bytesstore_bytesm a n x ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorystore_bytesm a n x ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

–split ; rewrite exit_load_bytes_disjoint by lia ; exact Hidx |

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
⊢
Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorystore_bytesm a n x ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

split ; exact Hlen |

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorystore_bytesm a n x ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

intros i slot Hi

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
⊢
exit_slot_memorystore_bytesm a n x ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

apply exit_slot_memory_agreem ; intros ; reflexivity | | auto

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
⊢
∀b : Z, ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ b < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32 → m_bytesstore_bytesm a n x b = m_bytesm b

assert i < lengthblock_slotsblock%nat by apply nth_error_Some ; congruence

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
i < Datatypes.lengthblock_slotsblock%nat
⊢
∀b : Z, ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ b < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32 → m_bytesstore_bytesm a n x b = m_bytesm b

apply Nat2Z.inj_lt in H

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
⊢
∀b : Z, ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ b < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32 → m_bytesstore_bytesm a n x b = m_bytesm b

intros b Hb

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
b :
Z
Hb :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ b < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32
⊢

simpl

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
b :
Z
Hb :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ b < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32
⊢
a ≤? b && b <? a + n
→
byte_ofx b − a
else
=

destruct a ≤? b && b <? a + n eqn: E ; | reflexivity

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
b :
Z
Hb :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ b < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32
E :
a ≤? b && b <? a + n = true
⊢
byte_ofx b − a = m_bytesm b

apply Bool.andb_true_iff in E as Hlo Hhi

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
b :
Z
Hb :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ b < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32
Hlo :
a ≤? b = true
Hhi :
b <? a + n = true
⊢
byte_ofx b − a = m_bytesm b

apply Z.leb_le in Hlo

m :
block :
next :
a, n, x :
Z
Hread :
Hidx :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hslots :
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
Hn :
0 ≤ n
Ha :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengthblock_slotsblock ≤ a
i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
H :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
b :
Z
Hb :
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati ≤ b < ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + 32
Hlo :
a ≤ b
Hhi :
b <? a + n = true
⊢
byte_ofx b − a = m_bytesm b

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m block next a n x Hcap & Hread & Hnext & Hidx & Hlen & Hslots Hn Ha
split ; exact Hcap |
split ; exact Hread |
split
–apply pointer_slot_bytes_disjoint ; lia | left ; lia | exact Hnext
–split ; rewrite exit_load_bytes_disjoint by lia ; exact Hidx |
split ; exact Hlen |
intros i slot Hi
apply exit_slot_memory_agreem ; intros ; reflexivity | | auto
assert i < lengthblock_slotsblock%nat by apply nth_error_Some ; congruence
apply Nat2Z.inj_lt in H
intros b Hb
simpl
destruct a ≤? b && b <? a + n eqn: E ; | reflexivity
apply Bool.andb_true_iff in E as Hlo Hhi
apply Z.leb_le in Hlo
lia

Cxa's flavor clear is outside the shortened represented prefix.

352Theorem exit_pop_block_represented
∀ m p older selected next
exit_block_memorym mkExitBlockp older ++ selected next
exit_block_memoryexit_pop_memorym p older selected mkExitBlockp older next
Explore proof 4 tactics

Initial goal

⊢
∀m : mem p : ptr older : listexit_slot selected : exit_slot next : ptr, exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next → exit_block_memoryexit_pop_memorym p older selected block_ptr ≔ p; block_slots ≔ older next

intros m p older selected next Hblock

m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
⊢
exit_block_memoryexit_pop_memorym p older selected block_ptr ≔ p; block_slots ≔ older next

pose proof exit_pop_index_representedm p older selected next Hblock as Hidx

m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hidx :
exit_block_memoryexit_pop_indexm p older block_ptr ≔ p; block_slots ≔ older next
⊢
exit_block_memoryexit_pop_memorym p older selected block_ptr ≔ p; block_slots ≔ older next

destruct selected ; try exact Hidx

m :
p :
older :
token :
nat
symbol :
function, argument, dso, next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ CxaSlottoken symbol function argument dso next
Hidx :
exit_block_memoryexit_pop_indexm p older block_ptr ≔ p; block_slots ≔ older next
⊢
exit_block_memoryexit_pop_memorym p older CxaSlottoken symbol function argument dso block_ptr ≔ p; block_slots ≔ older next

apply exit_block_store_after ; exact Hidx | lia | simpl ; lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m p older selected next Hblock
pose proof exit_pop_index_representedm p older selected next Hblock as Hidx
destruct selected ; try exact Hidx
apply exit_block_store_after ; exact Hidx | lia | simpl ; lia

The containing access supplies aligned field checks for either read or write, but not the independent writable-root permission/liveness.

363Lemma exit_block_field_access
∀ m block next off rights
exit_block_memorym block next
0 ≤ off
off + 8 ≤ 1040
off mod 8 = 0
access_resm ptr_addrblock_ptrblock + off ptr_capblock_ptrblock 8 rights 8 = Someok
Explore proof 17 tactics

Initial goal

⊢
∀m : mem block : exit_block next : ptr off : Z rights : rights, exit_block_memorym block next → 0 ≤ off → off + 8 ≤ 1040 → off mod 8 = 0 → access_resm ptr_addrblock_ptrblock + off ptr_capblock_ptrblock 8 rights 8 = Someok

intros m block next off rights Hcap & Hread & _ Hlo Hhi Hoff

m :
block :
next :
off :
Z
rights :
rights
Hread :
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
access_resm ptr_addrblock_ptrblock + off ptr_capblock_ptrblock 8 rights 8 = Someok

rewrite Hcap in *

m :
block :
next :
off :
Z
rights :
rights
Hread :
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
access_resm ptr_addrblock_ptrblock + off Objptr_addrblock_ptrblock 8 rights 8 = Someok

unfold access_res , cap_access_res in *

m :
block :
next :
off :
Z
rights :
rights
Hread :
Somereg
⇒
None
⇒
None
=
Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
Somereg
⇒
Some
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg
→
None
⇒
None
=
Someok

destruct object_regionptr_addrblock_ptrblock m_regionsm as reg | eqn: Hr ; try discriminate

m :
block :
next :
off :
Z
rights :
rights
reg :
Hread :
=
Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
Some
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg
→
=
Someok

destruct ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock && ptr_addrblock_ptrblock + 1040 ≤? r_endreg eqn: Hbounds ; try discriminate

m :
block :
next :
off :
Z
rights :
rights
reg :
Hbounds :
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock && ptr_addrblock_ptrblock + 1040 ≤? r_endreg = true
Hread :
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
Some
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg
→
=
Someok

apply andb_true_iff in Hbounds as _ Hend

m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤? r_endreg = true
Hread :
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
Some
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg
→
=
Someok

apply Z.leb_le in Hend

m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Hread :
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
Some
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg
→
=
Someok

unfold aligned_res in Hread

m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Hread :
Some
ptr_addrblock_ptrblock mod 8 =? 0
→
=
Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
Some
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg
→
=
Someok

destruct ptr_addrblock_ptrblock mod 8 =? 0 eqn: Halign ; try discriminate

m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Halign :
ptr_addrblock_ptrblock mod 8 =? 0 = true
Hread :
Someok = Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
Some
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg
→
=
Someok

apply Z.eqb_eq in Halign

m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Halign :
ptr_addrblock_ptrblock mod 8 = 0
Hread :
Someok = Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
Some
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg
→
=
Someok

assert ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg = true as Hfield

2 open

m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Halign :
ptr_addrblock_ptrblock mod 8 = 0
Hread :
Someok = Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg = true
focused goal
m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Halign :
ptr_addrblock_ptrblock mod 8 = 0
Hread :
Someok = Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
Hfield :
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg = true
⊢
Some
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg
→
=
Someok

{apply andb_true_iff

2 open

m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Halign :
ptr_addrblock_ptrblock mod 8 = 0
Hread :
Someok = Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
⊢
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off = true ∧ ptr_addrblock_ptrblock + off + 8 ≤? r_endreg = true
deferred goal
m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Halign :
ptr_addrblock_ptrblock mod 8 = 0
Hread :
Someok = Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
Hfield :
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg = true
⊢
Some
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg
→
=
Someok

split ; apply Z.leb_le ; lia

deferred goal
m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Halign :
ptr_addrblock_ptrblock mod 8 = 0
Hread :
Someok = Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
Hfield :
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg = true
⊢
Some
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg
→
=
Someok

rewrite Hfield

m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Halign :
ptr_addrblock_ptrblock mod 8 = 0
Hread :
Someok = Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
Hfield :
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg = true
⊢
Somealigned_resptr_addrblock_ptrblock + off 8 = Someok

unfold aligned_res

m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Halign :
ptr_addrblock_ptrblock mod 8 = 0
Hread :
Someok = Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
Hfield :
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg = true
⊢
Some
ptr_addrblock_ptrblock + off mod 8 =? 0
→
=
Someok

rewrite Z.add_mod , Halign , Hoff by lia

m :
block :
next :
off :
Z
rights :
rights
reg :
Hend :
ptr_addrblock_ptrblock + 1040 ≤ r_endreg
Halign :
ptr_addrblock_ptrblock mod 8 = 0
Hread :
Someok = Someok
Hlo :
0 ≤ off
Hhi :
off + 8 ≤ 1040
Hoff :
off mod 8 = 0
Hfield :
ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg = true
⊢
Some
0 + 0 mod 8 =? 0
→
=
Someok

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m block next off rights Hcap & Hread & _ Hlo Hhi Hoff
rewrite Hcap in *
destruct object_regionptr_addrblock_ptrblock m_regionsm as reg | eqn: Hr ; try discriminate
destruct ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock && ptr_addrblock_ptrblock + 1040 ≤? r_endreg eqn: Hbounds ; try discriminate
apply andb_true_iff in Hbounds as _ Hend
apply Z.leb_le in Hend
unfold aligned_res in Hread
destruct ptr_addrblock_ptrblock mod 8 =? 0 eqn: Halign ; try discriminate
apply Z.eqb_eq in Halign
assert ptr_addrblock_ptrblock ≤? ptr_addrblock_ptrblock + off && ptr_addrblock_ptrblock + off + 8 ≤? r_endreg = true as Hfield
{apply andb_true_iff
split ; apply Z.leb_le ; lia
rewrite Hfield
rewrite Z.add_mod , Halign , Hoff by lia
reflexivity

Captured payload capabilities come from complete checked source slots; the source span grants no write authority and no callback specification.

384Lemma exit_block_payload_authority
∀ m block next i off value
exit_block_memorym block next
i < lengthblock_slotsblock%nat
8 ≤ off ≤ 24
off mod 8 = 0
pointer_slotm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off value
Explore proof 18 tactics

Initial goal

⊢
∀m : mem block : exit_block next : ptr i : nat off : Z value : ptr, exit_block_memorym block next → i < Datatypes.lengthblock_slotsblock%nat → 8 ≤ off ≤ 24 → off mod 8 = 0 → pointer_slotm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off value → available_capspan_ptr ≔ block_ptrblock; span_size ≔ 1040 [ ] m ptr_capvalue

intros m block next i off value Hblock Hi Hoff Halign _ & _ & Haux

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
⊢
available_capspan_ptr ≔ block_ptrblock; span_size ≔ 1040 [ ] m ptr_capvalue

assert Hbound : 16 + 32 × Z.of_nati + off + 8 ≤ 1040

2 open

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
⊢
16 + 32 × Z.of_nati + off + 8 ≤ 1040
focused goal
m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
available_capspan_ptr ≔ block_ptrblock; span_size ≔ 1040 [ ] m ptr_capvalue

{destruct Hblock as _ & _ & _ & _ & Hlen & _

2 open

m :
block :
next :
i :
nat
off :
Z
value :
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
⊢
16 + 32 × Z.of_nati + off + 8 ≤ 1040
deferred goal
m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
available_capspan_ptr ≔ block_ptrblock; span_size ≔ 1040 [ ] m ptr_capvalue

apply Nat2Z.inj_lt in Hi

2 open

m :
block :
next :
i :
nat
off :
Z
value :
Hlen :
Datatypes.lengthblock_slotsblock ≤ 32%nat
Hi :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
⊢
16 + 32 × Z.of_nati + off + 8 ≤ 1040
deferred goal
m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
available_capspan_ptr ≔ block_ptrblock; span_size ≔ 1040 [ ] m ptr_capvalue

apply Nat2Z.inj_le in Hlen

2 open

m :
block :
next :
i :
nat
off :
Z
value :
Hlen :
Z.of_natDatatypes.lengthblock_slotsblock ≤ Z.of_nat32
Hi :
Z.of_nati < Z.of_natDatatypes.lengthblock_slotsblock
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
⊢
16 + 32 × Z.of_nati + off + 8 ≤ 1040
deferred goal
m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
available_capspan_ptr ≔ block_ptrblock; span_size ≔ 1040 [ ] m ptr_capvalue

lia

deferred goal
m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
available_capspan_ptr ≔ block_ptrblock; span_size ≔ 1040 [ ] m ptr_capvalue

right

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
∃s : span, Ins span_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ ptr_capvalue = ptr_capspan_ptrs ∨ ∃s : span a : Z, Ins span_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ span_containss a ∧ a + 8 ≤ ptr_addrspan_ptrs + span_sizes ∧ access_resm a ptr_capspan_ptrs 8 Read 8 = Someok ∧ ptr_capvalue = m_auxm a ∨ ∃base : Z, Inbase [ ] ∧ ptr_capvalue = Objbase ∨ ptr_capvalue = Robase

right

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
∃s : span a : Z, Ins span_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ span_containss a ∧ a + 8 ≤ ptr_addrspan_ptrs + span_sizes ∧ access_resm a ptr_capspan_ptrs 8 Read 8 = Someok ∧ ptr_capvalue = m_auxm a ∨ ∃base : Z, Inbase [ ] ∧ ptr_capvalue = Objbase ∨ ptr_capvalue = Robase

left

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
∃s : span a : Z, Ins span_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ span_containss a ∧ a + 8 ≤ ptr_addrspan_ptrs + span_sizes ∧ access_resm a ptr_capspan_ptrs 8 Read 8 = Someok ∧ ptr_capvalue = m_auxm a

exists mkSpanblock_ptrblock 1040, ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
Inspan_ptr ≔ block_ptrblock; span_size ≔ 1040 span_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ span_containsspan_ptr ≔ block_ptrblock; span_size ≔ 1040 ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off ∧ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off + 8 ≤ ptr_addrspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 + span_sizespan_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ access_resm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off ptr_capspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 8 Read 8 = Someok ∧ ptr_capvalue = m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off

split ; left ; reflexivity |

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
span_containsspan_ptr ≔ block_ptrblock; span_size ≔ 1040 ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off ∧ ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off + 8 ≤ ptr_addrspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 + span_sizespan_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ access_resm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off ptr_capspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 8 Read 8 = Someok ∧ ptr_capvalue = m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off

split ; unfold span_contains ; cbn - [ Z.add Z.mul ] ; lia |

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off + 8 ≤ ptr_addrspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 + span_sizespan_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ access_resm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off ptr_capspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 8 Read 8 = Someok ∧ ptr_capvalue = m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off

split ; cbn - [ Z.add Z.mul ] ; lia |

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
access_resm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off ptr_capspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 8 Read 8 = Someok ∧ ptr_capvalue = m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off

split ; | symmetry ; exact Haux

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
access_resm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off ptr_capspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 8 Read 8 = Someok

replace ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off with ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off by lia

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
access_resm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off ptr_capspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 8 Read 8 = Someok

apply exit_block_field_accessm block next ; exact Hblock | lia | exact Hbound |

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
16 + 32 × Z.of_nati + off mod 8 = 0

rewrite Z.add_mod16 + 32 × Z.of_nati off 8 , Z.add_mod16 32 × Z.of_nati 8 , Z.mul_mod32 Z.of_nati 8 , Halign by lia

m :
block :
next :
i :
nat
off :
Z
value :
Hblock :
exit_block_memorym block next
Hi :
i < Datatypes.lengthblock_slotsblock%nat
Hoff :
8 ≤ off ≤ 24
Halign :
off mod 8 = 0
Haux :
m_auxm ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off = ptr_capvalue
Hbound :
16 + 32 × Z.of_nati + off + 8 ≤ 1040
⊢
16 mod 8 + 32 mod 8 × Z.of_nati mod 8 mod 8 mod 8 + 0 mod 8 = 0

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m block next i off value Hblock Hi Hoff Halign _ & _ & Haux
assert Hbound : 16 + 32 × Z.of_nati + off + 8 ≤ 1040
{destruct Hblock as _ & _ & _ & _ & Hlen & _
apply Nat2Z.inj_lt in Hi
apply Nat2Z.inj_le in Hlen
lia
right
right
left
exists mkSpanblock_ptrblock 1040, ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off
split ; left ; reflexivity |
split ; unfold span_contains ; cbn - [ Z.add Z.mul ] ; lia |
split ; cbn - [ Z.add Z.mul ] ; lia |
split ; | symmetry ; exact Haux
replace ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off with ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati + off by lia
apply exit_block_field_accessm block next ; exact Hblock | lia | exact Hbound |
rewrite Z.add_mod16 + 32 × Z.of_nati off 8 , Z.add_mod16 32 × Z.of_nati 8 , Z.mul_mod32 Z.of_nati 8 , Halign by lia
reflexivity

Capacity and containing alignment derive both native eight-byte stores.

407Lemma exit_pop_fields
∀ m p older selected next
exit_block_memorym mkExitBlockp older ++ selected next
lengtholder < 32%nat ∧ access_resm ptr_addrp + 8 ptr_capp 8 Write 8 = Someok ∧ access_resm ptr_addrp + 16 + 32 × Z.of_natlengtholder ptr_capp 8 Write 8 = Someok
Explore proof 16 tactics

Initial goal

⊢
∀m : mem p : ptr older : listexit_slot selected : exit_slot next : ptr, exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next → Datatypes.lengtholder < 32%nat ∧ access_resm ptr_addrp + 8 ptr_capp 8 Write 8 = Someok ∧ access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

intros m p older selected next Hblock

m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
⊢
Datatypes.lengtholder < 32%nat ∧ access_resm ptr_addrp + 8 ptr_capp 8 Write 8 = Someok ∧ access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

assert Hlen : lengtholder < 32%nat

2 open

m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
⊢
Datatypes.lengtholder < 32%nat
focused goal
m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
Datatypes.lengtholder < 32%nat ∧ access_resm ptr_addrp + 8 ptr_capp 8 Write 8 = Someok ∧ access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

{destruct Hblock as _ & _ & _ & _ & Hlen & _

2 open

m :
p :
older :
selected :
next :
Hlen :
Datatypes.lengthblock_slotsblock_ptr ≔ p; block_slots ≔ older ++ selected ≤ 32%nat
⊢
Datatypes.lengtholder < 32%nat
deferred goal
m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
Datatypes.lengtholder < 32%nat ∧ access_resm ptr_addrp + 8 ptr_capp 8 Write 8 = Someok ∧ access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

simpl in Hlen

2 open

m :
p :
older :
selected :
next :
Hlen :
Datatypes.lengtholder ++ selected ≤ 32%nat
⊢
Datatypes.lengtholder < 32%nat
deferred goal
m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
Datatypes.lengtholder < 32%nat ∧ access_resm ptr_addrp + 8 ptr_capp 8 Write 8 = Someok ∧ access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

rewrite length_app in Hlen

2 open

m :
p :
older :
selected :
next :
Hlen :
Datatypes.lengtholder + Datatypes.lengthselected ≤ 32%nat
⊢
Datatypes.lengtholder < 32%nat
deferred goal
m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
Datatypes.lengtholder < 32%nat ∧ access_resm ptr_addrp + 8 ptr_capp 8 Write 8 = Someok ∧ access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

simpl in Hlen

2 open

m :
p :
older :
selected :
next :
Hlen :
Datatypes.lengtholder + 1 ≤ 32%nat
⊢
Datatypes.lengtholder < 32%nat
deferred goal
m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
Datatypes.lengtholder < 32%nat ∧ access_resm ptr_addrp + 8 ptr_capp 8 Write 8 = Someok ∧ access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

lia

deferred goal
m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
Datatypes.lengtholder < 32%nat ∧ access_resm ptr_addrp + 8 ptr_capp 8 Write 8 = Someok ∧ access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

split ; exact Hlen |

m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
access_resm ptr_addrp + 8 ptr_capp 8 Write 8 = Someok ∧ access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

split

2 open

m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
access_resm ptr_addrp + 8 ptr_capp 8 Write 8 = Someok
focused goal
m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

–exact exit_block_field_accessm mkExitBlockp older ++ selected next 8 Write Hblock ltac:lia ltac:lia eq_refl

deferred goal
m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

–replace ptr_addrp + 16 + 32 × Z.of_natlengtholder with ptr_addrp + 16 + 32 × Z.of_natlengtholder by lia

m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
access_resm ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ptr_capp 8 Write 8 = Someok

apply exit_block_field_accessm mkExitBlockp older ++ selected next ; exact Hblock | lia | |

2 open

m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
16 + 32 × Z.of_natDatatypes.lengtholder + 8 ≤ 1040
focused goal
m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
16 + 32 × Z.of_natDatatypes.lengtholder mod 8 = 0

+apply Nat2Z.inj_lt in Hlen

2 open

m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Z.of_natDatatypes.lengtholder < Z.of_nat32
⊢
16 + 32 × Z.of_natDatatypes.lengtholder + 8 ≤ 1040
deferred goal
m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
16 + 32 × Z.of_natDatatypes.lengtholder mod 8 = 0

lia

deferred goal
m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
16 + 32 × Z.of_natDatatypes.lengtholder mod 8 = 0

+rewrite Z.add_mod , Z.mul_mod by lia

m :
p :
older :
selected :
next :
Hblock :
exit_block_memorym block_ptr ≔ p; block_slots ≔ older ++ selected next
Hlen :
Datatypes.lengtholder < 32%nat
⊢
16 mod 8 + 32 mod 8 × Z.of_natDatatypes.lengtholder mod 8 mod 8 mod 8 = 0

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m p older selected next Hblock
assert Hlen : lengtholder < 32%nat
{destruct Hblock as _ & _ & _ & _ & Hlen & _
simpl in Hlen
rewrite length_app in Hlen
simpl in Hlen
lia
split ; exact Hlen |
split
–exact exit_block_field_accessm mkExitBlockp older ++ selected next 8 Write Hblock ltac:lia ltac:lia eq_refl
–replace ptr_addrp + 16 + 32 × Z.of_natlengtholder with ptr_addrp + 16 + 32 × Z.of_natlengtholder by lia
apply exit_block_field_accessm mkExitBlockp older ++ selected next ; exact Hblock | lia | |
+apply Nat2Z.inj_lt in Hlen
lia
+rewrite Z.add_mod , Z.mul_mod by lia
reflexivity

Popping a separated nonempty head preserves the head pointer, remaining chain and identities. Exhausting a block does not unlink or release it.

429Theorem exit_pop_registry_represented
∀ m head p older selected rest
exit_registry_memorym head mkExitBlockp older ++ selected :: rest
exit_registry_memoryexit_pop_memorym p older selected head mkExitBlockp older :: rest
Proof 31 steps Qed
intros m head p older selected rest Hread & Hhead & Hblock Hchain & Hdistinct Hheadsep Hsep
destruct exit_pop_framem p older selected as Hregions Haux Hbytes
assert Hlen : lengtholder < 32%nat
{destruct Hblock as _ & _ & _ & _ & Hlen & _
simpl in Hlen
rewrite length_app in Hlen
simpl in Hlen
lia
split
–unfold access_res
rewrite Hregions
exact Hread
–split
+apply exit_pointer_agreem ; rewrite Haux ; reflexivity | | exact Hhead
intros b Hb
apply exit_pop_outside_block ; exact Hlen | lia
+split ; | exact Hdistinct
split
exact Hblock
∗clear Hhead Hheadsep Hread Hdistinct Hblock
induction rest as | block rest IH ; exact I |
destruct Hchain as Hblock Hchain
inversion Hsep as [ |? ? Hdis Hrest ] ; subst
split ; | apply IH ; assumption
apply exit_block_memory_agreem ; try assumption
--intros a Ha
rewrite Haux
reflexivity
--intros a Ha
apply exit_pop_outside_block ; exact Hlen | lia

An installed physical slot is exactly the first pending registration.

454Lemma exit_pop_pending
∀ p older selected rest entry
exit_slot_pendingselected = entry
exit_registry_pendingmkExitBlockp older ++ selected :: rest = entry :: exit_registry_pendingmkExitBlockp older :: rest
Explore proof 4 tactics

Initial goal

⊢
∀p : ptr older : listexit_slot selected : exit_slot rest : listexit_block entry : registration, exit_slot_pendingselected = entry → exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest = entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest

intros p older selected rest entry Hslot

p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
⊢
exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest = entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest

change exit_pendingolder ++ selected ++ exit_registry_pendingrest = entry :: exit_pendingolder ++ exit_registry_pendingrest

p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
⊢
exit_pendingolder ++ selected ++ exit_registry_pendingrest = entry :: exit_pendingolder ++ exit_registry_pendingrest

rewrite exit_pending_popolder selected entry Hslot

p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
⊢
entry :: exit_pendingolder ++ exit_registry_pendingrest = entry :: exit_pendingolder ++ exit_registry_pendingrest

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros p older selected rest entry Hslot
change exit_pendingolder ++ selected ++ exit_registry_pendingrest = entry :: exit_pendingolder ++ exit_registry_pendingrest
rewrite exit_pending_popolder selected entry Hslot
reflexivity

Skipping a hole stutters logically; it is not a callback or TLS action.

466Lemma exit_pop_skip
∀ p older selected rest
selected = FreeSlot ∨ selected = ReservedSlot
exit_registry_pendingmkExitBlockp older ++ selected :: rest = exit_registry_pendingmkExitBlockp older :: rest
Explore proof 7 tactics

Initial goal

⊢
∀p : ptr older : listexit_slot selected : exit_slot rest : listexit_block, selected = FreeSlot ∨ selected = ReservedSlot → exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest = exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest

intros p older selected rest → | →

2 open

p :
older :
rest :
⊢
exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ FreeSlot :: rest = exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest
focused goal
p :
older :
rest :
⊢
exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ ReservedSlot :: rest = exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest

–change exit_pendingolder ++ FreeSlot ++ exit_registry_pendingrest = exit_pendingolder ++ exit_registry_pendingrest

2 open

p :
older :
rest :
deferred goal
p :
older :
rest :
⊢
exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ ReservedSlot :: rest = exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest

rewrite exit_pending_skip_free

2 open

p :
older :
rest :
deferred goal
p :
older :
rest :
⊢
exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ ReservedSlot :: rest = exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest

reflexivity

deferred goal
p :
older :
rest :
⊢
exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ ReservedSlot :: rest = exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest

–change exit_pendingolder ++ ReservedSlot ++ exit_registry_pendingrest = exit_pendingolder ++ exit_registry_pendingrest

rewrite exit_pending_skip_reserved

p :
older :
rest :

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros p older selected rest → | →
reflexivity

The installed pop constructs the existing logical callback-entry edge; uniqueness is supplied independently, never inferred from slot addresses.

482Theorem exit_pop_shutdown
∀ p older selected rest entry status consumed q
exit_slot_pendingselected = entry
let before ≔ mkShutdownHandlers status exit_registry_pendingmkExitBlockp older ++ selected :: rest consumed q in
let after ≔ mkShutdownInCallbackentry status exit_registry_pendingmkExitBlockp older :: rest consumed ++ registration_tokenentry q in
shutdown_uniquebefore → shutdown_stepbefore InvokeCallbackentry status after ∧ shutdown_uniqueafter
Explore proof 7 tactics

Initial goal

⊢
∀ p : ptr older : listexit_slot selected : exit_slot rest : listexit_block entry : registration status : Z consumed : listnat q : stream_state  ,
exit_slot_pendingselected = entry
→
let before ≔ shutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q in
let after ≔ shutdown_at ≔ InCallbackentry; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest; shutdown_consumed ≔ consumed ++ registration_tokenentry; shutdown_stdout ≔ q in
shutdown_uniquebefore → shutdown_stepbefore InvokeCallbackentry status after ∧ shutdown_uniqueafter

intros p older selected rest entry status consumed q Hslot before after Hunique

p :
older :
selected :
rest :
status :
Z
consumed :
listnat
Hslot :
exit_slot_pendingselected = entry
before :=
shutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q : shutdown_state
after :=
Hunique :
⊢
shutdown_stepbefore InvokeCallbackentry status after ∧ shutdown_uniqueafter

assert Hstep : shutdown_stepbefore InvokeCallbackentry status after

2 open

p :
older :
selected :
rest :
status :
Z
consumed :
listnat
Hslot :
exit_slot_pendingselected = entry
before :=
shutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q : shutdown_state
after :=
Hunique :
⊢
shutdown_stepbefore InvokeCallbackentry status after
focused goal
p :
older :
selected :
rest :
status :
Z
consumed :
listnat
Hslot :
exit_slot_pendingselected = entry
before :=
shutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q : shutdown_state
after :=
Hunique :
Hstep :
shutdown_stepbefore InvokeCallbackentry status after
⊢
shutdown_stepbefore InvokeCallbackentry status after ∧ shutdown_uniqueafter

{unfold before , after

2 open

p :
older :
selected :
rest :
status :
Z
consumed :
listnat
Hslot :
exit_slot_pendingselected = entry
before :=
shutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q : shutdown_state
after :=
Hunique :
⊢
shutdown_stepshutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q InvokeCallbackentry status shutdown_at ≔ InCallbackentry; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest; shutdown_consumed ≔ consumed ++ registration_tokenentry; shutdown_stdout ≔ q
deferred goal
p :
older :
selected :
rest :
status :
Z
consumed :
listnat
Hslot :
exit_slot_pendingselected = entry
before :=
shutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q : shutdown_state
after :=
Hunique :
Hstep :
shutdown_stepbefore InvokeCallbackentry status after
⊢
shutdown_stepbefore InvokeCallbackentry status after ∧ shutdown_uniqueafter

rewrite exit_pop_pendingp older selected rest entry Hslot

2 open

p :
older :
selected :
rest :
status :
Z
consumed :
listnat
Hslot :
exit_slot_pendingselected = entry
before :=
shutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q : shutdown_state
after :=
Hunique :
⊢
shutdown_stepshutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q InvokeCallbackentry status shutdown_at ≔ InCallbackentry; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest; shutdown_consumed ≔ consumed ++ registration_tokenentry; shutdown_stdout ≔ q
deferred goal
p :
older :
selected :
rest :
status :
Z
consumed :
listnat
Hslot :
exit_slot_pendingselected = entry
before :=
shutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q : shutdown_state
after :=
Hunique :
Hstep :
shutdown_stepbefore InvokeCallbackentry status after
⊢
shutdown_stepbefore InvokeCallbackentry status after ∧ shutdown_uniqueafter

constructor

deferred goal
p :
older :
selected :
rest :
status :
Z
consumed :
listnat
Hslot :
exit_slot_pendingselected = entry
before :=
shutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q : shutdown_state
after :=
Hunique :
Hstep :
shutdown_stepbefore InvokeCallbackentry status after
⊢
shutdown_stepbefore InvokeCallbackentry status after ∧ shutdown_uniqueafter

split ; exact Hstep |

p :
older :
selected :
rest :
status :
Z
consumed :
listnat
Hslot :
exit_slot_pendingselected = entry
before :=
shutdown_at ≔ Handlers; shutdown_status ≔ status; shutdown_pending ≔ exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest; shutdown_consumed ≔ consumed; shutdown_stdout ≔ q : shutdown_state
after :=
Hunique :
Hstep :
shutdown_stepbefore InvokeCallbackentry status after

eapply shutdown_step_unique ; eauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros p older selected rest entry status consumed q Hslot before after Hunique
assert Hstep : shutdown_stepbefore InvokeCallbackentry status after
{unfold before , after
rewrite exit_pop_pendingp older selected rest entry Hslot
constructor
split ; exact Hstep |
eapply shutdown_step_unique ; eauto

Admission specifications may depend on memory. Stability is a general footprint rule over any two snapshots, not the desired endpoint premise. In particular an argument that aliases idx needs separate justification.

501Definition exit_admission_stableadmitted : mem → registration → Prop roots : listspan : Prop ≔
∀m m′, m_regionsm′ = m_regionsm → m_auxm′ = m_auxm → ∀a, ¬∃root, Inroot roots ∧ span_containsroot a → m_bytesm′ a = m_bytesm a → ∀entry, admittedm entry → admittedm′ entry

The same exact frame transports every remaining and active admission.

507Theorem exit_pop_admitted
∀ admitted m p older selected rest entry
exit_slot_pendingselected = entry
exit_admission_stableadmitted exit_pop_writesp older selected
exit_callbacks_admittedadmitted m mkExitBlockp older ++ selected :: rest None
exit_callbacks_admittedadmitted exit_pop_memorym p older selected mkExitBlockp older :: rest Someentry
Explore proof 11 tactics

Initial goal

⊢
∀admitted : mem → registration → Prop m : mem p : ptr older : listexit_slot selected : exit_slot rest : listexit_block entry : registration, exit_slot_pendingselected = entry → exit_admission_stableadmitted exit_pop_writesp older selected → exit_callbacks_admittedadmitted m block_ptr ≔ p; block_slots ≔ older ++ selected :: rest None → exit_callbacks_admittedadmitted exit_pop_memorym p older selected block_ptr ≔ p; block_slots ≔ older :: rest Someentry

intros admitted m p older selected rest entry Hslot Hstable Hall _

admitted :
mem → registration → Prop
m :
p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
Hstable :
exit_admission_stableadmitted exit_pop_writesp older selected
Hall :
Foralladmittedm exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older ++ selected :: rest
⊢
exit_callbacks_admittedadmitted exit_pop_memorym p older selected block_ptr ≔ p; block_slots ≔ older :: rest Someentry

rewrite exit_pop_pendingp older selected rest entry Hslot in Hall

admitted :
mem → registration → Prop
m :
p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
Hstable :
exit_admission_stableadmitted exit_pop_writesp older selected
Hall :
Foralladmittedm entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest
⊢
exit_callbacks_admittedadmitted exit_pop_memorym p older selected block_ptr ≔ p; block_slots ≔ older :: rest Someentry

inversion Hall as [ |? ? Hentry Hrest ] ; subst

admitted :
mem → registration → Prop
m :
p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
Hstable :
exit_admission_stableadmitted exit_pop_writesp older selected
Hall :
Foralladmittedm entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest
Hentry :
admittedm entry
Hrest :
Foralladmittedm exit_pendingolder ++ exit_registry_pendingrest
⊢
exit_callbacks_admittedadmitted exit_pop_memorym p older selected block_ptr ≔ p; block_slots ≔ older :: rest Someentry

destruct exit_pop_framem p older selected as Hregions Haux Hbytes

admitted :
mem → registration → Prop
m :
p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
Hstable :
exit_admission_stableadmitted exit_pop_writesp older selected
Hall :
Foralladmittedm entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest
Hentry :
admittedm entry
Hrest :
Foralladmittedm exit_pendingolder ++ exit_registry_pendingrest
Hregions :
m_regionsexit_pop_memorym p older selected = m_regionsm
Haux :
m_auxexit_pop_memorym p older selected = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a
⊢
exit_callbacks_admittedadmitted exit_pop_memorym p older selected block_ptr ≔ p; block_slots ≔ older :: rest Someentry

assert Htransport : ∀item, admittedm item → admittedexit_pop_memorym p older selected item

2 open

admitted :
mem → registration → Prop
m :
p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
Hstable :
exit_admission_stableadmitted exit_pop_writesp older selected
Hall :
Foralladmittedm entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest
Hentry :
admittedm entry
Hrest :
Foralladmittedm exit_pendingolder ++ exit_registry_pendingrest
Hregions :
m_regionsexit_pop_memorym p older selected = m_regionsm
Haux :
m_auxexit_pop_memorym p older selected = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a
⊢
∀item : registration, admittedm item → admittedexit_pop_memorym p older selected item
focused goal
admitted :
mem → registration → Prop
m :
p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
Hstable :
exit_admission_stableadmitted exit_pop_writesp older selected
Hall :
Foralladmittedm entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest
Hentry :
admittedm entry
Hrest :
Foralladmittedm exit_pendingolder ++ exit_registry_pendingrest
Hregions :
m_regionsexit_pop_memorym p older selected = m_regionsm
Haux :
m_auxexit_pop_memorym p older selected = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a
Htransport :
∀item : registration, admittedm item → admittedexit_pop_memorym p older selected item
⊢
exit_callbacks_admittedadmitted exit_pop_memorym p older selected block_ptr ≔ p; block_slots ≔ older :: rest Someentry

{apply Hstable ; assumption

deferred goal
admitted :
mem → registration → Prop
m :
p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
Hstable :
exit_admission_stableadmitted exit_pop_writesp older selected
Hall :
Foralladmittedm entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest
Hentry :
admittedm entry
Hrest :
Foralladmittedm exit_pendingolder ++ exit_registry_pendingrest
Hregions :
m_regionsexit_pop_memorym p older selected = m_regionsm
Haux :
m_auxexit_pop_memorym p older selected = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a
Htransport :
∀item : registration, admittedm item → admittedexit_pop_memorym p older selected item
⊢
exit_callbacks_admittedadmitted exit_pop_memorym p older selected block_ptr ≔ p; block_slots ≔ older :: rest Someentry

split ; | apply Htransport ; exact Hentry

admitted :
mem → registration → Prop
m :
p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
Hstable :
exit_admission_stableadmitted exit_pop_writesp older selected
Hall :
Foralladmittedm entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest
Hentry :
admittedm entry
Hrest :
Foralladmittedm exit_pendingolder ++ exit_registry_pendingrest
Hregions :
m_regionsexit_pop_memorym p older selected = m_regionsm
Haux :
m_auxexit_pop_memorym p older selected = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a
Htransport :
∀item : registration, admittedm item → admittedexit_pop_memorym p older selected item
⊢
Foralladmittedexit_pop_memorym p older selected exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest

eapply Forall_impl ; | exact Hrest

admitted :
mem → registration → Prop
m :
p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
Hstable :
exit_admission_stableadmitted exit_pop_writesp older selected
Hall :
Foralladmittedm entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest
Hentry :
admittedm entry
Hrest :
Foralladmittedm exit_pendingolder ++ exit_registry_pendingrest
Hregions :
m_regionsexit_pop_memorym p older selected = m_regionsm
Haux :
m_auxexit_pop_memorym p older selected = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a
Htransport :
∀item : registration, admittedm item → admittedexit_pop_memorym p older selected item
⊢
∀a : registration, admittedm a → admittedexit_pop_memorym p older selected a

intros item Hi

admitted :
mem → registration → Prop
m :
p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
Hstable :
exit_admission_stableadmitted exit_pop_writesp older selected
Hall :
Foralladmittedm entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest
Hentry :
admittedm entry
Hrest :
Foralladmittedm exit_pendingolder ++ exit_registry_pendingrest
Hregions :
m_regionsexit_pop_memorym p older selected = m_regionsm
Haux :
m_auxexit_pop_memorym p older selected = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a
Htransport :
∀item : registration, admittedm item → admittedexit_pop_memorym p older selected item
Hi :
admittedm item
⊢
admittedexit_pop_memorym p older selected item

apply Htransport

admitted :
mem → registration → Prop
m :
p :
older :
selected :
rest :
Hslot :
exit_slot_pendingselected = entry
Hstable :
exit_admission_stableadmitted exit_pop_writesp older selected
Hall :
Foralladmittedm entry :: exit_registry_pendingblock_ptr ≔ p; block_slots ≔ older :: rest
Hentry :
admittedm entry
Hrest :
Foralladmittedm exit_pendingolder ++ exit_registry_pendingrest
Hregions :
m_regionsexit_pop_memorym p older selected = m_regionsm
Haux :
m_auxexit_pop_memorym p older selected = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesp older selected ∧ span_containsroot a → m_bytesexit_pop_memorym p older selected a = m_bytesm a
Htransport :
∀item : registration, admittedm item → admittedexit_pop_memorym p older selected item
Hi :
admittedm item
⊢
admittedm item

exact Hi

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros admitted m p older selected rest entry Hslot Hstable Hall _
rewrite exit_pop_pendingp older selected rest entry Hslot in Hall
inversion Hall as [ |? ? Hentry Hrest ] ; subst
destruct exit_pop_framem p older selected as Hregions Haux Hbytes
assert Htransport : ∀item, admittedm item → admittedexit_pop_memorym p older selected item
{apply Hstable ; assumption
split ; | apply Htransport ; exact Hentry
eapply Forall_impl ; | exact Hrest
intros item Hi
apply Htransport
exact Hi

Construction uses the existing bounded-write effects, with no allocations or releases. Both the index-only prefix and cxa's final prefix are valid.

526Module ExitPopOn R : Runtime M : ExternalMachineSigR
527Module E ≔ M.E

Writable roots survive these stores because their regions do not change.

530Lemma pop_effects
∀ sources s m p older selected
Forallwritable_spanm exit_pop_writesp older selected
E.effectssources exit_pop_writesp older selected [ ] λ_ _ ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]
Explore proof 23 tactics

Initial goal

⊢
∀sources : listspan s : R.state m : mem p : ptr older : listexit_slot selected : exit_slot, Forallwritable_spanm exit_pop_writesp older selected → E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

intros sources s m p older selected Hw

sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

assert Hindex : local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older

2 open

sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
⊢
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
focused goal
sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hindex :
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

{apply local_store_bytes

2 open

sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
⊢
∀b : Z, ptr_addrp + 8 ≤ b < ptr_addrp + 8 + 8 → write_authorityexit_pop_writesp older selected [ ] m b
deferred goal
sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hindex :
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

intros a Ha

2 open

sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
a :
Z
Ha :
ptr_addrp + 8 ≤ a < ptr_addrp + 8 + 8
⊢
write_authorityexit_pop_writesp older selected [ ] m a
deferred goal
sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hindex :
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

left

2 open

sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
a :
Z
Ha :
ptr_addrp + 8 ≤ a < ptr_addrp + 8 + 8
⊢
∃s0 : span, Ins0 exit_pop_writesp older selected ∧ writable_spanm s0 ∧ span_containss0 a
deferred goal
sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hindex :
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

exists mkSpanmkPtrptr_addrp + 8 ptr_capp 8

2 open

sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
a :
Z
Ha :
ptr_addrp + 8 ≤ a < ptr_addrp + 8 + 8
⊢
Inspan_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 exit_pop_writesp older selected ∧ writable_spanm span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 ∧ span_containsspan_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 a
deferred goal
sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hindex :
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

split ; left ; reflexivity |

2 open

sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
a :
Z
Ha :
ptr_addrp + 8 ≤ a < ptr_addrp + 8 + 8
⊢
writable_spanm span_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 ∧ span_containsspan_ptr ≔ ptr_addr ≔ ptr_addrp + 8; ptr_cap ≔ ptr_capp; span_size ≔ 8 a
deferred goal
sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hindex :
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

split ; inversion Hw ; assumption | exact Ha

deferred goal
sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hindex :
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

assert Hprefix : E.effectssources exit_pop_writesp older selected [ ] λ_ _ ⇒ False s m [ ] s exit_pop_indexm p older [ ]

2 open

sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hindex :
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
focused goal
sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hindex :
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

{eapply E.effects_local ; exact Hindex | constructor

deferred goal
sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hindex :
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ] ∧ E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

split ; exact Hprefix |

sources :
listspan
s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hindex :
local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
⊢
E.effectssources exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]

destruct selected ; try exact Hprefix

sources :
listspan
s :
R.state
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hw :
Forallwritable_spanm exit_pop_writesp older CxaSlottoken symbol function argument dso
Hindex :
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
⊢
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older CxaSlottoken symbol function argument dso [ ]

eapply E.effects_local ; exact Hindex |

sources :
listspan
s :
R.state
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hw :
Forallwritable_spanm exit_pop_writesp older CxaSlottoken symbol function argument dso
Hindex :
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
⊢
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s exit_pop_indexm p older [ ] s exit_pop_memorym p older CxaSlottoken symbol function argument dso [ ]

eapply E.effects_local ; | constructor

sources :
listspan
s :
R.state
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hw :
Forallwritable_spanm exit_pop_writesp older CxaSlottoken symbol function argument dso
Hindex :
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
⊢
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] exit_pop_indexm p older exit_pop_memorym p older CxaSlottoken symbol function argument dso

apply local_store_bytes

sources :
listspan
s :
R.state
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hw :
Forallwritable_spanm exit_pop_writesp older CxaSlottoken symbol function argument dso
Hindex :
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
⊢
∀b : Z, ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ b < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8 → write_authorityexit_pop_writesp older CxaSlottoken symbol function argument dso [ ] exit_pop_indexm p older b

intros a Ha

sources :
listspan
s :
R.state
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hw :
Forallwritable_spanm exit_pop_writesp older CxaSlottoken symbol function argument dso
Hindex :
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
⊢
write_authorityexit_pop_writesp older CxaSlottoken symbol function argument dso [ ] exit_pop_indexm p older a

left

sources :
listspan
s :
R.state
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hw :
Forallwritable_spanm exit_pop_writesp older CxaSlottoken symbol function argument dso
Hindex :
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
⊢
∃s0 : span, Ins0 exit_pop_writesp older CxaSlottoken symbol function argument dso ∧ writable_spanexit_pop_indexm p older s0 ∧ span_containss0 a

exists mkSpanmkPtrptr_addrp + 16 + 32 × Z.of_natlengtholder ptr_capp 8

sources :
listspan
s :
R.state
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hw :
Forallwritable_spanm exit_pop_writesp older CxaSlottoken symbol function argument dso
Hindex :
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
⊢
Inspan_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 exit_pop_writesp older CxaSlottoken symbol function argument dso ∧ writable_spanexit_pop_indexm p older span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 ∧ span_containsspan_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 a

split ; right ; left ; reflexivity |

sources :
listspan
s :
R.state
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hw :
Forallwritable_spanm exit_pop_writesp older CxaSlottoken symbol function argument dso
Hindex :
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
⊢
writable_spanexit_pop_indexm p older span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 ∧ span_containsspan_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8 a

split ; | exact Ha

sources :
listspan
s :
R.state
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hw :
Forallwritable_spanm exit_pop_writesp older CxaSlottoken symbol function argument dso
Hindex :
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
⊢
writable_spanexit_pop_indexm p older span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8

change writable_spanm mkSpanmkPtrptr_addrp + 16 + 32 × Z.of_natlengtholder ptr_capp 8

sources :
listspan
s :
R.state
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hw :
Forallwritable_spanm exit_pop_writesp older CxaSlottoken symbol function argument dso
Hindex :
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
⊢
writable_spanm span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8

inversion Hw as [ |? ? _ Htail ] ; subst

sources :
listspan
s :
R.state
m :
p :
older :
token :
nat
symbol :
function, argument, dso :
Hw :
Forallwritable_spanm exit_pop_writesp older CxaSlottoken symbol function argument dso
Hindex :
local_effectsources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] [ ] m exit_pop_indexm p older
Hprefix :
E.effectssources exit_pop_writesp older CxaSlottoken symbol function argument dso [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
a :
Z
Ha :
ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder ≤ a < ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder + 8
Htail :
Forallwritable_spanm span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + match Z.of_natDatatypes.lengtholder with 0 ⇒ 0 | Z.posy′ ⇒ Z.posy′~0~0~0~0~0 | Z.negy′ ⇒ Z.negy′~0~0~0~0~0 end; ptr_cap ≔ ptr_capp; span_size ≔ 8
⊢
writable_spanm span_ptr ≔ ptr_addr ≔ ptr_addrp + 16 + 32 × Z.of_natDatatypes.lengtholder; ptr_cap ≔ ptr_capp; span_size ≔ 8

inversion Htail ; assumption

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros sources s m p older selected Hw
assert Hindex : local_effectsources exit_pop_writesp older selected [ ] [ ] m exit_pop_indexm p older
intros a Ha
left
split ; left ; reflexivity |
split ; inversion Hw ; assumption | exact Ha
assert Hprefix : E.effectssources exit_pop_writesp older selected [ ] λ_ _ ⇒ False s m [ ] s exit_pop_indexm p older [ ]
{eapply E.effects_local ; exact Hindex | constructor
split ; exact Hprefix |
destruct selected ; try exact Hprefix
eapply E.effects_local ; exact Hindex |
eapply E.effects_local ; | constructor
intros a Ha
left
exists mkSpanmkPtrptr_addrp + 16 + 32 × Z.of_natlengtholder ptr_capp 8
split ; right ; left ; reflexivity |
split ; | exact Ha
change writable_spanm mkSpanmkPtrptr_addrp + 16 + 32 × Z.of_natlengtholder ptr_capp 8
inversion Hw as [ |? ? _ Htail ] ; subst
inversion Htail ; assumption

Any runtime stays ready and every identity persists at both constructed cutpoints. No behavior of generic runtime free is used.

557Theorem pop_preserves
∀ s m p older selected
Forallwritable_spanm exit_pop_writesp older selected
R.readys m
R.readys exit_pop_indexm p older ∧ persistsm exit_pop_indexm p older ∧ R.readys exit_pop_memorym p older selected ∧ persistsm exit_pop_memorym p older selected
Explore proof 3 tactics

Initial goal

⊢
∀s : R.state m : mem p : ptr older : listexit_slot selected : exit_slot, Forallwritable_spanm exit_pop_writesp older selected → R.readys m → R.readys exit_pop_indexm p older ∧ persistsm exit_pop_indexm p older ∧ R.readys exit_pop_memorym p older selected ∧ persistsm exit_pop_memorym p older selected

intros s m p older selected Hw Hr

s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hr :
R.readys m
⊢
R.readys exit_pop_indexm p older ∧ persistsm exit_pop_indexm p older ∧ R.readys exit_pop_memorym p older selected ∧ persistsm exit_pop_memorym p older selected

destruct pop_effects[ ] s m p older selected Hw as Hindex Hpop

s :
R.state
m :
p :
older :
selected :
Hw :
Forallwritable_spanm exit_pop_writesp older selected
Hr :
R.readys m
Hindex :
E.effects[ ] exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_indexm p older [ ]
Hpop :
E.effects[ ] exit_pop_writesp older selected [ ] λ_ _ : Z ⇒ False s m [ ] s exit_pop_memorym p older selected [ ]
⊢
R.readys exit_pop_indexm p older ∧ persistsm exit_pop_indexm p older ∧ R.readys exit_pop_memorym p older selected ∧ persistsm exit_pop_memorym p older selected

split ; eapply E.effects_preserve ; eauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros s m p older selected Hw Hr
destruct pop_effects[ ] s m p older selected Hw as Hindex Hpop
split ; eapply E.effects_preserve ; eauto

Standalone wrapper; composition clients supply their exact machine.

570Module ExitPop R : Runtime
571Module M ≔ ExternalMachine R
Include ExitPopOn R M

Unlinking an exhausted head, without retirement

The actual pointer store also installs the successor's capability. A last node is unlinked to null, not freed or kept in the chain.

This is head-cell separation, unlike pop's modified-block separation.

Unlink changes only eight head bytes and the head's own shadow cell; every region, including the removed block's lifetime, is unchanged.

Explore proof 17 tactics

Initial goal

⊢
∀m : mem head : ptr rest : listexit_block, m_regionsexit_unlink_memorym head rest = m_regionsm ∧ ∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a ∧ ∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

intros m head rest

m :
head :
rest :
⊢
m_regionsexit_unlink_memorym head rest = m_regionsm ∧ ∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a ∧ ∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

split ; reflexivity |

m :
head :
rest :
⊢
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a ∧ ∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

split

2 open

m :
head :
rest :
⊢
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
focused goal
m :
head :
rest :
⊢
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

–intros a Hout

2 open

m :
head :
rest :
a :
Z
Hout :
a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a
⊢
deferred goal
m :
head :
rest :
⊢
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

unfold exit_unlink_memory , startup_store

2 open

m :
head :
rest :
a :
Z
Hout :
a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a
deferred goal
m :
head :
rest :
⊢
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

simpl

2 open

m :
head :
rest :
a :
Z
Hout :
a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a
⊢
ptr_addrhead ≤? a && a <? ptr_addrhead + 8
→
else
=
deferred goal
m :
head :
rest :
⊢
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

destruct ptr_addrhead ≤? a && a <? ptr_addrhead + 8 eqn: E ; | reflexivity

2 open

m :
head :
rest :
a :
Z
Hout :
a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a
E :
ptr_addrhead ≤? a && a <? ptr_addrhead + 8 = true
⊢
deferred goal
m :
head :
rest :
⊢
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

apply andb_true_iff in E as Hlo Hhi

2 open

m :
head :
rest :
a :
Z
Hout :
a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a
Hlo :
ptr_addrhead ≤? a = true
Hhi :
a <? ptr_addrhead + 8 = true
⊢
deferred goal
m :
head :
rest :
⊢
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

apply Z.leb_le in Hlo

2 open

m :
head :
rest :
a :
Z
Hout :
a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a
Hlo :
ptr_addrhead ≤ a
Hhi :
a <? ptr_addrhead + 8 = true
⊢
deferred goal
m :
head :
rest :
⊢
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

apply Z.ltb_lt in Hhi

2 open

m :
head :
rest :
a :
Z
Hout :
a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a
Hlo :
ptr_addrhead ≤ a
Hhi :
a < ptr_addrhead + 8
⊢
deferred goal
m :
head :
rest :
⊢
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

lia

deferred goal
m :
head :
rest :
⊢
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

–intros a Hneq

m :
head :
rest :
a :
Z
Hneq :
a ≠ ptr_addrhead
⊢
m_auxexit_unlink_memorym head rest a = m_auxm a

unfold exit_unlink_memory , startup_store

m :
head :
rest :
a :
Z
Hneq :
a ≠ ptr_addrhead

simpl

m :
head :
rest :
a :
Z
Hneq :
a ≠ ptr_addrhead
⊢
a =? ptr_addrhead
→
else
=

assert a =? ptr_addrhead = false as E by apply Z.eqb_neq ; exact Hneq

m :
head :
rest :
a :
Z
Hneq :
a ≠ ptr_addrhead
E :
a =? ptr_addrhead = false
⊢
a =? ptr_addrhead
→
else
=

rewrite E

m :
head :
rest :
a :
Z
Hneq :
a ≠ ptr_addrhead
E :
a =? ptr_addrhead = false
⊢
m_auxm a = m_auxm a

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m head rest
split ; reflexivity |
split
–intros a Hout
simpl
destruct ptr_addrhead ≤? a && a <? ptr_addrhead + 8 eqn: E ; | reflexivity
apply andb_true_iff in E as Hlo Hhi
apply Z.leb_le in Hlo
apply Z.ltb_lt in Hhi
lia
–intros a Hneq
simpl
assert a =? ptr_addrhead = false as E by apply Z.eqb_neq ; exact Hneq
rewrite E
reflexivity

The successor capability comes from the original checked next slot, not from the head's old capability or the successor's address bits.

606Lemma exit_next_authority
∀ m block next
exit_block_memorym block next
Explore proof 20 tactics

Initial goal

⊢
∀m : mem block : exit_block next : ptr, exit_block_memorym block next → available_capspan_ptr ≔ block_ptrblock; span_size ≔ 1040 [ ] m ptr_capnext

intros m block next Hblock

m :
block :
next :
Hblock :
exit_block_memorym block next
⊢
available_capspan_ptr ≔ block_ptrblock; span_size ≔ 1040 [ ] m ptr_capnext

destruct Hblock as Hcap & Hread & Hnext & Htail

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
available_capspan_ptr ≔ block_ptrblock; span_size ≔ 1040 [ ] m ptr_capnext

right

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
∃s : span, Ins span_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ ptr_capnext = ptr_capspan_ptrs ∨ ∃s : span a : Z, Ins span_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ span_containss a ∧ a + 8 ≤ ptr_addrspan_ptrs + span_sizes ∧ access_resm a ptr_capspan_ptrs 8 Read 8 = Someok ∧ ptr_capnext = m_auxm a ∨ ∃base : Z, Inbase [ ] ∧ ptr_capnext = Objbase ∨ ptr_capnext = Robase

right

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
∃s : span a : Z, Ins span_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ span_containss a ∧ a + 8 ≤ ptr_addrspan_ptrs + span_sizes ∧ access_resm a ptr_capspan_ptrs 8 Read 8 = Someok ∧ ptr_capnext = m_auxm a ∨ ∃base : Z, Inbase [ ] ∧ ptr_capnext = Objbase ∨ ptr_capnext = Robase

left

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
∃s : span a : Z, Ins span_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ span_containss a ∧ a + 8 ≤ ptr_addrspan_ptrs + span_sizes ∧ access_resm a ptr_capspan_ptrs 8 Read 8 = Someok ∧ ptr_capnext = m_auxm a

exists mkSpanblock_ptrblock 1040, ptr_addrblock_ptrblock

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
Inspan_ptr ≔ block_ptrblock; span_size ≔ 1040 span_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ span_containsspan_ptr ≔ block_ptrblock; span_size ≔ 1040 ptr_addrblock_ptrblock ∧ ptr_addrblock_ptrblock + 8 ≤ ptr_addrspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 + span_sizespan_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ access_resm ptr_addrblock_ptrblock ptr_capspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 8 Read 8 = Someok ∧ ptr_capnext = m_auxm ptr_addrblock_ptrblock

split ; left ; reflexivity |

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
span_containsspan_ptr ≔ block_ptrblock; span_size ≔ 1040 ptr_addrblock_ptrblock ∧ ptr_addrblock_ptrblock + 8 ≤ ptr_addrspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 + span_sizespan_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ access_resm ptr_addrblock_ptrblock ptr_capspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 8 Read 8 = Someok ∧ ptr_capnext = m_auxm ptr_addrblock_ptrblock

split ; unfold span_contains ; simpl ; lia |

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
ptr_addrblock_ptrblock + 8 ≤ ptr_addrspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 + span_sizespan_ptr ≔ block_ptrblock; span_size ≔ 1040 ∧ access_resm ptr_addrblock_ptrblock ptr_capspan_ptrspan_ptr ≔ block_ptrblock; span_size ≔ 1040 8 Read 8 = Someok ∧ ptr_capnext = m_auxm ptr_addrblock_ptrblock

split ; simpl ; lia |

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

split

2 open

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
focused goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

–replace ptr_addrblock_ptrblock with ptr_addrblock_ptrblock + 0 at 1 by lia

2 open

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

eapply exit_block_field_access with block := block next := next off := 0

5 open

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
exit_block_memorym block next
focused goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 ≤ 0
focused goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 + 8 ≤ 1040
focused goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 mod 8 = 0
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

+split ; exact Hcap |

5 open

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
access_resm ptr_addrblock_ptrblock ptr_capblock_ptrblock 1040 Read 8 = Someok ∧ pointer_slotm ptr_addrblock_ptrblock next ∧ load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 ≤ 0
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 + 8 ≤ 1040
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 mod 8 = 0
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

split ; exact Hread |

5 open

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
pointer_slotm ptr_addrblock_ptrblock next ∧ load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 ≤ 0
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 + 8 ≤ 1040
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 mod 8 = 0
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

split ; assumption

4 open

deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 ≤ 0
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 + 8 ≤ 1040
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 mod 8 = 0
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

+lia

3 open

deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 + 8 ≤ 1040
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 mod 8 = 0
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

+lia

2 open

deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
⊢
0 mod 8 = 0
deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

+reflexivity

deferred goal
m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

–symmetry

m :
block :
next :
Hread :
Htail :
load_bytesm ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

exact proj2proj2Hnext

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m block next Hblock
destruct Hblock as Hcap & Hread & Hnext & Htail
right
right
left
exists mkSpanblock_ptrblock 1040, ptr_addrblock_ptrblock
split ; left ; reflexivity |
split ; unfold span_contains ; simpl ; lia |
split ; simpl ; lia |
split
–replace ptr_addrblock_ptrblock with ptr_addrblock_ptrblock + 0 at 1 by lia
eapply exit_block_field_access with block := block next := next off := 0
+split ; exact Hcap |
split ; exact Hread |
split ; assumption
+lia
+lia
+reflexivity
–symmetry
exact proj2proj2Hnext

Writable head authority plus the original aligned read permits the native aligned store; neither premise is inferred from stored bytes.

Explore proof 4 tactics

Initial goal

⊢
∀m : mem head : ptr, writable_spanm span_ptr ≔ head; span_size ≔ 8 → access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok → access_resm ptr_addrhead ptr_caphead 8 Write 8 = Someok

intros m head _ & base & reg & Hcap & _ Hread

m :
head :
base :
Z
reg :
Hcap :
ptr_capspan_ptrspan_ptr ≔ head; span_size ≔ 8 = Objbase
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
⊢
access_resm ptr_addrhead ptr_caphead 8 Write 8 = Someok

simpl in Hcap

m :
head :
base :
Z
reg :
Hcap :
ptr_caphead = Objbase
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
⊢
access_resm ptr_addrhead ptr_caphead 8 Write 8 = Someok

rewrite Hcap in *

m :
head :
base :
Z
reg :
Hcap :
ptr_caphead = Objbase
Hread :
access_resm ptr_addrhead Objbase 8 Read 8 = Someok
⊢
access_resm ptr_addrhead Objbase 8 Write 8 = Someok

exact Hread

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m head _ & base & reg & Hcap & _ Hread
simpl in Hcap
rewrite Hcap in *
exact Hread

Exact local frames preserve the old chain, including the detached node, when every represented block is separated from the head store.

Explore proof 13 tactics

Initial goal

⊢
∀m : mem head : ptr rest blocks : listexit_block, exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks

intros m head rest blocks Hchain Hsep

m :
head :
rest, blocks :
Hchain :
Hsep :

destruct exit_unlink_framem head rest as Hregions Hbytes Haux

m :
head :
rest, blocks :
Hchain :
Hsep :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a

induction blocks as | block blocks IH ; exact I |

m :
head :
rest :
block :
blocks :
Hchain :
exit_chain_memorym block :: blocks
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
⊢
exit_chain_memoryexit_unlink_memorym head rest block :: blocks

destruct Hchain as Hblock Hchain

m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
⊢
exit_chain_memoryexit_unlink_memorym head rest block :: blocks

inversion Hsep as [ |? ? Hdis Htail ] ; subst

m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
Hdis :
ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead
Htail :
Forallλblock : exit_block ⇒ ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead blocks
⊢
exit_chain_memoryexit_unlink_memorym head rest block :: blocks

split ; | apply IH ; assumption

m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
Hdis :
ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead
Htail :
Forallλblock : exit_block ⇒ ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead blocks

apply exit_block_memory_agreem ; exact Hregions | | | exact Hblock

2 open

m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
Hdis :
ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead
Htail :
Forallλblock : exit_block ⇒ ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead blocks
⊢
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_auxexit_unlink_memorym head rest a = m_auxm a
focused goal
m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
Hdis :
ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead
Htail :
Forallλblock : exit_block ⇒ ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead blocks
⊢
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesexit_unlink_memorym head rest a = m_bytesm a

–intros a Ha

2 open

m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
Hdis :
ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead
Htail :
Forallλblock : exit_block ⇒ ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead blocks
a :
Z
Ha :
ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040
⊢
m_auxexit_unlink_memorym head rest a = m_auxm a
deferred goal
m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
Hdis :
ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead
Htail :
Forallλblock : exit_block ⇒ ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead blocks
⊢
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesexit_unlink_memorym head rest a = m_bytesm a

apply Haux

2 open

m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
Hdis :
ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead
Htail :
Forallλblock : exit_block ⇒ ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead blocks
a :
Z
Ha :
ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040
⊢
a ≠ ptr_addrhead
deferred goal
m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
Hdis :
ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead
Htail :
Forallλblock : exit_block ⇒ ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead blocks
⊢
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesexit_unlink_memorym head rest a = m_bytesm a

lia

deferred goal
m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
Hdis :
ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead
Htail :
Forallλblock : exit_block ⇒ ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead blocks
⊢
∀a : Z, ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040 → m_bytesexit_unlink_memorym head rest a = m_bytesm a

–intros a Ha

m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
Hdis :
ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead
Htail :
Forallλblock : exit_block ⇒ ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead blocks
a :
Z
Ha :
ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040
⊢

apply Hbytes

m :
head :
rest :
block :
blocks :
Hblock :
Hchain :
Hsep :
exit_unlink_separatedhead block :: blocks
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
IH :
exit_chain_memorym blocks → exit_unlink_separatedhead blocks → exit_chain_memoryexit_unlink_memorym head rest blocks
Hdis :
ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead
Htail :
Forallλblock : exit_block ⇒ ptr_addrhead + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrhead blocks
a :
Z
Ha :
ptr_addrblock_ptrblock ≤ a < ptr_addrblock_ptrblock + 1040
⊢
a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m head rest blocks Hchain Hsep
destruct exit_unlink_framem head rest as Hregions Hbytes Haux
induction blocks as | block blocks IH ; exact I |
destruct Hchain as Hblock Hchain
inversion Hsep as [ |? ? Hdis Htail ] ; subst
split ; | apply IH ; assumption
apply exit_block_memory_agreem ; exact Hregions | | | exact Hblock
–intros a Ha
apply Haux
lia
–intros a Ha
apply Hbytes
lia

Removing an exhausted head preserves the checked suffix and the detached block's view. No free, done flag, lock change or cleanup action occurs.

Explore proof 9 tactics

Initial goal

⊢
∀m : mem head p : ptr rest : listexit_block, exit_registry_memorym head block_ptr ≔ p; block_slots ≔ [ ] :: rest → exit_unlink_separatedhead block_ptr ≔ p; block_slots ≔ [ ] :: rest → exit_registry_memoryexit_unlink_memorym head rest head rest ∧ exit_block_memoryexit_unlink_memorym head rest block_ptr ≔ p; block_slots ≔ [ ] exit_headrest

intros m head p rest Hread & Hhead & Hchain & Hdistinct Hsep

m :
head, p :
rest :
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
Hhead :
pointer_slotm ptr_addrhead exit_headblock_ptr ≔ p; block_slots ≔ [ ] :: rest
Hchain :
exit_chain_memorym block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hsep :
exit_unlink_separatedhead block_ptr ≔ p; block_slots ≔ [ ] :: rest

destruct exit_unlink_chain_representedm head rest mkExitBlockp [ ] :: rest Hchain Hsep as Hdetached Hsuffix

m :
head, p :
rest :
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
Hhead :
pointer_slotm ptr_addrhead exit_headblock_ptr ≔ p; block_slots ≔ [ ] :: rest
Hchain :
exit_chain_memorym block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hsep :
exit_unlink_separatedhead block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdetached :
Hsuffix :
fix exit_chain_memory m : mem blocks : listexit_block {struct blocks} : Prop ≔
match blocks with
[ ]
⇒
True
block :: rest
⇒
exit_block_memorym block exit_headrest ∧ exit_chain_memorym rest
exit_unlink_memorym head rest rest

split ; | exact Hdetached

m :
head, p :
rest :
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
Hhead :
pointer_slotm ptr_addrhead exit_headblock_ptr ≔ p; block_slots ≔ [ ] :: rest
Hchain :
exit_chain_memorym block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hsep :
exit_unlink_separatedhead block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdetached :
Hsuffix :
fix exit_chain_memory m : mem blocks : listexit_block {struct blocks} : Prop ≔
match blocks with
[ ]
⇒
True
block :: rest
⇒
exit_block_memorym block exit_headrest ∧ exit_chain_memorym rest
exit_unlink_memorym head rest rest

split ; exact Hread |

m :
head, p :
rest :
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
Hhead :
pointer_slotm ptr_addrhead exit_headblock_ptr ≔ p; block_slots ≔ [ ] :: rest
Hchain :
exit_chain_memorym block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hsep :
exit_unlink_separatedhead block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdetached :
Hsuffix :
fix exit_chain_memory m : mem blocks : listexit_block {struct blocks} : Prop ≔
match blocks with
[ ]
⇒
True
block :: rest
⇒
exit_block_memorym block exit_headrest ∧ exit_chain_memorym rest
exit_unlink_memorym head rest rest
⊢
pointer_slotexit_unlink_memorym head rest ptr_addrhead exit_headrest ∧ exit_chain_memoryexit_unlink_memorym head rest rest ∧ NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock rest

split

2 open

m :
head, p :
rest :
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
Hhead :
pointer_slotm ptr_addrhead exit_headblock_ptr ≔ p; block_slots ≔ [ ] :: rest
Hchain :
exit_chain_memorym block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hsep :
exit_unlink_separatedhead block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdetached :
Hsuffix :
fix exit_chain_memory m : mem blocks : listexit_block {struct blocks} : Prop ≔
match blocks with
[ ]
⇒
True
block :: rest
⇒
exit_block_memorym block exit_headrest ∧ exit_chain_memorym rest
exit_unlink_memorym head rest rest
focused goal
m :
head, p :
rest :
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
Hhead :
pointer_slotm ptr_addrhead exit_headblock_ptr ≔ p; block_slots ≔ [ ] :: rest
Hchain :
exit_chain_memorym block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hsep :
exit_unlink_separatedhead block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdetached :
Hsuffix :
fix exit_chain_memory m : mem blocks : listexit_block {struct blocks} : Prop ≔
match blocks with
[ ]
⇒
True
block :: rest
⇒
exit_block_memorym block exit_headrest ∧ exit_chain_memorym rest
exit_unlink_memorym head rest rest
⊢
exit_chain_memoryexit_unlink_memorym head rest rest ∧ NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock rest

–apply pointer_slot_written

2 open

m :
head, p :
rest :
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
Hhead :
pointer_slotm ptr_addrhead exit_headblock_ptr ≔ p; block_slots ≔ [ ] :: rest
Hchain :
exit_chain_memorym block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hsep :
exit_unlink_separatedhead block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdetached :
Hsuffix :
fix exit_chain_memory m : mem blocks : listexit_block {struct blocks} : Prop ≔
match blocks with
[ ]
⇒
True
block :: rest
⇒
exit_block_memorym block exit_headrest ∧ exit_chain_memorym rest
exit_unlink_memorym head rest rest
⊢
0 ≤ ptr_addrexit_headrest < 2 ^ 64
deferred goal
m :
head, p :
rest :
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
Hhead :
pointer_slotm ptr_addrhead exit_headblock_ptr ≔ p; block_slots ≔ [ ] :: rest
Hchain :
exit_chain_memorym block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hsep :
exit_unlink_separatedhead block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdetached :
Hsuffix :
fix exit_chain_memory m : mem blocks : listexit_block {struct blocks} : Prop ≔
match blocks with
[ ]
⇒
True
block :: rest
⇒
exit_block_memorym block exit_headrest ∧ exit_chain_memorym rest
exit_unlink_memorym head rest rest
⊢
exit_chain_memoryexit_unlink_memorym head rest rest ∧ NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock rest

exact proj1proj1proj2proj2proj1Hchain

deferred goal
m :
head, p :
rest :
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
Hhead :
pointer_slotm ptr_addrhead exit_headblock_ptr ≔ p; block_slots ≔ [ ] :: rest
Hchain :
exit_chain_memorym block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hsep :
exit_unlink_separatedhead block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdetached :
Hsuffix :
fix exit_chain_memory m : mem blocks : listexit_block {struct blocks} : Prop ≔
match blocks with
[ ]
⇒
True
block :: rest
⇒
exit_block_memorym block exit_headrest ∧ exit_chain_memorym rest
exit_unlink_memorym head rest rest
⊢
exit_chain_memoryexit_unlink_memorym head rest rest ∧ NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock rest

–split ; exact Hsuffix |

m :
head, p :
rest :
Hread :
access_resm ptr_addrhead ptr_caphead 8 Read 8 = Someok
Hhead :
pointer_slotm ptr_addrhead exit_headblock_ptr ≔ p; block_slots ≔ [ ] :: rest
Hchain :
exit_chain_memorym block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdistinct :
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hsep :
exit_unlink_separatedhead block_ptr ≔ p; block_slots ≔ [ ] :: rest
Hdetached :
Hsuffix :
fix exit_chain_memory m : mem blocks : listexit_block {struct blocks} : Prop ≔
match blocks with
[ ]
⇒
True
block :: rest
⇒
exit_block_memorym block exit_headrest ∧ exit_chain_memorym rest
exit_unlink_memorym head rest rest
⊢
NoDupmapλblock : exit_block ⇒ ptr_addrblock_ptrblock rest

inversion Hdistinct ; assumption

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m head p rest Hread & Hhead & Hchain & Hdistinct Hsep
destruct exit_unlink_chain_representedm head rest mkExitBlockp [ ] :: rest Hchain Hsep as Hdetached Hsuffix
split ; | exact Hdetached
split ; exact Hread |
split
exact proj1proj1proj2proj2proj1Hchain
–split ; exact Hsuffix |
inversion Hdistinct ; assumption

An empty physical node contributes no callback, even when it is last.

Explore proof 1 tactics

Initial goal

⊢
∀p : ptr rest : listexit_block, exit_registry_pendingblock_ptr ≔ p; block_slots ≔ [ ] :: rest = exit_registry_pendingrest

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

Admission may observe the head's old capability, so pop's globally unchanged-shadow premise is insufficient. This rule permits precisely the head store's byte and shadow changes in arbitrary snapshots.

Unlink stutters on pending/active registrations and transports every admission only when its independent pointer-store frame rule holds.

Explore proof 11 tactics

Initial goal

⊢
∀admitted : mem → registration → Prop m : mem head p : ptr rest : listexit_block active : optionregistration, exit_unlink_admission_stableadmitted head → exit_callbacks_admittedadmitted m block_ptr ≔ p; block_slots ≔ [ ] :: rest active → exit_callbacks_admittedadmitted exit_unlink_memorym head rest rest active

intros admitted m head p rest active Hstable Hall Hactive

admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingblock_ptr ≔ p; block_slots ≔ [ ] :: rest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
⊢
exit_callbacks_admittedadmitted exit_unlink_memorym head rest rest active

rewrite exit_unlink_pending in Hall

admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
⊢
exit_callbacks_admittedadmitted exit_unlink_memorym head rest rest active

destruct exit_unlink_framem head rest as Hregions Hbytes Haux

admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
⊢
exit_callbacks_admittedadmitted exit_unlink_memorym head rest rest active

assert Htransport : ∀entry, admittedm entry → admittedexit_unlink_memorym head rest entry

2 open

admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
⊢
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
focused goal
admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
Htransport :
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
⊢
exit_callbacks_admittedadmitted exit_unlink_memorym head rest rest active

{apply Hstable ; assumption

deferred goal
admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
Htransport :
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
⊢
exit_callbacks_admittedadmitted exit_unlink_memorym head rest rest active

split

2 open

admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
Htransport :
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
⊢
Foralladmittedexit_unlink_memorym head rest exit_registry_pendingrest
focused goal
admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
Htransport :
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
⊢
match active with
Someentry
⇒
admittedexit_unlink_memorym head rest entry
None
⇒
True

–eapply Forall_impl ; | exact Hall

2 open

admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
Htransport :
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
⊢
∀a : registration, admittedm a → admittedexit_unlink_memorym head rest a
deferred goal
admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
Htransport :
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
⊢
match active with
Someentry
⇒
admittedexit_unlink_memorym head rest entry
None
⇒
True

intros entry Hi

2 open

admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
Htransport :
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
Hi :
admittedm entry
⊢
admittedexit_unlink_memorym head rest entry
deferred goal
admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
Htransport :
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
⊢
match active with
Someentry
⇒
admittedexit_unlink_memorym head rest entry
None
⇒
True

apply Htransport

2 open

admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
Htransport :
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
Hi :
admittedm entry
⊢
admittedm entry
deferred goal
admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
Htransport :
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
⊢
match active with
Someentry
⇒
admittedexit_unlink_memorym head rest entry
None
⇒
True

exact Hi

deferred goal
admitted :
mem → registration → Prop
m :
head, p :
rest :
active :
Hstable :
Hall :
Foralladmittedm exit_registry_pendingrest
Hactive :
match active with
Someentry
⇒
admittedm entry
None
⇒
True
Hregions :
Hbytes :
∀a : Z, a < ptr_addrhead ∨ ptr_addrhead + 8 ≤ a → m_bytesexit_unlink_memorym head rest a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrhead → m_auxexit_unlink_memorym head rest a = m_auxm a
Htransport :
∀entry : registration, admittedm entry → admittedexit_unlink_memorym head rest entry
⊢
match active with
Someentry
⇒
admittedexit_unlink_memorym head rest entry
None
⇒
True

–destruct active ; apply Htransport ; exact Hactive | exact I

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros admitted m head p rest active Hstable Hall Hactive
rewrite exit_unlink_pending in Hall
destruct exit_unlink_framem head rest as Hregions Hbytes Haux
assert Htransport : ∀entry, admittedm entry → admittedexit_unlink_memorym head rest entry
{apply Hstable ; assumption
split
–eapply Forall_impl ; | exact Hall
intros entry Hi
apply Htransport
exact Hi
–destruct active ; apply Htransport ; exact Hactive | exact I

One actual pointer-store effect over any runtime, with no retirement.

697Module ExitUnlinkOn R : Runtime M : ExternalMachineSigR

The existing external-call effects of the caller's machine.

699Module E ≔ M.E

The source capability is loaded from next; only the head is writable.

Explore proof 9 tactics

Initial goal

⊢
∀s : R.state m : mem head p : ptr rest : listexit_block, exit_block_memorym block_ptr ≔ p; block_slots ≔ [ ] exit_headrest → writable_spanm span_ptr ≔ head; span_size ≔ 8 → E.effectsspan_ptr ≔ p; span_size ≔ 1040 span_ptr ≔ head; span_size ≔ 8 [ ] λ_ _ : Z ⇒ False s m [ ] s exit_unlink_memorym head rest [ ]

intros s m head p rest Hblock Hw

s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
⊢
E.effectsspan_ptr ≔ p; span_size ≔ 1040 span_ptr ≔ head; span_size ≔ 8 [ ] λ_ _ : Z ⇒ False s m [ ] s exit_unlink_memorym head rest [ ]

eapply E.effects_local ; | constructor

s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
⊢
local_effectspan_ptr ≔ p; span_size ≔ 1040 span_ptr ≔ head; span_size ≔ 8 [ ] [ ] m exit_unlink_memorym head rest

apply local_store_pointer

2 open

s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
⊢
∀b : Z, ptr_addrhead ≤ b < ptr_addrhead + 8 → write_authorityspan_ptr ≔ head; span_size ≔ 8 [ ] m b
focused goal
s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
⊢

–intros a Ha

2 open

s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
a :
Z
Ha :
ptr_addrhead ≤ a < ptr_addrhead + 8
⊢
write_authorityspan_ptr ≔ head; span_size ≔ 8 [ ] m a
deferred goal
s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
⊢

left

2 open

s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
a :
Z
Ha :
ptr_addrhead ≤ a < ptr_addrhead + 8
⊢
∃s0 : span, Ins0 span_ptr ≔ head; span_size ≔ 8 ∧ writable_spanm s0 ∧ span_containss0 a
deferred goal
s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
⊢

exists mkSpanhead 8

2 open

s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
a :
Z
Ha :
ptr_addrhead ≤ a < ptr_addrhead + 8
⊢
Inspan_ptr ≔ head; span_size ≔ 8 span_ptr ≔ head; span_size ≔ 8 ∧ writable_spanm span_ptr ≔ head; span_size ≔ 8 ∧ span_containsspan_ptr ≔ head; span_size ≔ 8 a
deferred goal
s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
⊢

split ; left ; reflexivity |

2 open

s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
a :
Z
Ha :
ptr_addrhead ≤ a < ptr_addrhead + 8
⊢
writable_spanm span_ptr ≔ head; span_size ≔ 8 ∧ span_containsspan_ptr ≔ head; span_size ≔ 8 a
deferred goal
s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
⊢

split ; exact Hw | exact Ha

deferred goal
s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
⊢

–exact exit_next_authoritym mkExitBlockp [ ] exit_headrest Hblock

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros s m head p rest Hblock Hw
eapply E.effects_local ; | constructor
–intros a Ha
left
exists mkSpanhead 8
split ; left ; reflexivity |
split ; exact Hw | exact Ha
–exact exit_next_authoritym mkExitBlockp [ ] exit_headrest Hblock

Readiness and identity persistence follow from the constructed effect, not from a claim that libc always reaches or completes this cutpoint.

Explore proof 2 tactics

Initial goal

⊢
∀s : R.state m : mem head p : ptr rest : listexit_block, exit_block_memorym block_ptr ≔ p; block_slots ≔ [ ] exit_headrest → writable_spanm span_ptr ≔ head; span_size ≔ 8 → R.readys m → R.readys exit_unlink_memorym head rest ∧ persistsm exit_unlink_memorym head rest

intros s m head p rest Hblock Hw Hr

s :
R.state
m :
head, p :
rest :
Hblock :
Hw :
writable_spanm span_ptr ≔ head; span_size ≔ 8
Hr :
R.readys m
⊢
R.readys exit_unlink_memorym head rest ∧ persistsm exit_unlink_memorym head rest

eapply E.effects_preserve ; exact unlink_effectss m head p rest Hblock Hw | exact Hr

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros s m head p rest Hblock Hw Hr
eapply E.effects_preserve ; exact unlink_effectss m head p rest Hblock Hw | exact Hr

Standalone wrapper for existing unlink clients.

Concrete model memory checks do not locate the native hidden registry.

734Module ExitMemoryChecks

Two distinct callback forms with asymmetric tokens and arguments.

737Definition oldest: exit_slot ≔
OnSlot10 TAtom"oldest" mkPtr65536 FnTAtom"oldest" mkPtr4096 Obj4096

The newest stored callback has no argument; cxa still stores its null slot.

740Definition newest: exit_slot ≔
CxaSlot11 TAtom"newest" mkPtr65544 FnTAtom"newest" mkPtr0 CNone mkPtr0 CNone

idx=3 describes two installed callbacks separated by a finalized hole.

743Definition block: exit_block ≔

Build actual address bytes and shadow capabilities with existing stores.

746Definition memory: mem ≔
let m ≔ mkMemλ_ ⇒ 0 mkRegion1000 1008 GlobalData Live; mkRegion2048 3088 GlobalData Live; mkRegion4096 4104 Heap Live λ_ ⇒ CNone in
let m ≔ startup_storem 1000 block_ptrblock in
let m ≔ store_bytesm 2056 8 3 in
let m ≔ store_bytesm 2064 8 2 in
let m ≔ startup_storem 2072 mkPtr65536 FnTAtom"oldest" in
let m ≔ startup_storem 2080 mkPtr4096 Obj4096 in
let m ≔ store_bytesm 2128 8 4 in
startup_storem 2136 mkPtr65544 FnTAtom"newest"

The concrete bytes inhabit a checked block view, with idx counting the hole.

Explore proof 9 tactics

Initial goal

split ; reflexivity |

⊢
access_resmemory ptr_addrblock_ptrblock ptr_capblock_ptrblock 1040 Read 8 = Someok ∧ pointer_slotmemory ptr_addrblock_ptrblock ptr_addr ≔ 0; ptr_cap ≔ CNone ∧ load_bytesmemory ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorymemory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

split ; reflexivity |

⊢
pointer_slotmemory ptr_addrblock_ptrblock ptr_addr ≔ 0; ptr_cap ≔ CNone ∧ load_bytesmemory ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorymemory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

split

2 open

focused goal
⊢
load_bytesmemory ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorymemory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

–vm_compute

2 open

⊢
Datatypes.Eq = Datatypes.Gt → False ∧ Datatypes.Lt = Datatypes.Lt ∧ 0 = 0 ∧ CNone = CNone
deferred goal
⊢
load_bytesmemory ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorymemory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

repeat split ; congruence

deferred goal
⊢
load_bytesmemory ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorymemory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

–split ; reflexivity |

⊢
Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorymemory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

split ; simpl ; lia |

⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorymemory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

intros i slot Hi

i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
⊢
exit_slot_memorymemory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot

destruct i as | | | i ; simpl in Hi ; try destruct i ; discriminate Hi ; injection Hi as ← ; vm_compute ; repeat split ; congruence

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; reflexivity |
split ; reflexivity |
split
–vm_compute
repeat split ; congruence
–split ; reflexivity |
split ; simpl ; lia |
intros i slot Hi
destruct i as | | | i ; simpl in Hi ; try destruct i ; discriminate Hi ; injection Hi as ← ; vm_compute ; repeat split ; congruence

A readable head and a distinct, null-terminated chain inhabit the registry view.

769Example registry_represented: exit_registry_memorymemory mkPtr1000 Obj1000 block
Explore proof 8 tactics

Initial goal

split ; reflexivity |

split

2 open

focused goal
⊢
exit_chain_memorymemory block ∧ NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block

–vm_compute

2 open

⊢
Datatypes.Lt = Datatypes.Gt → False ∧ Datatypes.Lt = Datatypes.Lt ∧ 2048 = 2048 ∧ Obj2048 = Obj2048
deferred goal
⊢
exit_chain_memorymemory block ∧ NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block

repeat split ; congruence

deferred goal
⊢
exit_chain_memorymemory block ∧ NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block

–split ; split ; exact block_represented | exact I |

⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block

repeat constructor

simpl

⊢
¬False

tauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; reflexivity |
split
–vm_compute
repeat split ; congruence
–split ; split ; exact block_represented | exact I |
repeat constructor
simpl
tauto

A head block precedes an older block; both scan backward and skip holes.

Explore proof 1 tactics

Initial goal

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

After decreasing idx the former newest slot is outside the pending scan. Even replacing its argument capability with nonsense does not invalidate this shorter registry view. Active callback evidence is independent.

789Example stale_payload_above_idx_ignored: exit_block_memorystore_auxstore_bytesmemory 2056 8 2 2144 Obj9999 mkExitBlockblock_ptrblock oldest; FreeSlot mkPtr0 CNone
Explore proof 9 tactics

Initial goal

split ; reflexivity |

split ; reflexivity |

split

2 open

focused goal
⊢
load_bytesstore_auxstore_bytesmemory 2056 8 2 2144 Obj9999 ptr_addrblock_ptrblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot ∧ Datatypes.lengthblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot i = Someslot → exit_slot_memorystore_auxstore_bytesmemory 2056 8 2 2144 Obj9999 ptr_addrblock_ptrblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot + 16 + 32 × Z.of_nati slot

–vm_compute

2 open

⊢
Datatypes.Eq = Datatypes.Gt → False ∧ Datatypes.Lt = Datatypes.Lt ∧ 0 = 0 ∧ CNone = CNone
deferred goal
⊢
load_bytesstore_auxstore_bytesmemory 2056 8 2 2144 Obj9999 ptr_addrblock_ptrblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot ∧ Datatypes.lengthblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot i = Someslot → exit_slot_memorystore_auxstore_bytesmemory 2056 8 2 2144 Obj9999 ptr_addrblock_ptrblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot + 16 + 32 × Z.of_nati slot

repeat split ; congruence

deferred goal
⊢
load_bytesstore_auxstore_bytesmemory 2056 8 2 2144 Obj9999 ptr_addrblock_ptrblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot ∧ Datatypes.lengthblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot i = Someslot → exit_slot_memorystore_auxstore_bytesmemory 2056 8 2 2144 Obj9999 ptr_addrblock_ptrblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot + 16 + 32 × Z.of_nati slot

–split ; reflexivity |

⊢
Datatypes.lengthblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot i = Someslot → exit_slot_memorystore_auxstore_bytesmemory 2056 8 2 2144 Obj9999 ptr_addrblock_ptrblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot + 16 + 32 × Z.of_nati slot

split ; simpl ; lia |

⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot i = Someslot → exit_slot_memorystore_auxstore_bytesmemory 2056 8 2 2144 Obj9999 ptr_addrblock_ptrblock_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot + 16 + 32 × Z.of_nati slot

intros i slot Hi

i :
nat
slot :
Hi :

destruct i as | | i ; simpl in Hi ; try destruct i ; discriminate Hi ; injection Hi as ← ; vm_compute ; repeat split ; congruence

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; reflexivity |
split ; reflexivity |
split
–vm_compute
repeat split ; congruence
–split ; reflexivity |
split ; simpl ; lia |
intros i slot Hi
destruct i as | | i ; simpl in Hi ; try destruct i ; discriminate Hi ; injection Hi as ← ; vm_compute ; repeat split ; congruence

Correct next-pointer bits cannot compensate for its wrong capability.

Explore proof 2 tactics

Initial goal

intros _ & _ & _ & _ & Haux & _

discriminate Haux

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros _ & _ & _ & _ & Haux & _
discriminate Haux

Correct function address bits cannot turn an object capability into Fn.

806Example malformed_function_capability_rejected: ¬exit_slot_memorystore_auxmemory 2072 Obj65536 2064 oldest
Explore proof 2 tactics

Initial goal

intros _ & _ & _ & Haux _ & _

Haux :
m_auxstore_auxmemory 2072 Obj65536 2064 + 8 = ptr_capptr_addr ≔ 65536; ptr_cap ≔ FnTAtom"oldest"
⊢
False

discriminate Haux

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros _ & _ & _ & Haux _ & _
discriminate Haux

Unknown flavors are not silently reclassified as holes.

811Example unknown_flavor_rejected: ∀slot, ¬exit_slot_memorystore_bytesmemory 2064 8 99 2064 slot
Explore proof 2 tactics

Initial goal

⊢
∀slot : exit_slot, ¬exit_slot_memorystore_bytesmemory 2064 8 99 2064 slot

intros slot Hslot

slot :
Hslot :
⊢
False

destruct slot ; simpl in Hslot ; try discriminate Hslot ; destruct Hslot as Htag _ ; discriminate Htag

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros slot Hslot
destruct slot ; simpl in Hslot ; try discriminate Hslot ; destruct Hslot as Htag _ ; discriminate Htag

An empty pending chain cannot erase the detached active callback's contract.

819Example detached_callback_still_needs_admission: ∀m entry, exit_callbacks_admittedλ_ _ ⇒ False m [ ] None ∧ ¬exit_callbacks_admittedλ_ _ ⇒ False m [ ] Someentry
Explore proof 4 tactics

Initial goal

⊢
∀m : mem entry : registration, exit_callbacks_admittedλ_ : mem _ : registration ⇒ False m [ ] None ∧ ¬exit_callbacks_admittedλ_ : mem _ : registration ⇒ False m [ ] Someentry

intros m entry

m :
⊢
exit_callbacks_admittedλ_ : mem _ : registration ⇒ False m [ ] None ∧ ¬exit_callbacks_admittedλ_ : mem _ : registration ⇒ False m [ ] Someentry

split ; split ; constructor |

m :
⊢
¬exit_callbacks_admittedλ_ : mem _ : registration ⇒ False m [ ] Someentry

intros _ Hactive

m :
Hactive :
False
⊢
False

exact Hactive

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m entry
split ; split ; constructor |
intros _ Hactive
exact Hactive

A represented Fn capability does not authorize a missing callback contract.

825Example decoded_function_not_admission: exit_registry_memorymemory mkPtr1000 Obj1000 block ∧ ¬exit_callbacks_admittedλ_ _ ⇒ False memory block None
Explore proof 3 tactics

Initial goal

⊢

split ; exact registry_represented |

⊢
¬exit_callbacks_admittedλ_ : mem _ : registration ⇒ False memory block None

intros Hcallbacks _

Hcallbacks :
⊢
False

inversion Hcallbacks ; assumption

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; exact registry_represented |
intros Hcallbacks _
inversion Hcallbacks ; assumption

Cxa removes exactly its newest flavor, leaving older slots and captured function/argument capabilities. Index-only completion is insufficient.

835Example constructed_cxa_pop: let m′ ≔ exit_pop_memorymemory block_ptrblock oldest; FreeSlot newest in load_bytesm′ 2056 8 = 2 ∧ load_bytesm′ 2128 8 = 0 ∧ load_bytesm′ 2064 8 = 2 ∧ pointer_slotm′ 2136 mkPtr65544 FnTAtom"newest" ∧ m_auxm′ = m_auxmemory ∧ exit_registry_memorym′ mkPtr1000 Obj1000 mkExitBlockblock_ptrblock oldest; FreeSlot
Explore proof 8 tactics

Initial goal

⊢
load_bytesm′ 2056 8 = 2 ∧ load_bytesm′ 2128 8 = 0 ∧ load_bytesm′ 2064 8 = 2 ∧ pointer_slotm′ 2136 ptr_addr ≔ 65544; ptr_cap ≔ FnTAtom"newest" ∧ m_auxm′ = m_auxmemory ∧ exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot

intros m′

⊢
load_bytesm′ 2056 8 = 2 ∧ load_bytesm′ 2128 8 = 0 ∧ load_bytesm′ 2064 8 = 2 ∧ pointer_slotm′ 2136 ptr_addr ≔ 65544; ptr_cap ≔ FnTAtom"newest" ∧ m_auxm′ = m_auxmemory ∧ exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot

split ; reflexivity |

⊢
load_bytesm′ 2128 8 = 0 ∧ load_bytesm′ 2064 8 = 2 ∧ pointer_slotm′ 2136 ptr_addr ≔ 65544; ptr_cap ≔ FnTAtom"newest" ∧ m_auxm′ = m_auxmemory ∧ exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot

split ; reflexivity |

⊢
load_bytesm′ 2064 8 = 2 ∧ pointer_slotm′ 2136 ptr_addr ≔ 65544; ptr_cap ≔ FnTAtom"newest" ∧ m_auxm′ = m_auxmemory ∧ exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ block_ptrblock; block_slots ≔ oldest; FreeSlot

split ; reflexivity |

split ; vm_compute ; repeat split ; congruence |

split ; reflexivity |

apply exit_pop_registry_representedmemory mkPtr1000 Obj1000 block_ptrblock oldest; FreeSlot newest [ ] registry_represented

split ; left ; simpl ; lia | constructor

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m′
split ; reflexivity |
split ; reflexivity |
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split ; reflexivity |
split ; left ; simpl ; lia | constructor

Hole and ordinary callback removal decrement idx without clearing payloads.

Explore proof 1 tactics

Initial goal

repeat split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
repeat split ; reflexivity

The narrow cxa roots are independently writable, without permitting any callback argument write or heap release.

Explore proof 8 tactics

Initial goal

constructor

2 open

focused goal
⊢
match newest with
CxaSlot_ _ _ _ _
⇒
span_ptr ≔ ptr_addr ≔ ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengtholdest; FreeSlot; ptr_cap ≔ ptr_capblock_ptrblock; span_size ≔ 8
_
⇒
[ ]

–split ; simpl ; lia |

2 open

deferred goal
⊢
match newest with
CxaSlot_ _ _ _ _
⇒
span_ptr ≔ ptr_addr ≔ ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengtholdest; FreeSlot; ptr_cap ≔ ptr_capblock_ptrblock; span_size ≔ 8
_
⇒
[ ]

exists 2048, mkRegion2048 3088 GlobalData Live

2 open

deferred goal
⊢
match newest with
CxaSlot_ _ _ _ _
⇒
span_ptr ≔ ptr_addr ≔ ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengtholdest; FreeSlot; ptr_cap ≔ ptr_capblock_ptrblock; span_size ≔ 8
_
⇒
[ ]

repeat split ; reflexivity

deferred goal
⊢
match newest with
CxaSlot_ _ _ _ _
⇒
span_ptr ≔ ptr_addr ≔ ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengtholdest; FreeSlot; ptr_cap ≔ ptr_capblock_ptrblock; span_size ≔ 8
_
⇒
[ ]

–constructor ; | constructor

⊢
writable_spanmemory span_ptr ≔ ptr_addr ≔ ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengtholdest; FreeSlot; ptr_cap ≔ ptr_capblock_ptrblock; span_size ≔ 8

split ; simpl ; lia |

⊢
∃base : Z reg : region, ptr_capspan_ptrspan_ptr ≔ ptr_addr ≔ ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengtholdest; FreeSlot; ptr_cap ≔ ptr_capblock_ptrblock; span_size ≔ 8 = Objbase ∧ object_regionbase m_regionsmemory = Somereg ∧ r_lifereg = Live ∧ access_resmemory ptr_addrspan_ptrspan_ptr ≔ ptr_addr ≔ ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengtholdest; FreeSlot; ptr_cap ≔ ptr_capblock_ptrblock; span_size ≔ 8 Objbase span_sizespan_ptr ≔ ptr_addr ≔ ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengtholdest; FreeSlot; ptr_cap ≔ ptr_capblock_ptrblock; span_size ≔ 8 Write 1 = Someok

exists 2048, mkRegion2048 3088 GlobalData Live

⊢
ptr_capspan_ptrspan_ptr ≔ ptr_addr ≔ ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengtholdest; FreeSlot; ptr_cap ≔ ptr_capblock_ptrblock; span_size ≔ 8 = Obj2048 ∧ object_region2048 m_regionsmemory = Somer_base ≔ 2048; r_end ≔ 3088; r_kind ≔ GlobalData; r_life ≔ Live ∧ r_lifer_base ≔ 2048; r_end ≔ 3088; r_kind ≔ GlobalData; r_life ≔ Live = Live ∧ access_resmemory ptr_addrspan_ptrspan_ptr ≔ ptr_addr ≔ ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengtholdest; FreeSlot; ptr_cap ≔ ptr_capblock_ptrblock; span_size ≔ 8 Obj2048 span_sizespan_ptr ≔ ptr_addr ≔ ptr_addrblock_ptrblock + 16 + 32 × Z.of_natDatatypes.lengtholdest; FreeSlot; ptr_cap ≔ ptr_capblock_ptrblock; span_size ≔ 8 Write 1 = Someok

repeat split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
constructor
–split ; simpl ; lia |
exists 2048, mkRegion2048 3088 GlobalData Live
repeat split ; reflexivity
–constructor ; | constructor
split ; simpl ; lia |
exists 2048, mkRegion2048 3088 GlobalData Live
repeat split ; reflexivity

A real changed index cannot be justified by an empty write footprint.

871Example pop_without_write_authority_rejected: ¬local_effect[ ] [ ] [ ] [ ] memory exit_pop_indexmemory block_ptrblock oldest; FreeSlot
Explore proof 5 tactics

Initial goal

intros _ & _ & Hframe & _

assert Hnone : ¬write_authority[ ] [ ] memory 2056

2 open

focused goal

{intros root & & _ | base & reg & & _

deferred goal

destruct Hframe2056 Hnone as Hbyte _

discriminate Hbyte

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros _ & _ & Hframe & _
assert Hnone : ¬write_authority[ ] [ ] memory 2056
{intros root & & _ | base & reg & & _
destruct Hframe2056 Hnone as Hbyte _
discriminate Hbyte

An empty physical prefix cannot be decomposed into a selected pop.

881Example empty_pop_rejected: ∀older : listexit_slot selected, [ ] ≠ older ++ selected
Explore proof 5 tactics

Initial goal

⊢
∀older : listexit_slot selected : exit_slot, [ ] ≠ older ++ selected

intros older selected H

older :
selected :
H :
[ ] = older ++ selected
⊢
False

apply f_equal@lengthexit_slot in H

older :
selected :
H :
Datatypes.length[ ] = Datatypes.lengtholder ++ selected
⊢
False

rewrite length_app in H

older :
selected :
H :
Datatypes.length[ ] = Datatypes.lengtholder + Datatypes.lengthselected%nat
⊢
False

simpl in H

older :
selected :
H :
0%nat = Datatypes.lengtholder + 1%nat
⊢
False

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros older selected H
apply f_equal@lengthexit_slot in H
rewrite length_app in H
simpl in H
lia

Data-sensitive admission of the known callbacks, retaining the pending on_exit argument's checked byte. Not a native callback implementation.

888Definition pop_admissionm entry : Prop ≔
Inentry exit_registry_pendingblock ∧ access_resm 4096 Obj4096 1 Read 1 = Someok ∧ load_bytesm 4096 1 = 0

Its checked data lies outside both metadata roots, so the general stability premise is discharged rather than assumed at the endpoint.

Explore proof 11 tactics

Initial goal

intros m m′ Hregions Haux Hbytes entry Hin & Hread & Hdata

m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
pop_admissionm′ entry

split ; exact Hin |

m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
access_resm′ 4096 Obj4096 1 Read 1 = Someok ∧ load_bytesm′ 4096 1 = 0

split

2 open

m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
access_resm′ 4096 Obj4096 1 Read 1 = Someok
focused goal
m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
load_bytesm′ 4096 1 = 0

–unfold access_res

2 open

m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
cap_access_resObj4096 m_regionsm′ 4096 1 Read 1 = Someok
deferred goal
m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
load_bytesm′ 4096 1 = 0

rewrite Hregions

2 open

m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
cap_access_resObj4096 m_regionsm 4096 1 Read 1 = Someok
deferred goal
m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
load_bytesm′ 4096 1 = 0

exact Hread

deferred goal
m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
load_bytesm′ 4096 1 = 0

–rewrite <- Hdata

m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
load_bytesm′ 4096 1 = load_bytesm 4096 1

apply load_bytes_agree ; lia |

m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
∀i : Z, 0 ≤ i < 1 → m_bytesm′ 4096 + i = m_bytesm 4096 + i

intros i Hi

m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
i :
Z
Hi :
0 ≤ i < 1
⊢
m_bytesm′ 4096 + i = m_bytesm 4096 + i

apply Hbytes

m, m′ :
Hregions :
Haux :
m_auxm′ = m_auxm
Hbytes :
∀a : Z, ¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot a → m_bytesm′ a = m_bytesm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
i :
Z
Hi :
0 ≤ i < 1
⊢
¬∃root : span, Inroot exit_pop_writesblock_ptrblock oldest; FreeSlot newest ∧ span_containsroot 4096 + i

intros root & ← | ← | & Hrange ; unfold span_contains in Hrange ; cbn - [ Z.add Z.mul ] in Hrange ; lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ Hregions Haux Hbytes entry Hin & Hread & Hdata
split ; exact Hin |
split
–unfold access_res
rewrite Hregions
exact Hread
–rewrite <- Hdata
apply load_bytes_agree ; lia |
intros i Hi
apply Hbytes
intros root & ← | ← | & Hrange ; unfold span_contains in Hrange ; cbn - [ Z.add Z.mul ] in Hrange ; lia

Both the still-pending argument and the detached active callback stay admitted at the actual constructed endpoint.

Explore proof 8 tactics

Initial goal

apply exit_pop_admittedpop_admission memory block_ptrblock oldest; FreeSlot newest [ ] ; reflexivity | exact pop_admission_stable |

split ; | exact I

constructor

2 open

focused goal
⊢
fix app l m : listregistration {struct l} : listregistration ≔
match l with
[ ]
⇒
m
a :: l1
⇒
a :: appl1 m

–split ; left ; reflexivity |

2 open

⊢
access_resmemory 4096 Obj4096 1 Read 1 = Someok ∧ load_bytesmemory 4096 1 = 0
deferred goal
⊢
fix app l m : listregistration {struct l} : listregistration ≔
match l with
[ ]
⇒
m
a :: l1
⇒
a :: appl1 m

split ; reflexivity

deferred goal
⊢
fix app l m : listregistration {struct l} : listregistration ≔
match l with
[ ]
⇒
m
a :: l1
⇒
a :: appl1 m

–constructor ; | constructor

split ; right ; left ; reflexivity |

⊢
access_resmemory 4096 Obj4096 1 Read 1 = Someok ∧ load_bytesmemory 4096 1 = 0

split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; | exact I
constructor
–split ; left ; reflexivity |
split ; reflexivity
–constructor ; | constructor
split ; right ; left ; reflexivity |
split ; reflexivity

A specification depending on idx does NOT satisfy footprint stability.

921Example index_dependent_admission_rejected: ¬exit_admission_stableλm _ ⇒ load_bytesm 2056 8 = 3 exit_pop_writesblock_ptrblock oldest; FreeSlot newest
Explore proof 4 tactics

Initial goal

intros Hstable

destruct exit_pop_framememory block_ptrblock oldest; FreeSlot newest as Hregions Haux Hbytes

pose proof Hstablememory exit_pop_memorymemory block_ptrblock oldest; FreeSlot newest Hregions Haux Hbytes mkRegistration11 AtExitTAtom"index" eq_refl as Hbad

discriminate Hbad

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hstable
destruct exit_pop_framememory block_ptrblock oldest; FreeSlot newest as Hregions Haux Hbytes
pose proof Hstablememory exit_pop_memorymemory block_ptrblock oldest; FreeSlot newest Hregions Haux Hbytes mkRegistration11 AtExitTAtom"index" eq_refl as Hbad
discriminate Hbad

A second block with one skipped physical slot is genuinely represented.

933Definition tail_block: exit_block ≔

Link the original block to separate storage, preserving its callback data.

935Definition chain_memory: mem ≔

Both blocks and the external head cell satisfy the checked snapshot.

Explore proof 20 tactics

Initial goal

split ; reflexivity |

split ; vm_compute ; repeat split ; congruence |

split

2 open

focused goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

–split

3 open

focused goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

+split ; reflexivity |

3 open

⊢
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

split ; reflexivity |

3 open

⊢
pointer_slotchain_memory ptr_addrblock_ptrblock exit_headtail_block ∧ load_byteschain_memory ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorychain_memory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

split ; vm_compute ; repeat split ; congruence |

3 open

⊢
load_byteschain_memory ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorychain_memory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

split ; reflexivity |

3 open

⊢
Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorychain_memory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

split ; simpl ; lia |

3 open

⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memorychain_memory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

intros i slot Hi

3 open

i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
⊢
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

destruct i as | | | i ; simpl in Hi ; try destruct i ; discriminate Hi ; injection Hi as ← ; vm_compute ; repeat split ; congruence

2 open

deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

+split ; | exact I

2 open

deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

split ; reflexivity |

2 open

deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

split ; reflexivity |

2 open

⊢
pointer_slotchain_memory ptr_addrblock_ptrtail_block exit_head[ ] ∧ load_byteschain_memory ptr_addrblock_ptrtail_block + 8 8 = Z.of_natDatatypes.lengthblock_slotstail_block ∧ Datatypes.lengthblock_slotstail_block ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotstail_block i = Someslot → exit_slot_memorychain_memory ptr_addrblock_ptrtail_block + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

split ; vm_compute ; repeat split ; congruence |

2 open

⊢
load_byteschain_memory ptr_addrblock_ptrtail_block + 8 8 = Z.of_natDatatypes.lengthblock_slotstail_block ∧ Datatypes.lengthblock_slotstail_block ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotstail_block i = Someslot → exit_slot_memorychain_memory ptr_addrblock_ptrtail_block + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

split ; reflexivity |

2 open

⊢
Datatypes.lengthblock_slotstail_block ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotstail_block i = Someslot → exit_slot_memorychain_memory ptr_addrblock_ptrtail_block + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

split ; simpl ; lia |

2 open

⊢
∀i : nat slot : exit_slot, nth_errorblock_slotstail_block i = Someslot → exit_slot_memorychain_memory ptr_addrblock_ptrtail_block + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

intros i slot Hi

2 open

i :
nat
slot :
Hi :
nth_errorblock_slotstail_block i = Someslot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

destruct i ; simpl in Hi ; injection Hi as ← ; reflexivity | destruct i ; discriminate Hi

deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block; tail_block

–repeat constructor ; simpl ; intuition congruence

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split
–split
+split ; reflexivity |
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split ; reflexivity |
split ; simpl ; lia |
intros i slot Hi
destruct i as | | | i ; simpl in Hi ; try destruct i ; discriminate Hi ; injection Hi as ← ; vm_compute ; repeat split ; congruence
+split ; | exact I
split ; reflexivity |
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split ; reflexivity |
split ; simpl ; lia |
intros i slot Hi
destruct i ; simpl in Hi ; injection Hi as ← ; reflexivity | destruct i ; discriminate Hi
–repeat constructor ; simpl ; intuition congruence

A constructed cxa pop preserves a nonempty separated suffix, not only singleton registries. No block is freed at this cutpoint.

Explore proof 3 tactics

Initial goal

apply exit_pop_registry_representedchain_memory mkPtr1000 Obj1000 block_ptrblock oldest; FreeSlot newest tail_block chain_represented

split ; left ; simpl ; lia |

⊢
Forallλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 + 1040 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrblock_ptrblock0 tail_block

constructor ; right ; simpl ; lia | constructor

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; left ; simpl ; lia |
constructor ; right ; simpl ; lia | constructor

A snapshot can alias its own head cell with idx; distinct block identities alone therefore do not justify metadata-write preservation.

967Definition aliased_memory: mem ≔
store_auxstore_bytesmkMemλ_ ⇒ 0 mkRegion8 1048 GlobalData Live λ_ ⇒ CNone 16 8 8 16 Obj8

Eight free physical slots make both interpretations of that cell agree.

972Lemma aliased_head_represented
Explore proof 17 tactics

Initial goal

split ; reflexivity |

⊢
pointer_slotaliased_memory ptr_addrptr_addr ≔ 16; ptr_cap ≔ Obj8 exit_headblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 ∧ exit_chain_memoryaliased_memory block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 ∧ NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

split ; vm_compute ; repeat split ; congruence |

⊢
exit_chain_memoryaliased_memory block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 ∧ NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

split

2 open

focused goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

–split ; | exact I

2 open

deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

split ; reflexivity |

2 open

⊢
access_resaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 ptr_capblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 1040 Read 8 = Someok ∧ pointer_slotaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 exit_head[ ] ∧ load_bytesaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 i = Someslot → exit_slot_memoryaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

split ; reflexivity |

2 open

⊢
pointer_slotaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 exit_head[ ] ∧ load_bytesaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 i = Someslot → exit_slot_memoryaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

split ; vm_compute ; repeat split ; congruence |

2 open

⊢
load_bytesaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 i = Someslot → exit_slot_memoryaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

split ; reflexivity |

2 open

⊢
Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 i = Someslot → exit_slot_memoryaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

split ; simpl ; lia |

2 open

⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 i = Someslot → exit_slot_memoryaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

intros i slot Hi

2 open

i :
nat
slot :
Hi :
nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 i = Someslot
⊢
exit_slot_memoryaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

apply nth_error_In in Hi

2 open

i :
nat
slot :
Hi :
Inslot block_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8
⊢
exit_slot_memoryaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

apply repeat_spec in Hi

2 open

i :
nat
slot :
Hi :
slot = FreeSlot
⊢
exit_slot_memoryaliased_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

subst slot

2 open

i :
nat
⊢
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

change load_bytesstore_bytesmkMemλ_ ⇒ 0 mkRegion8 1048 GlobalData Live λ_ ⇒ CNone 16 8 8 8 + 16 + 32 × Z.of_nati 8 = 0

2 open

i :
nat
⊢
load_bytesstore_bytesm_bytes ≔ λ_ : Z ⇒ 0; m_regions ≔ r_base ≔ 8; r_end ≔ 1048; r_kind ≔ GlobalData; r_life ≔ Live; m_aux ≔ λ_ : Z ⇒ CNone 16 8 8 8 + 16 + 32 × Z.of_nati 8 = 0
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

rewrite exit_load_bytes_disjoint by lia

2 open

i :
nat
⊢
load_bytesm_bytes ≔ λ_ : Z ⇒ 0; m_regions ≔ r_base ≔ 8; r_end ≔ 1048; r_kind ≔ GlobalData; r_life ≔ Live; m_aux ≔ λ_ : Z ⇒ CNone 8 + 16 + 32 × Z.of_nati 8 = 0
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

reflexivity

deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 8

–constructor ; simpl ; tauto | constructor

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split
–split ; | exact I
split ; reflexivity |
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split ; reflexivity |
split ; simpl ; lia |
intros i slot Hi
apply nth_error_In in Hi
apply repeat_spec in Hi
subst slot
change load_bytesstore_bytesmkMemλ_ ⇒ 0 mkRegion8 1048 GlobalData Live λ_ ⇒ CNone 16 8 8 8 + 16 + 32 × Z.of_nati 8 = 0
reflexivity
–constructor ; simpl ; tauto | constructor

The actual decrement destroys that aliased head; the separation premise excludes this valid counterexample to the unrestricted theorem.

Explore proof 3 tactics

Initial goal

⊢

split ; intros H _ ; simpl in H ; lia |

intros _ & _ & Hload & _ & _

discriminate Hload

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; intros H _ ; simpl in H ; lia |
intros _ & _ & Hload & _ & _
discriminate Hload

An exhausted heap head links to the callback-bearing older block. Its successor has different address bits AND a different capability.

The source view is inhabited, not merely an executable update example.

Explore proof 20 tactics

Initial goal

⊢
exit_registry_memoryunlink_memory ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split ; reflexivity |

⊢
pointer_slotunlink_memory ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 exit_headblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block ∧ exit_chain_memoryunlink_memory block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block ∧ NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split ; vm_compute ; repeat split ; congruence |

⊢
exit_chain_memoryunlink_memory block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block ∧ NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split

2 open

focused goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

–split

3 open

focused goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

+split ; reflexivity |

3 open

⊢
access_resunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ptr_capblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] 1040 Read 8 = Someok ∧ pointer_slotunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] exit_headblock ∧ load_bytesunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot → exit_slot_memoryunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split ; reflexivity |

3 open

⊢
pointer_slotunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] exit_headblock ∧ load_bytesunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot → exit_slot_memoryunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split ; vm_compute ; repeat split ; congruence |

3 open

⊢
load_bytesunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot → exit_slot_memoryunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split ; reflexivity |

3 open

⊢
Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot → exit_slot_memoryunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split ; simpl ; lia |

3 open

⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot → exit_slot_memoryunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

intros i slot Hi

3 open

i :
nat
slot :
Hi :
nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot
⊢
exit_slot_memoryunlink_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

destruct i ; discriminate Hi

2 open

deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

+split ; | exact I

2 open

deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split ; reflexivity |

2 open

⊢
access_resunlink_memory ptr_addrblock_ptrblock ptr_capblock_ptrblock 1040 Read 8 = Someok ∧ pointer_slotunlink_memory ptr_addrblock_ptrblock exit_head[ ] ∧ load_bytesunlink_memory ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memoryunlink_memory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split ; reflexivity |

2 open

⊢
pointer_slotunlink_memory ptr_addrblock_ptrblock exit_head[ ] ∧ load_bytesunlink_memory ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memoryunlink_memory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split ; vm_compute ; repeat split ; congruence |

2 open

⊢
load_bytesunlink_memory ptr_addrblock_ptrblock + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock ∧ Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memoryunlink_memory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split ; reflexivity |

2 open

⊢
Datatypes.lengthblock_slotsblock ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memoryunlink_memory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

split ; simpl ; lia |

2 open

⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock i = Someslot → exit_slot_memoryunlink_memory ptr_addrblock_ptrblock + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

intros i slot Hi

2 open

i :
nat
slot :
Hi :
nth_errorblock_slotsblock i = Someslot
⊢
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

destruct i as | | | i ; simpl in Hi ; try destruct i ; discriminate Hi ; injection Hi as ← ; vm_compute ; repeat split ; congruence

deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

–repeat constructor ; simpl ; intuition congruence

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split
–split
+split ; reflexivity |
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split ; reflexivity |
split ; simpl ; lia |
intros i slot Hi
destruct i ; discriminate Hi
+split ; | exact I
split ; reflexivity |
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split ; reflexivity |
split ; simpl ; lia |
intros i slot Hi
destruct i as | | | i ; simpl in Hi ; try destruct i ; discriminate Hi ; injection Hi as ← ; vm_compute ; repeat split ; congruence
–repeat constructor ; simpl ; intuition congruence

Unlink preserves the callback-bearing suffix and detached node, using an independently checked writable head and the actual source view.

Explore proof 8 tactics

Initial goal

⊢
∧
let m′ ≔ exit_unlink_memoryunlink_memory ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block in
pointer_slotm′ 1000 block_ptrblock ∧ exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block ∧ exit_block_memorym′ block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] block_ptrblock

split

2 open

⊢
focused goal
⊢
let m′ ≔ exit_unlink_memoryunlink_memory ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block in
pointer_slotm′ 1000 block_ptrblock ∧ exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block ∧ exit_block_memorym′ block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] block_ptrblock

–split ; simpl ; lia |

2 open

⊢
∃base : Z reg : region, ptr_capspan_ptrspan_ptr ≔ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000; span_size ≔ 8 = Objbase ∧ object_regionbase m_regionsunlink_memory = Somereg ∧ r_lifereg = Live ∧ access_resunlink_memory ptr_addrspan_ptrspan_ptr ≔ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000; span_size ≔ 8 Objbase span_sizespan_ptr ≔ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000; span_size ≔ 8 Write 1 = Someok
deferred goal
⊢
let m′ ≔ exit_unlink_memoryunlink_memory ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block in
pointer_slotm′ 1000 block_ptrblock ∧ exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block ∧ exit_block_memorym′ block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] block_ptrblock

exists 1000, mkRegion1000 1008 GlobalData Live

2 open

⊢
ptr_capspan_ptrspan_ptr ≔ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000; span_size ≔ 8 = Obj1000 ∧ object_region1000 m_regionsunlink_memory = Somer_base ≔ 1000; r_end ≔ 1008; r_kind ≔ GlobalData; r_life ≔ Live ∧ r_lifer_base ≔ 1000; r_end ≔ 1008; r_kind ≔ GlobalData; r_life ≔ Live = Live ∧ access_resunlink_memory ptr_addrspan_ptrspan_ptr ≔ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000; span_size ≔ 8 Obj1000 span_sizespan_ptr ≔ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000; span_size ≔ 8 Write 1 = Someok
deferred goal
⊢
let m′ ≔ exit_unlink_memoryunlink_memory ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block in
pointer_slotm′ 1000 block_ptrblock ∧ exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block ∧ exit_block_memorym′ block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] block_ptrblock

repeat split ; reflexivity

deferred goal
⊢
let m′ ≔ exit_unlink_memoryunlink_memory ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block in
pointer_slotm′ 1000 block_ptrblock ∧ exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block ∧ exit_block_memorym′ block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] block_ptrblock

–split ; vm_compute ; repeat split ; congruence |

apply exit_unlink_registry_representedunlink_memory mkPtr1000 Obj1000 mkPtr8192 Obj8192 block unlink_source_represented

⊢
exit_unlink_separatedptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]; block

constructor ; left ; simpl ; lia |

⊢
Forallλblock0 : exit_block ⇒ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ ptr_addrblock_ptrblock0 ∨ ptr_addrblock_ptrblock0 + 1040 ≤ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block

constructor ; left ; simpl ; lia | constructor

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split
–split ; simpl ; lia |
exists 1000, mkRegion1000 1008 GlobalData Live
repeat split ; reflexivity
–split ; vm_compute ; repeat split ; congruence |
constructor ; left ; simpl ; lia |
constructor ; left ; simpl ; lia | constructor

Singleton removal installs canonical null but retains its heap allocation.

Explore proof 19 tactics

Initial goal

⊢
let m ≔ startup_storeunlink_memory 8192 ptr_addr ≔ 0; ptr_cap ≔ CNone in
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

intros m

⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

assert Hsource : exit_registry_memorym mkPtr1000 Obj1000 mkExitBlockmkPtr8192 Obj8192 [ ]

2 open

⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
focused goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

{split ; reflexivity |

2 open

⊢
pointer_slotm ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 exit_headblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ∧ exit_chain_memorym block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ∧ NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

split ; vm_compute ; repeat split ; congruence |

2 open

⊢
exit_chain_memorym block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ∧ NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

split

3 open

⊢
exit_chain_memorym block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
focused goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

–split ; | exact I

3 open

⊢
exit_block_memorym block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] exit_head[ ]
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

split ; reflexivity |

3 open

⊢
access_resm ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ptr_capblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] 1040 Read 8 = Someok ∧ pointer_slotm ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] exit_head[ ] ∧ load_bytesm ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

split ; reflexivity |

3 open

⊢
pointer_slotm ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] exit_head[ ] ∧ load_bytesm ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

split ; vm_compute ; repeat split ; congruence |

3 open

⊢
load_bytesm ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

split ; reflexivity |

3 open

⊢
Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

split ; simpl ; lia |

3 open

⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot → exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

intros i slot Hi

3 open

i :
nat
slot :
Hi :
nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] i = Someslot
⊢
exit_slot_memorym ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

destruct i ; discriminate Hi

2 open

deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

–repeat constructor

2 open

⊢
¬Inptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ] [ ]
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

simpl

2 open

⊢
¬False
deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

tauto

deferred goal
Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
∧
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

split ; exact Hsource |

Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
let m′ ≔ exit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] in
exit_registry_memorym′ ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ∧ object_region8192 m_regionsm′ = Somer_base ≔ 8192; r_end ≔ 9232; r_kind ≔ Heap; r_life ≔ Live

split ; | reflexivity

Hsource :
exit_registry_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; block_slots ≔ [ ]
⊢
exit_registry_memoryexit_unlink_memorym ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ] ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 [ ]

apply proj1exit_unlink_registry_representedm mkPtr1000 Obj1000 mkPtr8192 Obj8192 [ ] Hsource ltac:constructor ; left ; simpl ; lia | constructor

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m
assert Hsource : exit_registry_memorym mkPtr1000 Obj1000 mkExitBlockmkPtr8192 Obj8192 [ ]
{split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split
–split ; | exact I
split ; reflexivity |
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split ; reflexivity |
split ; simpl ; lia |
intros i slot Hi
destruct i ; discriminate Hi
–repeat constructor
simpl
tauto
split ; exact Hsource |
split ; | reflexivity
apply proj1exit_unlink_registry_representedm mkPtr1000 Obj1000 mkPtr8192 Obj8192 [ ] Hsource ltac:constructor ; left ; simpl ; lia | constructor

Updating address bits alone loses the successor's capability.

Explore proof 2 tactics

Initial goal

intros _ & _ & Haux

⊢
False

discriminate Haux

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros _ & _ & Haux
discriminate Haux

The changed head byte cannot be justified without writable roots.

Explore proof 5 tactics

Initial goal

⊢
¬local_effectspan_ptr ≔ ptr_addr ≔ 8192; ptr_cap ≔ Obj8192; span_size ≔ 1040 [ ] [ ] [ ] unlink_memory exit_unlink_memoryunlink_memory ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block

intros _ & _ & Hframe & _

assert Hnone : ¬write_authority[ ] [ ] unlink_memory 1001

2 open

focused goal

{intros root & & _ | base & reg & & _

deferred goal

destruct Hframe1001 Hnone as Hbyte _

discriminate Hbyte

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros _ & _ & Hframe & _
assert Hnone : ¬write_authority[ ] [ ] unlink_memory 1001
{intros root & & _ | base & reg & & _
destruct Hframe1001 Hnone as Hbyte _
discriminate Hbyte

Retained argument admission survives arbitrary head stores, not just this endpoint: the admitted data and its access remain outside the head.

Explore proof 12 tactics

Initial goal

intros m m′ Hregions Hbytes Haux entry Hin & Hread & Hdata

m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
pop_admissionm′ entry

split ; exact Hin |

m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
access_resm′ 4096 Obj4096 1 Read 1 = Someok ∧ load_bytesm′ 4096 1 = 0

split

2 open

m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
access_resm′ 4096 Obj4096 1 Read 1 = Someok
focused goal
m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
load_bytesm′ 4096 1 = 0

–unfold access_res

2 open

m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
cap_access_resObj4096 m_regionsm′ 4096 1 Read 1 = Someok
deferred goal
m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
load_bytesm′ 4096 1 = 0

rewrite Hregions

2 open

m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
cap_access_resObj4096 m_regionsm 4096 1 Read 1 = Someok
deferred goal
m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
load_bytesm′ 4096 1 = 0

exact Hread

deferred goal
m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
load_bytesm′ 4096 1 = 0

–rewrite <- Hdata

m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
load_bytesm′ 4096 1 = load_bytesm 4096 1

apply load_bytes_agree ; lia |

m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
⊢
∀i : Z, 0 ≤ i < 1 → m_bytesm′ 4096 + i = m_bytesm 4096 + i

intros i Hi

m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
i :
Z
Hi :
0 ≤ i < 1
⊢
m_bytesm′ 4096 + i = m_bytesm 4096 + i

apply Hbytes

m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
i :
Z
Hi :
0 ≤ i < 1
⊢
4096 + i < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ 4096 + i

cbn - [ Z.add ]

m, m′ :
Hregions :
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesm′ a = m_bytesm a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxm′ a = m_auxm a
Hread :
access_resm 4096 Obj4096 1 Read 1 = Someok
Hdata :
load_bytesm 4096 1 = 0
i :
Z
Hi :
0 ≤ i < 1
⊢
4096 + i < 1000 ∨ 1000 + 8 ≤ 4096 + i

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ Hregions Hbytes Haux entry Hin & Hread & Hdata
split ; exact Hin |
split
–unfold access_res
rewrite Hregions
exact Hread
–rewrite <- Hdata
apply load_bytes_agree ; lia |
intros i Hi
apply Hbytes
cbn - [ Z.add ]
lia

Both pending callbacks and a detached active registration retain their admitted argument checks through the actual pointer store.

Explore proof 10 tactics

Initial goal

apply exit_unlink_admittedpop_admission unlink_memory mkPtr1000 Obj1000 mkPtr8192 Obj8192 block ; exact unlink_admission_stable |

split

2 open

focused goal

–constructor

3 open

focused goal
⊢
fix app l m : listregistration {struct l} : listregistration ≔
match l with
[ ]
⇒
m
a :: l1
⇒
a :: appl1 m
deferred goal

+split ; left ; reflexivity |

3 open

⊢
access_resunlink_memory 4096 Obj4096 1 Read 1 = Someok ∧ load_bytesunlink_memory 4096 1 = 0
deferred goal
⊢
fix app l m : listregistration {struct l} : listregistration ≔
match l with
[ ]
⇒
m
a :: l1
⇒
a :: appl1 m
deferred goal

split ; reflexivity

2 open

deferred goal
⊢
fix app l m : listregistration {struct l} : listregistration ≔
match l with
[ ]
⇒
m
a :: l1
⇒
a :: appl1 m
deferred goal

+constructor ; | constructor

2 open

deferred goal

split ; right ; left ; reflexivity |

2 open

⊢
access_resunlink_memory 4096 Obj4096 1 Read 1 = Someok ∧ load_bytesunlink_memory 4096 1 = 0
deferred goal

split ; reflexivity

deferred goal

–split ; right ; left ; reflexivity |

⊢
access_resunlink_memory 4096 Obj4096 1 Read 1 = Someok ∧ load_bytesunlink_memory 4096 1 = 0

split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split
–constructor
+split ; left ; reflexivity |
split ; reflexivity
+constructor ; | constructor
split ; right ; left ; reflexivity |
split ; reflexivity
–split ; right ; left ; reflexivity |
split ; reflexivity

A specification observing the old head shadow does not frame through unlink, despite every allocation and every other shadow cell surviving.

1103Example head_dependent_admission_rejected: ¬exit_unlink_admission_stableλm _ ⇒ m_auxm 1000 = Obj8192 mkPtr1000 Obj1000
Explore proof 4 tactics

Initial goal

⊢
¬exit_unlink_admission_stableλm : mem _ : registration ⇒ m_auxm 1000 = Obj8192 ptr_addr ≔ 1000; ptr_cap ≔ Obj1000

intros Hstable

Hstable :
exit_unlink_admission_stableλm : mem _ : registration ⇒ m_auxm 1000 = Obj8192 ptr_addr ≔ 1000; ptr_cap ≔ Obj1000
⊢
False

destruct exit_unlink_frameunlink_memory mkPtr1000 Obj1000 block as Hregions Hbytes Haux

Hstable :
exit_unlink_admission_stableλm : mem _ : registration ⇒ m_auxm 1000 = Obj8192 ptr_addr ≔ 1000; ptr_cap ≔ Obj1000
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesexit_unlink_memoryunlink_memory ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block a = m_bytesunlink_memory a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxexit_unlink_memoryunlink_memory ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block a = m_auxunlink_memory a
⊢
False

pose proof Hstableunlink_memory exit_unlink_memoryunlink_memory mkPtr1000 Obj1000 block Hregions Hbytes Haux mkRegistration11 AtExitTAtom"head" eq_refl as Hbad

Hstable :
exit_unlink_admission_stableλm : mem _ : registration ⇒ m_auxm 1000 = Obj8192 ptr_addr ≔ 1000; ptr_cap ≔ Obj1000
Hbytes :
∀a : Z, a < ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 ∨ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 + 8 ≤ a → m_bytesexit_unlink_memoryunlink_memory ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block a = m_bytesunlink_memory a
Haux :
∀a : Z, a ≠ ptr_addrptr_addr ≔ 1000; ptr_cap ≔ Obj1000 → m_auxexit_unlink_memoryunlink_memory ptr_addr ≔ 1000; ptr_cap ≔ Obj1000 block a = m_auxunlink_memory a
Hbad :
⊢
False

discriminate Hbad

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hstable
destruct exit_unlink_frameunlink_memory mkPtr1000 Obj1000 block as Hregions Hbytes Haux
pose proof Hstableunlink_memory exit_unlink_memoryunlink_memory mkPtr1000 Obj1000 block Hregions Hbytes Haux mkRegistration11 AtExitTAtom"head" eq_refl as Hbad
discriminate Hbad

Even distinct block identities may overlap. Here the readable head cell is the older block's idx; unlink would change it from 32 to 8.

The unrestricted snapshot admits the alias, so separation is substantive.

Explore proof 24 tactics

Initial goal

⊢
exit_registry_memoryunlink_alias_memory ptr_addr ≔ 16; ptr_cap ≔ Obj8 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split ; reflexivity |

⊢
pointer_slotunlink_alias_memory ptr_addrptr_addr ≔ 16; ptr_cap ≔ Obj8 exit_headblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ∧ exit_chain_memoryunlink_alias_memory block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ∧ NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split ; vm_compute ; repeat split ; congruence |

⊢
exit_chain_memoryunlink_alias_memory block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ∧ NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split

2 open

⊢
focused goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

–split

3 open

focused goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

+split ; reflexivity |

3 open

⊢
access_resunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] ptr_capblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] 1040 Read 8 = Someok ∧ pointer_slotunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] exit_headblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ∧ load_bytesunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] i = Someslot → exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split ; reflexivity |

3 open

⊢
pointer_slotunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] exit_headblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ∧ load_bytesunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] i = Someslot → exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split ; vm_compute ; repeat split ; congruence |

3 open

⊢
load_bytesunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] i = Someslot → exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split ; reflexivity |

3 open

⊢
Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] i = Someslot → exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split ; simpl ; lia |

3 open

⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] i = Someslot → exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

intros i slot Hi

3 open

i :
nat
slot :
Hi :
nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] i = Someslot
⊢
exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ] + 16 + 32 × Z.of_nati slot
deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

destruct i ; discriminate Hi

2 open

deferred goal
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

+split ; | exact I

2 open

deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split ; reflexivity |

2 open

⊢
access_resunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ptr_capblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 1040 Read 8 = Someok ∧ pointer_slotunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 exit_head[ ] ∧ load_bytesunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 i = Someslot → exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split ; reflexivity |

2 open

⊢
pointer_slotunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 exit_head[ ] ∧ load_bytesunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 i = Someslot → exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split ; vm_compute ; repeat split ; congruence |

2 open

⊢
load_bytesunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ∧ Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 i = Someslot → exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split ; reflexivity |

2 open

⊢
Datatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ≤ 32%nat ∧ ∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 i = Someslot → exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split ; simpl ; lia |

2 open

⊢
∀i : nat slot : exit_slot, nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 i = Someslot → exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

intros i slot Hi

2 open

i :
nat
slot :
Hi :
nth_errorblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 i = Someslot
⊢
exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

apply nth_error_In in Hi

2 open

i :
nat
slot :
Hi :
Inslot block_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32
⊢
exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

apply repeat_spec in Hi

2 open

i :
nat
slot :
Hi :
slot = FreeSlot
⊢
exit_slot_memoryunlink_alias_memory ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 16 + 32 × Z.of_nati slot
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

subst slot

2 open

i :
nat
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

change load_bytesstore_bytesstore_bytesmkMemλ_ ⇒ 0 mkRegion8 1048 GlobalData Live; mkRegion32 1072 Heap Live λ_ ⇒ CNone 16 8 32 32 8 8 8 + 16 + 32 × Z.of_nati 8 = 0

2 open

i :
nat
⊢
load_bytesstore_bytesstore_bytesm_bytes ≔ λ_ : Z ⇒ 0; m_regions ≔ r_base ≔ 8; r_end ≔ 1048; r_kind ≔ GlobalData; r_life ≔ Live; r_base ≔ 32; r_end ≔ 1072; r_kind ≔ Heap; r_life ≔ Live; m_aux ≔ λ_ : Z ⇒ CNone 16 8 32 32 8 8 8 + 16 + 32 × Z.of_nati 8 = 0
deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

destruct i ; rewrite ! exit_load_bytes_disjoint by lia ; reflexivity

deferred goal
⊢
NoDupmapλblock0 : exit_block ⇒ ptr_addrblock_ptrblock0 block_ptr ≔ ptr_addr ≔ 32; ptr_cap ≔ Obj32; block_slots ≔ [ ]; block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

–repeat constructor ; simpl ; intuition congruence

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split
–split
+split ; reflexivity |
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split ; reflexivity |
split ; simpl ; lia |
intros i slot Hi
destruct i ; discriminate Hi
+split ; | exact I
split ; reflexivity |
split ; reflexivity |
split ; vm_compute ; repeat split ; congruence |
split ; reflexivity |
split ; simpl ; lia |
intros i slot Hi
apply nth_error_In in Hi
apply repeat_spec in Hi
subst slot
change load_bytesstore_bytesstore_bytesmkMemλ_ ⇒ 0 mkRegion8 1048 GlobalData Live; mkRegion32 1072 Heap Live λ_ ⇒ CNone 16 8 32 32 8 8 8 + 16 + 32 × Z.of_nati 8 = 0
destruct i ; rewrite ! exit_load_bytes_disjoint by lia ; reflexivity
–repeat constructor ; simpl ; intuition congruence

Head/suffix separation rejects this actual representation-breaking store.

Explore proof 7 tactics

Initial goal

⊢
¬exit_unlink_separatedptr_addr ≔ 16; ptr_cap ≔ Obj8 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ∧ ¬exit_registry_memoryexit_unlink_memoryunlink_alias_memory ptr_addr ≔ 16; ptr_cap ≔ Obj8 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ptr_addr ≔ 16; ptr_cap ≔ Obj8 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32

split

2 open

⊢
¬exit_unlink_separatedptr_addr ≔ 16; ptr_cap ≔ Obj8 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32
focused goal

–intros H

2 open

H :
exit_unlink_separatedptr_addr ≔ 16; ptr_cap ≔ Obj8 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32
⊢
False
deferred goal

inversion H as [ |? ? Hdis Htail ]

2 open

H :
exit_unlink_separatedptr_addr ≔ 16; ptr_cap ≔ Obj8 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32
l :
Htail :
Forallλblock : exit_block ⇒ ptr_addrptr_addr ≔ 16; ptr_cap ≔ Obj8 + 8 ≤ ptr_addrblock_ptrblock ∨ ptr_addrblock_ptrblock + 1040 ≤ ptr_addrptr_addr ≔ 16; ptr_cap ≔ Obj8 [ ]
H1 :
l = [ ]
⊢
False
deferred goal

simpl in Hdis

2 open

⊢
False
deferred goal

lia

deferred goal

–intros _ & _ & _ & _ & _ & Hidx & _ _ & _

Hidx :
load_bytesexit_unlink_memoryunlink_alias_memory ptr_addr ≔ 16; ptr_cap ≔ Obj8 block_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 ptr_addrblock_ptrblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32 + 8 8 = Z.of_natDatatypes.lengthblock_slotsblock_ptr ≔ ptr_addr ≔ 8; ptr_cap ≔ Obj8; block_slots ≔ repeatFreeSlot 32
⊢
False

discriminate Hidx

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split
–intros H
inversion H as [ |? ? Hdis Htail ]
simpl in Hdis
lia
–intros _ & _ & _ & _ & _ & Hidx & _ _ & _
discriminate Hidx