Fil-C on Nix

Filnix wiki

the formal campaign

rocq/theories/Heap.v

The ghost heap of the program logic (Logic.v): what each piece of memory holds, when a ghost heap of pieces agrees with the memory, and the ownership of a list of pieces in Iris's gen_heap. Taken from the logic spike's IrisHeap.v, which keeps the parts about its own language of whole configurations.

The ghost heap is Iris's gen_heap from Pieces.v's piece to a pval: an object's life with its region, a byte, or a capability in an aux slot. It agrees with a memory when a life token names a live object, and a byte or aux piece names a registered object and, while that object is live, is inside its bounds and holds what the memory holds there, an aux slot up to the collector's rewriting of dead capabilities (agree_piece). Since every piece names a registered object, a fresh base has no pieces yet.

The lemmas say what keeps agreement: a safepoint (agree_piece_safepoint), a store into a live object, which keeps every piece it does not write (frame_ok, cell_store_ok, ptr_store_ok), and an allocation, whose new pieces agree (obj_ps_agree) and which keeps the old ones (agree_piece_allocated). pts ps owns the pieces ps; pts_lookup, pts_update and pts_alloc read, write and allocate them against the authoritative heap. Nothing here is about one runtime or one language.

From iris.proofmode Require Import proofmode
From iris.base_logic.lib Require Import gen_heap
From Stdlib Require Import ZArith Lia
From Nanofil Require Import Term Syntax Values Memory Runtime ExternalCalls Pieces
Open Scope Z_scope
Open Scope list_scope

Pieces and their values

What a piece holds: an object's life with its region, a byte, the capability in an aux slot, or, for a life token, the end of the object's life: a free turns a VLive token into VFreed, since the ghost heap has no way to give a piece up. A name holds the pointer p and the text t of the string the world lends; the memory has nothing to say about it, and the world interpretation ties it to the world. A codec, under a name key, holds the world's multibyte codec, which the memory has nothing to say about either. A stream, under a name key, holds a FILE handle p and, while it is open, its physical pending count and logical FIFO, or nothing once it is closed: libc's state, which only the world interpretation reads. A getopt token, under a name key, holds getopt's optarg and optind, which the world interpretation ties to libc's cells. An open-only stream permission records its handle but freezes neither pending bytes nor the protocol; the world interpretation requires that handle to remain open.

51Inductive pval: Type ≔
|VLive
reg : region
|VByte
v : Z
|VAux
c : cap
|VFreed
|VName
p : ptr t : listZ
|VCodec
c : term
|VStream
p : ptr pending : optionZ × listZ
|VGetopt
optarg : ptr optind : Z
|VStreamOpen
p : ptr

Pieces have decidable equality.

57Instance piece_eq_dec: EqDecisionpiece
Explore proof 1 tactics

Initial goal

⊢
EqDecisionpiece

solve_decision

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
solve_decision

Pieces are countable, by an injection into sums of integers.

61Instance piece_countable: Countablepiece
Explore proof 2 tactics

Initial goal

⊢
Countablepiece

refine inj_countable'λp ⇒ match p with PLiveb ⇒ inlb | PByteb o ⇒ inrinlb, o | PAuxb o ⇒ inrinrinlb, o | PNamek ⇒ inrinrinrk end λt ⇒ match t with inlb ⇒ PLiveb | inrinlb, o ⇒ PByteb o | inrinrinlb, o ⇒ PAuxb o | inrinrinrk ⇒ PNamek end _

⊢
∀ x : piece  ,
match match x with PLiveb ⇒ inlb | PByteb o ⇒ inrinlb, o | PAuxb o ⇒ inrinrinlb, o | PNamek ⇒ inrinrinrk end with
inlb
⇒
inrinlb, o
⇒
inrinrinlb, o
⇒
PAuxb o
inrinrinrk
⇒
=
x

by intros

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
refine inj_countable'λp ⇒ match p with PLiveb ⇒ inlb | PByteb o ⇒ inrinlb, o | PAuxb o ⇒ inrinrinlb, o | PNamek ⇒ inrinrinrk end λt ⇒ match t with inlb ⇒ PLiveb | inrinlb, o ⇒ PByteb o | inrinrinlb, o ⇒ PAuxb o | inrinrinrk ⇒ PNamek end _
by intros

Agreement with the memory

The object of identity b is registered in m, live or freed.

82Definition registeredm : mem b : Z : Prop ≔

While the object b is live in m, offset o is inside its bounds and P holds.

86Definition in_livem : mem b o : Z P : Prop : Prop ≔
∀reg, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ P

The piece l with the value v agrees with the memory m: a life token names a live object with its region, or, ended, a registered one; a byte or aux piece names a registered object and, while it is live, is inside its bounds and holds the memory's byte, or the capability up to aux_holds; a name, a codec, a stream or a getopt token agrees with every memory.

95Definition agree_piecem : mem l : piece v : pval : Prop ≔
match l, v with
⇒
live_atm b reg
⇒
registeredm b ∧ in_livem b o m_bytesm b + o = x
PAuxb o, VAuxc
⇒
registeredm b ∧ in_livem b o aux_holdsm b + o c
⇒
True
⇒
True
⇒
True
⇒
True
⇒
True
_, _
⇒
False

Every piece of the ghost heap h agrees with the memory m.

110Definition agreesm : mem h : gmappiece pval : Prop ≔
∀l v, h !! l = Somev → agree_piecem l v

Every piece of the list ps agrees with the memory m.

114Fixpoint all_agreem : mem ps : listpiece × pval : Prop ≔
match ps with
[ ]
⇒
True
lv :: ps′
⇒
agree_piecem lv.1 lv.2 ∧ all_agreem ps′

What owning the pieces ps tells a step about the memory m: they agree with it, live objects do not overlap, and every object fits the address space.

123Definition owned_factsps : listpiece × pval m : mem : Prop ≔

From m to m', every piece whose key is not among ks keeps agreeing: a step that writes only the pieces ks.

128Definition frame_okks : listpiece m m′ : mem : Prop ≔
∀l v, l ∉ ks → agree_piecem l v → agree_piecem′ l v

The eight byte pieces of the little-endian x at offset o of the object b.

133Definition cellb o x : Z : listpiece × pval ≔
mapλi ⇒ PByteb o + i, VBytebyte_ofx i 0; 1; 2; 3; 4; 5; 6; 7

The ghost heap h with the pieces ps written over it, the first of a key winning.

138Fixpoint overwriteps : listpiece × pval h : gmappiece pval : gmappiece pval ≔
match ps with
[ ]
⇒
h
lv :: ps′
⇒
<[lv.1 ≔ lv.2]>overwriteps′ h

The pieces of a new object of the request q at base: its life, a zero byte and an empty aux slot at each offset.

146Definition obj_psbase : Z q : alloc_req : listpiece × pval ≔
PLivebase, VLivemkRegionbase base + req_extentq req_kindq Live :: λi ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq

Facts about agreement

A byte store keeps every region.

154Lemma regions_store_bytes
∀ m a s x
Explore proof 1 tactics

Initial goal

m :
a, s, x :
Z

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

An aux store keeps every region.

158Lemma regions_store_aux
∀ m a c
Explore proof 1 tactics

Initial goal

m :
a :
Z
c :

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

A byte store keeps every aux slot.

162Lemma aux_store_bytes
∀ m a s x
Explore proof 1 tactics

Initial goal

m :
a, s, x :
Z
⊢

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

An aux store changes only its own slot.

166Lemma aux_store_aux
∀ m a c a′
m_auxstore_auxm a c a′
=
a′ =? a
→
c
else
m_auxm a′
Explore proof 1 tactics

Initial goal

m :
a :
Z
c :
a′ :
Z
⊢
m_auxstore_auxm a c a′
=
a′ =? a
→
c
else
m_auxm a′

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

all_agree of two lists is all_agree of each.

170Lemma all_agree_app
∀ m ps qs
all_agreem ps ++ qs ↔ all_agreem ps ∧ all_agreem qs
Explore proof 3 tactics

Initial goal

m :
ps, qs :
listpiece × pval
⊢
all_agreem ps ++ qs ↔ all_agreem ps ∧ all_agreem qs

induction ps as | lv ps IH ; cbn ; tauto |

m :
lv :
ps, qs :
listpiece × pval
IH :
all_agreem ps ++ qs ↔ all_agreem ps ∧ all_agreem qs
⊢
agree_piecem lv.1 lv.2 ∧ all_agreem ps ++ qs ↔ agree_piecem lv.1 lv.2 ∧ all_agreem ps ∧ all_agreem qs

rewrite IH

m :
lv :
ps, qs :
listpiece × pval
IH :
all_agreem ps ++ qs ↔ all_agreem ps ∧ all_agreem qs
⊢
agree_piecem lv.1 lv.2 ∧ all_agreem ps ∧ all_agreem qs ↔ agree_piecem lv.1 lv.2 ∧ all_agreem ps ∧ all_agreem qs

tauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
induction ps as | lv ps IH ; cbn ; tauto |
rewrite IH
tauto

A piece of a list that agrees agrees.

174Lemma all_agree_elem
∀ m ps l v
l, v ∈ ps
Explore proof 4 tactics

Initial goal

m :
ps :
listpiece × pval
v :
⊢
all_agreem ps → l, v ∈ ps → agree_piecem l v

induction ps as | l′ v′ ps IH ; cbn ; intros H Hin

2 open

m :
v :
H :
True
Hin :
l, v ∈ [ ]
⊢
focused goal
m :
l′ :
v′ :
ps :
listpiece × pval
v :
IH :
all_agreem ps → l, v ∈ ps → agree_piecem l v
H :
agree_piecem l′ v′ ∧ all_agreem ps
Hin :
l, v ∈ l′, v′ :: ps
⊢

–by apply not_elem_of_nil in Hin

deferred goal
m :
l′ :
v′ :
ps :
listpiece × pval
v :
IH :
all_agreem ps → l, v ∈ ps → agree_piecem l v
H :
agree_piecem l′ v′ ∧ all_agreem ps
Hin :
l, v ∈ l′, v′ :: ps
⊢

–apply elem_of_cons in Hin as = → → | Hin ; tauto |

m :
l′ :
v′ :
ps :
listpiece × pval
v :
IH :
all_agreem ps → l, v ∈ ps → agree_piecem l v
H :
agree_piecem l′ v′ ∧ all_agreem ps
Hin :
l, v ∈ ps
⊢

apply IH ; tauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
induction ps as | l′ v′ ps IH ; cbn ; intros H Hin
–by apply not_elem_of_nil in Hin
–apply elem_of_cons in Hin as = → → | Hin ; tauto |
apply IH ; tauto

A list agrees if each of its pieces does.

182Lemma all_agree_intro
∀ m ps
∀l v, l, v ∈ ps → agree_piecem l v
Explore proof 10 tactics

Initial goal

m :
ps :
listpiece × pval
⊢
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps

induction ps as | l v ps IH ; cbn ; intros H ; done |

m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
⊢
agree_piecem l v ∧ all_agreem ps

split

2 open

m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
⊢
focused goal
m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
⊢

–apply H

2 open

m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
⊢
l, v ∈ l, v :: ps
deferred goal
m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
⊢

apply elem_of_cons

2 open

m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
⊢
l, v = l, v ∨ l, v ∈ ps
deferred goal
m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
⊢

by left

deferred goal
m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
⊢

–apply IH

m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
⊢
∀l0 : piece v0 : pval, l0, v0 ∈ ps → agree_piecem l0 v0

intros l′ v′ Hin

m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
l′ :
v′ :
Hin :
l′, v′ ∈ ps
⊢
agree_piecem l′ v′

apply H

m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
l′ :
v′ :
Hin :
l′, v′ ∈ ps
⊢
l′, v′ ∈ l, v :: ps

apply elem_of_cons

m :
v :
ps :
listpiece × pval
IH :
∀l : piece v : pval, l, v ∈ ps → agree_piecem l v → all_agreem ps
H :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → agree_piecem l0 v0
l′ :
v′ :
Hin :
l′, v′ ∈ ps
⊢
l′, v′ = l, v ∨ l′, v′ ∈ ps

by right

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
induction ps as | l v ps IH ; cbn ; intros H ; done |
split
–apply H
apply elem_of_cons
by left
–apply IH
intros l′ v′ Hin
apply H
apply elem_of_cons
by right

A cell agrees when each of its eight bytes does.

190Lemma all_agree_cell
∀ m b o x
all_agreem cellb o x ↔ ∀i, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
Explore proof 8 tactics

Initial goal

m :
b, o, x :
Z
⊢
all_agreem cellb o x ↔ ∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i

unfold cell ; cbn [ map all_agree fst snd ]

m :
b, o, x :
Z
⊢
agree_piecem PByteb o + 0 VBytebyte_ofx 0 ∧ agree_piecem PByteb o + 1 VBytebyte_ofx 1 ∧ agree_piecem PByteb o + 2 VBytebyte_ofx 2 ∧ agree_piecem PByteb o + 3 VBytebyte_ofx 3 ∧ agree_piecem PByteb o + 4 VBytebyte_ofx 4 ∧ agree_piecem PByteb o + 5 VBytebyte_ofx 5 ∧ agree_piecem PByteb o + 6 VBytebyte_ofx 6 ∧ agree_piecem PByteb o + 7 VBytebyte_ofx 7 ∧ True ↔ ∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i

split

2 open

m :
b, o, x :
Z
⊢
agree_piecem PByteb o + 0 VBytebyte_ofx 0 ∧ agree_piecem PByteb o + 1 VBytebyte_ofx 1 ∧ agree_piecem PByteb o + 2 VBytebyte_ofx 2 ∧ agree_piecem PByteb o + 3 VBytebyte_ofx 3 ∧ agree_piecem PByteb o + 4 VBytebyte_ofx 4 ∧ agree_piecem PByteb o + 5 VBytebyte_ofx 5 ∧ agree_piecem PByteb o + 6 VBytebyte_ofx 6 ∧ agree_piecem PByteb o + 7 VBytebyte_ofx 7 ∧ True → ∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
focused goal
m :
b, o, x :
Z
⊢
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i → agree_piecem PByteb o + 0 VBytebyte_ofx 0 ∧ agree_piecem PByteb o + 1 VBytebyte_ofx 1 ∧ agree_piecem PByteb o + 2 VBytebyte_ofx 2 ∧ agree_piecem PByteb o + 3 VBytebyte_ofx 3 ∧ agree_piecem PByteb o + 4 VBytebyte_ofx 4 ∧ agree_piecem PByteb o + 5 VBytebyte_ofx 5 ∧ agree_piecem PByteb o + 6 VBytebyte_ofx 6 ∧ agree_piecem PByteb o + 7 VBytebyte_ofx 7 ∧ True

–intros H i Hi

2 open

m :
b, o, x :
Z
H :
agree_piecem PByteb o + 0 VBytebyte_ofx 0 ∧ agree_piecem PByteb o + 1 VBytebyte_ofx 1 ∧ agree_piecem PByteb o + 2 VBytebyte_ofx 2 ∧ agree_piecem PByteb o + 3 VBytebyte_ofx 3 ∧ agree_piecem PByteb o + 4 VBytebyte_ofx 4 ∧ agree_piecem PByteb o + 5 VBytebyte_ofx 5 ∧ agree_piecem PByteb o + 6 VBytebyte_ofx 6 ∧ agree_piecem PByteb o + 7 VBytebyte_ofx 7 ∧ True
i :
Z
Hi :
0 ≤ i < 8
deferred goal
m :
b, o, x :
Z
⊢
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i → agree_piecem PByteb o + 0 VBytebyte_ofx 0 ∧ agree_piecem PByteb o + 1 VBytebyte_ofx 1 ∧ agree_piecem PByteb o + 2 VBytebyte_ofx 2 ∧ agree_piecem PByteb o + 3 VBytebyte_ofx 3 ∧ agree_piecem PByteb o + 4 VBytebyte_ofx 4 ∧ agree_piecem PByteb o + 5 VBytebyte_ofx 5 ∧ agree_piecem PByteb o + 6 VBytebyte_ofx 6 ∧ agree_piecem PByteb o + 7 VBytebyte_ofx 7 ∧ True

assert i = 0 ∨ i = 1 ∨ i = 2 ∨ i = 3 ∨ i = 4 ∨ i = 5 ∨ i = 6 ∨ i = 7 as Hc by lia

2 open

m :
b, o, x :
Z
H :
agree_piecem PByteb o + 0 VBytebyte_ofx 0 ∧ agree_piecem PByteb o + 1 VBytebyte_ofx 1 ∧ agree_piecem PByteb o + 2 VBytebyte_ofx 2 ∧ agree_piecem PByteb o + 3 VBytebyte_ofx 3 ∧ agree_piecem PByteb o + 4 VBytebyte_ofx 4 ∧ agree_piecem PByteb o + 5 VBytebyte_ofx 5 ∧ agree_piecem PByteb o + 6 VBytebyte_ofx 6 ∧ agree_piecem PByteb o + 7 VBytebyte_ofx 7 ∧ True
i :
Z
Hi :
0 ≤ i < 8
Hc :
i = 0 ∨ i = 1 ∨ i = 2 ∨ i = 3 ∨ i = 4 ∨ i = 5 ∨ i = 6 ∨ i = 7
deferred goal
m :
b, o, x :
Z
⊢
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i → agree_piecem PByteb o + 0 VBytebyte_ofx 0 ∧ agree_piecem PByteb o + 1 VBytebyte_ofx 1 ∧ agree_piecem PByteb o + 2 VBytebyte_ofx 2 ∧ agree_piecem PByteb o + 3 VBytebyte_ofx 3 ∧ agree_piecem PByteb o + 4 VBytebyte_ofx 4 ∧ agree_piecem PByteb o + 5 VBytebyte_ofx 5 ∧ agree_piecem PByteb o + 6 VBytebyte_ofx 6 ∧ agree_piecem PByteb o + 7 VBytebyte_ofx 7 ∧ True

destruct Hc as [ ->| [ ->| [ ->| [ ->| [ ->| [ ->| [ ->| -> ] ] ] ] ] ] ] ; tauto

deferred goal
m :
b, o, x :
Z
⊢
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i → agree_piecem PByteb o + 0 VBytebyte_ofx 0 ∧ agree_piecem PByteb o + 1 VBytebyte_ofx 1 ∧ agree_piecem PByteb o + 2 VBytebyte_ofx 2 ∧ agree_piecem PByteb o + 3 VBytebyte_ofx 3 ∧ agree_piecem PByteb o + 4 VBytebyte_ofx 4 ∧ agree_piecem PByteb o + 5 VBytebyte_ofx 5 ∧ agree_piecem PByteb o + 6 VBytebyte_ofx 6 ∧ agree_piecem PByteb o + 7 VBytebyte_ofx 7 ∧ True

–intros H

m :
b, o, x :
Z
H :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
⊢
agree_piecem PByteb o + 0 VBytebyte_ofx 0 ∧ agree_piecem PByteb o + 1 VBytebyte_ofx 1 ∧ agree_piecem PByteb o + 2 VBytebyte_ofx 2 ∧ agree_piecem PByteb o + 3 VBytebyte_ofx 3 ∧ agree_piecem PByteb o + 4 VBytebyte_ofx 4 ∧ agree_piecem PByteb o + 5 VBytebyte_ofx 5 ∧ agree_piecem PByteb o + 6 VBytebyte_ofx 6 ∧ agree_piecem PByteb o + 7 VBytebyte_ofx 7 ∧ True

repeat split ; apply H ; lia |

m :
b, o, x :
Z
H :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
⊢
True

exact I

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
unfold cell ; cbn [ map all_agree fst snd ]
split
–intros H i Hi
assert i = 0 ∨ i = 1 ∨ i = 2 ∨ i = 3 ∨ i = 4 ∨ i = 5 ∨ i = 6 ∨ i = 7 as Hc by lia
destruct Hc as [ ->| [ ->| [ ->| [ ->| [ ->| [ ->| [ ->| -> ] ] ] ] ] ] ] ; tauto
–intros H
repeat split ; apply H ; lia |
exact I

Byte i of a cell is one of its keys.

201Lemma cell_keys
∀ b o x i
0 ≤ i < 8
PByteb o + i ∈ cellb o x.*1
Explore proof 6 tactics

Initial goal

b, o, x, i :
Z
⊢
0 ≤ i < 8 → PByteb o + i ∈ cellb o x.*1

intros Hi

b, o, x, i :
Z
Hi :
0 ≤ i < 8
⊢
PByteb o + i ∈ cellb o x.*1

apply list_elem_of_In

b, o, x, i :
Z
Hi :
0 ≤ i < 8
⊢
InPByteb o + i cellb o x.*1

unfold cell

b, o, x, i :
Z
Hi :
0 ≤ i < 8
⊢
InPByteb o + i mapλi0 : Z ⇒ PByteb o + i0, VBytebyte_ofx i0 0; 1; 2; 3; 4; 5; 6; 7.*1

cbn

b, o, x, i :
Z
Hi :
0 ≤ i < 8
⊢
PByteb o + 0 = PByteb o + i ∨ PByteb o + 1 = PByteb o + i ∨ PByteb o + 2 = PByteb o + i ∨ PByteb o + 3 = PByteb o + i ∨ PByteb o + 4 = PByteb o + i ∨ PByteb o + 5 = PByteb o + i ∨ PByteb o + 6 = PByteb o + i ∨ PByteb o + 7 = PByteb o + i ∨ False

assert i = 0 ∨ i = 1 ∨ i = 2 ∨ i = 3 ∨ i = 4 ∨ i = 5 ∨ i = 6 ∨ i = 7 as Hc by lia

b, o, x, i :
Z
Hi :
0 ≤ i < 8
Hc :
i = 0 ∨ i = 1 ∨ i = 2 ∨ i = 3 ∨ i = 4 ∨ i = 5 ∨ i = 6 ∨ i = 7
⊢
PByteb o + 0 = PByteb o + i ∨ PByteb o + 1 = PByteb o + i ∨ PByteb o + 2 = PByteb o + i ∨ PByteb o + 3 = PByteb o + i ∨ PByteb o + 4 = PByteb o + i ∨ PByteb o + 5 = PByteb o + i ∨ PByteb o + 6 = PByteb o + i ∨ PByteb o + 7 = PByteb o + i ∨ False

destruct Hc as [ ->| [ ->| [ ->| [ ->| [ ->| [ ->| [ ->| -> ] ] ] ] ] ] ] ; repeat first left ; reflexivity | right

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hi
apply list_elem_of_In
unfold cell
cbn
assert i = 0 ∨ i = 1 ∨ i = 2 ∨ i = 3 ∨ i = 4 ∨ i = 5 ∨ i = 6 ∨ i = 7 as Hc by lia
destruct Hc as [ ->| [ ->| [ ->| [ ->| [ ->| [ ->| [ ->| -> ] ] ] ] ] ] ] ; repeat first left ; reflexivity | right

A piece of memory that agrees names a registered object.

210Lemma agree_piece_registered
Explore proof 3 tactics

Initial goal

destruct l as b | b o | b o | k , v as reg | x | c | | q t | cd | sq sp | ga gi | op ; cbn ; unfold live_at , registered ; try tauto

m :
b :
Z
reg :
⊢
True → object_regionb m_regionsm = Somereg ∧ r_lifereg = Live → object_regionb m_regionsm ≠ None

intros _ E _

m :
b :
Z
reg :
E :
⊢

congruence

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
destruct l as b | b o | b o | k , v as reg | x | c | | q t | cd | sq sp | ga gi | op ; cbn ; unfold live_at , registered ; try tauto
intros _ E _
congruence

A live object stays live while regions are kept.

217Lemma live_at_regions
∀ m m′ b reg
live_atm′ b reg
Explore proof 3 tactics

Initial goal

m, m′ :
b :
Z
reg :
⊢
m_regionsm′ = m_regionsm → live_atm b reg → live_atm′ b reg

unfold live_at

m, m′ :
b :
Z
reg :
⊢
m_regionsm′ = m_regionsm → object_regionb m_regionsm = Somereg ∧ r_lifereg = Live → object_regionb m_regionsm′ = Somereg ∧ r_lifereg = Live

intros →

m, m′ :
b :
Z
reg :
⊢
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live → object_regionb m_regionsm = Somereg ∧ r_lifereg = Live

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
unfold live_at
intros →
auto

Live objects stay apart while regions are kept.

221Lemma live_disjoint_regions
Explore proof 4 tactics

Initial goal

m, m′ :

intros E Hd b1 r1 b2 r2

m, m′ :
E :
b1 :
Z
r1 :
b2 :
Z
r2 :
⊢
live_atm′ b1 r1 → live_atm′ b2 r2 → b1 ≠ b2 → r_endr1 ≤ b2 ∨ r_endr2 ≤ b1

unfold live_at

m, m′ :
E :
b1 :
Z
r1 :
b2 :
Z
r2 :
⊢
object_regionb1 m_regionsm′ = Somer1 ∧ r_lifer1 = Live → object_regionb2 m_regionsm′ = Somer2 ∧ r_lifer2 = Live → b1 ≠ b2 → r_endr1 ≤ b2 ∨ r_endr2 ≤ b1

rewrite E

m, m′ :
E :
b1 :
Z
r1 :
b2 :
Z
r2 :
⊢
object_regionb1 m_regionsm = Somer1 ∧ r_lifer1 = Live → object_regionb2 m_regionsm = Somer2 ∧ r_lifer2 = Live → b1 ≠ b2 → r_endr1 ≤ b2 ∨ r_endr2 ≤ b1

apply Hd

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros E Hd b1 r1 b2 r2
unfold live_at
rewrite E
apply Hd

What a safepoint may do keeps a piece's agreement.

225Lemma agree_piece_safepoint
∀ m m′ l v
agree_piecem′ l v
Explore proof 13 tactics

Initial goal

m, m′ :
v :
⊢
same_regionsm m′ → m_bytesm′ = m_bytesm → aux_movesm m′ → agree_piecem l v → agree_piecem′ l v

intros Hr Hb Ha

m, m′ :
v :
Hr :
Hb :
Ha :
aux_movesm m′
⊢
agree_piecem l v → agree_piecem′ l v

pose proof Hr as Hr′

m, m′ :
v :
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
⊢
agree_piecem l v → agree_piecem′ l v

unfold same_regions in Hr′

m, m′ :
v :
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
⊢
agree_piecem l v → agree_piecem′ l v

destruct l as b | b o | b o | k , v as reg | x | c | | q t | cd | sq sp | ga gi | op ; cbn ; try tauto ; unfold live_at , registered , in_live ; rewrite ! Hr′ ; try tauto

2 open

m, m′ :
b, o, x :
Z
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm b + o = x → object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm′ b + o = x
focused goal
m, m′ :
b, o :
Z
c :
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm′ b + o c

–rewrite Hb

2 open

m, m′ :
b, o, x :
Z
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm b + o = x → object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm b + o = x
deferred goal
m, m′ :
b, o :
Z
c :
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm′ b + o c

tauto

deferred goal
m, m′ :
b, o :
Z
c :
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm′ b + o c

–intros Hreg Hin

m, m′ :
b, o :
Z
c :
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
Hreg :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm′ b + o c

split ; exact Hreg |

m, m′ :
b, o :
Z
c :
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
Hreg :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
⊢
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm′ b + o c

intros reg E L

m, m′ :
b, o :
Z
c :
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
Hreg :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
reg :
E :
L :
r_lifereg = Live
⊢
0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm′ b + o c

destruct Hinreg E L as Ho & He & Hx

m, m′ :
b, o :
Z
c :
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
Hreg :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
reg :
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o < r_endreg
Hx :
aux_holdsm b + o c
⊢
0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm′ b + o c

split ; exact Ho |

m, m′ :
b, o :
Z
c :
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
Hreg :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
reg :
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o < r_endreg
Hx :
aux_holdsm b + o c
⊢
b + o < r_endreg ∧ aux_holdsm′ b + o c

split ; exact He |

m, m′ :
b, o :
Z
c :
Hr :
Hb :
Ha :
aux_movesm m′
Hr′ :
Hreg :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
reg :
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o < r_endreg
Hx :
aux_holdsm b + o c
⊢
aux_holdsm′ b + o c

exact aux_holds_movesm m′ b + o c Hr Ha Hx

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hr Hb Ha
pose proof Hr as Hr′
unfold same_regions in Hr′
destruct l as b | b o | b o | k , v as reg | x | c | | q t | cd | sq sp | ga gi | op ; cbn ; try tauto ; unfold live_at , registered , in_live ; rewrite ! Hr′ ; try tauto
–rewrite Hb
tauto
–intros Hreg Hin
split ; exact Hreg |
intros reg E L
destruct Hinreg E L as Ho & He & Hx
split ; exact Ho |
split ; exact He |
exact aux_holds_movesm m′ b + o c Hr Ha Hx

Two live objects' addresses differ.

238Lemma live_apart
∀ m b reg b′ reg′ a a′
live_atm b reg
live_atm b′ reg′
b ≠ b′
b ≤ a < r_endreg
b′ ≤ a′ < r_endreg′
a ≠ a′
Explore proof 2 tactics

Initial goal

m :
b :
Z
reg :
b′ :
Z
reg′ :
a, a′ :
Z
⊢
live_disjointm → live_atm b reg → live_atm b′ reg′ → b ≠ b′ → b ≤ a < r_endreg → b′ ≤ a′ < r_endreg′ → a ≠ a′

intros Hd H H′ Hne Ha Ha′

m :
b :
Z
reg :
b′ :
Z
reg′ :
a, a′ :
Z
H :
live_atm b reg
H′ :
live_atm b′ reg′
Hne :
b ≠ b′
Ha :
b ≤ a < r_endreg
Ha′ :
b′ ≤ a′ < r_endreg′
⊢
a ≠ a′

destruct Hdb reg b′ reg′ H H′ Hne ; lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hd H H′ Hne Ha Ha′
destruct Hdb reg b′ reg′ H H′ Hne ; lia

An 8-byte store inside the live object b, whose bytes are among the keys ks, keeps every other piece's agreement.

245Lemma frame_store_bytes
∀ ks m b reg o a x
live_atm b reg
0 ≤ o
b + o + 8 ≤ r_endreg
a = b + o
∀i, 0 ≤ i < 8 → PByteb o + i ∈ ks
Explore proof 27 tactics

Initial goal

ks :
listpiece
m :
b :
Z
reg :
o, a, x :
Z
⊢
live_disjointm → live_atm b reg → 0 ≤ o → b + o + 8 ≤ r_endreg → a = b + o → ∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks → frame_okks m store_bytesm a 8 x

intros Hd Hl Ho He → Hks l v Hn Ha

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
v :
Hn :
l ∉ ks
Ha :
⊢
agree_piecestore_bytesm b + o 8 x l v

destruct l as b′ | b′ o′ | b′ o′ | k , v as reg′ | y | c | | q t | cd | sq sp | ga gi | op ; cbn [ agree_piece ] in Ha |- * ; try contradiction ; try exact I

4 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′ :
Z
reg′ :
Hn :
PLiveb′ ∉ ks
Ha :
live_atm b′ reg′
⊢
live_atstore_bytesm b + o 8 x b′ reg′
focused goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
⊢
registeredstore_bytesm b + o 8 x b′
focused goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
focused goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

–exact live_at_regions_ _ _ _ regions_store_bytes_ _ _ _ Ha

3 open

deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
⊢
registeredstore_bytesm b + o 8 x b′
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

–unfold registered in *

3 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None
⊢
object_regionb′ m_regionsstore_bytesm b + o 8 x ≠ None
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

rewrite regions_store_bytes

3 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None
⊢
object_regionb′ m_regionsm ≠ None
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

exact Ha

2 open

deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

–unfold registered , in_live in *

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
⊢
object_regionb′ m_regionsstore_bytesm b + o 8 x ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsstore_bytesm b + o 8 x = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

rewrite ! regions_store_bytes

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
⊢
object_regionb′ m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

destruct Ha as Hr Hin

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
⊢
object_regionb′ m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

split ; exact Hr |

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
⊢
∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

intros reg′ E L

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
⊢
0 ≤ o′ ∧ b′ + o′ < r_endreg′ ∧ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

destruct Hinreg′ E L as Ho′ & He′ & Hb

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
⊢
0 ≤ o′ ∧ b′ + o′ < r_endreg′ ∧ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

split ; exact Ho′ |

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
⊢
b′ + o′ < r_endreg′ ∧ m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

split ; exact He′ |

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
⊢
m_bytesstore_bytesm b + o 8 x b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

rewrite store_bytes_other ; exact Hb |

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
⊢
¬b + o ≤ b′ + o′ < b + o + 8
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

intros Hin′

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
Hin′ :
b + o ≤ b′ + o′ < b + o + 8
⊢
False
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

destruct Z.eq_decb′ b as [ ->| Hne ]

3 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
o′, y :
Z
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b + o′ < r_endreg ∧ m_bytesm b + o′ = y
Hr :
Hn :
PByteb o′ ∉ ks
reg′ :
E :
object_regionb m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
Hin′ :
b + o ≤ b + o′ < b + o + 8
Hb :
m_bytesm b + o′ = y
He′ :
b + o′ < r_endreg′
⊢
False
focused goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
Hin′ :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

+apply Hn

3 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
o′, y :
Z
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b + o′ < r_endreg ∧ m_bytesm b + o′ = y
Hr :
Hn :
PByteb o′ ∉ ks
reg′ :
E :
object_regionb m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
Hin′ :
b + o ≤ b + o′ < b + o + 8
Hb :
m_bytesm b + o′ = y
He′ :
b + o′ < r_endreg′
⊢
PByteb o′ ∈ ks
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
Hin′ :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

replace o′ with o + o′ − o by lia

3 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
o′, y :
Z
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b + o′ < r_endreg ∧ m_bytesm b + o′ = y
Hr :
Hn :
PByteb o′ ∉ ks
reg′ :
E :
object_regionb m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
Hin′ :
b + o ≤ b + o′ < b + o + 8
Hb :
m_bytesm b + o′ = y
He′ :
b + o′ < r_endreg′
⊢
PByteb o + o′ − o ∈ ks
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
Hin′ :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

apply Hks

3 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
o′, y :
Z
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b + o′ < r_endreg ∧ m_bytesm b + o′ = y
Hr :
Hn :
PByteb o′ ∉ ks
reg′ :
E :
object_regionb m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
Hin′ :
b + o ≤ b + o′ < b + o + 8
Hb :
m_bytesm b + o′ = y
He′ :
b + o′ < r_endreg′
⊢
0 ≤ o′ − o < 8
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
Hin′ :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

lia

2 open

deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
Hin′ :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

+apply live_apartm b reg b′ reg′ b′ + o′ b′ + o′ Hd Hl conjE L ; congruence | lia | lia |

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
Hin′ :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
b′ + o′ = b′ + o′
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

destruct Hl as El Ll

2 open

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
El :
Ll :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hb :
m_bytesm b′ + o′ = y
Hin′ :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
b′ + o′ = b′ + o′
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

destruct Hdb reg b′ reg′ conjEl Ll conjE L ; congruence | | ; lia

deferred goal
ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
⊢
registeredstore_bytesm b + o 8 x b′ ∧ in_livestore_bytesm b + o 8 x b′ o′ aux_holdsstore_bytesm b + o 8 x b′ + o′ c

–unfold registered , in_live , aux_holds in *

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
object_regionb′ m_regionsstore_bytesm b + o 8 x ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsstore_bytesm b + o 8 x = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_auxstore_bytesm b + o 8 x b′ + o′ = c ∨ freed_inm_regionsstore_bytesm b + o 8 x c ∧ traps_as_freedm_regionsstore_bytesm b + o 8 x m_auxstore_bytesm b + o 8 x b′ + o′

rewrite ! regions_store_bytes aux_store_bytes

ks :
listpiece
m :
b :
Z
reg :
o, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hks :
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ ks
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
object_regionb′ m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′

exact Ha

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hd Hl Ho He → Hks l v Hn Ha
destruct l as b′ | b′ o′ | b′ o′ | k , v as reg′ | y | c | | q t | cd | sq sp | ga gi | op ; cbn [ agree_piece ] in Ha |- * ; try contradiction ; try exact I
–exact live_at_regions_ _ _ _ regions_store_bytes_ _ _ _ Ha
–unfold registered in *
exact Ha
–unfold registered , in_live in *
destruct Ha as Hr Hin
split ; exact Hr |
intros reg′ E L
destruct Hinreg′ E L as Ho′ & He′ & Hb
split ; exact Ho′ |
split ; exact He′ |
rewrite store_bytes_other ; exact Hb |
intros Hin′
destruct Z.eq_decb′ b as [ ->| Hne ]
+apply Hn
replace o′ with o + o′ − o by lia
apply Hks
lia
+apply live_apartm b reg b′ reg′ b′ + o′ b′ + o′ Hd Hl conjE L ; congruence | lia | lia |
destruct Hl as El Ll
destruct Hdb reg b′ reg′ conjEl Ll conjE L ; congruence | | ; lia
–unfold registered , in_live , aux_holds in *
exact Ha

An aux store inside the live object b, whose slot is among the keys ks, keeps every other piece's agreement.

268Lemma frame_store_aux
∀ ks m b reg o a c
live_atm b reg
0 ≤ o
b + o < r_endreg
a = b + o
PAuxb o ∈ ks
Explore proof 29 tactics

Initial goal

ks :
listpiece
m :
b :
Z
reg :
o, a :
Z
c :
⊢
live_disjointm → live_atm b reg → 0 ≤ o → b + o < r_endreg → a = b + o → PAuxb o ∈ ks → frame_okks m store_auxm a c

intros Hd Hl Ho He → Hk l v Hn Ha

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
v :
Hn :
l ∉ ks
Ha :
⊢
agree_piecestore_auxm b + o c l v

destruct l as b′ | b′ o′ | b′ o′ | k , v as reg′ | y | c′ | | q t | cd | sq sp | ga gi | op ; cbn [ agree_piece ] in Ha |- * ; try contradiction ; try exact I

4 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′ :
Z
reg′ :
Hn :
PLiveb′ ∉ ks
Ha :
live_atm b′ reg′
⊢
live_atstore_auxm b + o c b′ reg′
focused goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
⊢
registeredstore_auxm b + o c b′
focused goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ m_bytesstore_auxm b + o c b′ + o′ = y
focused goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c′
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ aux_holdsstore_auxm b + o c b′ + o′ c′

–exact live_at_regions_ _ _ _ regions_store_aux_ _ _ Ha

3 open

deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
⊢
registeredstore_auxm b + o c b′
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ m_bytesstore_auxm b + o c b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c′
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ aux_holdsstore_auxm b + o c b′ + o′ c′

–unfold registered in *

3 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None
⊢
object_regionb′ m_regionsstore_auxm b + o c ≠ None
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ m_bytesstore_auxm b + o c b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c′
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ aux_holdsstore_auxm b + o c b′ + o′ c′

rewrite regions_store_aux

3 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None
⊢
object_regionb′ m_regionsm ≠ None
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ m_bytesstore_auxm b + o c b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c′
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ aux_holdsstore_auxm b + o c b′ + o′ c′

exact Ha

2 open

deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ m_bytesstore_auxm b + o c b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c′
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ aux_holdsstore_auxm b + o c b′ + o′ c′

–unfold registered , in_live in *

2 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
⊢
object_regionb′ m_regionsstore_auxm b + o c ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsstore_auxm b + o c = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_bytesstore_auxm b + o c b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c′
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ aux_holdsstore_auxm b + o c b′ + o′ c′

rewrite ! regions_store_aux

2 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
⊢
object_regionb′ m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_bytesstore_auxm b + o c b′ + o′ = y
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c′
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ aux_holdsstore_auxm b + o c b′ + o′ c′

exact Ha

deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c′
⊢
registeredstore_auxm b + o c b′ ∧ in_livestore_auxm b + o c b′ o′ aux_holdsstore_auxm b + o c b′ + o′ c′

–unfold registered , in_live , aux_holds in *

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
object_regionb′ m_regionsstore_auxm b + o c ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsstore_auxm b + o c = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_auxstore_auxm b + o c b′ + o′ = c′ ∨ freed_inm_regionsstore_auxm b + o c c′ ∧ traps_as_freedm_regionsstore_auxm b + o c m_auxstore_auxm b + o c b′ + o′

rewrite ! regions_store_aux

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
object_regionb′ m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_auxstore_auxm b + o c b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxstore_auxm b + o c b′ + o′

destruct Ha as Hr Hin

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
object_regionb′ m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_auxstore_auxm b + o c b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxstore_auxm b + o c b′ + o′

split ; exact Hr |

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_auxstore_auxm b + o c b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxstore_auxm b + o c b′ + o′

intros reg′ E L

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
⊢
0 ≤ o′ ∧ b′ + o′ < r_endreg′ ∧ m_auxstore_auxm b + o c b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxstore_auxm b + o c b′ + o′

destruct Hinreg′ E L as Ho′ & He′ & Hx

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
0 ≤ o′ ∧ b′ + o′ < r_endreg′ ∧ m_auxstore_auxm b + o c b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxstore_auxm b + o c b′ + o′

split ; exact Ho′ |

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
b′ + o′ < r_endreg′ ∧ m_auxstore_auxm b + o c b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxstore_auxm b + o c b′ + o′

split ; exact He′ |

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
m_auxstore_auxm b + o c b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxstore_auxm b + o c b′ + o′

rewrite aux_store_aux

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′
=
c′
∨
∧
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′

assert Hne : b′ + o′ =? b + o = false

2 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
b′ + o′ =? b + o = false
focused goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ + o′ =? b + o = false
⊢
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′
=
c′
∨
∧
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′

{apply Z.eqb_neq

2 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
b′ + o′ ≠ b + o
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ + o′ =? b + o = false
⊢
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′
=
c′
∨
∧
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′

destruct Z.eq_decb′ b as [ ->| Hne ]

3 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
o′ :
Z
c′ :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b + o′ < r_endreg ∧ m_auxm b + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b + o′
Hr :
Hn :
PAuxb o′ ∉ ks
reg′ :
E :
object_regionb m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
Hx :
m_auxm b + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b + o′
He′ :
b + o′ < r_endreg′
⊢
b + o′ ≠ b + o
focused goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ ≠ b
⊢
b′ + o′ ≠ b + o
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ + o′ =? b + o = false
⊢
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′
=
c′
∨
∧
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′

–intros Heq

3 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
o′ :
Z
c′ :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b + o′ < r_endreg ∧ m_auxm b + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b + o′
Hr :
Hn :
PAuxb o′ ∉ ks
reg′ :
E :
object_regionb m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
Hx :
m_auxm b + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b + o′
He′ :
b + o′ < r_endreg′
Heq :
b + o′ = b + o
⊢
False
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ ≠ b
⊢
b′ + o′ ≠ b + o
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ + o′ =? b + o = false
⊢
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′
=
c′
∨
∧
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′

apply Hn

3 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
o′ :
Z
c′ :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b + o′ < r_endreg ∧ m_auxm b + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b + o′
Hr :
Hn :
PAuxb o′ ∉ ks
reg′ :
E :
object_regionb m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
Hx :
m_auxm b + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b + o′
He′ :
b + o′ < r_endreg′
Heq :
b + o′ = b + o
⊢
PAuxb o′ ∈ ks
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ ≠ b
⊢
b′ + o′ ≠ b + o
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ + o′ =? b + o = false
⊢
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′
=
c′
∨
∧
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′

replace o′ with o by lia

3 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
o′ :
Z
c′ :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b + o′ < r_endreg ∧ m_auxm b + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b + o′
Hr :
Hn :
PAuxb o′ ∉ ks
reg′ :
E :
object_regionb m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
Hx :
m_auxm b + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b + o′
He′ :
b + o′ < r_endreg′
Heq :
b + o′ = b + o
⊢
PAuxb o ∈ ks
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ ≠ b
⊢
b′ + o′ ≠ b + o
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ + o′ =? b + o = false
⊢
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′
=
c′
∨
∧
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′

exact Hk

2 open

deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ ≠ b
⊢
b′ + o′ ≠ b + o
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ + o′ =? b + o = false
⊢
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′
=
c′
∨
∧
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′

–destruct Hl as El Ll

2 open

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
El :
Ll :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ ≠ b
⊢
b′ + o′ ≠ b + o
deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ + o′ =? b + o = false
⊢
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′
=
c′
∨
∧
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′

destruct Hdb reg b′ reg′ conjEl Ll conjE L ; congruence | | ; lia

deferred goal
ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ + o′ =? b + o = false
⊢
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′
=
c′
∨
∧
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′

rewrite Hne

ks :
listpiece
m :
b :
Z
reg :
o :
Z
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
Hk :
PAuxb o ∈ ks
b′, o′ :
Z
c′ :
Hn :
PAuxb′ o′ ∉ ks
Hr :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Hx :
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hne :
b′ + o′ =? b + o = false
⊢
m_auxm b′ + o′ = c′ ∨ freed_inm_regionsm c′ ∧ traps_as_freedm_regionsm m_auxm b′ + o′

exact Hx

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hd Hl Ho He → Hk l v Hn Ha
destruct l as b′ | b′ o′ | b′ o′ | k , v as reg′ | y | c′ | | q t | cd | sq sp | ga gi | op ; cbn [ agree_piece ] in Ha |- * ; try contradiction ; try exact I
–exact live_at_regions_ _ _ _ regions_store_aux_ _ _ Ha
–unfold registered in *
exact Ha
–unfold registered , in_live in *
exact Ha
–unfold registered , in_live , aux_holds in *
destruct Ha as Hr Hin
split ; exact Hr |
intros reg′ E L
destruct Hinreg′ E L as Ho′ & He′ & Hx
split ; exact Ho′ |
split ; exact He′ |
assert Hne : b′ + o′ =? b + o = false
{apply Z.eqb_neq
destruct Z.eq_decb′ b as [ ->| Hne ]
–intros Heq
apply Hn
replace o′ with o by lia
exact Hk
–destruct Hl as El Ll
destruct Hdb reg b′ reg′ conjEl Ll conjE L ; congruence | | ; lia
rewrite Hne
exact Hx

A change that keeps every region and writes bytes and aux slots only inside the live object b, at offsets whose pieces are among the keys ks, keeps every other piece's agreement: a byte or aux slot of another live object lies outside b, since live objects do not overlap.

294Lemma frame_within
∀ ks m m′ b reg
live_atm b reg
∀a, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
∀a, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
frame_okks m m′
Explore proof 35 tactics

Initial goal

ks :
listpiece
m, m′ :
b :
Z
reg :
⊢
m_regionsm′ = m_regionsm → live_disjointm → live_atm b reg → ∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a → ∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a → frame_okks m m′

intros Hr Hd Hl Hb Hx l v Hn Ha

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
v :
Hn :
l ∉ ks
Ha :
⊢
agree_piecem′ l v

assert Hout : ∀b′ o′ reg′, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
v :
Hn :
l ∉ ks
Ha :
⊢
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
focused goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
v :
Hn :
l ∉ ks
Ha :
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
agree_piecem′ l v

{intros b′ o′ reg′ Hl′ Ho He Hin

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
v :
Hn :
l ∉ ks
Ha :
b′, o′ :
Z
reg′ :
Hl′ :
live_atm b′ reg′
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hin :
b ≤ b′ + o′ < r_endreg
⊢
b′ = b ∧ b′ + o′ − b = o′
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
v :
Hn :
l ∉ ks
Ha :
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
agree_piecem′ l v

destruct Z.eq_decb′ b as [ ->| Hne ] ; split ; reflexivity | lia |

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
v :
Hn :
l ∉ ks
Ha :
b′, o′ :
Z
reg′ :
Hl′ :
live_atm b′ reg′
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hin :
b ≤ b′ + o′ < r_endreg
Hne :
b′ ≠ b
⊢
b′ = b ∧ b′ + o′ − b = o′
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
v :
Hn :
l ∉ ks
Ha :
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
agree_piecem′ l v

exfalso

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
v :
Hn :
l ∉ ks
Ha :
b′, o′ :
Z
reg′ :
Hl′ :
live_atm b′ reg′
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hin :
b ≤ b′ + o′ < r_endreg
Hne :
b′ ≠ b
⊢
False
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
v :
Hn :
l ∉ ks
Ha :
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
agree_piecem′ l v

exact live_apartm b reg b′ reg′ b′ + o′ b′ + o′ Hd Hl Hl′ not_eq_symHne Hin ltac:lia eq_refl

deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
v :
Hn :
l ∉ ks
Ha :
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
agree_piecem′ l v

destruct l as b′ | b′ o′ | b′ o′ | k , v as reg′ | y | c | | q t | cd | sq sp | ga gi | op ; cbn [ agree_piece ] in Ha |- * ; try contradiction ; try exact I

4 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′ :
Z
reg′ :
Hn :
PLiveb′ ∉ ks
Ha :
live_atm b′ reg′
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
live_atm′ b′ reg′
focused goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′
focused goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ m_bytesm′ b′ + o′ = y
focused goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

–exact live_at_regions_ _ _ _ Hr Ha

3 open

deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

–unfold registered in *

3 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
object_regionb′ m_regionsm′ ≠ None
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

rewrite Hr

3 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′ :
Z
Hn :
PLiveb′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
object_regionb′ m_regionsm ≠ None
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

exact Ha

2 open

deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

–unfold registered , in_live in *

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
object_regionb′ m_regionsm′ ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm′ = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

rewrite Hr

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
object_regionb′ m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

destruct Ha as Hreg Hin

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
object_regionb′ m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

split ; exact Hreg |

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

intros reg′ E L

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
⊢
0 ≤ o′ ∧ b′ + o′ < r_endreg′ ∧ m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

destruct Hinreg′ E L as Ho & He & Hy

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hy :
m_bytesm b′ + o′ = y
⊢
0 ≤ o′ ∧ b′ + o′ < r_endreg′ ∧ m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

split ; exact Ho |

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hy :
m_bytesm b′ + o′ = y
⊢
b′ + o′ < r_endreg′ ∧ m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

split ; exact He |

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hy :
m_bytesm b′ + o′ = y
⊢
m_bytesm′ b′ + o′ = y
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

rewrite Hb ; exact Hy |

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hy :
m_bytesm b′ + o′ = y
⊢
b ≤ b′ + o′ < r_endreg → PByteb b′ + o′ − b ∉ ks
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

intros Hin′

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′, y :
Z
Hn :
PByteb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_bytesm b′ + o′ = y
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hy :
m_bytesm b′ + o′ = y
Hin′ :
b ≤ b′ + o′ < r_endreg
⊢
PByteb b′ + o′ − b ∉ ks
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

destruct Houtb′ o′ reg′ conjE L Ho He Hin′ as → →

2 open

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
o′, y :
Z
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b + o′ < r_endreg ∧ m_bytesm b + o′ = y
Hreg :
Hn :
PByteb o′ ∉ ks
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
Hin′ :
b ≤ b + o′ < r_endreg
Hy :
m_bytesm b + o′ = y
He :
b + o′ < r_endreg′
⊢
PByteb o′ ∉ ks
deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

exact Hn

deferred goal
ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
registeredm b′ ∧ in_livem b′ o′ aux_holdsm b′ + o′ c
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
registeredm′ b′ ∧ in_livem′ b′ o′ aux_holdsm′ b′ + o′ c

–unfold registered , in_live , aux_holds in *

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
object_regionb′ m_regionsm′ ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm′ = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_auxm′ b′ + o′ = c ∨ freed_inm_regionsm′ c ∧ traps_as_freedm_regionsm′ m_auxm′ b′ + o′

rewrite Hr

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Ha :
object_regionb′ m_regionsm ≠ None ∧ ∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
object_regionb′ m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_auxm′ b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm′ b′ + o′

destruct Ha as Hreg Hin

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
object_regionb′ m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_auxm′ b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm′ b′ + o′

split ; exact Hreg |

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
⊢
∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg0 ∧ m_auxm′ b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm′ b′ + o′

intros reg′ E L

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
⊢
0 ≤ o′ ∧ b′ + o′ < r_endreg′ ∧ m_auxm′ b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm′ b′ + o′

destruct Hinreg′ E L as Ho & He & Hy

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hy :
m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
0 ≤ o′ ∧ b′ + o′ < r_endreg′ ∧ m_auxm′ b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm′ b′ + o′

split ; exact Ho |

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hy :
m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
b′ + o′ < r_endreg′ ∧ m_auxm′ b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm′ b′ + o′

split ; exact He |

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hy :
m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
m_auxm′ b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm′ b′ + o′

rewrite Hx ; exact Hy |

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hy :
m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
⊢
b ≤ b′ + o′ < r_endreg → PAuxb b′ + o′ − b ∉ ks

intros Hin′

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
b′, o′ :
Z
c :
Hn :
PAuxb′ o′ ∉ ks
Hreg :
object_regionb′ m_regionsm ≠ None
Hin :
∀reg : region, object_regionb′ m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b′ + o′ < r_endreg ∧ m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
He :
b′ + o′ < r_endreg′
Hy :
m_auxm b′ + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b′ + o′
Hin′ :
b ≤ b′ + o′ < r_endreg
⊢
PAuxb b′ + o′ − b ∉ ks

destruct Houtb′ o′ reg′ conjE L Ho He Hin′ as → →

ks :
listpiece
m, m′ :
b :
Z
reg :
Hr :
Hl :
live_atm b reg
Hb :
∀a : Z, b ≤ a < r_endreg → PByteb a − b ∉ ks → m_bytesm′ a = m_bytesm a
Hx :
∀a : Z, b ≤ a < r_endreg → PAuxb a − b ∉ ks → m_auxm′ a = m_auxm a
o′ :
Z
c :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o′ ∧ b + o′ < r_endreg ∧ m_auxm b + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b + o′
Hreg :
Hn :
PAuxb o′ ∉ ks
Hout :
∀b′ o′ : Z reg′ : region, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
reg′ :
E :
object_regionb m_regionsm = Somereg′
L :
r_lifereg′ = Live
Ho :
0 ≤ o′
Hin′ :
b ≤ b + o′ < r_endreg
Hy :
m_auxm b + o′ = c ∨ freed_inm_regionsm c ∧ traps_as_freedm_regionsm m_auxm b + o′
He :
b + o′ < r_endreg′
⊢
PAuxb o′ ∉ ks

exact Hn

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hr Hd Hl Hb Hx l v Hn Ha
assert Hout : ∀b′ o′ reg′, live_atm b′ reg′ → 0 ≤ o′ → b′ + o′ < r_endreg′ → b ≤ b′ + o′ < r_endreg → b′ = b ∧ b′ + o′ − b = o′
{intros b′ o′ reg′ Hl′ Ho He Hin
destruct Z.eq_decb′ b as [ ->| Hne ] ; split ; reflexivity | lia |
exfalso
exact live_apartm b reg b′ reg′ b′ + o′ b′ + o′ Hd Hl Hl′ not_eq_symHne Hin ltac:lia eq_refl
destruct l as b′ | b′ o′ | b′ o′ | k , v as reg′ | y | c | | q t | cd | sq sp | ga gi | op ; cbn [ agree_piece ] in Ha |- * ; try contradiction ; try exact I
–exact live_at_regions_ _ _ _ Hr Ha
–unfold registered in *
rewrite Hr
exact Ha
–unfold registered , in_live in *
rewrite Hr
destruct Ha as Hreg Hin
split ; exact Hreg |
intros reg′ E L
destruct Hinreg′ E L as Ho & He & Hy
split ; exact Ho |
split ; exact He |
rewrite Hb ; exact Hy |
intros Hin′
destruct Houtb′ o′ reg′ conjE L Ho He Hin′ as → →
exact Hn
–unfold registered , in_live , aux_holds in *
rewrite Hr
destruct Ha as Hreg Hin
split ; exact Hreg |
intros reg′ E L
destruct Hinreg′ E L as Ho & He & Hy
split ; exact Ho |
split ; exact He |
rewrite Hx ; exact Hy |
intros Hin′
destruct Houtb′ o′ reg′ conjE L Ho He Hin′ as → →
exact Hn

Framing composes.

323Lemma frame_ok_trans
∀ ks m1 m2 m3
frame_okks m1 m2
frame_okks m2 m3
frame_okks m1 m3
Explore proof 2 tactics

Initial goal

ks :
listpiece
m1, m2, m3 :
⊢
frame_okks m1 m2 → frame_okks m2 m3 → frame_okks m1 m3

intros H1 H2 l v Hn Ha

ks :
listpiece
m1, m2, m3 :
H1 :
frame_okks m1 m2
H2 :
frame_okks m2 m3
v :
Hn :
l ∉ ks
Ha :
⊢

apply H2 , H1 ; assumption

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros H1 H2 l v Hn Ha
apply H2 , H1 ; assumption

Framing over fewer keys frames over more.

327Lemma frame_ok_mono
∀ ks ks′ m m′
∀l, l ∈ ks → l ∈ ks′
frame_okks m m′
frame_okks′ m m′
Explore proof 4 tactics

Initial goal

ks, ks′ :
listpiece
m, m′ :
⊢
∀l : piece, l ∈ ks → l ∈ ks′ → frame_okks m m′ → frame_okks′ m m′

intros Hs H l v Hn Ha

ks, ks′ :
listpiece
m, m′ :
Hs :
∀l : piece, l ∈ ks → l ∈ ks′
H :
frame_okks m m′
v :
Hn :
l ∉ ks′
Ha :
⊢
agree_piecem′ l v

apply H ; | exact Ha

ks, ks′ :
listpiece
m, m′ :
Hs :
∀l : piece, l ∈ ks → l ∈ ks′
H :
frame_okks m m′
v :
Hn :
l ∉ ks′
Ha :
⊢
l ∉ ks

intros Hin

ks, ks′ :
listpiece
m, m′ :
Hs :
∀l : piece, l ∈ ks → l ∈ ks′
H :
frame_okks m m′
v :
Hn :
l ∉ ks′
Ha :
Hin :
l ∈ ks
⊢
False

apply Hn , Hs , Hin

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hs H l v Hn Ha
apply H ; | exact Ha
intros Hin
apply Hn , Hs , Hin

The eight bytes of a cell of the live object b read back as its value modulo 2^64.

332Lemma cell_load
∀ m b reg o x a
live_atm b reg
a = b + o
load_bytesm a 8 = x mod 2 ^ 64
Explore proof 12 tactics

Initial goal

m :
b :
Z
reg :
o, x, a :
Z
⊢
live_atm b reg → all_agreem cellb o x → a = b + o → load_bytesm a 8 = x mod 2 ^ 64

intros E L Hc →

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
⊢
load_bytesm b + o 8 = x mod 2 ^ 64

rewrite all_agree_cell in Hc

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
⊢
load_bytesm b + o 8 = x mod 2 ^ 64

assert Hagree : ∀i, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i

2 open

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
⊢
∀i : Z, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
focused goal
m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
Hagree :
∀i : Z, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
⊢
load_bytesm b + o 8 = x mod 2 ^ 64

{intros i Hi

2 open

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
deferred goal
m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
Hagree :
∀i : Z, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
⊢
load_bytesm b + o 8 = x mod 2 ^ 64

rewrite stored_byte ; | exact Hi

2 open

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesm b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
Hagree :
∀i : Z, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
⊢
load_bytesm b + o 8 = x mod 2 ^ 64

destruct Hci Hi as _ Hin

2 open

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
i :
Z
Hi :
0 ≤ i < 8
Hin :
in_livem b o + i m_bytesm b + o + i = byte_ofx i
⊢
m_bytesm b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
Hagree :
∀i : Z, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
⊢
load_bytesm b + o 8 = x mod 2 ^ 64

destruct Hinreg E L as _ & _ & Hb

2 open

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
i :
Z
Hi :
0 ≤ i < 8
Hin :
in_livem b o + i m_bytesm b + o + i = byte_ofx i
Hb :
m_bytesm b + o + i = byte_ofx i
⊢
m_bytesm b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
Hagree :
∀i : Z, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
⊢
load_bytesm b + o 8 = x mod 2 ^ 64

replace b + o + i with b + o + i by lia

2 open

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
i :
Z
Hi :
0 ≤ i < 8
Hin :
in_livem b o + i m_bytesm b + o + i = byte_ofx i
Hb :
m_bytesm b + o + i = byte_ofx i
⊢
m_bytesm b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
Hagree :
∀i : Z, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
⊢
load_bytesm b + o 8 = x mod 2 ^ 64

exact Hb

deferred goal
m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
Hagree :
∀i : Z, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
⊢
load_bytesm b + o 8 = x mod 2 ^ 64

rewrite load_bytes_agreem store_bytesm b + o 8 x b + o 8 ; | lia | exact Hagree

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
Hagree :
∀i : Z, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
⊢
load_bytesstore_bytesm b + o 8 x b + o 8 = x mod 2 ^ 64

rewrite stored_bytes_value ; | lia

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Hc :
∀i : Z, 0 ≤ i < 8 → agree_piecem PByteb o + i VBytebyte_ofx i
Hagree :
∀i : Z, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
⊢
x mod 256 ^ 8 = x mod 2 ^ 64

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros E L Hc →
rewrite all_agree_cell in Hc
assert Hagree : ∀i, 0 ≤ i < 8 → m_bytesm b + o + i = m_bytesstore_bytesm b + o 8 x b + o + i
{intros i Hi
rewrite stored_byte ; | exact Hi
destruct Hci Hi as _ Hin
destruct Hinreg E L as _ & _ & Hb
replace b + o + i with b + o + i by lia
exact Hb
rewrite load_bytes_agreem store_bytesm b + o 8 x b + o 8 ; | lia | exact Hagree
rewrite stored_bytes_value ; | lia
reflexivity

An 8-byte store at offset o of the live object b: its cell holds the new value, and nothing else changes.

346Lemma cell_store_ok
∀ m b reg o a x
live_atm b reg
0 ≤ o
b + o + 8 ≤ r_endreg
a = b + o
all_agreestore_bytesm a 8 x cellb o x ∧ frame_okcellb o x.*1 m store_bytesm a 8 x
Explore proof 21 tactics

Initial goal

m :
b :
Z
reg :
o, a, x :
Z
⊢
live_disjointm → live_atm b reg → 0 ≤ o → b + o + 8 ≤ r_endreg → a = b + o → all_agreestore_bytesm a 8 x cellb o x ∧ frame_okcellb o x.*1 m store_bytesm a 8 x

intros Hd Hl Ho He Ha

m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
all_agreestore_bytesm a 8 x cellb o x ∧ frame_okcellb o x.*1 m store_bytesm a 8 x

split

2 open

m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
focused goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

–apply all_agree_cell

2 open

m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
∀i : Z, 0 ≤ i < 8 → agree_piecestore_bytesm a 8 x PByteb o + i VBytebyte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

intros i Hi

2 open

m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

cbn [ agree_piece ]

2 open

m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
⊢
registeredstore_bytesm a 8 x b ∧ in_livestore_bytesm a 8 x b o + i m_bytesstore_bytesm a 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

unfold registered , in_live

2 open

m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
⊢
object_regionb m_regionsstore_bytesm a 8 x ≠ None ∧ ∀reg0 : region, object_regionb m_regionsstore_bytesm a 8 x = Somereg0 → r_lifereg0 = Live → 0 ≤ o + i ∧ b + o + i < r_endreg0 ∧ m_bytesstore_bytesm a 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

rewrite regions_store_bytes

2 open

m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o + i ∧ b + o + i < r_endreg0 ∧ m_bytesstore_bytesm a 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

destruct Hl as E L

2 open

m :
b :
Z
reg :
o, a, x :
Z
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg0 : region, object_regionb m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o + i ∧ b + o + i < r_endreg0 ∧ m_bytesstore_bytesm a 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

split ; congruence |

2 open

m :
b :
Z
reg :
o, a, x :
Z
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
⊢
∀reg0 : region, object_regionb m_regionsm = Somereg0 → r_lifereg0 = Live → 0 ≤ o + i ∧ b + o + i < r_endreg0 ∧ m_bytesstore_bytesm a 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

intros reg′ E′ _

2 open

m :
b :
Z
reg :
o, a, x :
Z
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
reg′ :
E′ :
object_regionb m_regionsm = Somereg′
⊢
0 ≤ o + i ∧ b + o + i < r_endreg′ ∧ m_bytesstore_bytesm a 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

rewrite E in E′

2 open

m :
b :
Z
reg :
o, a, x :
Z
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
reg′ :
E′ :
Somereg = Somereg′
⊢
0 ≤ o + i ∧ b + o + i < r_endreg′ ∧ m_bytesstore_bytesm a 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

injection E′ as ←

2 open

m :
b :
Z
reg :
o, a, x :
Z
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
⊢
0 ≤ o + i ∧ b + o + i < r_endreg ∧ m_bytesstore_bytesm a 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

split ; lia |

2 open

m :
b :
Z
reg :
o, a, x :
Z
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
⊢
b + o + i < r_endreg ∧ m_bytesstore_bytesm a 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

split ; lia |

2 open

m :
b :
Z
reg :
o, a, x :
Z
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesstore_bytesm a 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

subst a

2 open

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesstore_bytesm b + o 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

replace b + o + i with b + o + i by lia

2 open

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesstore_bytesm b + o 8 x b + o + i = byte_ofx i
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

apply stored_byte

2 open

m :
b :
Z
reg :
o, x :
Z
E :
L :
r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
i :
Z
Hi :
0 ≤ i < 8
⊢
0 ≤ i < 8
deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

exact Hi

deferred goal
m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
frame_okcellb o x.*1 m store_bytesm a 8 x

–eapply frame_store_bytes ; exact Hd | exact Hl | exact Ho | exact He | exact Ha |

m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
⊢
∀i : Z, 0 ≤ i < 8 → PByteb o + i ∈ cellb o x.*1

intros i Hi

m :
b :
Z
reg :
o, a, x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Ha :
a = b + o
i :
Z
Hi :
0 ≤ i < 8
⊢
PByteb o + i ∈ cellb o x.*1

apply cell_keys , Hi

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hd Hl Ho He Ha
split
intros i Hi
cbn [ agree_piece ]
destruct Hl as E L
split ; congruence |
intros reg′ E′ _
rewrite E in E′
injection E′ as ←
split ; lia |
split ; lia |
subst a
replace b + o + i with b + o + i by lia
exact Hi
–eapply frame_store_bytes ; exact Hd | exact Hl | exact Ho | exact He | exact Ha |
intros i Hi
apply cell_keys , Hi

A pointer store (aux then address bytes, at offset 0) into the live object b: its aux slot and first cell hold the pointer, and nothing else changes.

363Lemma ptr_store_ok
∀ m b reg a c x
live_atm b reg
b + 8 ≤ r_endreg
a = b
m_regionsstore_bytesstore_auxm a c a 8 x = m_regionsm ∧ all_agreestore_bytesstore_auxm a c a 8 x PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x ∧ frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesstore_auxm a c a 8 x
Explore proof 45 tactics

Initial goal

m :
b :
Z
reg :
a :
Z
c :
x :
Z
⊢
live_disjointm → live_atm b reg → b + 8 ≤ r_endreg → a = b → m_regionsstore_bytesstore_auxm a c a 8 x = m_regionsm ∧ all_agreestore_bytesstore_auxm a c a 8 x PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x ∧ frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesstore_auxm a c a 8 x

intros Hd Hl He →

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
⊢
m_regionsstore_bytesstore_auxm b c b 8 x = m_regionsm ∧ all_agreestore_bytesstore_auxm b c b 8 x PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x ∧ frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesstore_auxm b c b 8 x

set m1 := store_auxm b c

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
⊢
m_regionsstore_bytesm1 b 8 x = m_regionsm ∧ all_agreestore_bytesm1 b 8 x PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x ∧ frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

assert Hd1 : live_disjointm1 by apply live_disjoint_regionsm ; reflexivity | exact Hd

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
⊢
m_regionsstore_bytesm1 b 8 x = m_regionsm ∧ all_agreestore_bytesm1 b 8 x PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x ∧ frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

assert Hl1 : live_atm1 b reg by apply live_at_regionsm ; reflexivity | exact Hl

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
⊢
m_regionsstore_bytesm1 b 8 x = m_regionsm ∧ all_agreestore_bytesm1 b 8 x PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x ∧ frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

destruct cell_store_okm1 b reg 0 b x Hd1 Hl1 ltac:lia ltac:lia ltac:lia as Hc Hf

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
m_regionsstore_bytesm1 b 8 x = m_regionsm ∧ all_agreestore_bytesm1 b 8 x PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x ∧ frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

split ; reflexivity |

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
all_agreestore_bytesm1 b 8 x PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x ∧ frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

split

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
all_agreestore_bytesm1 b 8 x PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x
focused goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

–apply all_agree_app

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
all_agreestore_bytesm1 b 8 x PLiveb, VLivereg; PAuxb 0, VAuxc ∧ all_agreestore_bytesm1 b 8 x cellb 0 x
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

split ; | exact Hc

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

cbn [ all_agree fst snd agree_piece ]

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
live_atstore_bytesm1 b 8 x b reg ∧ registeredstore_bytesm1 b 8 x b ∧ in_livestore_bytesm1 b 8 x b 0 aux_holdsstore_bytesm1 b 8 x b + 0 c ∧ True
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

split ; | split ; | exact I

3 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
live_atstore_bytesm1 b 8 x b reg
focused goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
registeredstore_bytesm1 b 8 x b ∧ in_livestore_bytesm1 b 8 x b 0 aux_holdsstore_bytesm1 b 8 x b + 0 c
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

+apply live_at_regionsm ; reflexivity | exact Hl

2 open

deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
registeredstore_bytesm1 b 8 x b ∧ in_livestore_bytesm1 b 8 x b 0 aux_holdsstore_bytesm1 b 8 x b + 0 c
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

+unfold registered , in_live , aux_holds

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
object_regionb m_regionsstore_bytesm1 b 8 x ≠ None ∧ ∀reg0 : region, object_regionb m_regionsstore_bytesm1 b 8 x = Somereg0 → r_lifereg0 = Live → 0 ≤ 0 ∧ b + 0 < r_endreg0 ∧ m_auxstore_bytesm1 b 8 x b + 0 = c ∨ freed_inm_regionsstore_bytesm1 b 8 x c ∧ traps_as_freedm_regionsstore_bytesm1 b 8 x m_auxstore_bytesm1 b 8 x b + 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

rewrite regions_store_bytes aux_store_bytes

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
object_regionb m_regionsm1 ≠ None ∧ ∀reg0 : region, object_regionb m_regionsm1 = Somereg0 → r_lifereg0 = Live → 0 ≤ 0 ∧ b + 0 < r_endreg0 ∧ m_auxm1 b + 0 = c ∨ freed_inm_regionsm1 c ∧ traps_as_freedm_regionsm1 m_auxm1 b + 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

unfold m1

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
object_regionb m_regionsstore_auxm b c ≠ None ∧ ∀reg0 : region, object_regionb m_regionsstore_auxm b c = Somereg0 → r_lifereg0 = Live → 0 ≤ 0 ∧ b + 0 < r_endreg0 ∧ m_auxstore_auxm b c b + 0 = c ∨ freed_inm_regionsstore_auxm b c c ∧ traps_as_freedm_regionsstore_auxm b c m_auxstore_auxm b c b + 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

rewrite regions_store_aux aux_store_aux

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
∧
∀ reg0 : region  ,
object_regionb m_regionsm = Somereg0
→
r_lifereg0 = Live
→
0 ≤ 0
∧
b + 0 < r_endreg0
∧
b + 0 =? b
→
c
else
m_auxm b + 0
=
c
∨
∧
b + 0 =? b
→
c
else
m_auxm b + 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

destruct Hl as E L

2 open

m :
b :
Z
reg :
c :
x :
Z
E :
L :
r_lifereg = Live
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
∧
∀ reg0 : region  ,
object_regionb m_regionsm = Somereg0
→
r_lifereg0 = Live
→
0 ≤ 0
∧
b + 0 < r_endreg0
∧
b + 0 =? b
→
c
else
m_auxm b + 0
=
c
∨
∧
b + 0 =? b
→
c
else
m_auxm b + 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

split ; congruence |

2 open

m :
b :
Z
reg :
c :
x :
Z
E :
L :
r_lifereg = Live
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
∀ reg0 : region  ,
object_regionb m_regionsm = Somereg0
→
r_lifereg0 = Live
→
0 ≤ 0
∧
b + 0 < r_endreg0
∧
b + 0 =? b
→
c
else
m_auxm b + 0
=
c
∨
∧
b + 0 =? b
→
c
else
m_auxm b + 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

intros reg′ E′ _

2 open

m :
b :
Z
reg :
c :
x :
Z
E :
L :
r_lifereg = Live
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
reg′ :
E′ :
object_regionb m_regionsm = Somereg′
⊢
0 ≤ 0
∧
b + 0 < r_endreg′
∧
b + 0 =? b
→
c
else
m_auxm b + 0
=
c
∨
∧
b + 0 =? b
→
c
else
m_auxm b + 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

rewrite E in E′

2 open

m :
b :
Z
reg :
c :
x :
Z
E :
L :
r_lifereg = Live
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
reg′ :
E′ :
Somereg = Somereg′
⊢
0 ≤ 0
∧
b + 0 < r_endreg′
∧
b + 0 =? b
→
c
else
m_auxm b + 0
=
c
∨
∧
b + 0 =? b
→
c
else
m_auxm b + 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

injection E′ as ←

2 open

m :
b :
Z
reg :
c :
x :
Z
E :
L :
r_lifereg = Live
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
0 ≤ 0
∧
b + 0 < r_endreg
∧
b + 0 =? b
→
c
else
m_auxm b + 0
=
c
∨
∧
b + 0 =? b
→
c
else
m_auxm b + 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

split ; lia |

2 open

m :
b :
Z
reg :
c :
x :
Z
E :
L :
r_lifereg = Live
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
b + 0 < r_endreg
∧
b + 0 =? b
→
c
else
m_auxm b + 0
=
c
∨
∧
b + 0 =? b
→
c
else
m_auxm b + 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

split ; lia |

2 open

m :
b :
Z
reg :
c :
x :
Z
E :
L :
r_lifereg = Live
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
b + 0 =? b
→
c
else
m_auxm b + 0
=
c
∨
∧
b + 0 =? b
→
c
else
m_auxm b + 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

left

2 open

m :
b :
Z
reg :
c :
x :
Z
E :
L :
r_lifereg = Live
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
b + 0 =? b
→
c
else
m_auxm b + 0
=
c
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

replace b + 0 =? b with true ; reflexivity |

2 open

m :
b :
Z
reg :
c :
x :
Z
E :
L :
r_lifereg = Live
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
true = b + 0 =? b
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

symmetry

2 open

m :
b :
Z
reg :
c :
x :
Z
E :
L :
r_lifereg = Live
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
b + 0 =? b = true
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

apply Z.eqb_eq

2 open

m :
b :
Z
reg :
c :
x :
Z
E :
L :
r_lifereg = Live
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
b + 0 = b
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

lia

deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m store_bytesm1 b 8 x

–apply frame_ok_trans_ m m1

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m m1
focused goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m1 store_bytesm1 b 8 x

+apply frame_store_aux_ m b reg 0 ; exact Hd | exact Hl | lia | lia | lia |

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
PAuxb 0 ∈ PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m1 store_bytesm1 b 8 x

rewrite fmap_app

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
PAuxb 0 ∈ PLiveb, VLivereg; PAuxb 0, VAuxc.*1 ++ cellb 0 x.*1
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m1 store_bytesm1 b 8 x

apply elem_of_app

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
PAuxb 0 ∈ PLiveb, VLivereg; PAuxb 0, VAuxc.*1 ∨ PAuxb 0 ∈ cellb 0 x.*1
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m1 store_bytesm1 b 8 x

left

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
PAuxb 0 ∈ PLiveb, VLivereg; PAuxb 0, VAuxc.*1
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m1 store_bytesm1 b 8 x

cbn

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
PAuxb 0 ∈ PLiveb; PAuxb 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m1 store_bytesm1 b 8 x

apply elem_of_cons

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
PAuxb 0 = PLiveb ∨ PAuxb 0 ∈ PAuxb 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m1 store_bytesm1 b 8 x

right

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
PAuxb 0 ∈ PAuxb 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m1 store_bytesm1 b 8 x

apply elem_of_cons

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
PAuxb 0 = PAuxb 0 ∨ PAuxb 0 ∈ [ ]
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m1 store_bytesm1 b 8 x

left

2 open

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
PAuxb 0 = PAuxb 0
deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m1 store_bytesm1 b 8 x

reflexivity

deferred goal
m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
frame_okPLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1 m1 store_bytesm1 b 8 x

+eapply frame_ok_mono ; | exact Hf

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
⊢
∀l : piece, l ∈ cellb 0 x.*1 → l ∈ PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1

intros l Hin

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
Hin :
l ∈ cellb 0 x.*1
⊢
l ∈ PLiveb, VLivereg; PAuxb 0, VAuxc ++ cellb 0 x.*1

rewrite fmap_app

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
Hin :
l ∈ cellb 0 x.*1
⊢
l ∈ PLiveb, VLivereg; PAuxb 0, VAuxc.*1 ++ cellb 0 x.*1

apply elem_of_app

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
Hin :
l ∈ cellb 0 x.*1
⊢
l ∈ PLiveb, VLivereg; PAuxb 0, VAuxc.*1 ∨ l ∈ cellb 0 x.*1

right

m :
b :
Z
reg :
c :
x :
Z
Hl :
live_atm b reg
He :
b + 8 ≤ r_endreg
m1 :=
store_auxm b c : mem
Hl1 :
live_atm1 b reg
Hc :
Hf :
frame_okcellb 0 x.*1 m1 store_bytesm1 b 8 x
Hin :
l ∈ cellb 0 x.*1
⊢
l ∈ cellb 0 x.*1

exact Hin

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hd Hl He →
set m1 := store_auxm b c
assert Hd1 : live_disjointm1 by apply live_disjoint_regionsm ; reflexivity | exact Hd
assert Hl1 : live_atm1 b reg by apply live_at_regionsm ; reflexivity | exact Hl
destruct cell_store_okm1 b reg 0 b x Hd1 Hl1 ltac:lia ltac:lia ltac:lia as Hc Hf
split ; reflexivity |
split
–apply all_agree_app
split ; | exact Hc
cbn [ all_agree fst snd agree_piece ]
split ; | split ; | exact I
+apply live_at_regionsm ; reflexivity | exact Hl
unfold m1
destruct Hl as E L
split ; congruence |
intros reg′ E′ _
rewrite E in E′
injection E′ as ←
split ; lia |
split ; lia |
left
replace b + 0 =? b with true ; reflexivity |
symmetry
apply Z.eqb_eq
lia
–apply frame_ok_trans_ m m1
+apply frame_store_aux_ m b reg 0 ; exact Hd | exact Hl | lia | lia | lia |
rewrite fmap_app
apply elem_of_app
left
cbn
apply elem_of_cons
right
apply elem_of_cons
left
reflexivity
+eapply frame_ok_mono ; | exact Hf
intros l Hin
rewrite fmap_app
apply elem_of_app
right
exact Hin

A key of overwrite ps h comes from ps, or from h when ps does not name it.

392Lemma lookup_overwrite
∀ ps h l v
overwriteps h !! l = Somev
l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Explore proof 19 tactics

Initial goal

ps :
listpiece × pval
h :
v :
⊢
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev

induction ps as | l′ v′ ps IH ; cbn

2 open

h :
v :
⊢
h !! l = Somev → l, v ∈ [ ] ∨ l ∉ [ ] ∧ h !! l = Somev
focused goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
⊢
<[l′ ≔ v′]>overwriteps h !! l = Somev → l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

–intros H

2 open

h :
v :
H :
h !! l = Somev
⊢
l, v ∈ [ ] ∨ l ∉ [ ] ∧ h !! l = Somev
deferred goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
⊢
<[l′ ≔ v′]>overwriteps h !! l = Somev → l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

right

2 open

h :
v :
H :
h !! l = Somev
⊢
l ∉ [ ] ∧ h !! l = Somev
deferred goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
⊢
<[l′ ≔ v′]>overwriteps h !! l = Somev → l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

split ; apply not_elem_of_nil | exact H

deferred goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
⊢
<[l′ ≔ v′]>overwriteps h !! l = Somev → l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

–rewrite lookup_insert

l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
⊢
decidel′ = l
→
Somev′
else
overwriteps h !! l
=
Somev
→
l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

destruct decidel′ = l as [ ->| Hne ]

2 open

v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
⊢
Somev′ = Somev → l, v ∈ l, v′ :: ps ∨ l ∉ l :: ps.*1 ∧ h !! l = Somev
focused goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
⊢
overwriteps h !! l = Somev → l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

+intros = →

2 open

ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
⊢
l, v ∈ l, v :: ps ∨ l ∉ l :: ps.*1 ∧ h !! l = Somev
deferred goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
⊢
overwriteps h !! l = Somev → l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

left

2 open

ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
⊢
l, v ∈ l, v :: ps
deferred goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
⊢
overwriteps h !! l = Somev → l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

apply elem_of_cons

2 open

ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
⊢
l, v = l, v ∨ l, v ∈ ps
deferred goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
⊢
overwriteps h !! l = Somev → l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

by left

deferred goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
⊢
overwriteps h !! l = Somev → l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

+intros H

l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
H :
overwriteps h !! l = Somev
⊢
l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

destruct IHH as Hin | Hn Hh

2 open

l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
H :
overwriteps h !! l = Somev
Hin :
l, v ∈ ps
⊢
l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev
focused goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
H :
overwriteps h !! l = Somev
Hn :
l ∉ ps.*1
Hh :
h !! l = Somev
⊢
l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

∗left

2 open

l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
H :
overwriteps h !! l = Somev
Hin :
l, v ∈ ps
⊢
l, v ∈ l′, v′ :: ps
deferred goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
H :
overwriteps h !! l = Somev
Hn :
l ∉ ps.*1
Hh :
h !! l = Somev
⊢
l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

apply elem_of_cons

2 open

l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
H :
overwriteps h !! l = Somev
Hin :
l, v ∈ ps
⊢
l, v = l′, v′ ∨ l, v ∈ ps
deferred goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
H :
overwriteps h !! l = Somev
Hn :
l ∉ ps.*1
Hh :
h !! l = Somev
⊢
l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

by right

deferred goal
l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
H :
overwriteps h !! l = Somev
Hn :
l ∉ ps.*1
Hh :
h !! l = Somev
⊢
l, v ∈ l′, v′ :: ps ∨ l ∉ l′ :: ps.*1 ∧ h !! l = Somev

∗right

l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
H :
overwriteps h !! l = Somev
Hn :
l ∉ ps.*1
Hh :
h !! l = Somev
⊢
l ∉ l′ :: ps.*1 ∧ h !! l = Somev

split ; | exact Hh

l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
H :
overwriteps h !! l = Somev
Hn :
l ∉ ps.*1
Hh :
h !! l = Somev
⊢
l ∉ l′ :: ps.*1

apply not_elem_of_cons

l′ :
v′ :
ps :
listpiece × pval
h :
v :
IH :
overwriteps h !! l = Somev → l, v ∈ ps ∨ l ∉ ps.*1 ∧ h !! l = Somev
Hne :
l′ ≠ l
H :
overwriteps h !! l = Somev
Hn :
l ∉ ps.*1
Hh :
h !! l = Somev
⊢
l ≠ l′ ∧ l ∉ ps.*1

split ; congruence | exact Hn

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
induction ps as | l′ v′ ps IH ; cbn
–intros H
right
split ; apply not_elem_of_nil | exact H
–rewrite lookup_insert
destruct decidel′ = l as [ ->| Hne ]
+intros = →
left
apply elem_of_cons
by left
+intros H
destruct IHH as Hin | Hn Hh
∗left
apply elem_of_cons
by right
∗right
split ; | exact Hh
apply not_elem_of_cons
split ; congruence | exact Hn

Every piece of a new object at base names base.

405Lemma obj_ps_id
∀ base q l v
l, v ∈ obj_psbase q
piece_idl = base
Explore proof 4 tactics

Initial goal

base :
Z
v :
⊢
l, v ∈ obj_psbase q → piece_idl = base

unfold obj_ps

base :
Z
v :
⊢
l, v ∈ PLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live :: λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq → piece_idl = base

intros Hin

base :
Z
v :
Hin :
l, v ∈ PLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live :: λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq
⊢
piece_idl = base

apply elem_of_cons in Hin as = → → | Hin ; reflexivity |

base :
Z
v :
Hin :
l, v ∈ λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq
⊢
piece_idl = base

apply elem_of_app in Hin as Hin | Hin ; apply list_elem_of_fmap in Hin as i & = → → & _ ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
unfold obj_ps
intros Hin
apply elem_of_cons in Hin as = → → | Hin ; reflexivity |
apply elem_of_app in Hin as Hin | Hin ; apply list_elem_of_fmap in Hin as i & = → → & _ ; reflexivity

A new object's pieces are pieces of memory.

413Lemma obj_ps_mem
∀ base q l v
l, v ∈ obj_psbase q
Explore proof 4 tactics

Initial goal

base :
Z
v :
⊢
l, v ∈ obj_psbase q → mem_piecel

unfold obj_ps

base :
Z
v :
⊢
l, v ∈ PLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live :: λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq → mem_piecel

intros Hin

base :
Z
v :
Hin :
l, v ∈ PLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live :: λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq

apply elem_of_cons in Hin as = → → | Hin ; exact I |

base :
Z
v :
Hin :
l, v ∈ λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq

apply elem_of_app in Hin as Hin | Hin ; apply list_elem_of_fmap in Hin as i & = → → & _ ; exact I

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
unfold obj_ps
intros Hin
apply elem_of_cons in Hin as = → → | Hin ; exact I |
apply elem_of_app in Hin as Hin | Hin ; apply list_elem_of_fmap in Hin as i & = → → & _ ; exact I

The keys of a new object's pieces are distinct.

421Lemma obj_ps_nodup
∀ base q
NoDupobj_psbase q.*1
Explore proof 22 tactics

Initial goal

base :
Z
⊢
NoDupobj_psbase q.*1

unfold obj_ps

base :
Z
⊢
NoDupPLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live :: λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq.*1

pose proof NoDup_seqZ0 req_extentq as Hl

base :
Z
Hl :
NoDupseqZ0 req_extentq
⊢
NoDupPLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live :: λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq.*1

revert Hl

base :
Z
⊢
NoDupseqZ0 req_extentq → NoDupPLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live :: λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq.*1

generalize seqZ0 req_extentq as ns

base :
Z
⊢
∀ns : listZ, NoDupns → NoDupPLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live :: λi : Z ⇒ PBytebase i, VByte0 <$> ns ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns.*1

intros ns Hl

base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupPLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live :: λi : Z ⇒ PBytebase i, VByte0 <$> ns ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns.*1

rewrite fmap_cons fmap_app -! list_fmap_compose

base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupPLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live.1 :: fst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns ++ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

apply NoDup_cons

base :
Z
ns :
listZ
Hl :
NoDupns
⊢
PLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live.1 ∉ fst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns ++ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns ∧ NoDupfst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns ++ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

split

2 open

base :
Z
ns :
listZ
Hl :
NoDupns
⊢
PLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live.1 ∉ fst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns ++ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns
focused goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns ++ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

–rewrite elem_of_app ! list_elem_of_fmap

2 open

base :
Z
ns :
listZ
Hl :
NoDupns
⊢
¬∃x : Z, PLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live.1 = fst ∘ λi : Z ⇒ PBytebase i, VByte0x ∧ x ∈ ns ∨ ∃x : Z, PLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live.1 = fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNonex ∧ x ∈ ns
deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns ++ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

intros i & Hi & _ | i & Hi & _ ; discriminate Hi

deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns ++ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

–apply NoDup_app

base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns ∧ ∀x : piece, x ∈ fst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns → x ∉ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns ∧ NoDupfst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

split ; | split

3 open

base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns
focused goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
∀x : piece, x ∈ fst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns → x ∉ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns
focused goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

+apply NoDup_fmap_2_strong ; | exact Hl

3 open

base :
Z
ns :
listZ
Hl :
NoDupns
⊢
∀x y : Z, x ∈ ns → y ∈ ns → fst ∘ λi : Z ⇒ PBytebase i, VByte0x = fst ∘ λi : Z ⇒ PBytebase i, VByte0y → x = y
deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
∀x : piece, x ∈ fst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns → x ∉ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns
deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

intros i j _ _ Hij

3 open

base :
Z
ns :
listZ
Hl :
NoDupns
i, j :
Z
Hij :
fst ∘ λi : Z ⇒ PBytebase i, VByte0i = fst ∘ λi : Z ⇒ PBytebase i, VByte0j
⊢
i = j
deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
∀x : piece, x ∈ fst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns → x ∉ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns
deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

by injection Hij

2 open

deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
∀x : piece, x ∈ fst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns → x ∉ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns
deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

+intros l

2 open

base :
Z
ns :
listZ
Hl :
NoDupns
⊢
l ∈ fst ∘ λi : Z ⇒ PBytebase i, VByte0 <$> ns → l ∉ fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns
deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

rewrite ! list_elem_of_fmap

2 open

base :
Z
ns :
listZ
Hl :
NoDupns
⊢
∃x : Z, l = fst ∘ λi : Z ⇒ PBytebase i, VByte0x ∧ x ∈ ns → ¬∃x : Z, l = fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNonex ∧ x ∈ ns
deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

intros i & → & _ j & Hj & _

2 open

base :
Z
ns :
listZ
Hl :
NoDupns
i, j :
Z
Hj :
fst ∘ λi : Z ⇒ PBytebase i, VByte0i = fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNonej
⊢
False
deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

discriminate Hj

deferred goal
base :
Z
ns :
listZ
Hl :
NoDupns
⊢
NoDupfst ∘ λi : Z ⇒ PAuxbase i, VAuxCNone <$> ns

+apply NoDup_fmap_2_strong ; | exact Hl

base :
Z
ns :
listZ
Hl :
NoDupns
⊢
∀x y : Z, x ∈ ns → y ∈ ns → fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNonex = fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNoney → x = y

intros i j _ _ Hij

base :
Z
ns :
listZ
Hl :
NoDupns
i, j :
Z
Hij :
fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNonei = fst ∘ λi : Z ⇒ PAuxbase i, VAuxCNonej
⊢
i = j

by injection Hij

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
unfold obj_ps
pose proof NoDup_seqZ0 req_extentq as Hl
revert Hl
generalize seqZ0 req_extentq as ns
intros ns Hl
rewrite fmap_cons fmap_app -! list_fmap_compose
apply NoDup_cons
split
–rewrite elem_of_app ! list_elem_of_fmap
intros i & Hi & _ | i & Hi & _ ; discriminate Hi
–apply NoDup_app
split ; | split
+apply NoDup_fmap_2_strong ; | exact Hl
intros i j _ _ Hij
by injection Hij
+intros l
rewrite ! list_elem_of_fmap
intros i & → & _ j & Hj & _
discriminate Hj
+apply NoDup_fmap_2_strong ; | exact Hl
intros i j _ _ Hij
by injection Hij

Each piece of a new object at a fresh base agrees with the memory after the allocation.

436Lemma obj_ps_agree
∀ m q base l v
Memory.freshm q base
0 ≤ req_extentq
l, v ∈ obj_psbase q
Explore proof 12 tactics

Initial goal

m :
base :
Z
v :
⊢
freshm q base → 0 ≤ req_extentq → l, v ∈ obj_psbase q → agree_pieceallocatedm q base l v

intros Hf Hq Hin

m :
base :
Z
v :
Hf :
freshm q base
Hq :
0 ≤ req_extentq
Hin :
l, v ∈ obj_psbase q
⊢

destruct Hf as _ & _ & _ & _ & _ & Hz

m :
base :
Z
v :
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
Hin :
l, v ∈ obj_psbase q
⊢

unfold obj_ps in Hin

m :
base :
Z
v :
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
Hin :
l, v ∈ PLivebase, VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live :: λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq
⊢

apply elem_of_cons in Hin as = → → | Hin

2 open

m :
base :
Z
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
⊢
agree_pieceallocatedm q base PLivebase VLiver_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live
focused goal
m :
base :
Z
v :
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
Hin :
l, v ∈ λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq
⊢

–cbn [ agree_piece ]

2 open

m :
base :
Z
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
⊢
live_atallocatedm q base base r_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live
deferred goal
m :
base :
Z
v :
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
Hin :
l, v ∈ λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq
⊢

unfold live_at

2 open

m :
base :
Z
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
⊢
object_regionbase m_regionsallocatedm q base = Somer_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live ∧ r_lifer_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live = Live
deferred goal
m :
base :
Z
v :
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
Hin :
l, v ∈ λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq
⊢

rewrite object_region_allocated Z.eqb_refl

2 open

m :
base :
Z
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
⊢
Somer_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live = Somer_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live ∧ r_lifer_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live = Live
deferred goal
m :
base :
Z
v :
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
Hin :
l, v ∈ λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq
⊢

split ; reflexivity

deferred goal
m :
base :
Z
v :
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
Hin :
l, v ∈ λi : Z ⇒ PBytebase i, VByte0 <$> seqZ0 req_extentq ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ0 req_extentq
⊢

–apply elem_of_app in Hin as Hin | Hin ; apply list_elem_of_fmap in Hin as i & = → → & Hi ; apply elem_of_seqZ in Hi ; cbn [ agree_piece ] ; unfold registered , in_live ; rewrite object_region_allocated Z.eqb_refl ; split ; discriminate | ; intros reg′ = ← _ ; cbn [ r_end ] ; split ; lia | ; split ; lia | ; destruct Hzbase + i ltac:lia as Hb Ha

2 open

m :
base :
Z
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
i :
Z
Hi :
0 ≤ i < 0 + req_extentq
Hb :
m_bytesm base + i = 0
Ha :
m_auxm base + i = CNone
⊢
m_bytesallocatedm q base base + i = 0
focused goal
m :
base :
Z
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
i :
Z
Hi :
0 ≤ i < 0 + req_extentq
Hb :
m_bytesm base + i = 0
Ha :
m_auxm base + i = CNone
⊢
aux_holdsallocatedm q base base + i CNone

+exact Hb

deferred goal
m :
base :
Z
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
i :
Z
Hi :
0 ≤ i < 0 + req_extentq
Hb :
m_bytesm base + i = 0
Ha :
m_auxm base + i = CNone
⊢
aux_holdsallocatedm q base base + i CNone

+left

m :
base :
Z
Hz :
∀a : Z, base ≤ a < base + req_extentq → m_bytesm a = 0 ∧ m_auxm a = CNone
Hq :
0 ≤ req_extentq
i :
Z
Hi :
0 ≤ i < 0 + req_extentq
Hb :
m_bytesm base + i = 0
Ha :
m_auxm base + i = CNone
⊢
m_auxallocatedm q base base + i = CNone

exact Ha

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hf Hq Hin
destruct Hf as _ & _ & _ & _ & _ & Hz
unfold obj_ps in Hin
apply elem_of_cons in Hin as = → → | Hin
–cbn [ agree_piece ]
unfold live_at
rewrite object_region_allocated Z.eqb_refl
split ; reflexivity
–apply elem_of_app in Hin as Hin | Hin ; apply list_elem_of_fmap in Hin as i & = → → & Hi ; apply elem_of_seqZ in Hi ; cbn [ agree_piece ] ; unfold registered , in_live ; rewrite object_region_allocated Z.eqb_refl ; split ; discriminate | ; intros reg′ = ← _ ; cbn [ r_end ] ; split ; lia | ; split ; lia | ; destruct Hzbase + i ltac:lia as Hb Ha
+exact Hb
+left
exact Ha

A freed capability stays freed after an allocation at a new base.

452Lemma freed_in_allocated
Explore proof 6 tactics

Initial goal

m :
base :
Z
c :

intros Hn b & reg & Hc & E & L

m :
base :
Z
c :
Hn :
b :
Z
reg :
Hc :
c = Objb ∨ c = Rob
E :
L :

exists b, reg

m :
base :
Z
c :
Hn :
b :
Z
reg :
Hc :
c = Objb ∨ c = Rob
E :
L :
⊢
c = Objb ∨ c = Rob ∧ object_regionb m_regionsallocatedm q base = Somereg ∧ r_lifereg = Freed

split ; exact Hc |

m :
base :
Z
c :
Hn :
b :
Z
reg :
Hc :
c = Objb ∨ c = Rob
E :
L :
⊢
object_regionb m_regionsallocatedm q base = Somereg ∧ r_lifereg = Freed

split ; | exact L

m :
base :
Z
c :
Hn :
b :
Z
reg :
Hc :
c = Objb ∨ c = Rob
E :
L :
⊢
object_regionb m_regionsallocatedm q base = Somereg

rewrite object_region_allocated

m :
base :
Z
c :
Hn :
b :
Z
reg :
Hc :
c = Objb ∨ c = Rob
E :
L :
⊢
base =? b
→
Somer_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live
=
Somereg

destruct Z.eqb_specbase b as [ <-| ] ; congruence | exact E

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hn b & reg & Hc & E & L
exists b, reg
split ; exact Hc |
split ; | exact L
destruct Z.eqb_specbase b as [ <-| ] ; congruence | exact E

A capability that traps as a freed one still does after an allocation at a new base.

461Lemma traps_as_freed_allocated
Explore proof 4 tactics

Initial goal

intros Hn H a size r align Hs

m :
base :
Z
c :
Hn :
a, size :
Z
align :
Z
Hs :
0 < size
⊢
cap_access_resc m_regionsallocatedm q base a size r align = SomeRTrapOutOfBounds

rewrite <- Ha size r align Hs

m :
base :
Z
c :
Hn :
a, size :
Z
align :
Z
Hs :
0 < size
⊢
cap_access_resc m_regionsallocatedm q base a size r align = cap_access_resc m_regionsm a size r align

unfold cap_access_res

m :
base :
Z
c :
Hn :
a, size :
Z
align :
Z
Hs :
0 < size
⊢
match c with
Objbase0
⇒
match object_regionbase0 m_regionsallocatedm q base with
Somereg
⇒
Some
base0 ≤? a && a + size ≤? r_endreg
→
None
⇒
None
Robase0
⇒
match object_regionbase0 m_regionsallocatedm q base with
Somereg
⇒
Some
base0 ≤? a && a + size ≤? r_endreg
→
None
⇒
None
⇒
None
=
match c with
Objbase0
⇒
match object_regionbase0 m_regionsm with
Somereg
⇒
Some
base0 ≤? a && a + size ≤? r_endreg
→
None
⇒
None
Robase0
⇒
match object_regionbase0 m_regionsm with
Somereg
⇒
Some
base0 ≤? a && a + size ≤? r_endreg
→
None
⇒
None
⇒
None

destruct c as | b | b | f | n ; try reflexivity ; rewrite object_region_allocated ; destruct Z.eqb_specbase b as [ <-| ] ; | reflexivity ; specialize Ha size r align Hs ; unfold cap_access_res in H ; rewrite Hn in H ; discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hn H a size r align Hs
rewrite <- Ha size r align Hs
destruct c as | b | b | f | n ; try reflexivity ; rewrite object_region_allocated ; destruct Z.eqb_specbase b as [ <-| ] ; | reflexivity ; specialize Ha size r align Hs ; unfold cap_access_res in H ; rewrite Hn in H ; discriminate

An allocation at a new base keeps every old piece's agreement.

472Lemma agree_piece_allocated
∀ m q base l v
Explore proof 23 tactics

Initial goal

m :
base :
Z
v :
⊢
object_regionbase m_regionsm = None → agree_piecem l v → agree_pieceallocatedm q base l v

intros Hn

m :
base :
Z
v :
Hn :
⊢
agree_piecem l v → agree_pieceallocatedm q base l v

assert Ho : ∀b, object_regionb m_regionsm ≠ None → object_regionb m_regionsallocatedm q base = object_regionb m_regionsm

2 open

m :
base :
Z
v :
Hn :
⊢
focused goal
m :
base :
Z
v :
Hn :
Ho :
⊢
agree_piecem l v → agree_pieceallocatedm q base l v

{intros b Hb

2 open

deferred goal
m :
base :
Z
v :
Hn :
Ho :
⊢
agree_piecem l v → agree_pieceallocatedm q base l v

rewrite object_region_allocated

2 open

m :
base :
Z
v :
Hn :
b :
Z
Hb :
⊢
base =? b
→
Somer_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live
=
deferred goal
m :
base :
Z
v :
Hn :
Ho :
⊢
agree_piecem l v → agree_pieceallocatedm q base l v

destruct Z.eqb_specbase b as [ <-| ] ; contradiction | reflexivity

deferred goal
m :
base :
Z
v :
Hn :
Ho :
⊢
agree_piecem l v → agree_pieceallocatedm q base l v

destruct l as b | b o | b o | k , v as reg | x | c | | p t | cd | sq sp | ga gi | op ; cbn [ agree_piece ] ; try tauto ; unfold live_at , registered , in_live

4 open

m :
base, b :
Z
reg :
Hn :
Ho :
⊢
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live → object_regionb m_regionsallocatedm q base = Somereg ∧ r_lifereg = Live
focused goal
m :
base, b :
Z
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None → object_regionb m_regionsallocatedm q base ≠ None
focused goal
m :
base, b, o, x :
Z
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm b + o = x → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesallocatedm q base b + o = x
focused goal
m :
base, b, o :
Z
c :
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

–intros E L

4 open

m :
base, b :
Z
reg :
Hn :
Ho :
E :
L :
r_lifereg = Live
⊢
object_regionb m_regionsallocatedm q base = Somereg ∧ r_lifereg = Live
deferred goal
m :
base, b :
Z
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None → object_regionb m_regionsallocatedm q base ≠ None
deferred goal
m :
base, b, o, x :
Z
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm b + o = x → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesallocatedm q base b + o = x
deferred goal
m :
base, b, o :
Z
c :
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

rewrite Ho ; | congruence

4 open

m :
base, b :
Z
reg :
Hn :
Ho :
E :
L :
r_lifereg = Live
⊢
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live
deferred goal
m :
base, b :
Z
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None → object_regionb m_regionsallocatedm q base ≠ None
deferred goal
m :
base, b, o, x :
Z
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm b + o = x → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesallocatedm q base b + o = x
deferred goal
m :
base, b, o :
Z
c :
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

auto

3 open

deferred goal
m :
base, b :
Z
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None → object_regionb m_regionsallocatedm q base ≠ None
deferred goal
m :
base, b, o, x :
Z
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm b + o = x → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesallocatedm q base b + o = x
deferred goal
m :
base, b, o :
Z
c :
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

–intros Hr

3 open

m :
base, b :
Z
Hn :
Ho :
Hr :
⊢
deferred goal
m :
base, b, o, x :
Z
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm b + o = x → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesallocatedm q base b + o = x
deferred goal
m :
base, b, o :
Z
c :
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

rewrite Ho ; exact Hr

2 open

deferred goal
m :
base, b, o, x :
Z
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm b + o = x → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesallocatedm q base b + o = x
deferred goal
m :
base, b, o :
Z
c :
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

–intros Hr Hin

2 open

m :
base, b, o, x :
Z
Hn :
Ho :
Hr :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm b + o = x
⊢
object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesallocatedm q base b + o = x
deferred goal
m :
base, b, o :
Z
c :
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

rewrite Ho ; | exact Hr

2 open

m :
base, b, o, x :
Z
Hn :
Ho :
Hr :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesm b + o = x
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ m_bytesallocatedm q base b + o = x
deferred goal
m :
base, b, o :
Z
c :
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

split ; exact Hr | exact Hin

deferred goal
m :
base, b, o :
Z
c :
Hn :
Ho :
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c → object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

–intros Hr Hin

m :
base, b, o :
Z
c :
Hn :
Ho :
Hr :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
⊢
object_regionb m_regionsallocatedm q base ≠ None ∧ ∀reg : region, object_regionb m_regionsallocatedm q base = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

rewrite Ho ; | exact Hr

m :
base, b, o :
Z
c :
Hn :
Ho :
Hr :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
⊢
object_regionb m_regionsm ≠ None ∧ ∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

split ; exact Hr |

m :
base, b, o :
Z
c :
Hn :
Ho :
Hr :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
⊢
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

intros reg E L

m :
base, b, o :
Z
c :
Hn :
Ho :
Hr :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
reg :
E :
L :
r_lifereg = Live
⊢
0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

destruct Hinreg E L as Ho′ & He & Hx

m :
base, b, o :
Z
c :
Hn :
Ho :
Hr :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
reg :
E :
L :
r_lifereg = Live
Ho′ :
0 ≤ o
He :
b + o < r_endreg
Hx :
aux_holdsm b + o c
⊢
0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

split ; exact Ho′ |

m :
base, b, o :
Z
c :
Hn :
Ho :
Hr :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
reg :
E :
L :
r_lifereg = Live
Ho′ :
0 ≤ o
He :
b + o < r_endreg
Hx :
aux_holdsm b + o c
⊢
b + o < r_endreg ∧ aux_holdsallocatedm q base b + o c

split ; exact He |

m :
base, b, o :
Z
c :
Hn :
Ho :
Hr :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
reg :
E :
L :
r_lifereg = Live
Ho′ :
0 ≤ o
He :
b + o < r_endreg
Hx :
aux_holdsm b + o c
⊢
aux_holdsallocatedm q base b + o c

destruct Hx as Hx | Hf Ht ; left ; exact Hx | right

m :
base, b, o :
Z
c :
Hn :
Ho :
Hr :
Hin :
∀reg : region, object_regionb m_regionsm = Somereg → r_lifereg = Live → 0 ≤ o ∧ b + o < r_endreg ∧ aux_holdsm b + o c
reg :
E :
L :
r_lifereg = Live
Ho′ :
0 ≤ o
He :
b + o < r_endreg

split ; exact freed_in_allocated_ _ _ _ Hn Hf | exact traps_as_freed_allocated_ _ _ _ Hn Ht

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hn
assert Ho : ∀b, object_regionb m_regionsm ≠ None → object_regionb m_regionsallocatedm q base = object_regionb m_regionsm
{intros b Hb
destruct Z.eqb_specbase b as [ <-| ] ; contradiction | reflexivity
destruct l as b | b o | b o | k , v as reg | x | c | | p t | cd | sq sp | ga gi | op ; cbn [ agree_piece ] ; try tauto ; unfold live_at , registered , in_live
–intros E L
rewrite Ho ; | congruence
auto
–intros Hr
rewrite Ho ; exact Hr
–intros Hr Hin
rewrite Ho ; | exact Hr
split ; exact Hr | exact Hin
–intros Hr Hin
rewrite Ho ; | exact Hr
split ; exact Hr |
intros reg E L
destruct Hinreg E L as Ho′ & He & Hx
split ; exact Ho′ |
split ; exact He |
destruct Hx as Hx | Hf Ht ; left ; exact Hx | right
split ; exact freed_in_allocated_ _ _ _ Hn Hf | exact traps_as_freed_allocated_ _ _ _ Hn Ht

Owning pieces

492Section pts
493Context `{!gen_heapGSpiece pval Σ}

Ownership of each piece of the list ps with its value.

496Definition ptsps : listpiece × pval : iPropΣ ≔
∗lv∈pspointstofstlv DfracOwn1 sndlv

Owning two lists of pieces is owning their concatenation.

499Lemma pts_app
∀ ps qs
ptsps ++ qs ⊣⊢ ptsps ∗ ptsqs
Explore proof 1 tactics

Initial goal

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
ps, qs :
listpiece × pval
⊢
ptsps ++ qs ⊣⊢ ptsps ∗ ptsqs

by rewrite / pts big_sepL_app

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
by rewrite / pts big_sepL_app

Owned pieces are in the authoritative heap.

503Lemma pts_lookup
∀ h ps
gen_heap_interph −∗ ptsps −∗ ⌜∀l v, l, v ∈ ps → h !! l = Somev⌝
Explore proof 11 tactics

Initial goal

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
ps :
listpiece × pval
⊢
gen_heap_interph −∗ ptsps −∗ ⌜∀l : piece v : pval, l, v ∈ ps → h !! l = Somev⌝

induction ps as | l v ps IH ; iIntros Hh Hps

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
Hh :
gen_heap_interph
Hps :
pts[ ]
∗
⌜∀l : piece v : pval, l, v ∈ [ ] → h !! l = Somev⌝
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
gen_heap_interph −∗ ptsps −∗ ⌜∀l : piece v : pval, l, v ∈ ps → h !! l = Somev⌝
Hh :
gen_heap_interph
Hps :
ptsl, v :: ps
∗
⌜∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = Somev0⌝

–iPureIntro

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
⊢
∀l : piece v : pval, l, v ∈ [ ] → h !! l = Somev
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
gen_heap_interph −∗ ptsps −∗ ⌜∀l : piece v : pval, l, v ∈ ps → h !! l = Somev⌝
Hh :
gen_heap_interph
Hps :
ptsl, v :: ps
∗
⌜∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = Somev0⌝

intros l v Hin

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
Hin :
l, v ∈ [ ]
⊢
h !! l = Somev
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
gen_heap_interph −∗ ptsps −∗ ⌜∀l : piece v : pval, l, v ∈ ps → h !! l = Somev⌝
Hh :
gen_heap_interph
Hps :
ptsl, v :: ps
∗
⌜∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = Somev0⌝

by apply not_elem_of_nil in Hin

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
gen_heap_interph −∗ ptsps −∗ ⌜∀l : piece v : pval, l, v ∈ ps → h !! l = Somev⌝
Hh :
gen_heap_interph
Hps :
ptsl, v :: ps
∗
⌜∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = Somev0⌝

–rewrite / pts /=

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
gen_heap_interph −∗ ptsps −∗ ⌜∀l : piece v : pval, l, v ∈ ps → h !! l = Somev⌝
Hh :
gen_heap_interph
Hps :
pointstol DfracOwn1 v ∗ ∗lv∈pspointstolv.1 DfracOwn1 lv.2
∗
⌜∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = Somev0⌝

iDestruct Hps as [Hl Hps]

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
gen_heap_interph −∗ ptsps −∗ ⌜∀l : piece v : pval, l, v ∈ ps → h !! l = Somev⌝
Hh :
gen_heap_interph
Hl :
pointstol DfracOwn1 v
Hps :
∗lv∈pspointstolv.1 DfracOwn1 lv.2
∗
⌜∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = Somev0⌝

iDestruct gen_heap_valid with Hh Hl as %Hl

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
gen_heap_interph −∗ ptsps −∗ ⌜∀l : piece v : pval, l, v ∈ ps → h !! l = Somev⌝
Hl :
h !! l = Somev
Hh :
gen_heap_interph
Hl :
pointstol DfracOwn1 v
Hps :
∗lv∈pspointstolv.1 DfracOwn1 lv.2
∗
⌜∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = Somev0⌝

iDestruct IH with Hh Hps as %Hps

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
gen_heap_interph −∗ ptsps −∗ ⌜∀l : piece v : pval, l, v ∈ ps → h !! l = Somev⌝
Hl :
h !! l = Somev
Hps :
∀l : piece v : pval, l, v ∈ ps → h !! l = Somev
Hh :
gen_heap_interph
Hl :
pointstol DfracOwn1 v
Hps :
∗lv∈pspointstolv.1 DfracOwn1 lv.2
∗
⌜∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = Somev0⌝

iPureIntro

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
gen_heap_interph −∗ ptsps −∗ ⌜∀l : piece v : pval, l, v ∈ ps → h !! l = Somev⌝
Hl :
h !! l = Somev
Hps :
∀l : piece v : pval, l, v ∈ ps → h !! l = Somev
⊢
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = Somev0

intros l′ v′ Hin

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
gen_heap_interph −∗ ptsps −∗ ⌜∀l : piece v : pval, l, v ∈ ps → h !! l = Somev⌝
Hl :
h !! l = Somev
Hps :
∀l : piece v : pval, l, v ∈ ps → h !! l = Somev
l′ :
v′ :
Hin :
l′, v′ ∈ l, v :: ps
⊢
h !! l′ = Somev′

apply elem_of_cons in Hin as = → → | Hin ; auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
induction ps as | l v ps IH ; iIntros Hh Hps
–iPureIntro
intros l v Hin
by apply not_elem_of_nil in Hin
–rewrite / pts /=
iDestruct Hps as [Hl Hps]
iDestruct gen_heap_valid with Hh Hl as %Hl
iDestruct IH with Hh Hps as %Hps
iPureIntro
intros l′ v′ Hin
apply elem_of_cons in Hin as = → → | Hin ; auto

Owned pieces can be given new values with the same keys.

514Lemma pts_update
∀ h ps ps′
ps′.*1 = ps.*1
gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
Explore proof 15 tactics

Initial goal

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
ps, ps′ :
listpiece × pval
⊢
ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′

revert ps′

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
ps :
listpiece × pval
⊢
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′

induction ps as | l v ps IH ; intros | l′ v′ ps′ Hk ; try discriminate Hk

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
Hk :
[ ].*1 = [ ].*1
⊢
gen_heap_interph −∗ pts[ ] ⇛ gen_heap_interpoverwrite[ ] h ∗ pts[ ]
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
l′ :
v′ :
ps′ :
listpiece × pval
Hk :
l′, v′ :: ps′.*1 = l, v :: ps.*1
⊢
gen_heap_interph −∗ ptsl, v :: ps ⇛ gen_heap_interpoverwritel′, v′ :: ps′ h ∗ ptsl′, v′ :: ps′

–iIntros Hh _

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
Hk :
[ ].*1 = [ ].*1
Hh :
gen_heap_interph
∗
|⇛ gen_heap_interpoverwrite[ ] h ∗ pts[ ]
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
l′ :
v′ :
ps′ :
listpiece × pval
Hk :
l′, v′ :: ps′.*1 = l, v :: ps.*1
⊢
gen_heap_interph −∗ ptsl, v :: ps ⇛ gen_heap_interpoverwritel′, v′ :: ps′ h ∗ ptsl′, v′ :: ps′

iModIntro

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
Hk :
[ ].*1 = [ ].*1
Hh :
gen_heap_interph
∗
gen_heap_interpoverwrite[ ] h ∗ pts[ ]
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
l′ :
v′ :
ps′ :
listpiece × pval
Hk :
l′, v′ :: ps′.*1 = l, v :: ps.*1
⊢
gen_heap_interph −∗ ptsl, v :: ps ⇛ gen_heap_interpoverwritel′, v′ :: ps′ h ∗ ptsl′, v′ :: ps′

iFrame

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
Hk :
[ ].*1 = [ ].*1
∗
pts[ ]
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
l′ :
v′ :
ps′ :
listpiece × pval
Hk :
l′, v′ :: ps′.*1 = l, v :: ps.*1
⊢
gen_heap_interph −∗ ptsl, v :: ps ⇛ gen_heap_interpoverwritel′, v′ :: ps′ h ∗ ptsl′, v′ :: ps′

by rewrite / pts

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
l′ :
v′ :
ps′ :
listpiece × pval
Hk :
l′, v′ :: ps′.*1 = l, v :: ps.*1
⊢
gen_heap_interph −∗ ptsl, v :: ps ⇛ gen_heap_interpoverwritel′, v′ :: ps′ h ∗ ptsl′, v′ :: ps′

–cbn in Hk

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
l′ :
v′ :
ps′ :
listpiece × pval
Hk :
l′ :: ps′.*1 = l :: ps.*1
⊢
gen_heap_interph −∗ ptsl, v :: ps ⇛ gen_heap_interpoverwritel′, v′ :: ps′ h ∗ ptsl′, v′ :: ps′

injection Hk as → Hk

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
v′ :
ps′ :
listpiece × pval
Hk :
ps′.*1 = ps.*1
⊢
gen_heap_interph −∗ ptsl, v :: ps ⇛ gen_heap_interpoverwritel, v′ :: ps′ h ∗ ptsl, v′ :: ps′

iIntros Hh Hps

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
v′ :
ps′ :
listpiece × pval
Hk :
ps′.*1 = ps.*1
Hh :
gen_heap_interph
Hps :
ptsl, v :: ps
∗
|⇛ gen_heap_interpoverwritel, v′ :: ps′ h ∗ ptsl, v′ :: ps′

rewrite / pts /=

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
v′ :
ps′ :
listpiece × pval
Hk :
ps′.*1 = ps.*1
Hh :
gen_heap_interph
Hps :
pointstol DfracOwn1 v ∗ ∗lv∈pspointstolv.1 DfracOwn1 lv.2
∗
|⇛ gen_heap_interp<[l ≔ v′]>overwriteps′ h ∗ pointstol DfracOwn1 v′ ∗ ∗lv∈ps′pointstolv.1 DfracOwn1 lv.2

iDestruct Hps as [Hl Hps]

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
v′ :
ps′ :
listpiece × pval
Hk :
ps′.*1 = ps.*1
Hh :
gen_heap_interph
Hl :
pointstol DfracOwn1 v
Hps :
∗lv∈pspointstolv.1 DfracOwn1 lv.2
∗
|⇛ gen_heap_interp<[l ≔ v′]>overwriteps′ h ∗ pointstol DfracOwn1 v′ ∗ ∗lv∈ps′pointstolv.1 DfracOwn1 lv.2

iMod IHps′ Hk with Hh Hps as [Hh Hps]

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
v′ :
ps′ :
listpiece × pval
Hk :
ps′.*1 = ps.*1
Hl :
pointstol DfracOwn1 v
Hh :
gen_heap_interpoverwriteps′ h
Hps :
ptsps′
∗
|⇛ gen_heap_interp<[l ≔ v′]>overwriteps′ h ∗ pointstol DfracOwn1 v′ ∗ ∗lv∈ps′pointstolv.1 DfracOwn1 lv.2

iMod gen_heap_update with Hh Hl as [Hh Hl]

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
v′ :
ps′ :
listpiece × pval
Hk :
ps′.*1 = ps.*1
Hps :
ptsps′
Hh :
gen_heap_interp<[l ≔ ?Goal]>overwriteps′ h
Hl :
pointstol DfracOwn1 ?Goal
∗
|⇛ gen_heap_interp<[l ≔ v′]>overwriteps′ h ∗ pointstol DfracOwn1 v′ ∗ ∗lv∈ps′pointstolv.1 DfracOwn1 lv.2
shelved goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
v′ :
ps′ :
listpiece × pval
Hk :
ps′.*1 = ps.*1
⊢

iModIntro

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
v′ :
ps′ :
listpiece × pval
Hk :
ps′.*1 = ps.*1
Hps :
ptsps′
Hh :
gen_heap_interp<[l ≔ ?Goal]>overwriteps′ h
Hl :
pointstol DfracOwn1 ?Goal
∗
gen_heap_interp<[l ≔ v′]>overwriteps′ h ∗ pointstol DfracOwn1 v′ ∗ ∗lv∈ps′pointstolv.1 DfracOwn1 lv.2
shelved goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
∀ps′ : listpiece × pval, ps′.*1 = ps.*1 → gen_heap_interph −∗ ptsps ⇛ gen_heap_interpoverwriteps′ h ∗ ptsps′
v′ :
ps′ :
listpiece × pval
Hk :
ps′.*1 = ps.*1
⊢

iFrame

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
revert ps′
induction ps as | l v ps IH ; intros | l′ v′ ps′ Hk ; try discriminate Hk
–iIntros Hh _
iModIntro
iFrame
by rewrite / pts
–cbn in Hk
injection Hk as → Hk
iIntros Hh Hps
rewrite / pts /=
iDestruct Hps as [Hl Hps]
iMod IHps′ Hk with Hh Hps as [Hh Hps]
iMod gen_heap_update with Hh Hl as [Hh Hl]
iModIntro
iFrame

Pieces with distinct keys, none in the heap, can be allocated.

526Lemma pts_alloc
∀ h ps
NoDupps.*1
∀l v, l, v ∈ ps → h !! l = None
gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Explore proof 25 tactics

Initial goal

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
ps :
listpiece × pval
⊢
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps

induction ps as | l v ps IH ; intros Hnd Hfr

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
Hnd :
NoDup[ ].*1
Hfr :
∀l : piece v : pval, l, v ∈ [ ] → h !! l = None
⊢
gen_heap_interph ⇛ gen_heap_interpoverwrite[ ] h ∗ pts[ ]
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hnd :
NoDupl, v :: ps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
⊢
gen_heap_interph ⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

–iIntros Hh

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
Hnd :
NoDup[ ].*1
Hfr :
∀l : piece v : pval, l, v ∈ [ ] → h !! l = None
Hh :
gen_heap_interph
∗
|⇛ gen_heap_interpoverwrite[ ] h ∗ pts[ ]
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hnd :
NoDupl, v :: ps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
⊢
gen_heap_interph ⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

iModIntro

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
Hnd :
NoDup[ ].*1
Hfr :
∀l : piece v : pval, l, v ∈ [ ] → h !! l = None
Hh :
gen_heap_interph
∗
gen_heap_interpoverwrite[ ] h ∗ pts[ ]
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hnd :
NoDupl, v :: ps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
⊢
gen_heap_interph ⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

iFrame

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
Hnd :
NoDup[ ].*1
Hfr :
∀l : piece v : pval, l, v ∈ [ ] → h !! l = None
∗
pts[ ]
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hnd :
NoDupl, v :: ps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
⊢
gen_heap_interph ⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

by rewrite / pts

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hnd :
NoDupl, v :: ps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
⊢
gen_heap_interph ⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

–cbn in Hnd

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hnd :
NoDupl :: ps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
⊢
gen_heap_interph ⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

apply NoDup_cons in Hnd as Hn Hnd

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
⊢
gen_heap_interph ⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

iIntros Hh

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hh :
gen_heap_interph
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

iMod IHHnd with Hh as [Hh Hps]

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
⊢
∀l0 : piece v0 : pval, l0, v0 ∈ ps → h !! l0 = None
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hh :
gen_heap_interpoverwriteps h
Hps :
ptsps
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

{intros l′ v′ Hin

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
l′ :
v′ :
Hin :
l′, v′ ∈ ps
⊢
h !! l′ = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hh :
gen_heap_interpoverwriteps h
Hps :
ptsps
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

apply Hfrl′ v′

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
l′ :
v′ :
Hin :
l′, v′ ∈ ps
⊢
l′, v′ ∈ l, v :: ps
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hh :
gen_heap_interpoverwriteps h
Hps :
ptsps
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

apply elem_of_cons

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
l′ :
v′ :
Hin :
l′, v′ ∈ ps
⊢
l′, v′ = l, v ∨ l′, v′ ∈ ps
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hh :
gen_heap_interpoverwriteps h
Hps :
ptsps
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

by right

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hh :
gen_heap_interpoverwriteps h
Hps :
ptsps
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

iMod gen_heap_alloc_ l v with Hh as (Hh & Hl & _)

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
⊢
overwriteps h !! l = None
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hps :
ptsps
Hh :
gen_heap_interp<[l ≔ v]>overwriteps h
Hl :
pointstol DfracOwn1 v
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

{destruct overwriteps h !! l as v′ | eqn: E ; | reflexivity

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
v′ :
E :
overwriteps h !! l = Somev′
⊢
Somev′ = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hps :
ptsps
Hh :
gen_heap_interp<[l ≔ v]>overwriteps h
Hl :
pointstol DfracOwn1 v
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

destruct lookup_overwrite_ _ _ _ E as Hin | _ Hh

3 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
v′ :
E :
overwriteps h !! l = Somev′
Hin :
l, v′ ∈ ps
⊢
Somev′ = None
focused goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
v′ :
E :
overwriteps h !! l = Somev′
Hh :
h !! l = Somev′
⊢
Somev′ = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hps :
ptsps
Hh :
gen_heap_interp<[l ≔ v]>overwriteps h
Hl :
pointstol DfracOwn1 v
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

–exfalso

3 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
v′ :
E :
overwriteps h !! l = Somev′
Hin :
l, v′ ∈ ps
⊢
False
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
v′ :
E :
overwriteps h !! l = Somev′
Hh :
h !! l = Somev′
⊢
Somev′ = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hps :
ptsps
Hh :
gen_heap_interp<[l ≔ v]>overwriteps h
Hl :
pointstol DfracOwn1 v
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

apply Hn

3 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
v′ :
E :
overwriteps h !! l = Somev′
Hin :
l, v′ ∈ ps
⊢
l ∈ ps.*1
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
v′ :
E :
overwriteps h !! l = Somev′
Hh :
h !! l = Somev′
⊢
Somev′ = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hps :
ptsps
Hh :
gen_heap_interp<[l ≔ v]>overwriteps h
Hl :
pointstol DfracOwn1 v
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

exact list_elem_of_fmap_2fst _ l, v′ Hin

2 open

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
v′ :
E :
overwriteps h !! l = Somev′
Hh :
h !! l = Somev′
⊢
Somev′ = None
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hps :
ptsps
Hh :
gen_heap_interp<[l ≔ v]>overwriteps h
Hl :
pointstol DfracOwn1 v
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

–rewrite Hfrl v in Hh ; discriminate |

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
v′ :
E :
overwriteps h !! l = Somev′
⊢
l, v ∈ l, v :: ps
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hps :
ptsps
Hh :
gen_heap_interp<[l ≔ v]>overwriteps h
Hl :
pointstol DfracOwn1 v
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

apply elem_of_cons

2 open

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
v′ :
E :
overwriteps h !! l = Somev′
⊢
l, v = l, v ∨ l, v ∈ ps
deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hps :
ptsps
Hh :
gen_heap_interp<[l ≔ v]>overwriteps h
Hl :
pointstol DfracOwn1 v
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

by left

deferred goal
Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hps :
ptsps
Hh :
gen_heap_interp<[l ≔ v]>overwriteps h
Hl :
pointstol DfracOwn1 v
∗
|⇛ gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

iModIntro

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hps :
ptsps
Hh :
gen_heap_interp<[l ≔ v]>overwriteps h
Hl :
pointstol DfracOwn1 v
∗
gen_heap_interpoverwritel, v :: ps h ∗ ptsl, v :: ps

rewrite / pts /=

Σ :
gFunctors
gen_heapGS0 :
gen_heapGSpiece pval Σ
h :
v :
ps :
listpiece × pval
IH :
NoDupps.*1 → ∀l : piece v : pval, l, v ∈ ps → h !! l = None → gen_heap_interph ⇛ gen_heap_interpoverwriteps h ∗ ptsps
Hn :
l ∉ ps.*1
Hnd :
NoDupps.*1
Hfr :
∀l0 : piece v0 : pval, l0, v0 ∈ l, v :: ps → h !! l0 = None
Hps :
∗lv∈pspointstolv.1 DfracOwn1 lv.2
Hh :
gen_heap_interp<[l ≔ v]>overwriteps h
Hl :
pointstol DfracOwn1 v
∗
gen_heap_interp<[l ≔ v]>overwriteps h ∗ pointstol DfracOwn1 v ∗ ∗lv∈pspointstolv.1 DfracOwn1 lv.2

iFrame

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
induction ps as | l v ps IH ; intros Hnd Hfr
–iIntros Hh
iModIntro
iFrame
by rewrite / pts
–cbn in Hnd
apply NoDup_cons in Hnd as Hn Hnd
iIntros Hh
iMod IHHnd with Hh as [Hh Hps]
{intros l′ v′ Hin
apply Hfrl′ v′
apply elem_of_cons
by right
iMod gen_heap_alloc_ l v with Hh as (Hh & Hl & _)
{destruct overwriteps h !! l as v′ | eqn: E ; | reflexivity
destruct lookup_overwrite_ _ _ _ E as Hin | _ Hh
–exfalso
apply Hn
exact list_elem_of_fmap_2fst _ l, v′ Hin
–rewrite Hfrl v in Hh ; discriminate |
apply elem_of_cons
by left
iModIntro
rewrite / pts /=
iFrame