Fil-C on Nix

Filnix wiki

the formal campaign

rocq/spikes/Sep.v

A small separation logic over the model's memory, hand-rolled: the first of the two spikes of docs/logic.md. Nothing outside nanofil/rocq/spikes depends on it.

An assertion is a predicate on a footprint and a memory: the footprint is the set of pieces of memory the assertion owns, and the assertion may speak of the memory only through those pieces and through facts that no step can take back. Pieces are keyed by identity, not by address: an object's life (PLive), one of its bytes (PByte) and one of its aux slots (PAux), each named by the object's base and an offset. Keying by address would not do: the model's fresh lets a new object take the addresses of a freed one, so a byte at an address may belong to two identities in turn. A byte piece speaks only while its object is live and the offset is in bounds, and then nothing else can write it.

The separating conjunction star splits the footprint in two disjoint parts. The frame property is stable: an assertion still holds after any change that keeps its pieces (same_on) and only moves objects forward in life (grows). Each kind of step that changes memory keeps every footprint that does not own what it writes (store_same_on, pointer_store_same_on, alloc_same_on), given one fact about the whole memory, that live objects do not overlap (live_disjoint): that fact is this logic's state interpretation.

A safepoint is the one step that may change memory nobody in the program wrote. It frees no object (Runtime.v's collector_live, so the premise Buffer.v once took is Pieces.v's lemma keeps_live) and changes nothing an assertion owns except an aux slot whose stored capability names a freed object, and the list predicate lst never stores one (lst_safepoint). An assertion that survives that is sp_stable.

An assertion that owns only pieces of objects (owns_registered) can be dropped into htrue, the affine assertion of anything owned: a walk of the list drops each node it has passed. A write is a rule for the owner of what it writes (writes: icell_writes, pcell_writes) and a fact for everyone else (keeps), and the two combine under star (writes_star_l, writes_star_r); an allocation adds a node no one else owned (alloc_frame). Footprints are predicates compared piece by piece, with no extensionality assumed, so emp is a unit only up to the same pieces (star_emp_elim).

From Stdlib Require Import String ZArith List Bool Lia
From Nanofil Require Import Term Syntax Values Memory Runtime Ops Pieces
Import ListNotations
Open Scope Z_scope

Footprints

A footprint: a set of pieces.

54Definition fp: Type ≔
piece → Prop

An assertion: a predicate on the footprint it owns and the memory.

57Definition hprop: Type ≔
fp → mem → Prop

The footprint S is exactly the pieces ps.

60Definition onlyS : fp ps : piece → Prop : Prop ≔
∀p, Sp ↔ psp

How memory may change

From m to m', every object moved forward in life only: it is still there unchanged, or it was live and is now freed and empty. New objects may appear. Every step of a run does this.

67Definition growsm m′ : mem : Prop ≔
∀b reg, object_regionb m_regionsm = Somereg → object_regionb m_regionsm′ = Somereg ∨ r_lifereg = Live ∧ object_regionb m_regionsm′ = SomemkRegionb b r_kindreg Freed

From m to m', the pieces of S are kept: an owned object's region, and, while the object is live and the offset in bounds, an owned byte or aux slot; a name is no memory.

75Definition same_onS : fp m m′ : mem : Prop ≔
∀ p  ,
Sp
→
match p with
⇒
∀reg, object_regionb m_regionsm = Somereg → object_regionb m_regionsm′ = Somereg
⇒
∀reg, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_bytesm′ b + o = m_bytesm b + o
PAuxb o
⇒
∀reg, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_auxm′ b + o = m_auxm b + o
⇒
True

The assertion P is stable: it survives any change that keeps its pieces and moves objects only forward. Every assertion built here is.

90Definition stableP : hprop : Prop ≔
∀S m m′, PS m → same_onS m m′ → growsm m′ → PS m′

Every piece of S belongs to an object of m. Every assertion built here owns only such pieces, so a fresh identity is owned by no one.

96Definition registeredS : fp m : mem : Prop ≔
∀p, Sp → object_regionpiece_idp m_regionsm ≠ None

Assertions

Owns nothing.

102Definition emp: hprop ≔
λS _ ⇒ onlyS λ_ ⇒ False

Owns nothing, and phi holds.

105Definition purephi : Prop : hprop ≔
λS _ ⇒ onlyS λ_ ⇒ False ∧ phi

P and Q hold of disjoint parts of the footprint.

108Definition starP Q : hprop : hprop ≔
λS m ⇒ ∃S1 S2, ∀p, Sp ↔ S1p ∨ S2p ∧ ∀p, ¬S1p ∧ S2p ∧ PS1 m ∧ QS2 m

P x holds for some x.

113Definition hexA : Type P : A → hprop : hprop ≔
λS m ⇒ ∃x, Px S m
Declare Scope hprop_scope
Delimit Scope hprop_scope with h
117Infix ** ≔ star (at level 41 , right associativity) : hprop_scope

The persistent fact that b is an object of kind k whose bounds, while it is live, are n bytes: the meta of docs/logic.md. Owns nothing, and no step takes it back.

122Definition metab n : Z k : kind : hprop ≔
λS m ⇒ onlyS λ_ ⇒ False ∧ ∃reg, object_regionb m_regionsm = Somereg ∧ r_kindreg = k ∧ r_lifereg = Live → r_endreg = b + n

The object b is live, and only the owner of this may end it: the live token.

129Definition liveb : Z : hprop ≔
λS m ⇒ onlyS eqPLiveb ∧ ∃reg, live_atm b reg

The eight bytes at offset o of the object b.

133Definition bytes8b o : Z p : piece : Prop ≔
∃i, 0 ≤ i < 8 ∧ p = PByteb o + i

The eight bytes at offset o of b hold the integer v, while b is live; b is an object, and o is in its bounds.

138Definition icellb o v : Z : hprop ≔
λS m ⇒ onlyS bytes8b o ∧ object_regionb m_regionsm ≠ None ∧ ∀reg, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v

The pointer slot at offset o of b holds the pointer x, its address in the bytes and its capability in the aux (aux_holds), while b is live.

146Definition pcellb o : Z x : ptr : hprop ≔
λS m ⇒ onlyS λp ⇒ bytes8b o p ∨ p = PAuxb o ∧ object_regionb m_regionsm ≠ None ∧ ∀reg, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx

A list node at b: a 16-byte heap object, live, whose first slot points to next and whose second holds v (C's struct node {struct node *next; long v;}).

156Definition nodeb : Z next : ptr v : Z : hprop ≔
metab 16 Heap ** liveb ** pcellb 0 next ** icellb 8 v%h

The list at p holds the values xs: null for none, else a pointer to a node with its own capability, at an 8-aligned address (a pointer load checks the alignment of its slot), whose next pointer is the rest.

163Fixpoint lstp : ptr xs : listZ : hprop ≔
match xs with
[ ]
⇒
v :: xs′
⇒
hexλnext ⇒ purep = mkPtrptr_addrp Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs′%h

One node of a nonempty list at p: its value v, its next pointer next and the rest xs, the body of lst's second case.

173Definition lst_consp : ptr v : Z next : ptr xs : listZ : hprop ≔
purep = mkPtrptr_addrp Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h

More ways memory may change

The assertion P survives what a safepoint may do (safepoint_shape): the same objects, the same bytes, and aux slots changed only as aux_moves allows.

182Definition sp_stableP : hprop : Prop ≔
∀S m m′, PS m → same_regionsm m′ → m_bytesm′ = m_bytesm → aux_movesm m′ → PS m′

The assertion P owns only pieces of objects of the memory.

186Definition owns_registeredP : hprop : Prop ≔
∀S m, PS m → registeredS m

Anything owned: the affine assertion into which pieces no longer needed are dropped.

190Definition htrue: hprop ≔
λS m ⇒ registeredS m

The pieces a pointer slot at offset o of b owns.

193Definition pcell_piecesb o : Z p : piece : Prop ≔
bytes8b o p ∨ p = PAuxb o

The pieces a node at b owns.

196Definition node_piecesb : Z p : piece : Prop ≔
p = PLiveb ∨ bytes8b 0 p ∨ p = PAuxb 0 ∨ bytes8b 8 p

From m to m', every footprint owning nothing of W is kept: what a write of the pieces W does to everyone else.

201Definition keepsW : piece → Prop m m′ : mem : Prop ≔
∀S, ∀p, Sp → ¬Wp → same_onS m m′

From m to m', P becomes P' on the same footprint, which owns the written pieces W: the rule of one write for the owner of what it writes.

207Definition writesW : piece → Prop m m′ : mem P P′ : hprop : Prop ≔
∀S, PS m → P′S m′ ∧ ∀p, Wp → Sp

Facts about objects and bytes

The region object_region finds for b has b for its base.

213Lemma object_region_base
∀ b rs reg
object_regionb rs = Somereg
r_basereg = b
Explore proof 3 tactics

Initial goal

⊢
∀b : Z rs : listregion reg : region, object_regionb rs = Somereg → r_basereg = b

intros b rs reg

b :
Z
rs :
listregion
reg :
⊢
object_regionb rs = Somereg → r_basereg = b

induction rs as | r rs IH ; cbn ; discriminate |

b :
Z
rs :
listregion
reg :
IH :
object_regionb rs = Somereg → r_basereg = b
⊢
r_baser =? b
→
Somer
=
Somereg
→
r_basereg = b

destruct Z.eqb_specr_baser b as E | _ ; intros H ; injection H as ← ; exact E | exact IH

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b rs reg
induction rs as | r rs IH ; cbn ; discriminate |
destruct Z.eqb_specr_baser b as E | _ ; intros H ; injection H as ← ; exact E | exact IH

An object live after a change that moves objects only forward was live, with the same region, before it.

221Lemma grows_live_at
∀ m m′ b reg
growsm m′
live_atm′ b reg
live_atm b reg
Explore proof 5 tactics

Initial goal

⊢
∀m m′ : mem b : Z reg : region, growsm m′ → object_regionb m_regionsm ≠ None → live_atm′ b reg → live_atm b reg

intros m m′ b reg Hg Hb E L

m, m′ :
b :
Z
reg :
Hg :
growsm m′
Hb :
E :
object_regionb m_regionsm′ = Somereg
L :
r_lifereg = Live
⊢
live_atm b reg

destruct object_regionb m_regionsm as reg0 | eqn: E0 ; | congruence

m, m′ :
b :
Z
reg :
Hg :
growsm m′
reg0 :
E0 :
object_regionb m_regionsm = Somereg0
Hb :
Somereg0 ≠ None
E :
object_regionb m_regionsm′ = Somereg
L :
r_lifereg = Live
⊢
live_atm b reg

destruct Hgb reg0 E0 as E1 | L0 & E1 ; rewrite E1 in E ; injection E as ←

2 open

m, m′ :
b :
Z
Hg :
growsm m′
reg0 :
E0 :
object_regionb m_regionsm = Somereg0
Hb :
Somereg0 ≠ None
L :
r_lifereg0 = Live
E1 :
object_regionb m_regionsm′ = Somereg0
⊢
live_atm b reg0
focused goal
m, m′ :
b :
Z
Hg :
growsm m′
reg0 :
E0 :
object_regionb m_regionsm = Somereg0
Hb :
Somereg0 ≠ None
L :
r_lifer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg0; r_life ≔ Freed = Live
L0 :
r_lifereg0 = Live
E1 :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg0; r_life ≔ Freed
⊢
live_atm b r_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg0; r_life ≔ Freed

–split ; assumption

deferred goal
m, m′ :
b :
Z
Hg :
growsm m′
reg0 :
E0 :
object_regionb m_regionsm = Somereg0
Hb :
Somereg0 ≠ None
L :
r_lifer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg0; r_life ≔ Freed = Live
L0 :
r_lifereg0 = Live
E1 :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg0; r_life ≔ Freed
⊢
live_atm b r_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg0; r_life ≔ Freed

–discriminate L

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ b reg Hg Hb E L
destruct object_regionb m_regionsm as reg0 | eqn: E0 ; | congruence
destruct Hgb reg0 E0 as E1 | L0 & E1 ; rewrite E1 in E ; injection E as ←
–split ; assumption
–discriminate L

A footprint of objects stays one when objects move only forward.

232Lemma grows_registered
∀ m m′ S
Explore proof 4 tactics

Initial goal

⊢
∀m m′ : mem S : fp, growsm m′ → registeredS m → registeredS m′

intros m m′ S Hg Hr p Hp

m, m′ :
S :
Hg :
growsm m′
Hr :
Hp :
Sp

specialize Hrp Hp

m, m′ :
S :
Hg :
growsm m′
Hp :
Sp

destruct object_regionpiece_idp m_regionsm as reg | eqn: E ; | congruence

m, m′ :
S :
Hg :
growsm m′
reg :
Hr :
Somereg ≠ None
Hp :
Sp

destruct Hg_ _ E as E′ | _ & E′ ; rewrite E' ; discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ S Hg Hr p Hp
specialize Hrp Hp
destruct object_regionpiece_idp m_regionsm as reg | eqn: E ; | congruence
destruct Hg_ _ E as E′ | _ & E′ ; rewrite E' ; discriminate

A footprint of objects stays one while objects keep their regions.

240Lemma registered_same
∀ m m′ S
Explore proof 3 tactics

Initial goal

⊢
∀m m′ : mem S : fp, same_regionsm m′ → registeredS m → registeredS m′

intros m m′ S Hr H p Hp

m, m′ :
S :
Hr :
Hp :
Sp

rewrite Hr

m, m′ :
S :
Hr :
Hp :
Sp

exact Hp Hp

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ S Hr H p Hp
rewrite Hr
exact Hp Hp

A freed object stays freed when objects move only forward.

244Lemma freed_in_grows
∀ m m′ c
Explore proof 4 tactics

Initial goal

⊢
∀m m′ : mem c : cap, growsm m′ → freed_inm_regionsm c → freed_inm_regionsm′ c

intros m m′ c Hg b & reg & Hc & E & L

m, m′ :
c :
Hg :
growsm m′
b :
Z
reg :
Hc :
c = Objb ∨ c = Rob
E :
L :

exists b, reg

m, m′ :
c :
Hg :
growsm m′
b :
Z
reg :
Hc :
c = Objb ∨ c = Rob
E :
L :
⊢
c = Objb ∨ c = Rob ∧ object_regionb m_regionsm′ = Somereg ∧ r_lifereg = Freed

split ; exact Hc |

m, m′ :
c :
Hg :
growsm m′
b :
Z
reg :
Hc :
c = Objb ∨ c = Rob
E :
L :
⊢
object_regionb m_regionsm′ = Somereg ∧ r_lifereg = Freed

destruct Hgb reg E as E′ | L′ & _ ; split ; assumption | congruence

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ c Hg b & reg & Hc & E & L
exists b, reg
split ; exact Hc |
destruct Hgb reg E as E′ | L′ & _ ; split ; assumption | congruence

A capability that traps as a freed one keeps doing so when objects move only forward: an object that ends has no bounds left.

253Lemma traps_as_freed_grows
Explore proof 3 tactics

Initial goal

⊢
∀m m′ : mem c : cap, growsm m′ → traps_as_freedm_regionsm c → traps_as_freedm_regionsm′ c

intros m m′ c Hg H a size r align Hs

m, m′ :
c :
Hg :
growsm m′
a, size :
Z
align :
Z
Hs :
0 < size
⊢
cap_access_resc m_regionsm′ a size r align = SomeRTrapOutOfBounds

specialize Ha size r align Hs

m, m′ :
c :
Hg :
growsm m′
a, size :
Z
align :
Z
H :
cap_access_resc m_regionsm a size r align = SomeRTrapOutOfBounds
Hs :
0 < size
⊢
cap_access_resc m_regionsm′ a size r align = SomeRTrapOutOfBounds

destruct c as | b | b | f | n ; cbn in H |- * ; try exact H ; destruct object_regionb m_regionsm as reg | eqn: E ; try discriminate H ; destruct Hgb reg E as E′ | _ & E′ ; rewrite E' ; try exact H ; cbn [ r_end ] ; destruct Z.leb_specb a ; rewrite proj2Z.leb_gta + size b by lia | ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ c Hg H a size r align Hs
specialize Ha size r align Hs
destruct c as | b | b | f | n ; cbn in H |- * ; try exact H ; destruct object_regionb m_regionsm as reg | eqn: E ; try discriminate H ; destruct Hgb reg E as E′ | _ & E′ ; rewrite E' ; try exact H ; cbn [ r_end ] ; destruct Z.leb_specb a ; rewrite proj2Z.leb_gta + size b by lia | ; reflexivity

The eight bytes at a read the same where each of them is the same.

264Lemma load_bytes_ext8
∀ m m′ a
∀i, 0 ≤ i < 8 → m_bytesm′ a + i = m_bytesm a + i
load_bytesm′ a 8 = load_bytesm a 8
Explore proof 5 tactics

Initial goal

⊢
∀m m′ : mem a : Z, ∀i : Z, 0 ≤ i < 8 → m_bytesm′ a + i = m_bytesm a + i → load_bytesm′ a 8 = load_bytesm a 8

intros m m′ a H

m, m′ :
a :
Z
H :
∀i : Z, 0 ≤ i < 8 → m_bytesm′ a + i = m_bytesm a + i
⊢
load_bytesm′ a 8 = load_bytesm a 8

unfold load_bytes

m, m′ :
a :
Z
H :
∀i : Z, 0 ≤ i < 8 → m_bytesm′ a + i = m_bytesm a + i
⊢
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm′ a + Z.of_natn′
Z.to_nat8 0
=
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm a + Z.of_natn′
Z.to_nat8 0

simpl

m, m′ :
a :
Z
H :
∀i : Z, 0 ≤ i < 8 → m_bytesm′ a + i = m_bytesm a + i
⊢
m_bytesm′ a + 7 × 256 + m_bytesm′ a + 6 × 256 + m_bytesm′ a + 5 × 256 + m_bytesm′ a + 4 × 256 + m_bytesm′ a + 3 × 256 + m_bytesm′ a + 2 × 256 + m_bytesm′ a + 1 × 256 + m_bytesm′ a + 0 = m_bytesm a + 7 × 256 + m_bytesm a + 6 × 256 + m_bytesm a + 5 × 256 + m_bytesm a + 4 × 256 + m_bytesm a + 3 × 256 + m_bytesm a + 2 × 256 + m_bytesm a + 1 × 256 + m_bytesm a + 0

rewrite ! H by lia

m, m′ :
a :
Z
H :
∀i : Z, 0 ≤ i < 8 → m_bytesm′ a + i = m_bytesm a + i
⊢
m_bytesm a + 7 × 256 + m_bytesm a + 6 × 256 + m_bytesm a + 5 × 256 + m_bytesm a + 4 × 256 + m_bytesm a + 3 × 256 + m_bytesm a + 2 × 256 + m_bytesm a + 1 × 256 + m_bytesm a + 0 = m_bytesm a + 7 × 256 + m_bytesm a + 6 × 256 + m_bytesm a + 5 × 256 + m_bytesm a + 4 × 256 + m_bytesm a + 3 × 256 + m_bytesm a + 2 × 256 + m_bytesm a + 1 × 256 + m_bytesm a + 0

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ a H
unfold load_bytes
simpl
rewrite ! H by lia
reflexivity

Bytes read the same in a memory with the same bytes.

272Lemma load_bytes_same
∀ m m′ a n
load_bytesm′ a n = load_bytesm a n
Explore proof 4 tactics

Initial goal

⊢
∀m m′ : mem a n : Z, m_bytesm′ = m_bytesm → load_bytesm′ a n = load_bytesm a n

intros m m′ a n H

m, m′ :
a, n :
Z
H :
⊢
load_bytesm′ a n = load_bytesm a n

unfold load_bytes

m, m′ :
a, n :
Z
H :
⊢
fix go n0 : nat acc : Z {struct n0} : Z ≔
match n0 with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm′ a + Z.of_natn′
Z.to_natn 0
=
fix go n0 : nat acc : Z {struct n0} : Z ≔
match n0 with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm a + Z.of_natn′
Z.to_natn 0

rewrite H

m, m′ :
a, n :
Z
H :
⊢
fix go n0 : nat acc : Z {struct n0} : Z ≔
match n0 with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm a + Z.of_natn′
Z.to_natn 0
=
fix go n0 : nat acc : Z {struct n0} : Z ≔
match n0 with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm a + Z.of_natn′
Z.to_natn 0

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ a n H
unfold load_bytes
rewrite H
reflexivity

Eight zero bytes read as zero.

276Lemma load_bytes_zero
∀ m a
∀i, 0 ≤ i < 8 → m_bytesm a + i = 0
load_bytesm a 8 = 0
Explore proof 5 tactics

Initial goal

⊢
∀m : mem a : Z, ∀i : Z, 0 ≤ i < 8 → m_bytesm a + i = 0 → load_bytesm a 8 = 0

intros m a H

m :
a :
Z
H :
∀i : Z, 0 ≤ i < 8 → m_bytesm a + i = 0
⊢
load_bytesm a 8 = 0

unfold load_bytes

m :
a :
Z
H :
∀i : Z, 0 ≤ i < 8 → m_bytesm a + i = 0
⊢
fix go n : nat acc : Z {struct n} : Z ≔
match n with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm a + Z.of_natn′
Z.to_nat8 0
=
0

simpl

m :
a :
Z
H :
∀i : Z, 0 ≤ i < 8 → m_bytesm a + i = 0
⊢
m_bytesm a + 7 × 256 + m_bytesm a + 6 × 256 + m_bytesm a + 5 × 256 + m_bytesm a + 4 × 256 + m_bytesm a + 3 × 256 + m_bytesm a + 2 × 256 + m_bytesm a + 1 × 256 + m_bytesm a + 0 = 0

rewrite ! H by lia

m :
a :
Z
H :
∀i : Z, 0 ≤ i < 8 → m_bytesm a + i = 0
⊢
0 × 256 + 0 × 256 + 0 × 256 + 0 × 256 + 0 × 256 + 0 × 256 + 0 × 256 + 0 = 0

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m a H
unfold load_bytes
simpl
rewrite ! H by lia
reflexivity

Live objects stay apart while objects keep their regions.

283Lemma live_disjoint_same
Explore proof 4 tactics

Initial goal

⊢
∀m m′ : mem, m_regionsm′ = m_regionsm → live_disjointm → live_disjointm′

intros m m′ E H 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 H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ E H b1 r1 b2 r2
unfold live_at
rewrite E
apply H

A memory with the same objects only moves them forward.

287Lemma grows_same
∀ m m′
growsm m′
Explore proof 4 tactics

Initial goal

⊢
∀m m′ : mem, m_regionsm′ = m_regionsm → growsm m′

intros m m′ E b reg H

m, m′ :
E :
b :
Z
reg :
H :
⊢
object_regionb m_regionsm′ = Somereg ∨ r_lifereg = Live ∧ object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg; r_life ≔ Freed

left

m, m′ :
E :
b :
Z
reg :
H :
⊢
object_regionb m_regionsm′ = Somereg

rewrite E

m, m′ :
E :
b :
Z
reg :
H :
⊢

exact H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m m′ E b reg H
left
rewrite E
exact H

A footprint's parts are kept where it is.

291Lemma same_on_sub
∀ S S′ m m′
∀p, S′p → Sp
same_onS m m′
same_onS′ m m′
Explore proof 2 tactics

Initial goal

⊢
∀S S′ : piece → Prop m m′ : mem, ∀p : piece, S′p → Sp → same_onS m m′ → same_onS′ m m′

intros S S′ m m′ H Hs p Hp

S, S′ :
piece → Prop
m, m′ :
H :
∀p : piece, S′p → Sp
Hs :
same_onS m m′
Hp :
S′p
⊢
match p with
⇒
∀reg : region, object_regionb m_regionsm = Somereg → object_regionb m_regionsm′ = Somereg
⇒
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_bytesm′ b + o = m_bytesm b + o
PAuxb o
⇒
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_auxm′ b + o = m_auxm b + o
⇒
True

exact Hsp Hp Hp

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros S S′ m m′ H Hs p Hp
exact Hsp Hp Hp

Kept through two changes is kept through both, when the second keeps every object's region.

296Lemma same_on_trans
∀ S m1 m2 m3
same_onS m1 m2
same_onS m2 m3
same_onS m1 m3
Explore proof 19 tactics

Initial goal

⊢
∀S : fp m1 m2 m3 : mem, m_regionsm3 = m_regionsm2 → same_onS m1 m2 → same_onS m2 m3 → same_onS m1 m3

intros S m1 m2 m3 Hr H12 H23 p Hp

S :
m1, m2, m3 :
Hr :
H12 :
same_onS m1 m2
H23 :
same_onS m2 m3
Hp :
Sp
⊢
match p with
⇒
∀reg : region, object_regionb m_regionsm1 = Somereg → object_regionb m_regionsm3 = Somereg
⇒
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm1 b + o
PAuxb o
⇒
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
⇒
True

specialize H12p Hp

S :
m1, m2, m3 :
Hr :
H12 :
match p with
⇒
∀reg : region, object_regionb m_regionsm1 = Somereg → object_regionb m_regionsm2 = Somereg
⇒
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm2 b + o = m_bytesm1 b + o
PAuxb o
⇒
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
⇒
True
H23 :
same_onS m2 m3
Hp :
Sp
⊢
match p with
⇒
∀reg : region, object_regionb m_regionsm1 = Somereg → object_regionb m_regionsm3 = Somereg
⇒
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm1 b + o
PAuxb o
⇒
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
⇒
True

specialize H23p Hp

S :
m1, m2, m3 :
Hr :
H12 :
match p with
⇒
∀reg : region, object_regionb m_regionsm1 = Somereg → object_regionb m_regionsm2 = Somereg
⇒
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm2 b + o = m_bytesm1 b + o
PAuxb o
⇒
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
⇒
True
H23 :
match p with
⇒
∀reg : region, object_regionb m_regionsm2 = Somereg → object_regionb m_regionsm3 = Somereg
⇒
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm2 b + o
PAuxb o
⇒
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
⇒
True
Hp :
Sp
⊢
match p with
⇒
∀reg : region, object_regionb m_regionsm1 = Somereg → object_regionb m_regionsm3 = Somereg
⇒
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm1 b + o
PAuxb o
⇒
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
⇒
True

destruct p ; cbn iota beta in H12 , H23 |- *

4 open

S :
m1, m2, m3 :
Hr :
b :
Z
H12 :
∀reg : region, object_regionb m_regionsm1 = Somereg → object_regionb m_regionsm2 = Somereg
H23 :
∀reg : region, object_regionb m_regionsm2 = Somereg → object_regionb m_regionsm3 = Somereg
Hp :
⊢
∀reg : region, object_regionb m_regionsm1 = Somereg → object_regionb m_regionsm3 = Somereg
focused goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm2 b + o = m_bytesm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm2 b + o
Hp :
SPByteb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm1 b + o
focused goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
focused goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

–intros reg E

4 open

S :
m1, m2, m3 :
Hr :
b :
Z
H12 :
∀reg : region, object_regionb m_regionsm1 = Somereg → object_regionb m_regionsm2 = Somereg
H23 :
∀reg : region, object_regionb m_regionsm2 = Somereg → object_regionb m_regionsm3 = Somereg
Hp :
reg :
E :
object_regionb m_regionsm1 = Somereg
⊢
object_regionb m_regionsm3 = Somereg
deferred goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm2 b + o = m_bytesm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm2 b + o
Hp :
SPByteb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

apply H23 , H12 , E

3 open

deferred goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm2 b + o = m_bytesm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm2 b + o
Hp :
SPByteb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

–intros reg Hl Ho He

3 open

S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm2 b + o = m_bytesm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm2 b + o
Hp :
SPByteb o
reg :
Hl :
live_atm3 b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
⊢
m_bytesm3 b + o = m_bytesm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

rewrite H23reg Hl Ho He

3 open

S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm2 b + o = m_bytesm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm2 b + o
Hp :
SPByteb o
reg :
Hl :
live_atm3 b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
⊢
m_bytesm2 b + o = m_bytesm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

apply H12reg ; | assumption | assumption

3 open

S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm2 b + o = m_bytesm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm2 b + o
Hp :
SPByteb o
reg :
Hl :
live_atm3 b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
⊢
live_atm2 b reg
deferred goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

unfold live_at in *

3 open

S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, object_regionb m_regionsm2 = Somereg ∧ r_lifereg = Live → 0 ≤ o → b + o < r_endreg → m_bytesm2 b + o = m_bytesm1 b + o
H23 :
∀reg : region, object_regionb m_regionsm3 = Somereg ∧ r_lifereg = Live → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm2 b + o
Hp :
SPByteb o
reg :
Hl :
object_regionb m_regionsm3 = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o < r_endreg
⊢
object_regionb m_regionsm2 = Somereg ∧ r_lifereg = Live
deferred goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

rewrite <- Hr

3 open

S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, object_regionb m_regionsm2 = Somereg ∧ r_lifereg = Live → 0 ≤ o → b + o < r_endreg → m_bytesm2 b + o = m_bytesm1 b + o
H23 :
∀reg : region, object_regionb m_regionsm3 = Somereg ∧ r_lifereg = Live → 0 ≤ o → b + o < r_endreg → m_bytesm3 b + o = m_bytesm2 b + o
Hp :
SPByteb o
reg :
Hl :
object_regionb m_regionsm3 = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o < r_endreg
⊢
object_regionb m_regionsm3 = Somereg ∧ r_lifereg = Live
deferred goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

exact Hl

2 open

deferred goal
S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
⊢
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

–intros reg Hl Ho He

2 open

S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
reg :
Hl :
live_atm3 b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
⊢
m_auxm3 b + o = m_auxm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

rewrite H23reg Hl Ho He

2 open

S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
reg :
Hl :
live_atm3 b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
⊢
m_auxm2 b + o = m_auxm1 b + o
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

apply H12reg ; | assumption | assumption

2 open

S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, live_atm2 b reg → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, live_atm3 b reg → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
reg :
Hl :
live_atm3 b reg
Ho :
0 ≤ o
He :
b + o < r_endreg
⊢
live_atm2 b reg
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

unfold live_at in *

2 open

S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, object_regionb m_regionsm2 = Somereg ∧ r_lifereg = Live → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, object_regionb m_regionsm3 = Somereg ∧ r_lifereg = Live → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
reg :
Hl :
object_regionb m_regionsm3 = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o < r_endreg
⊢
object_regionb m_regionsm2 = Somereg ∧ r_lifereg = Live
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

rewrite <- Hr

2 open

S :
m1, m2, m3 :
Hr :
b, o :
Z
H12 :
∀reg : region, object_regionb m_regionsm2 = Somereg ∧ r_lifereg = Live → 0 ≤ o → b + o < r_endreg → m_auxm2 b + o = m_auxm1 b + o
H23 :
∀reg : region, object_regionb m_regionsm3 = Somereg ∧ r_lifereg = Live → 0 ≤ o → b + o < r_endreg → m_auxm3 b + o = m_auxm2 b + o
Hp :
SPAuxb o
reg :
Hl :
object_regionb m_regionsm3 = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o < r_endreg
⊢
object_regionb m_regionsm3 = Somereg ∧ r_lifereg = Live
deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

exact Hl

deferred goal
S :
m1, m2, m3 :
Hr :
k :
Z
H12, H23 :
True
Hp :
⊢
True

–exact I

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros S m1 m2 m3 Hr H12 H23 p Hp
specialize H12p Hp
specialize H23p Hp
destruct p ; cbn iota beta in H12 , H23 |- *
–intros reg E
apply H23 , H12 , E
–intros reg Hl Ho He
rewrite H23reg Hl Ho He
apply H12reg ; | assumption | assumption
unfold live_at in *
rewrite <- Hr
exact Hl
–intros reg Hl Ho He
rewrite H23reg Hl Ho He
apply H12reg ; | assumption | assumption
unfold live_at in *
rewrite <- Hr
exact Hl
–exact I

The algebra of star

star commutes.

312Lemma star_comm
∀ P Q S m
P ** Q%hS m
Q ** P%hS m
Explore proof 5 tactics

Initial goal

⊢
∀P Q : hprop S : fp m : mem, P ** Q%hS m → Q ** P%hS m

intros P Q S m S1 & S2 & HS & Hd & H1 & H2

P, Q :
S :
m :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
⊢
Q ** P%hS m

exists S2, S1

P, Q :
S :
m :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
⊢
∀p : piece, Sp ↔ S2p ∨ S1p ∧ ∀p : piece, ¬S2p ∧ S1p ∧ QS2 m ∧ PS1 m

split ; intros p ; specialize HSp ; tauto |

P, Q :
S :
m :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
⊢
∀p : piece, ¬S2p ∧ S1p ∧ QS2 m ∧ PS1 m

split ; intros p ; specialize Hdp ; tauto |

P, Q :
S :
m :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
⊢
QS2 m ∧ PS1 m

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q S m S1 & S2 & HS & Hd & H1 & H2
exists S2, S1
split ; intros p ; specialize HSp ; tauto |
split ; intros p ; specialize Hdp ; tauto |
auto

star associates, to the left.

319Lemma star_assoc_l
∀ P Q R S m
P ** Q ** R%hS m
P ** Q ** R%hS m
Explore proof 9 tactics

Initial goal

⊢
∀P Q R : hprop S : fp m : mem, P ** Q ** R%hS m → P ** Q ** R%hS m

intros P Q R S m S1 & S23 & HS & Hd & H1 & S2 & S3 & HS23 & Hd23 & H2 & H3

P, Q, R :
S :
m :
S1, S23 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S23p
Hd :
∀p : piece, ¬S1p ∧ S23p
H1 :
PS1 m
S2, S3 :
piece → Prop
HS23 :
∀p : piece, S23p ↔ S2p ∨ S3p
Hd23 :
∀p : piece, ¬S2p ∧ S3p
H2 :
QS2 m
H3 :
RS3 m
⊢
P ** Q ** R%hS m

exists λp ⇒ S1p ∨ S2p, S3

P, Q, R :
S :
m :
S1, S23 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S23p
Hd :
∀p : piece, ¬S1p ∧ S23p
H1 :
PS1 m
S2, S3 :
piece → Prop
HS23 :
∀p : piece, S23p ↔ S2p ∨ S3p
Hd23 :
∀p : piece, ¬S2p ∧ S3p
H2 :
QS2 m
H3 :
RS3 m
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∨ S3p ∧ ∀p : piece, ¬S1p ∨ S2p ∧ S3p ∧ P ** Q%hλp : piece ⇒ S1p ∨ S2p m ∧ RS3 m

split ; intros p ; specialize HSp ; specialize HS23p ; tauto |

P, Q, R :
S :
m :
S1, S23 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S23p
Hd :
∀p : piece, ¬S1p ∧ S23p
H1 :
PS1 m
S2, S3 :
piece → Prop
HS23 :
∀p : piece, S23p ↔ S2p ∨ S3p
Hd23 :
∀p : piece, ¬S2p ∧ S3p
H2 :
QS2 m
H3 :
RS3 m
⊢
∀p : piece, ¬S1p ∨ S2p ∧ S3p ∧ P ** Q%hλp : piece ⇒ S1p ∨ S2p m ∧ RS3 m

split ; intros p ; specialize Hdp ; specialize Hd23p ; specialize HS23p ; tauto |

P, Q, R :
S :
m :
S1, S23 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S23p
Hd :
∀p : piece, ¬S1p ∧ S23p
H1 :
PS1 m
S2, S3 :
piece → Prop
HS23 :
∀p : piece, S23p ↔ S2p ∨ S3p
Hd23 :
∀p : piece, ¬S2p ∧ S3p
H2 :
QS2 m
H3 :
RS3 m
⊢
P ** Q%hλp : piece ⇒ S1p ∨ S2p m ∧ RS3 m

split ; | exact H3

P, Q, R :
S :
m :
S1, S23 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S23p
Hd :
∀p : piece, ¬S1p ∧ S23p
H1 :
PS1 m
S2, S3 :
piece → Prop
HS23 :
∀p : piece, S23p ↔ S2p ∨ S3p
Hd23 :
∀p : piece, ¬S2p ∧ S3p
H2 :
QS2 m
H3 :
RS3 m
⊢
P ** Q%hλp : piece ⇒ S1p ∨ S2p m

exists S1, S2

P, Q, R :
S :
m :
S1, S23 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S23p
Hd :
∀p : piece, ¬S1p ∧ S23p
H1 :
PS1 m
S2, S3 :
piece → Prop
HS23 :
∀p : piece, S23p ↔ S2p ∨ S3p
Hd23 :
∀p : piece, ¬S2p ∧ S3p
H2 :
QS2 m
H3 :
RS3 m
⊢
∀p : piece, S1p ∨ S2p ↔ S1p ∨ S2p ∧ ∀p : piece, ¬S1p ∧ S2p ∧ PS1 m ∧ QS2 m

split ; intros p ; tauto |

P, Q, R :
S :
m :
S1, S23 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S23p
Hd :
∀p : piece, ¬S1p ∧ S23p
H1 :
PS1 m
S2, S3 :
piece → Prop
HS23 :
∀p : piece, S23p ↔ S2p ∨ S3p
Hd23 :
∀p : piece, ¬S2p ∧ S3p
H2 :
QS2 m
H3 :
RS3 m
⊢
∀p : piece, ¬S1p ∧ S2p ∧ PS1 m ∧ QS2 m

split ; intros p ; specialize Hdp ; specialize HS23p ; tauto |

P, Q, R :
S :
m :
S1, S23 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S23p
Hd :
∀p : piece, ¬S1p ∧ S23p
H1 :
PS1 m
S2, S3 :
piece → Prop
HS23 :
∀p : piece, S23p ↔ S2p ∨ S3p
Hd23 :
∀p : piece, ¬S2p ∧ S3p
H2 :
QS2 m
H3 :
RS3 m
⊢
PS1 m ∧ QS2 m

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q R S m S1 & S23 & HS & Hd & H1 & S2 & S3 & HS23 & Hd23 & H2 & H3
exists λp ⇒ S1p ∨ S2p, S3
split ; intros p ; specialize HSp ; specialize HS23p ; tauto |
split ; intros p ; specialize Hdp ; specialize Hd23p ; specialize HS23p ; tauto |
split ; | exact H3
exists S1, S2
split ; intros p ; tauto |
split ; intros p ; specialize Hdp ; specialize HS23p ; tauto |
auto

star associates, to the right.

330Lemma star_assoc_r
∀ P Q R S m
P ** Q ** R%hS m
P ** Q ** R%hS m
Explore proof 9 tactics

Initial goal

⊢
∀P Q R : hprop S : fp m : mem, P ** Q ** R%hS m → P ** Q ** R%hS m

intros P Q R S m S12 & S3 & HS & Hd & S1 & S2 & HS12 & Hd12 & H1 & H2 & H3

P, Q, R :
S :
m :
S12, S3 :
piece → Prop
HS :
∀p : piece, Sp ↔ S12p ∨ S3p
Hd :
∀p : piece, ¬S12p ∧ S3p
S1, S2 :
piece → Prop
HS12 :
∀p : piece, S12p ↔ S1p ∨ S2p
Hd12 :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H3 :
RS3 m
⊢
P ** Q ** R%hS m

exists S1, λp ⇒ S2p ∨ S3p

P, Q, R :
S :
m :
S12, S3 :
piece → Prop
HS :
∀p : piece, Sp ↔ S12p ∨ S3p
Hd :
∀p : piece, ¬S12p ∧ S3p
S1, S2 :
piece → Prop
HS12 :
∀p : piece, S12p ↔ S1p ∨ S2p
Hd12 :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H3 :
RS3 m
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∨ S3p ∧ ∀p : piece, ¬S1p ∧ S2p ∨ S3p ∧ PS1 m ∧ Q ** R%hλp : piece ⇒ S2p ∨ S3p m

split ; intros p ; specialize HSp ; specialize HS12p ; tauto |

P, Q, R :
S :
m :
S12, S3 :
piece → Prop
HS :
∀p : piece, Sp ↔ S12p ∨ S3p
Hd :
∀p : piece, ¬S12p ∧ S3p
S1, S2 :
piece → Prop
HS12 :
∀p : piece, S12p ↔ S1p ∨ S2p
Hd12 :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H3 :
RS3 m
⊢
∀p : piece, ¬S1p ∧ S2p ∨ S3p ∧ PS1 m ∧ Q ** R%hλp : piece ⇒ S2p ∨ S3p m

split ; intros p ; specialize Hdp ; specialize Hd12p ; specialize HS12p ; tauto |

P, Q, R :
S :
m :
S12, S3 :
piece → Prop
HS :
∀p : piece, Sp ↔ S12p ∨ S3p
Hd :
∀p : piece, ¬S12p ∧ S3p
S1, S2 :
piece → Prop
HS12 :
∀p : piece, S12p ↔ S1p ∨ S2p
Hd12 :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H3 :
RS3 m
⊢
PS1 m ∧ Q ** R%hλp : piece ⇒ S2p ∨ S3p m

split ; exact H1 |

P, Q, R :
S :
m :
S12, S3 :
piece → Prop
HS :
∀p : piece, Sp ↔ S12p ∨ S3p
Hd :
∀p : piece, ¬S12p ∧ S3p
S1, S2 :
piece → Prop
HS12 :
∀p : piece, S12p ↔ S1p ∨ S2p
Hd12 :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H3 :
RS3 m
⊢
Q ** R%hλp : piece ⇒ S2p ∨ S3p m

exists S2, S3

P, Q, R :
S :
m :
S12, S3 :
piece → Prop
HS :
∀p : piece, Sp ↔ S12p ∨ S3p
Hd :
∀p : piece, ¬S12p ∧ S3p
S1, S2 :
piece → Prop
HS12 :
∀p : piece, S12p ↔ S1p ∨ S2p
Hd12 :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H3 :
RS3 m
⊢
∀p : piece, S2p ∨ S3p ↔ S2p ∨ S3p ∧ ∀p : piece, ¬S2p ∧ S3p ∧ QS2 m ∧ RS3 m

split ; intros p ; tauto |

P, Q, R :
S :
m :
S12, S3 :
piece → Prop
HS :
∀p : piece, Sp ↔ S12p ∨ S3p
Hd :
∀p : piece, ¬S12p ∧ S3p
S1, S2 :
piece → Prop
HS12 :
∀p : piece, S12p ↔ S1p ∨ S2p
Hd12 :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H3 :
RS3 m
⊢
∀p : piece, ¬S2p ∧ S3p ∧ QS2 m ∧ RS3 m

split ; intros p ; specialize Hdp ; specialize HS12p ; tauto |

P, Q, R :
S :
m :
S12, S3 :
piece → Prop
HS :
∀p : piece, Sp ↔ S12p ∨ S3p
Hd :
∀p : piece, ¬S12p ∧ S3p
S1, S2 :
piece → Prop
HS12 :
∀p : piece, S12p ↔ S1p ∨ S2p
Hd12 :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H3 :
RS3 m
⊢
QS2 m ∧ RS3 m

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q R S m S12 & S3 & HS & Hd & S1 & S2 & HS12 & Hd12 & H1 & H2 & H3
exists S1, λp ⇒ S2p ∨ S3p
split ; intros p ; specialize HSp ; specialize HS12p ; tauto |
split ; intros p ; specialize Hdp ; specialize Hd12p ; specialize HS12p ; tauto |
split ; exact H1 |
exists S2, S3
split ; intros p ; tauto |
split ; intros p ; specialize Hdp ; specialize HS12p ; tauto |
auto

The frame rule's monotonicity, on the left.

341Lemma star_mono_l
∀ P P′ Q : hprop S m
∀S m, PS m → P′S m
P ** Q%hS m
P′ ** Q%hS m
Explore proof 3 tactics

Initial goal

⊢
∀P P′ Q : hprop S : fp m : mem, ∀S0 : fp m0 : mem, PS0 m0 → P′S0 m0 → P ** Q%hS m → P′ ** Q%hS m

intros P P′ Q S m H S1 & S2 & HS & Hd & H1 & H2

P, P′, Q :
S :
m :
H :
∀S : fp m : mem, PS m → P′S m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
⊢
P′ ** Q%hS m

exists S1, S2

P, P′, Q :
S :
m :
H :
∀S : fp m : mem, PS m → P′S m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∧ ∀p : piece, ¬S1p ∧ S2p ∧ P′S1 m ∧ QS2 m

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P P′ Q S m H S1 & S2 & HS & Hd & H1 & H2
exists S1, S2
auto

The frame rule's monotonicity, on the right.

346Lemma star_mono_r
∀ P Q Q′ : hprop S m
∀S m, QS m → Q′S m
P ** Q%hS m
P ** Q′%hS m
Explore proof 3 tactics

Initial goal

⊢
∀P Q Q′ : hprop S : fp m : mem, ∀S0 : fp m0 : mem, QS0 m0 → Q′S0 m0 → P ** Q%hS m → P ** Q′%hS m

intros P Q Q′ S m H S1 & S2 & HS & Hd & H1 & H2

P, Q, Q′ :
S :
m :
H :
∀S : fp m : mem, QS m → Q′S m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
⊢
P ** Q′%hS m

exists S1, S2

P, Q, Q′ :
S :
m :
H :
∀S : fp m : mem, QS m → Q′S m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∧ ∀p : piece, ¬S1p ∧ S2p ∧ PS1 m ∧ Q′S2 m

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q Q′ S m H S1 & S2 & HS & Hd & H1 & H2
exists S1, S2
auto

The first two parts of a star trade places.

351Lemma star_swap
∀ P Q R S m
P ** Q ** R%hS m
Q ** P ** R%hS m
Explore proof 6 tactics

Initial goal

⊢
∀P Q R : hprop S : fp m : mem, P ** Q ** R%hS m → Q ** P ** R%hS m

intros P Q R S m H

P, Q, R :
S :
m :
H :
P ** Q ** R%hS m
⊢
Q ** P ** R%hS m

apply star_assoc_r

P, Q, R :
S :
m :
H :
P ** Q ** R%hS m
⊢
Q ** P ** R%hS m

apply star_assoc_l in H

P, Q, R :
S :
m :
H :
P ** Q ** R%hS m
⊢
Q ** P ** R%hS m

revert H

P, Q, R :
S :
m :
⊢
P ** Q ** R%hS m → Q ** P ** R%hS m

apply star_mono_l

P, Q, R :
S :
m :
⊢
∀S0 : fp m0 : mem, P ** Q%hS0 m0 → Q ** P%hS0 m0

apply star_comm

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q R S m H
apply star_assoc_l in H
revert H
apply star_comm

emp is a unit, on the right.

358Lemma star_emp_r
∀ P S m
PS m
P ** emp%hS m
Explore proof 5 tactics

Initial goal

⊢
∀P : fp → mem → Prop S : fp m : mem, PS m → P ** emp%hS m

intros P S m H

P :
fp → mem → Prop
S :
m :
H :
PS m
⊢
P ** emp%hS m

exists S, λ_ ⇒ False

P :
fp → mem → Prop
S :
m :
H :
PS m
⊢
∀p : piece, Sp ↔ Sp ∨ False ∧ ∀p : piece, ¬Sp ∧ False ∧ PS m ∧ empλ_ : piece ⇒ False m

split ; intros p ; tauto |

P :
fp → mem → Prop
S :
m :
H :
PS m
⊢
∀p : piece, ¬Sp ∧ False ∧ PS m ∧ empλ_ : piece ⇒ False m

split ; intros p ; tauto |

P :
fp → mem → Prop
S :
m :
H :
PS m
⊢
PS m ∧ empλ_ : piece ⇒ False m

split ; exact H | intros p ; tauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P S m H
exists S, λ_ ⇒ False
split ; intros p ; tauto |
split ; intros p ; tauto |
split ; exact H | intros p ; tauto

emp is a unit, on the left.

365Lemma star_emp_l
∀ P S m
PS m
emp ** P%hS m
Explore proof 2 tactics

Initial goal

⊢
∀P : fp → mem → Prop S : fp m : mem, PS m → emp ** P%hS m

intros P S m H

P :
fp → mem → Prop
S :
m :
H :
PS m
⊢
emp ** P%hS m

apply star_comm , star_emp_r , H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P S m H
apply star_comm , star_emp_r , H

And back: without emp, P holds of a footprint with the same pieces. Footprints are predicates, so this is as close as the logic gets to equality of footprints without extensionality.

371Lemma star_emp_elim
∀ P S m
emp ** P%hS m
∃S′, ∀p, Sp ↔ S′p ∧ PS′ m
Explore proof 7 tactics

Initial goal

⊢
∀P : hprop S : fp m : mem, emp ** P%hS m → ∃S′ : piece → Prop, ∀p : piece, Sp ↔ S′p ∧ PS′ m

intros P S m S1 & S2 & HS & _ & H1 & H2

S :
m :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
H1 :
empS1 m
H2 :
PS2 m
⊢
∃S′ : piece → Prop, ∀p : piece, Sp ↔ S′p ∧ PS′ m

exists S2

S :
m :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
H1 :
empS1 m
H2 :
PS2 m
⊢
∀p : piece, Sp ↔ S2p ∧ PS2 m

split ; | exact H2

S :
m :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
H1 :
empS1 m
H2 :
PS2 m
⊢
∀p : piece, Sp ↔ S2p

intros p

S :
m :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
H1 :
empS1 m
H2 :
PS2 m
⊢
Sp ↔ S2p

specialize HSp

S :
m :
S1, S2 :
piece → Prop
HS :
Sp ↔ S1p ∨ S2p
H1 :
empS1 m
H2 :
PS2 m
⊢
Sp ↔ S2p

specialize H1p

S :
m :
S1, S2 :
piece → Prop
HS :
Sp ↔ S1p ∨ S2p
H1 :
S1p ↔ λ_ : piece ⇒ Falsep
H2 :
PS2 m
⊢
Sp ↔ S2p

tauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P S m S1 & S2 & HS & _ & H1 & H2
exists S2
split ; | exact H2
intros p
specialize HSp
specialize H1p
tauto

A pure fact on no footprint may be added.

378Lemma star_pure_intro
∀ phi : Prop Q S m
phi
QS m
purephi ** Q%hS m
Explore proof 8 tactics

Initial goal

⊢
∀phi : Prop Q : fp → mem → Prop S : fp m : mem, phi → QS m → purephi ** Q%hS m

intros phi Q S m Hp H

phi :
Prop
Q :
fp → mem → Prop
S :
m :
Hp :
phi
H :
QS m
⊢
purephi ** Q%hS m

apply star_comm

phi :
Prop
Q :
fp → mem → Prop
S :
m :
Hp :
phi
H :
QS m
⊢
Q ** purephi%hS m

destruct star_emp_rQ S m H as S1 & S2 & HS & Hd & H1 & H2

phi :
Prop
Q :
fp → mem → Prop
S :
m :
Hp :
phi
H :
QS m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
empS2 m
⊢
Q ** purephi%hS m

exists S1, S2

phi :
Prop
Q :
fp → mem → Prop
S :
m :
Hp :
phi
H :
QS m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
empS2 m
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∧ ∀p : piece, ¬S1p ∧ S2p ∧ QS1 m ∧ purephi S2 m

split ; exact HS |

phi :
Prop
Q :
fp → mem → Prop
S :
m :
Hp :
phi
H :
QS m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
empS2 m
⊢
∀p : piece, ¬S1p ∧ S2p ∧ QS1 m ∧ purephi S2 m

split ; exact Hd |

phi :
Prop
Q :
fp → mem → Prop
S :
m :
Hp :
phi
H :
QS m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
empS2 m
⊢
QS1 m ∧ purephi S2 m

split ; exact H1 |

phi :
Prop
Q :
fp → mem → Prop
S :
m :
Hp :
phi
H :
QS m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
empS2 m
⊢
purephi S2 m

split ; exact H2 | exact Hp

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros phi Q S m Hp H
apply star_comm
destruct star_emp_rQ S m H as S1 & S2 & HS & Hd & H1 & H2
exists S1, S2
split ; exact HS |
split ; exact Hd |
split ; exact H1 |
split ; exact H2 | exact Hp

The left part of a star holds of part of the footprint.

382Lemma star_elim_l
∀ P Q S m
P ** Q%hS m
∃S1, PS1 m
Explore proof 3 tactics

Initial goal

⊢
∀P Q : hprop S : fp m : mem, P ** Q%hS m → ∃S1 : fp, PS1 m

intros P Q S m S1 & S2 & _ & _ & H1 & _

P, Q :
S :
m :
S1, S2 :
piece → Prop
H1 :
PS1 m
⊢
∃S0 : fp, PS0 m

exists S1

P, Q :
S :
m :
S1, S2 :
piece → Prop
H1 :
PS1 m
⊢
PS1 m

exact H1

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q S m S1 & S2 & _ & _ & H1 & _
exists S1
exact H1

The right part of a star holds of part of the footprint.

386Lemma star_elim_r
∀ P Q S m
P ** Q%hS m
∃S2, QS2 m
Explore proof 3 tactics

Initial goal

⊢
∀P Q : hprop S : fp m : mem, P ** Q%hS m → ∃S2 : fp, QS2 m

intros P Q S m S1 & S2 & _ & _ & _ & H2

P, Q :
S :
m :
S1, S2 :
piece → Prop
H2 :
QS2 m
⊢
∃S0 : fp, QS0 m

exists S2

P, Q :
S :
m :
S1, S2 :
piece → Prop
H2 :
QS2 m
⊢
QS2 m

exact H2

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q S m S1 & S2 & _ & _ & _ & H2
exists S2
exact H2

An existential on the left of a star comes out.

390Lemma star_hex_l
∀ A : Type P : A → hprop Q S m
hexP ** Q%hS m ↔ ∃x, Px ** Q%hS m
Explore proof 10 tactics

Initial goal

⊢
∀A : Type P : A → hprop Q : hprop S : fp m : mem, hexP ** Q%hS m ↔ ∃x : A, Px ** Q%hS m

intros A P Q S m

A :
Type
P :
A → hprop
S :
m :
⊢
hexP ** Q%hS m ↔ ∃x : A, Px ** Q%hS m

split

2 open

A :
Type
P :
A → hprop
S :
m :
⊢
hexP ** Q%hS m → ∃x : A, Px ** Q%hS m
focused goal
A :
Type
P :
A → hprop
S :
m :
⊢
∃x : A, Px ** Q%hS m → hexP ** Q%hS m

–intros S1 & S2 & HS & Hd & x & H1 & H2

2 open

A :
Type
P :
A → hprop
S :
m :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
x :
A
H1 :
Px S1 m
H2 :
QS2 m
⊢
∃x0 : A, Px0 ** Q%hS m
deferred goal
A :
Type
P :
A → hprop
S :
m :
⊢
∃x : A, Px ** Q%hS m → hexP ** Q%hS m

exists x, S1, S2

2 open

A :
Type
P :
A → hprop
S :
m :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
x :
A
H1 :
Px S1 m
H2 :
QS2 m
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∧ ∀p : piece, ¬S1p ∧ S2p ∧ Px S1 m ∧ QS2 m
deferred goal
A :
Type
P :
A → hprop
S :
m :
⊢
∃x : A, Px ** Q%hS m → hexP ** Q%hS m

auto

deferred goal
A :
Type
P :
A → hprop
S :
m :
⊢
∃x : A, Px ** Q%hS m → hexP ** Q%hS m

–intros x & S1 & S2 & HS & Hd & H1 & H2

A :
Type
P :
A → hprop
S :
m :
x :
A
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
Px S1 m
H2 :
QS2 m
⊢
hexP ** Q%hS m

exists S1, S2

A :
Type
P :
A → hprop
S :
m :
x :
A
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
Px S1 m
H2 :
QS2 m
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∧ ∀p : piece, ¬S1p ∧ S2p ∧ hexP S1 m ∧ QS2 m

split ; exact HS |

A :
Type
P :
A → hprop
S :
m :
x :
A
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
Px S1 m
H2 :
QS2 m
⊢
∀p : piece, ¬S1p ∧ S2p ∧ hexP S1 m ∧ QS2 m

split ; exact Hd |

A :
Type
P :
A → hprop
S :
m :
x :
A
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
Px S1 m
H2 :
QS2 m
⊢
hexP S1 m ∧ QS2 m

split ; exists x ; exact H1 | exact H2

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros A P Q S m
split
–intros S1 & S2 & HS & Hd & x & H1 & H2
exists x, S1, S2
auto
–intros x & S1 & S2 & HS & Hd & H1 & H2
exists S1, S2
split ; exact HS |
split ; exact Hd |
split ; exists x ; exact H1 | exact H2

htrue holds of no footprint, so it may be added.

399Lemma htrue_intro
∀ Q S m
QS m
htrue ** Q%hS m
Explore proof 9 tactics

Initial goal

⊢
∀Q : fp → mem → Prop S : fp m : mem, QS m → htrue ** Q%hS m

intros Q S m H

Q :
fp → mem → Prop
S :
m :
H :
QS m
⊢
htrue ** Q%hS m

apply star_comm

Q :
fp → mem → Prop
S :
m :
H :
QS m
⊢
Q ** htrue%hS m

destruct star_emp_rQ S m H as S1 & S2 & HS & Hd & H1 & H2

Q :
fp → mem → Prop
S :
m :
H :
QS m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
empS2 m
⊢
Q ** htrue%hS m

exists S1, S2

Q :
fp → mem → Prop
S :
m :
H :
QS m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
empS2 m
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∧ ∀p : piece, ¬S1p ∧ S2p ∧ QS1 m ∧ htrueS2 m

split ; exact HS |

Q :
fp → mem → Prop
S :
m :
H :
QS m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
empS2 m
⊢
∀p : piece, ¬S1p ∧ S2p ∧ QS1 m ∧ htrueS2 m

split ; exact Hd |

Q :
fp → mem → Prop
S :
m :
H :
QS m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
empS2 m
⊢
QS1 m ∧ htrueS2 m

split ; exact H1 |

Q :
fp → mem → Prop
S :
m :
H :
QS m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
empS2 m
⊢
htrueS2 m

intros p Hp

Q :
fp → mem → Prop
S :
m :
H :
QS m
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
empS2 m
Hp :
S2p

destruct proj1H2p Hp

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Q S m H
apply star_comm
destruct star_emp_rQ S m H as S1 & S2 & HS & Hd & H1 & H2
exists S1, S2
split ; exact HS |
split ; exact Hd |
split ; exact H1 |
intros p Hp
destruct proj1H2p Hp

What owns only pieces of objects can be dropped into htrue.

406Lemma star_drop
∀ P Q S m
P ** Q%hS m
htrue ** Q%hS m
Explore proof 3 tactics

Initial goal

⊢
∀P Q : hprop S : fp m : mem, owns_registeredP → P ** Q%hS m → htrue ** Q%hS m

intros P Q S m HP

P, Q :
S :
m :
⊢
P ** Q%hS m → htrue ** Q%hS m

apply star_mono_l

P, Q :
S :
m :
⊢
∀S0 : fp m0 : mem, PS0 m0 → htrueS0 m0

exact HP

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q S m HP
exact HP

htrue absorbs what owns only pieces of objects.

410Lemma htrue_absorb
∀ P R S m
P ** htrue ** R%hS m
htrue ** R%hS m
Explore proof 6 tactics

Initial goal

⊢
∀P R : hprop S : fp m : mem, owns_registeredP → P ** htrue ** R%hS m → htrue ** R%hS m

intros P R S m HP H

P, R :
S :
m :
H :
P ** htrue ** R%hS m
⊢
htrue ** R%hS m

apply star_assoc_l in H

P, R :
S :
m :
H :
P ** htrue ** R%hS m
⊢
htrue ** R%hS m

revert H

P, R :
S :
m :
⊢
P ** htrue ** R%hS m → htrue ** R%hS m

apply star_mono_l

P, R :
S :
m :
⊢
∀S0 : fp m0 : mem, P ** htrue%hS0 m0 → htrueS0 m0

intros S0 m0 S1 & S2 & HS & _ & H1 & H2 p Hp

P, R :
S :
m :
S0 :
m0 :
S1, S2 :
piece → Prop
HS :
∀p : piece, S0p ↔ S1p ∨ S2p
H1 :
PS1 m0
H2 :
htrueS2 m0
Hp :
S0p

apply HS in Hp as Hp | Hp ; exact HP_ _ H1 p Hp | exact H2p Hp

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P R S m HP H
apply star_assoc_l in H
revert H
intros S0 m0 S1 & S2 & HS & _ & H1 & H2 p Hp
apply HS in Hp as Hp | Hp ; exact HP_ _ H1 p Hp | exact H2p Hp

htrue absorbs a part that owns only pieces of objects from in front of another.

418Lemma star_absorb
∀ P Q R S m
P ** Q ** htrue ** R%hS m
Q ** htrue ** R%hS m
Explore proof 6 tactics

Initial goal

⊢
∀P Q R : hprop S : fp m : mem, owns_registeredP → P ** Q ** htrue ** R%hS m → Q ** htrue ** R%hS m

intros P Q R S m HP H

P, Q, R :
S :
m :
H :
P ** Q ** htrue ** R%hS m
⊢
Q ** htrue ** R%hS m

apply star_swap in H

P, Q, R :
S :
m :
H :
Q ** P ** htrue ** R%hS m
⊢
Q ** htrue ** R%hS m

revert H

P, Q, R :
S :
m :
⊢
Q ** P ** htrue ** R%hS m → Q ** htrue ** R%hS m

apply star_mono_r

P, Q, R :
S :
m :
⊢
∀S0 : fp m0 : mem, P ** htrue ** R%hS0 m0 → htrue ** R%hS0 m0

intros S0 m0

P, Q, R :
S :
m :
S0 :
m0 :
⊢
P ** htrue ** R%hS0 m0 → htrue ** R%hS0 m0

apply htrue_absorb , HP

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q R S m HP H
apply star_swap in H
revert H
intros S0 m0
apply htrue_absorb , HP

Stability of each assertion

A star is stable if its parts are.

428Lemma star_stable
∀ P Q
stableP ** Q%h
Explore proof 9 tactics

Initial goal

⊢
∀P Q : hprop, stableP → stableQ → stableP ** Q%h

intros P Q HP HQ S m m′ S1 & S2 & HS & Hd & H1 & H2 Hs Hg

P, Q :
HP :
HQ :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
P ** Q%hS m′

exists S1, S2

P, Q :
HP :
HQ :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∧ ∀p : piece, ¬S1p ∧ S2p ∧ PS1 m′ ∧ QS2 m′

split ; exact HS |

P, Q :
HP :
HQ :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
∀p : piece, ¬S1p ∧ S2p ∧ PS1 m′ ∧ QS2 m′

split ; exact Hd |

P, Q :
HP :
HQ :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
PS1 m′ ∧ QS2 m′

split

2 open

P, Q :
HP :
HQ :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
PS1 m′
focused goal
P, Q :
HP :
HQ :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
QS2 m′

–apply HPS1 m m′ H1 ; | exact Hg

2 open

P, Q :
HP :
HQ :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
same_onS1 m m′
deferred goal
P, Q :
HP :
HQ :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
QS2 m′

apply same_on_subS ; intros p Hp ; apply HS ; left ; exact Hp | exact Hs

deferred goal
P, Q :
HP :
HQ :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
QS2 m′

–apply HQS2 m m′ H2 ; | exact Hg

P, Q :
HP :
HQ :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
same_onS2 m m′

apply same_on_subS ; intros p Hp ; apply HS ; right ; exact Hp | exact Hs

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q HP HQ S m m′ S1 & S2 & HS & Hd & H1 & H2 Hs Hg
exists S1, S2
split ; exact HS |
split ; exact Hd |
split
–apply HPS1 m m′ H1 ; | exact Hg
apply same_on_subS ; intros p Hp ; apply HS ; left ; exact Hp | exact Hs
–apply HQS2 m m′ H2 ; | exact Hg
apply same_on_subS ; intros p Hp ; apply HS ; right ; exact Hp | exact Hs

A star survives a safepoint if its parts do.

437Lemma star_sp_stable
∀ P Q
sp_stableP ** Q%h
Explore proof 5 tactics

Initial goal

⊢
∀P Q : hprop, sp_stableP → sp_stableQ → sp_stableP ** Q%h

intros P Q HP HQ S m m′ S1 & S2 & HS & Hd & H1 & H2 Hr Hb Ha

P, Q :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hr :
Hb :
Ha :
aux_movesm m′
⊢
P ** Q%hS m′

exists S1, S2

P, Q :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hr :
Hb :
Ha :
aux_movesm m′
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∧ ∀p : piece, ¬S1p ∧ S2p ∧ PS1 m′ ∧ QS2 m′

split ; exact HS |

P, Q :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hr :
Hb :
Ha :
aux_movesm m′
⊢
∀p : piece, ¬S1p ∧ S2p ∧ PS1 m′ ∧ QS2 m′

split ; exact Hd |

P, Q :
S :
m, m′ :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hr :
Hb :
Ha :
aux_movesm m′
⊢
PS1 m′ ∧ QS2 m′

split ; exact HP_ _ _ H1 Hr Hb Ha | exact HQ_ _ _ H2 Hr Hb Ha

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q HP HQ S m m′ S1 & S2 & HS & Hd & H1 & H2 Hr Hb Ha
exists S1, S2
split ; exact HS |
split ; exact Hd |
split ; exact HP_ _ _ H1 Hr Hb Ha | exact HQ_ _ _ H2 Hr Hb Ha

A star owns pieces of objects if its parts do.

444Lemma star_registered
Explore proof 2 tactics

Initial goal

⊢
∀P Q : hprop, owns_registeredP → owns_registeredQ → owns_registeredP ** Q%h

intros P Q HP HQ S m S1 & S2 & HS & Hd & H1 & H2 p Hp

P, Q :
S :
m :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
Hp :
Sp

apply HS in Hp as Hp | Hp ; exact HP_ _ H1 p Hp | exact HQ_ _ H2 p Hp

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P Q HP HQ S m S1 & S2 & HS & Hd & H1 & H2 p Hp
apply HS in Hp as Hp | Hp ; exact HP_ _ H1 p Hp | exact HQ_ _ H2 p Hp

hex is stable if each instance is.

451Lemma hex_stable
∀ A : Type P : A → hprop
∀x, stablePx
Explore proof 3 tactics

Initial goal

⊢
∀A : Type P : A → hprop, ∀x : A, stablePx → stablehexP

intros A P HP S m m′ x & H Hs Hg

A :
Type
P :
A → hprop
HP :
∀x : A, stablePx
S :
m, m′ :
x :
A
H :
Px S m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
hexP S m′

exists x

A :
Type
P :
A → hprop
HP :
∀x : A, stablePx
S :
m, m′ :
x :
A
H :
Px S m
Hs :
same_onS m m′
Hg :
growsm m′
⊢
Px S m′

exact HPx _ _ _ H Hs Hg

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros A P HP S m m′ x & H Hs Hg
exists x
exact HPx _ _ _ H Hs Hg

hex survives a safepoint if each instance does.

455Lemma hex_sp_stable
∀ A : Type P : A → hprop
∀x, sp_stablePx
Explore proof 3 tactics

Initial goal

⊢
∀A : Type P : A → hprop, ∀x : A, sp_stablePx → sp_stablehexP

intros A P HP S m m′ x & H Hr Hb Ha

A :
Type
P :
A → hprop
HP :
∀x : A, sp_stablePx
S :
m, m′ :
x :
A
H :
Px S m
Hr :
Hb :
Ha :
aux_movesm m′
⊢
hexP S m′

exists x

A :
Type
P :
A → hprop
HP :
∀x : A, sp_stablePx
S :
m, m′ :
x :
A
H :
Px S m
Hr :
Hb :
Ha :
aux_movesm m′
⊢
Px S m′

exact HPx _ _ _ H Hr Hb Ha

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros A P HP S m m′ x & H Hr Hb Ha
exists x
exact HPx _ _ _ H Hr Hb Ha

hex owns pieces of objects if each instance does.

459Lemma hex_registered
∀ A : Type P : A → hprop
Explore proof 2 tactics

Initial goal

⊢
∀A : Type P : A → hprop, ∀x : A, owns_registeredPx → owns_registeredhexP

intros A P HP S m x & H

A :
Type
P :
A → hprop
HP :
∀x : A, owns_registeredPx
S :
m :
x :
A
H :
Px S m

exact HPx _ _ H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros A P HP S m x & H
exact HPx _ _ H

emp is stable.

463Lemma emp_stable
Explore proof 2 tactics

Initial goal

intros S m m′ H _ _

S :
m, m′ :
H :
empS m
⊢
empS m′

exact H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros S m m′ H _ _
exact H

emp survives a safepoint.

467Lemma emp_sp_stable
Explore proof 2 tactics

Initial goal

intros S m m′ H _ _ _

S :
m, m′ :
H :
empS m
⊢
empS m′

exact H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros S m m′ H _ _ _
exact H

emp owns nothing.

471Lemma emp_registered
Explore proof 2 tactics

Initial goal

intros S m H p Hp

S :
m :
H :
empS m
Hp :
Sp

destruct proj1Hp Hp

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros S m H p Hp
destruct proj1Hp Hp

pure is stable.

475Lemma pure_stable
∀ phi
Explore proof 2 tactics

Initial goal

⊢
∀phi : Prop, stablepurephi

intros phi S m m′ H _ _

phi :
Prop
S :
m, m′ :
H :
purephi S m
⊢
purephi S m′

exact H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros phi S m m′ H _ _
exact H

pure survives a safepoint.

479Lemma pure_sp_stable
∀ phi
Explore proof 2 tactics

Initial goal

⊢
∀phi : Prop, sp_stablepurephi

intros phi S m m′ H _ _ _

phi :
Prop
S :
m, m′ :
H :
purephi S m
⊢
purephi S m′

exact H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros phi S m m′ H _ _ _
exact H

pure owns nothing.

483Lemma pure_registered
Explore proof 2 tactics

Initial goal

⊢
∀phi : Prop, owns_registeredpurephi

intros phi S m H _ p Hp

phi :
Prop
S :
m :
H :
onlyS λ_ : piece ⇒ False
Hp :
Sp

destruct proj1Hp Hp

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros phi S m H _ p Hp
destruct proj1Hp Hp

htrue is stable.

487Lemma htrue_stable
Explore proof 2 tactics

Initial goal

intros S m m′ H _ Hg

S :
m, m′ :
H :
Hg :
growsm m′
⊢
htrueS m′

exact grows_registered_ _ _ Hg H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros S m m′ H _ Hg
exact grows_registered_ _ _ Hg H

htrue survives a safepoint.

491Lemma htrue_sp_stable
Explore proof 2 tactics

Initial goal

intros S m m′ H Hr _ _

S :
m, m′ :
H :
Hr :
⊢
htrueS m′

exact registered_same_ _ _ Hr H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros S m m′ H Hr _ _
exact registered_same_ _ _ Hr H

htrue owns pieces of objects.

495Lemma htrue_registered
Explore proof 2 tactics

Initial goal

intros S m H

S :
m :
H :

exact H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros S m H
exact H

meta is stable: an object that ends keeps its kind, and has no bounds to speak of.

500Lemma meta_stable
∀ b n k
Explore proof 8 tactics

Initial goal

⊢
∀b n : Z k : kind, stablemetab n k

intros b n k S m m′ HS & reg & E & Hk & Hl _ Hg

b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hg :
growsm m′
⊢
metab n k S m′

split ; exact HS |

b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hg :
growsm m′
⊢
∃reg0 : region, object_regionb m_regionsm′ = Somereg0 ∧ r_kindreg0 = k ∧ r_lifereg0 = Live → r_endreg0 = b + n

destruct Hgb reg E as E′ | L & E′

2 open

b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hg :
growsm m′
E′ :
object_regionb m_regionsm′ = Somereg
⊢
∃reg0 : region, object_regionb m_regionsm′ = Somereg0 ∧ r_kindreg0 = k ∧ r_lifereg0 = Live → r_endreg0 = b + n
focused goal
b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hg :
growsm m′
L :
r_lifereg = Live
E′ :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg; r_life ≔ Freed
⊢
∃reg0 : region, object_regionb m_regionsm′ = Somereg0 ∧ r_kindreg0 = k ∧ r_lifereg0 = Live → r_endreg0 = b + n

–exists reg

2 open

b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hg :
growsm m′
E′ :
object_regionb m_regionsm′ = Somereg
⊢
object_regionb m_regionsm′ = Somereg ∧ r_kindreg = k ∧ r_lifereg = Live → r_endreg = b + n
deferred goal
b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hg :
growsm m′
L :
r_lifereg = Live
E′ :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg; r_life ≔ Freed
⊢
∃reg0 : region, object_regionb m_regionsm′ = Somereg0 ∧ r_kindreg0 = k ∧ r_lifereg0 = Live → r_endreg0 = b + n

auto

deferred goal
b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hg :
growsm m′
L :
r_lifereg = Live
E′ :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg; r_life ≔ Freed
⊢
∃reg0 : region, object_regionb m_regionsm′ = Somereg0 ∧ r_kindreg0 = k ∧ r_lifereg0 = Live → r_endreg0 = b + n

–eexists

2 open

b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hg :
growsm m′
L :
r_lifereg = Live
E′ :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg; r_life ≔ Freed
⊢
object_regionb m_regionsm′ = Some?reg ∧ r_kind?reg = k ∧ r_life?reg = Live → r_end?reg = b + n
shelved goal
b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hg :
growsm m′
L :
r_lifereg = Live
E′ :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg; r_life ≔ Freed

split ; exact E′ |

b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hg :
growsm m′
L :
r_lifereg = Live
E′ :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg; r_life ≔ Freed
⊢
r_kindr_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg; r_life ≔ Freed = k ∧ r_lifer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg; r_life ≔ Freed = Live → r_endr_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg; r_life ≔ Freed = b + n

split ; exact Hk | discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b n k S m m′ HS & reg & E & Hk & Hl _ Hg
split ; exact HS |
destruct Hgb reg E as E′ | L & E′
–exists reg
auto
–eexists
split ; exact E′ |
split ; exact Hk | discriminate

meta survives a safepoint.

509Lemma meta_sp_stable
∀ b n k
Explore proof 5 tactics

Initial goal

⊢
∀b n : Z k : kind, sp_stablemetab n k

intros b n k S m m′ HS & reg & E & Hk & Hl Hr _ _

b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hr :
⊢
metab n k S m′

split ; exact HS |

b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hr :
⊢
∃reg0 : region, object_regionb m_regionsm′ = Somereg0 ∧ r_kindreg0 = k ∧ r_lifereg0 = Live → r_endreg0 = b + n

exists reg

b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hr :
⊢
object_regionb m_regionsm′ = Somereg ∧ r_kindreg = k ∧ r_lifereg = Live → r_endreg = b + n

rewrite Hr

b, n :
Z
k :
S :
m, m′ :
HS :
onlyS λ_ : piece ⇒ False
reg :
E :
Hk :
r_kindreg = k
Hl :
r_lifereg = Live → r_endreg = b + n
Hr :
⊢
object_regionb m_regionsm = Somereg ∧ r_kindreg = k ∧ r_lifereg = Live → r_endreg = b + n

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b n k S m m′ HS & reg & E & Hk & Hl Hr _ _
split ; exact HS |
exists reg
rewrite Hr
auto

meta owns nothing.

513Lemma meta_registered
∀ b n k
Explore proof 2 tactics

Initial goal

⊢
∀b n : Z k : kind, owns_registeredmetab n k

intros b n k S m H _ p Hp

b, n :
Z
k :
S :
m :
H :
onlyS λ_ : piece ⇒ False
Hp :
Sp

destruct proj1Hp Hp

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b n k S m H _ p Hp
destruct proj1Hp Hp

live is stable: its owner keeps the object's region.

517Lemma live_stable
Explore proof 5 tactics

Initial goal

⊢
∀b : Z, stableliveb

intros b S m m′ HS & reg & E & L Hs _

b :
Z
S :
m, m′ :
HS :
reg :
E :
L :
r_lifereg = Live
Hs :
same_onS m m′
⊢
liveb S m′

split ; exact HS |

b :
Z
S :
m, m′ :
HS :
reg :
E :
L :
r_lifereg = Live
Hs :
same_onS m m′
⊢
∃reg0 : region, live_atm′ b reg0

exists reg

b :
Z
S :
m, m′ :
HS :
reg :
E :
L :
r_lifereg = Live
Hs :
same_onS m m′
⊢
live_atm′ b reg

split ; | exact L

b :
Z
S :
m, m′ :
HS :
reg :
E :
L :
r_lifereg = Live
Hs :
same_onS m m′
⊢
object_regionb m_regionsm′ = Somereg

exact HsPLiveb proj2HS_ eq_refl reg E

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b S m m′ HS & reg & E & L Hs _
split ; exact HS |
exists reg
split ; | exact L
exact HsPLiveb proj2HS_ eq_refl reg E

live survives a safepoint.

524Lemma live_sp_stable
Explore proof 6 tactics

Initial goal

⊢
∀b : Z, sp_stableliveb

intros b S m m′ HS & reg & E & L Hr _ _

b :
Z
S :
m, m′ :
HS :
reg :
E :
L :
r_lifereg = Live
Hr :
⊢
liveb S m′

split ; exact HS |

b :
Z
S :
m, m′ :
HS :
reg :
E :
L :
r_lifereg = Live
Hr :
⊢
∃reg0 : region, live_atm′ b reg0

exists reg

b :
Z
S :
m, m′ :
HS :
reg :
E :
L :
r_lifereg = Live
Hr :
⊢
live_atm′ b reg

unfold live_at

b :
Z
S :
m, m′ :
HS :
reg :
E :
L :
r_lifereg = Live
Hr :
⊢
object_regionb m_regionsm′ = Somereg ∧ r_lifereg = Live

rewrite Hr

b :
Z
S :
m, m′ :
HS :
reg :
E :
L :
r_lifereg = Live
Hr :
⊢
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b S m m′ HS & reg & E & L Hr _ _
split ; exact HS |
exists reg
unfold live_at
rewrite Hr
auto

live owns a piece of its object.

528Lemma live_registered
Explore proof 5 tactics

Initial goal

⊢

intros b S m HS & reg & E & L p Hp

b :
Z
S :
m :
HS :
reg :
E :
L :
r_lifereg = Live
Hp :
Sp

apply HS in Hp

b :
Z
S :
m :
HS :
reg :
E :
L :
r_lifereg = Live
Hp :
PLiveb = p

subst p

b :
Z
S :
m :
HS :
reg :
E :
L :
r_lifereg = Live

cbn

b :
Z
S :
m :
HS :
reg :
E :
L :
r_lifereg = Live
⊢

congruence

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b S m HS & reg & E & L p Hp
apply HS in Hp
subst p
cbn
congruence

icell is stable: while the object is live it is the same object, and its owned bytes are kept.

533Lemma icell_stable
∀ b o v
Explore proof 17 tactics

Initial goal

⊢
∀b o v : Z, stableicellb o v

intros b o v S m m′ HS & Hb & H Hs Hg

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
⊢
icellb o v S m′

split ; exact HS |

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
⊢
object_regionb m_regionsm′ ≠ None ∧ ∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

split

2 open

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
⊢
object_regionb m_regionsm′ ≠ None
focused goal
b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
⊢
∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

–destruct object_regionb m_regionsm as reg | eqn: E0 ; | congruence

2 open

b, o, v :
Z
S :
m, m′ :
HS :
reg :
E0 :
Hb :
Somereg ≠ None
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
⊢
object_regionb m_regionsm′ ≠ None
deferred goal
b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
⊢
∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

destruct Hg_ _ E0 as E1 | _ & E1 ; congruence

deferred goal
b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
⊢
∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

–intros reg Hl

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

destruct Hreg grows_live_at_ _ _ _ Hg Hb Hl as Ho & He & Hv

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

split ; exact Ho |

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
⊢
b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

split ; exact He |

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
⊢
load_bytesm′ b + o 8 = v

rewrite <- Hv

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
⊢
load_bytesm′ b + o 8 = load_bytesm b + o 8

apply load_bytes_ext8

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
⊢
∀i : Z, 0 ≤ i < 8 → m_bytesm′ b + o + i = m_bytesm b + o + i

intros i Hi

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesm′ b + o + i = m_bytesm b + o + i

assert Hp : SPByteb o + i by apply HS ; exists i ; split ; exact Hi | reflexivity

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
i :
Z
Hi :
0 ≤ i < 8
Hp :
SPByteb o + i
⊢
m_bytesm′ b + o + i = m_bytesm b + o + i

pose proof Hs_ Hp as Hs′

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
i :
Z
Hi :
0 ≤ i < 8
Hp :
SPByteb o + i
Hs′ :
match PByteb o + i with
⇒
∀reg : region, object_regionb m_regionsm = Somereg → object_regionb m_regionsm′ = Somereg
⇒
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_bytesm′ b + o = m_bytesm b + o
PAuxb o
⇒
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_auxm′ b + o = m_auxm b + o
⇒
True
⊢
m_bytesm′ b + o + i = m_bytesm b + o + i

cbn iota beta in Hs′

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
i :
Z
Hi :
0 ≤ i < 8
Hp :
SPByteb o + i
Hs′ :
∀reg : region, live_atm′ b reg → 0 ≤ o + i → b + o + i < r_endreg → m_bytesm′ b + o + i = m_bytesm b + o + i
⊢
m_bytesm′ b + o + i = m_bytesm b + o + i

rewrite <- Z.add_assoc

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
i :
Z
Hi :
0 ≤ i < 8
Hp :
SPByteb o + i
Hs′ :
∀reg : region, live_atm′ b reg → 0 ≤ o + i → b + o + i < r_endreg → m_bytesm′ b + o + i = m_bytesm b + o + i
⊢
m_bytesm′ b + o + i = m_bytesm b + o + i

apply Hs′reg ; exact Hl | lia | lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b o v S m m′ HS & Hb & H Hs Hg
split ; exact HS |
split
–destruct object_regionb m_regionsm as reg | eqn: E0 ; | congruence
destruct Hg_ _ E0 as E1 | _ & E1 ; congruence
–intros reg Hl
destruct Hreg grows_live_at_ _ _ _ Hg Hb Hl as Ho & He & Hv
split ; exact Ho |
split ; exact He |
rewrite <- Hv
intros i Hi
assert Hp : SPByteb o + i by apply HS ; exists i ; split ; exact Hi | reflexivity
pose proof Hs_ Hp as Hs′
cbn iota beta in Hs′
rewrite <- Z.add_assoc
apply Hs′reg ; exact Hl | lia | lia

icell survives a safepoint.

545Lemma icell_sp_stable
∀ b o v
Explore proof 11 tactics

Initial goal

⊢
∀b o v : Z, sp_stableicellb o v

intros b o v S m m′ HS & Hb & H Hr Hbytes _

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hr :
Hbytes :
⊢
icellb o v S m′

split ; exact HS |

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hr :
Hbytes :
⊢
object_regionb m_regionsm′ ≠ None ∧ ∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

split ; rewrite Hr ; exact Hb |

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hr :
Hbytes :
⊢
∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

intros reg Hl

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hr :
Hbytes :
reg :
Hl :
live_atm′ b reg
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

unfold live_at in Hl

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hr :
Hbytes :
reg :
Hl :
object_regionb m_regionsm′ = Somereg ∧ r_lifereg = Live
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

rewrite Hr in Hl

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hr :
Hbytes :
reg :
Hl :
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

destruct Hreg Hl as Ho & He & Hv

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hr :
Hbytes :
reg :
Hl :
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

split ; exact Ho |

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hr :
Hbytes :
reg :
Hl :
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
⊢
b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = v

split ; exact He |

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hr :
Hbytes :
reg :
Hl :
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
⊢
load_bytesm′ b + o 8 = v

rewrite load_bytes_samem m′ _ _ Hbytes

b, o, v :
Z
S :
m, m′ :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
Hr :
Hbytes :
reg :
Hl :
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = v
⊢
load_bytesm b + o 8 = v

exact Hv

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b o v S m m′ HS & Hb & H Hr Hbytes _
split ; exact HS |
split ; rewrite Hr ; exact Hb |
intros reg Hl
unfold live_at in Hl
rewrite Hr in Hl
destruct Hreg Hl as Ho & He & Hv
split ; exact Ho |
split ; exact He |
rewrite load_bytes_samem m′ _ _ Hbytes
exact Hv

icell owns pieces of its object.

553Lemma icell_registered
∀ b o v
Explore proof 3 tactics

Initial goal

⊢
∀b o v : Z, owns_registeredicellb o v

intros b o v S m HS & Hb & _ p Hp

b, o, v :
Z
S :
m :
HS :
Hb :
Hp :
Sp

apply HS in Hp as i & _ & →

b, o, v :
Z
S :
m :
HS :
Hb :
i :
Z

exact Hb

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b o v S m HS & Hb & _ p Hp
apply HS in Hp as i & _ & →
exact Hb

pcell is stable: as icell, and its aux slot is kept, or what it is known to hold names a freed object, which stays freed.

558Lemma pcell_stable
∀ b o x
Explore proof 26 tactics

Initial goal

⊢
∀b o : Z x : ptr, stablepcellb o x

intros b o x S m m′ HS & Hb & H Hs Hg

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
⊢
pcellb o x S m′

split ; exact HS |

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
⊢
object_regionb m_regionsm′ ≠ None ∧ ∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

split

2 open

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
⊢
object_regionb m_regionsm′ ≠ None
focused goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
⊢
∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

–destruct object_regionb m_regionsm as reg | eqn: E0 ; | congruence

2 open

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
reg :
E0 :
Hb :
Somereg ≠ None
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
⊢
object_regionb m_regionsm′ ≠ None
deferred goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
⊢
∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

destruct Hg_ _ E0 as E1 | _ & E1 ; congruence

deferred goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
⊢
∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

–intros reg Hl

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

destruct Hreg grows_live_at_ _ _ _ Hg Hb Hl as Ho & He & Hv & Ha

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

split ; exact Ho |

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

split ; exact He |

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

split

2 open

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
load_bytesm′ b + o 8 = ptr_addrx
focused goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
aux_holdsm′ b + o ptr_capx

+rewrite <- Hv

2 open

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
load_bytesm′ b + o 8 = load_bytesm b + o 8
deferred goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
aux_holdsm′ b + o ptr_capx

apply load_bytes_ext8

2 open

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
∀i : Z, 0 ≤ i < 8 → m_bytesm′ b + o + i = m_bytesm b + o + i
deferred goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
aux_holdsm′ b + o ptr_capx

intros i Hi

2 open

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesm′ b + o + i = m_bytesm b + o + i
deferred goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
aux_holdsm′ b + o ptr_capx

assert Hp : SPByteb o + i by apply HS ; left ; exists i ; split ; exact Hi | reflexivity

2 open

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
i :
Z
Hi :
0 ≤ i < 8
Hp :
SPByteb o + i
⊢
m_bytesm′ b + o + i = m_bytesm b + o + i
deferred goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
aux_holdsm′ b + o ptr_capx

pose proof Hs_ Hp as Hs′

2 open

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
i :
Z
Hi :
0 ≤ i < 8
Hp :
SPByteb o + i
Hs′ :
match PByteb o + i with
⇒
∀reg : region, object_regionb m_regionsm = Somereg → object_regionb m_regionsm′ = Somereg
⇒
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_bytesm′ b + o = m_bytesm b + o
PAuxb o
⇒
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_auxm′ b + o = m_auxm b + o
⇒
True
⊢
m_bytesm′ b + o + i = m_bytesm b + o + i
deferred goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
aux_holdsm′ b + o ptr_capx

cbn iota beta in Hs′

2 open

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
i :
Z
Hi :
0 ≤ i < 8
Hp :
SPByteb o + i
Hs′ :
∀reg : region, live_atm′ b reg → 0 ≤ o + i → b + o + i < r_endreg → m_bytesm′ b + o + i = m_bytesm b + o + i
⊢
m_bytesm′ b + o + i = m_bytesm b + o + i
deferred goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
aux_holdsm′ b + o ptr_capx

rewrite <- Z.add_assoc

2 open

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
i :
Z
Hi :
0 ≤ i < 8
Hp :
SPByteb o + i
Hs′ :
∀reg : region, live_atm′ b reg → 0 ≤ o + i → b + o + i < r_endreg → m_bytesm′ b + o + i = m_bytesm b + o + i
⊢
m_bytesm′ b + o + i = m_bytesm b + o + i
deferred goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
aux_holdsm′ b + o ptr_capx

apply Hs′reg ; exact Hl | lia | lia

deferred goal
b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
⊢
aux_holdsm′ b + o ptr_capx

+assert Hp : SPAuxb o by apply HS ; right ; reflexivity

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
Hp :
SPAuxb o
⊢
aux_holdsm′ b + o ptr_capx

pose proof Hs_ Hp as Hs′

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
Hp :
SPAuxb o
Hs′ :
match PAuxb o with
⇒
∀reg : region, object_regionb m_regionsm = Somereg → object_regionb m_regionsm′ = Somereg
⇒
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_bytesm′ b + o = m_bytesm b + o
PAuxb o
⇒
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_auxm′ b + o = m_auxm b + o
⇒
True
⊢
aux_holdsm′ b + o ptr_capx

cbn iota beta in Hs′

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
Hp :
SPAuxb o
Hs′ :
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_auxm′ b + o = m_auxm b + o
⊢
aux_holdsm′ b + o ptr_capx

unfold aux_holds

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
Hp :
SPAuxb o
Hs′ :
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_auxm′ b + o = m_auxm b + o
⊢
m_auxm′ b + o = ptr_capx ∨ freed_inm_regionsm′ ptr_capx ∧ traps_as_freedm_regionsm′ m_auxm′ b + o

rewrite Hs′reg Hl Ho ltac:lia

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Ha :
Hp :
SPAuxb o
Hs′ :
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_auxm′ b + o = m_auxm b + o
⊢
m_auxm b + o = ptr_capx ∨ freed_inm_regionsm′ ptr_capx ∧ traps_as_freedm_regionsm′ m_auxm b + o

destruct Ha as E | Hf & Ht ; left ; exact E |

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Hp :
SPAuxb o
Hs′ :
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_auxm′ b + o = m_auxm b + o
⊢
m_auxm b + o = ptr_capx ∨ freed_inm_regionsm′ ptr_capx ∧ traps_as_freedm_regionsm′ m_auxm b + o

right

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hs :
same_onS m m′
Hg :
growsm m′
reg :
Hl :
live_atm′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Hp :
SPAuxb o
Hs′ :
∀reg : region, live_atm′ b reg → 0 ≤ o → b + o < r_endreg → m_auxm′ b + o = m_auxm b + o

split ; exact freed_in_grows_ _ _ Hg Hf | exact traps_as_freed_grows_ _ _ Hg Ht

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b o x S m m′ HS & Hb & H Hs Hg
split ; exact HS |
split
–destruct object_regionb m_regionsm as reg | eqn: E0 ; | congruence
destruct Hg_ _ E0 as E1 | _ & E1 ; congruence
–intros reg Hl
destruct Hreg grows_live_at_ _ _ _ Hg Hb Hl as Ho & He & Hv & Ha
split ; exact Ho |
split ; exact He |
split
+rewrite <- Hv
intros i Hi
assert Hp : SPByteb o + i by apply HS ; left ; exists i ; split ; exact Hi | reflexivity
pose proof Hs_ Hp as Hs′
cbn iota beta in Hs′
rewrite <- Z.add_assoc
apply Hs′reg ; exact Hl | lia | lia
+assert Hp : SPAuxb o by apply HS ; right ; reflexivity
pose proof Hs_ Hp as Hs′
cbn iota beta in Hs′
unfold aux_holds
rewrite Hs′reg Hl Ho ltac:lia
destruct Ha as E | Hf & Ht ; left ; exact E |
right
split ; exact freed_in_grows_ _ _ Hg Hf | exact traps_as_freed_grows_ _ _ Hg Ht

pcell survives a safepoint (aux_holds_moves).

575Lemma pcell_sp_stable
∀ b o x
Explore proof 11 tactics

Initial goal

⊢
∀b o : Z x : ptr, sp_stablepcellb o x

intros b o x S m m′ HS & Hb & H Hr Hbytes Ha

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hr :
Hbytes :
Ha :
aux_movesm m′
⊢
pcellb o x S m′

split ; exact HS |

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hr :
Hbytes :
Ha :
aux_movesm m′
⊢
object_regionb m_regionsm′ ≠ None ∧ ∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

split ; rewrite Hr ; exact Hb |

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hr :
Hbytes :
Ha :
aux_movesm m′
⊢
∀reg : region, live_atm′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

intros reg Hl

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hr :
Hbytes :
Ha :
aux_movesm m′
reg :
Hl :
live_atm′ b reg
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

unfold live_at in Hl

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hr :
Hbytes :
Ha :
aux_movesm m′
reg :
Hl :
object_regionb m_regionsm′ = Somereg ∧ r_lifereg = Live
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

rewrite Hr in Hl

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hr :
Hbytes :
Ha :
aux_movesm m′
reg :
Hl :
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

destruct Hreg Hl as Ho & He & Hv & Hx

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hr :
Hbytes :
Ha :
aux_movesm m′
reg :
Hl :
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Hx :
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

split ; exact Ho |

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hr :
Hbytes :
Ha :
aux_movesm m′
reg :
Hl :
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Hx :
⊢
b + o + 8 ≤ r_endreg ∧ load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

split ; exact He |

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hr :
Hbytes :
Ha :
aux_movesm m′
reg :
Hl :
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Hx :
⊢
load_bytesm′ b + o 8 = ptr_addrx ∧ aux_holdsm′ b + o ptr_capx

split ; rewrite load_bytes_samem m′ _ _ Hbytes ; exact Hv |

b, o :
Z
x :
S :
m, m′ :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
Hr :
Hbytes :
Ha :
aux_movesm m′
reg :
Hl :
object_regionb m_regionsm = Somereg ∧ r_lifereg = Live
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
Hv :
load_bytesm b + o 8 = ptr_addrx
Hx :
⊢
aux_holdsm′ b + o ptr_capx

exact aux_holds_moves_ _ _ _ Hr Ha Hx

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b o x S m m′ HS & Hb & H Hr Hbytes Ha
split ; exact HS |
split ; rewrite Hr ; exact Hb |
intros reg Hl
unfold live_at in Hl
rewrite Hr in Hl
destruct Hreg Hl as Ho & He & Hv & Hx
split ; exact Ho |
split ; exact He |
split ; rewrite load_bytes_samem m′ _ _ Hbytes ; exact Hv |
exact aux_holds_moves_ _ _ _ Hr Ha Hx

pcell owns pieces of its object.

584Lemma pcell_registered
∀ b o x
Explore proof 2 tactics

Initial goal

⊢
∀b o : Z x : ptr, owns_registeredpcellb o x

intros b o x S m HS & Hb & _ p Hp

b, o :
Z
x :
S :
m :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
Hp :
Sp

apply HS in Hp as i & _ & → | → ; exact Hb

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b o x S m HS & Hb & _ p Hp
apply HS in Hp as i & _ & → | → ; exact Hb

node is stable.

588Lemma node_stable
∀ b next v
stablenodeb next v
Explore proof 3 tactics

Initial goal

⊢
∀b : Z next : ptr v : Z, stablenodeb next v

intros

b :
Z
next :
v :
Z
⊢
stablenodeb next v

unfold node

b :
Z
next :
v :
Z
⊢
stablemetab 16 Heap ** liveb ** pcellb 0 next ** icellb 8 v%h

repeat apply star_stable ; auto using meta_stable , live_stable , pcell_stable , icell_stable

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros
unfold node

node survives a safepoint.

595Lemma node_sp_stable
∀ b next v
Explore proof 3 tactics

Initial goal

⊢
∀b : Z next : ptr v : Z, sp_stablenodeb next v

intros

b :
Z
next :
v :
Z
⊢

unfold node

b :
Z
next :
v :
Z
⊢
sp_stablemetab 16 Heap ** liveb ** pcellb 0 next ** icellb 8 v%h

repeat apply star_sp_stable ; auto using meta_sp_stable , live_sp_stable , pcell_sp_stable , icell_sp_stable

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script

node owns pieces of its object.

602Lemma node_registered
∀ b next v
Explore proof 3 tactics

Initial goal

⊢
∀b : Z next : ptr v : Z, owns_registerednodeb next v

intros

b :
Z
next :
v :
Z

unfold node

b :
Z
next :
v :
Z
⊢
owns_registeredmetab 16 Heap ** liveb ** pcellb 0 next ** icellb 8 v%h

repeat apply star_registered ; auto using meta_registered , live_registered , pcell_registered , icell_registered

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script

lst is stable.

609Lemma lst_stable
∀ xs p
Explore proof 5 tactics

Initial goal

⊢
∀xs : listZ p : ptr, stablelstp xs

induction xs as | v xs IH ; intros p ; cbn [ lst ] ; apply pure_stable |

v :
Z
xs :
listZ
IH :
∀p : ptr, stablelstp xs
p :
⊢
stablehexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h

apply hex_stable

v :
Z
xs :
listZ
IH :
∀p : ptr, stablelstp xs
p :
⊢
∀x : ptr, stablepurep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp x v ** lstx xs%h

intros next

v :
Z
xs :
listZ
IH :
∀p : ptr, stablelstp xs
p, next :
⊢
stablepurep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h

apply star_stable ; apply pure_stable |

v :
Z
xs :
listZ
IH :
∀p : ptr, stablelstp xs
p, next :
⊢
stablenodeptr_addrp next v ** lstnext xs%h

apply star_stable ; apply node_stable | apply IH

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
induction xs as | v xs IH ; intros p ; cbn [ lst ] ; apply pure_stable |
intros next
apply star_stable ; apply pure_stable |
apply star_stable ; apply node_stable | apply IH

lst survives a safepoint: the list never stores the capability of a freed object, and what it stores is known up to the collector's rewriting anyway.

619Lemma lst_safepoint
∀ xs p
Explore proof 5 tactics

Initial goal

⊢
∀xs : listZ p : ptr, sp_stablelstp xs

induction xs as | v xs IH ; intros p ; cbn [ lst ] ; apply pure_sp_stable |

v :
Z
xs :
listZ
IH :
∀p : ptr, sp_stablelstp xs
p :
⊢
sp_stablehexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h

apply hex_sp_stable

v :
Z
xs :
listZ
IH :
∀p : ptr, sp_stablelstp xs
p :
⊢
∀x : ptr, sp_stablepurep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp x v ** lstx xs%h

intros next

v :
Z
xs :
listZ
IH :
∀p : ptr, sp_stablelstp xs
p, next :
⊢
sp_stablepurep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h

apply star_sp_stable ; apply pure_sp_stable |

v :
Z
xs :
listZ
IH :
∀p : ptr, sp_stablelstp xs
p, next :
⊢
sp_stablenodeptr_addrp next v ** lstnext xs%h

apply star_sp_stable ; apply node_sp_stable | apply IH

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
induction xs as | v xs IH ; intros p ; cbn [ lst ] ; apply pure_sp_stable |
intros next
apply star_sp_stable ; apply node_sp_stable | apply IH

lst owns pieces of objects.

627Lemma lst_registered
∀ xs p
Explore proof 5 tactics

Initial goal

⊢
∀xs : listZ p : ptr, owns_registeredlstp xs

induction xs as | v xs IH ; intros p ; cbn [ lst ] ; apply pure_registered |

v :
Z
xs :
listZ
IH :
∀p : ptr, owns_registeredlstp xs
p :
⊢
owns_registeredhexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h

apply hex_registered

v :
Z
xs :
listZ
IH :
∀p : ptr, owns_registeredlstp xs
p :
⊢
∀x : ptr, owns_registeredpurep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp x v ** lstx xs%h

intros next

v :
Z
xs :
listZ
IH :
∀p : ptr, owns_registeredlstp xs
p, next :
⊢
owns_registeredpurep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h

apply star_registered ; apply pure_registered |

v :
Z
xs :
listZ
IH :
∀p : ptr, owns_registeredlstp xs
p, next :
⊢
owns_registerednodeptr_addrp next v ** lstnext xs%h

apply star_registered ; apply node_registered | apply IH

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
induction xs as | v xs IH ; intros p ; cbn [ lst ] ; apply pure_registered |
intros next
apply star_registered ; apply node_registered | apply IH

The steps that change memory

An 8-byte store at offset o of the live object b, in bounds, keeps every footprint that owns none of those bytes: other live objects do not overlap b.

639Lemma store_same_on
∀ m b o reg x
live_atm b reg
0 ≤ o
b + o + 8 ≤ r_endreg
keepsbytes8b o m store_bytesm b + o 8 x
Explore proof 19 tactics

Initial goal

⊢
∀m : mem b o : Z reg : region x : Z, live_disjointm → live_atm b reg → 0 ≤ o → b + o + 8 ≤ r_endreg → keepsbytes8b o m store_bytesm b + o 8 x

intros m b o reg x Hd Hl Ho He S HS p Hp

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬bytes8b o p
Hp :
Sp
⊢
match p with
⇒
∀reg0 : region, object_regionb0 m_regionsm = Somereg0 → object_regionb0 m_regionsstore_bytesm b + o 8 x = Somereg0
PByteb0 o0
⇒
∀reg0 : region, live_atstore_bytesm b + o 8 x b0 reg0 → 0 ≤ o0 → b0 + o0 < r_endreg0 → m_bytesstore_bytesm b + o 8 x b0 + o0 = m_bytesm b0 + o0
PAuxb0 o0
⇒
∀reg0 : region, live_atstore_bytesm b + o 8 x b0 reg0 → 0 ≤ o0 → b0 + o0 < r_endreg0 → m_auxstore_bytesm b + o 8 x b0 + o0 = m_auxm b0 + o0
⇒
True

specialize HSp Hp

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
¬bytes8b o p
Hp :
Sp
⊢
match p with
⇒
∀reg0 : region, object_regionb0 m_regionsm = Somereg0 → object_regionb0 m_regionsstore_bytesm b + o 8 x = Somereg0
PByteb0 o0
⇒
∀reg0 : region, live_atstore_bytesm b + o 8 x b0 reg0 → 0 ≤ o0 → b0 + o0 < r_endreg0 → m_bytesstore_bytesm b + o 8 x b0 + o0 = m_bytesm b0 + o0
PAuxb0 o0
⇒
∀reg0 : region, live_atstore_bytesm b + o 8 x b0 reg0 → 0 ≤ o0 → b0 + o0 < r_endreg0 → m_auxstore_bytesm b + o 8 x b0 + o0 = m_auxm b0 + o0
⇒
True

destruct p as b′ | b′ o′ | b′ o′ | k ; cbn iota beta ; | | | exact I

3 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′ :
Z
HS :
¬bytes8b o PLiveb′
Hp :
SPLiveb′
⊢
∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → object_regionb′ m_regionsstore_bytesm b + o 8 x = Somereg0
focused goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_bytesstore_bytesm b + o 8 x b′ + o′ = m_bytesm b′ + o′
focused goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

–intros reg′ E

3 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′ :
Z
HS :
¬bytes8b o PLiveb′
Hp :
SPLiveb′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
⊢
object_regionb′ m_regionsstore_bytesm b + o 8 x = Somereg′
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_bytesstore_bytesm b + o 8 x b′ + o′ = m_bytesm b′ + o′
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

exact E

2 open

deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_bytesstore_bytesm b + o 8 x b′ + o′ = m_bytesm b′ + o′
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

–intros reg′ Hl′ Ho′ He′

2 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
reg′ :
Hl′ :
live_atstore_bytesm b + o 8 x b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
⊢
m_bytesstore_bytesm b + o 8 x b′ + o′ = m_bytesm b′ + o′
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

apply store_bytes_other

2 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
reg′ :
Hl′ :
live_atstore_bytesm b + o 8 x b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
⊢
¬b + o ≤ b′ + o′ < b + o + 8
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

intros Ha

2 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
reg′ :
Hl′ :
live_atstore_bytesm b + o 8 x b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b + o ≤ b′ + o′ < b + o + 8
⊢
False
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

change live_atm b′ reg′ in Hl′

2 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b + o ≤ b′ + o′ < b + o + 8
⊢
False
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

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

3 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
o′ :
Z
Hp :
SPByteb o′
HS :
¬bytes8b o PByteb o′
reg′ :
Hl′ :
live_atm b reg′
Ho′ :
0 ≤ o′
Ha :
b + o ≤ b + o′ < b + o + 8
He′ :
b + o′ < r_endreg′
⊢
False
focused goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

+assert reg′ = reg as → by destruct Hl , Hl′ ; congruence

3 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
o′ :
Z
Hp :
SPByteb o′
HS :
¬bytes8b o PByteb o′
Hl′ :
live_atm b reg
Ho′ :
0 ≤ o′
Ha :
b + o ≤ b + o′ < b + o + 8
He′ :
b + o′ < r_endreg
⊢
False
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

apply HS

3 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
o′ :
Z
Hp :
SPByteb o′
HS :
¬bytes8b o PByteb o′
Hl′ :
live_atm b reg
Ho′ :
0 ≤ o′
Ha :
b + o ≤ b + o′ < b + o + 8
He′ :
b + o′ < r_endreg
⊢
bytes8b o PByteb o′
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

exists o′ − o

3 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
o′ :
Z
Hp :
SPByteb o′
HS :
¬bytes8b o PByteb o′
Hl′ :
live_atm b reg
Ho′ :
0 ≤ o′
Ha :
b + o ≤ b + o′ < b + o + 8
He′ :
b + o′ < r_endreg
⊢
0 ≤ o′ − o < 8 ∧ PByteb o′ = PByteb o + o′ − o
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

split ; lia |

3 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
o′ :
Z
Hp :
SPByteb o′
HS :
¬bytes8b o PByteb o′
Hl′ :
live_atm b reg
Ho′ :
0 ≤ o′
Ha :
b + o ≤ b + o′ < b + o + 8
He′ :
b + o′ < r_endreg
⊢
PByteb o′ = PByteb o + o′ − o
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

f_equal

3 open

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
o′ :
Z
Hp :
SPByteb o′
HS :
¬bytes8b o PByteb o′
Hl′ :
live_atm b reg
Ho′ :
0 ≤ o′
Ha :
b + o ≤ b + o′ < b + o + 8
He′ :
b + o′ < r_endreg
⊢
o′ = o + o′ − o
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

lia

2 open

deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PByteb′ o′
Hp :
SPByteb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b + o ≤ b′ + o′ < b + o + 8
Hne :
b′ ≠ b
⊢
False
deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

+destruct Hdb′ reg′ b reg Hl′ Hl Hne ; lia

deferred goal
m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_bytesm b + o 8 x b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

–intros

m :
b, o :
Z
reg :
x :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
¬bytes8b o PAuxb′ o′
Hp :
SPAuxb′ o′
reg0 :
H :
live_atstore_bytesm b + o 8 x b′ reg0
H0 :
0 ≤ o′
H1 :
b′ + o′ < r_endreg0
⊢
m_auxstore_bytesm b + o 8 x b′ + o′ = m_auxm b′ + o′

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b o reg x Hd Hl Ho He S HS p Hp
specialize HSp Hp
destruct p as b′ | b′ o′ | b′ o′ | k ; cbn iota beta ; | | | exact I
–intros reg′ E
exact E
–intros reg′ Hl′ Ho′ He′
intros Ha
change live_atm b′ reg′ in Hl′
destruct Z.eq_decb′ b as [ ->| Hne ]
+assert reg′ = reg as → by destruct Hl , Hl′ ; congruence
apply HS
exists o′ − o
split ; lia |
f_equal
lia
+destruct Hdb′ reg′ b reg Hl′ Hl Hne ; lia
–intros
reflexivity

An aux store at offset o of the live object b, in bounds, keeps every footprint that does not own that slot.

655Lemma aux_store_same_on
∀ m b o reg c
live_atm b reg
0 ≤ o
b + o + 8 ≤ r_endreg
keepseqPAuxb o m store_auxm b + o c
Explore proof 16 tactics

Initial goal

⊢
∀m : mem b o : Z reg : region c : cap, live_disjointm → live_atm b reg → 0 ≤ o → b + o + 8 ≤ r_endreg → keepseqPAuxb o m store_auxm b + o c

intros m b o reg c Hd Hl Ho He S HS p Hp

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → PAuxb o ≠ p
Hp :
Sp
⊢
match p with
⇒
∀reg0 : region, object_regionb0 m_regionsm = Somereg0 → object_regionb0 m_regionsstore_auxm b + o c = Somereg0
PByteb0 o0
⇒
∀reg0 : region, live_atstore_auxm b + o c b0 reg0 → 0 ≤ o0 → b0 + o0 < r_endreg0 → m_bytesstore_auxm b + o c b0 + o0 = m_bytesm b0 + o0
PAuxb0 o0
⇒
∀reg0 : region, live_atstore_auxm b + o c b0 reg0 → 0 ≤ o0 → b0 + o0 < r_endreg0 → m_auxstore_auxm b + o c b0 + o0 = m_auxm b0 + o0
⇒
True

specialize HSp Hp

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
PAuxb o ≠ p
Hp :
Sp
⊢
match p with
⇒
∀reg0 : region, object_regionb0 m_regionsm = Somereg0 → object_regionb0 m_regionsstore_auxm b + o c = Somereg0
PByteb0 o0
⇒
∀reg0 : region, live_atstore_auxm b + o c b0 reg0 → 0 ≤ o0 → b0 + o0 < r_endreg0 → m_bytesstore_auxm b + o c b0 + o0 = m_bytesm b0 + o0
PAuxb0 o0
⇒
∀reg0 : region, live_atstore_auxm b + o c b0 reg0 → 0 ≤ o0 → b0 + o0 < r_endreg0 → m_auxstore_auxm b + o c b0 + o0 = m_auxm b0 + o0
⇒
True

destruct p as b′ | b′ o′ | b′ o′ | k ; cbn iota beta ; | | | exact I

3 open

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′ :
Z
HS :
PAuxb o ≠ PLiveb′
Hp :
SPLiveb′
⊢
∀reg0 : region, object_regionb′ m_regionsm = Somereg0 → object_regionb′ m_regionsstore_auxm b + o c = Somereg0
focused goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PByteb′ o′
Hp :
SPByteb′ o′
⊢
∀reg0 : region, live_atstore_auxm b + o c b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_bytesstore_auxm b + o c b′ + o′ = m_bytesm b′ + o′
focused goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_auxm b + o c b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_auxm b + o c b′ + o′ = m_auxm b′ + o′

–intros reg′ E

3 open

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′ :
Z
HS :
PAuxb o ≠ PLiveb′
Hp :
SPLiveb′
reg′ :
E :
object_regionb′ m_regionsm = Somereg′
⊢
object_regionb′ m_regionsstore_auxm b + o c = Somereg′
deferred goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PByteb′ o′
Hp :
SPByteb′ o′
⊢
∀reg0 : region, live_atstore_auxm b + o c b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_bytesstore_auxm b + o c b′ + o′ = m_bytesm b′ + o′
deferred goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_auxm b + o c b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_auxm b + o c b′ + o′ = m_auxm b′ + o′

exact E

2 open

deferred goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PByteb′ o′
Hp :
SPByteb′ o′
⊢
∀reg0 : region, live_atstore_auxm b + o c b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_bytesstore_auxm b + o c b′ + o′ = m_bytesm b′ + o′
deferred goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_auxm b + o c b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_auxm b + o c b′ + o′ = m_auxm b′ + o′

–intros

2 open

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PByteb′ o′
Hp :
SPByteb′ o′
reg0 :
H :
live_atstore_auxm b + o c b′ reg0
H0 :
0 ≤ o′
H1 :
b′ + o′ < r_endreg0
⊢
m_bytesstore_auxm b + o c b′ + o′ = m_bytesm b′ + o′
deferred goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_auxm b + o c b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_auxm b + o c b′ + o′ = m_auxm b′ + o′

reflexivity

deferred goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
⊢
∀reg0 : region, live_atstore_auxm b + o c b′ reg0 → 0 ≤ o′ → b′ + o′ < r_endreg0 → m_auxstore_auxm b + o c b′ + o′ = m_auxm b′ + o′

–intros reg′ Hl′ Ho′ He′

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
reg′ :
Hl′ :
live_atstore_auxm b + o c b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
⊢
m_auxstore_auxm b + o c b′ + o′ = m_auxm b′ + o′

change live_atm b′ reg′ in Hl′

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
⊢
m_auxstore_auxm b + o c b′ + o′ = m_auxm b′ + o′

cbn [ m_aux store_aux ]

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
⊢
b′ + o′ =? b + o
→
c
else
m_auxm b′ + o′
=
m_auxm b′ + o′

destruct Z.eqb_specb′ + o′ b + o as Ha | _ ; exfalso | reflexivity

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b′ + o′ = b + o
⊢
False

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

2 open

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
o′ :
Z
Hp :
SPAuxb o′
HS :
PAuxb o ≠ PAuxb o′
reg′ :
Hl′ :
live_atm b reg′
Ho′ :
0 ≤ o′
Ha :
b + o′ = b + o
He′ :
b + o′ < r_endreg′
⊢
False
focused goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b′ + o′ = b + o
Hne :
b′ ≠ b
⊢
False

+apply HS

2 open

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
o′ :
Z
Hp :
SPAuxb o′
HS :
PAuxb o ≠ PAuxb o′
reg′ :
Hl′ :
live_atm b reg′
Ho′ :
0 ≤ o′
Ha :
b + o′ = b + o
He′ :
b + o′ < r_endreg′
⊢
PAuxb o = PAuxb o′
deferred goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b′ + o′ = b + o
Hne :
b′ ≠ b
⊢
False

f_equal

2 open

m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
o′ :
Z
Hp :
SPAuxb o′
HS :
PAuxb o ≠ PAuxb o′
reg′ :
Hl′ :
live_atm b reg′
Ho′ :
0 ≤ o′
Ha :
b + o′ = b + o
He′ :
b + o′ < r_endreg′
⊢
o = o′
deferred goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b′ + o′ = b + o
Hne :
b′ ≠ b
⊢
False

lia

deferred goal
m :
b, o :
Z
reg :
c :
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
b′, o′ :
Z
HS :
PAuxb o ≠ PAuxb′ o′
Hp :
SPAuxb′ o′
reg′ :
Hl′ :
live_atm b′ reg′
Ho′ :
0 ≤ o′
He′ :
b′ + o′ < r_endreg′
Ha :
b′ + o′ = b + o
Hne :
b′ ≠ b
⊢
False

+destruct Hdb′ reg′ b reg Hl′ Hl Hne ; lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b o reg c Hd Hl Ho He S HS p Hp
specialize HSp Hp
destruct p as b′ | b′ o′ | b′ o′ | k ; cbn iota beta ; | | | exact I
–intros reg′ E
exact E
–intros
reflexivity
–intros reg′ Hl′ Ho′ He′
change live_atm b′ reg′ in Hl′
destruct Z.eqb_specb′ + o′ b + o as Ha | _ ; exfalso | reflexivity
destruct Z.eq_decb′ b as [ ->| Hne ]
+apply HS
f_equal
lia
+destruct Hdb′ reg′ b reg Hl′ Hl Hne ; lia

The pointer store's protocol in listsum.c (ensure, barrier, reload, then the capability and the address) is an aux store and then an 8-byte store.

Explore proof 1 tactics

Initial goal

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

That pointer store at offset o of the live object b, in bounds, keeps every footprint that owns none of the slot's pieces.

679Lemma pointer_store_same_on
∀ m b o reg c v
live_atm b reg
0 ≤ o
b + o + 8 ≤ r_endreg
keepspcell_piecesb o m store_bytesstore_auxm b + o c b + o 8 v
Explore proof 14 tactics

Initial goal

⊢
∀m : mem b o : Z reg : region c : cap v : Z, live_disjointm → live_atm b reg → 0 ≤ o → b + o + 8 ≤ r_endreg → keepspcell_piecesb o m store_bytesstore_auxm b + o c b + o 8 v

intros m b o reg c v Hd Hl Ho He S HS

m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
same_onS m store_bytesstore_auxm b + o c b + o 8 v

apply same_on_trans with store_auxm b + o c ; reflexivity | |

2 open

m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
same_onS m store_auxm b + o c
focused goal
m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
same_onS store_auxm b + o c store_bytesstore_auxm b + o c b + o 8 v

–apply aux_store_same_onm b o reg c Hd Hl Ho He

2 open

m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
∀p : piece, Sp → PAuxb o ≠ p
deferred goal
m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
same_onS store_auxm b + o c store_bytesstore_auxm b + o c b + o 8 v

intros p Hp E

2 open

m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
Hp :
Sp
E :
PAuxb o = p
⊢
False
deferred goal
m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
same_onS store_auxm b + o c store_bytesstore_auxm b + o c b + o 8 v

apply HSp Hp

2 open

m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
Hp :
Sp
E :
PAuxb o = p
⊢
deferred goal
m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
same_onS store_auxm b + o c store_bytesstore_auxm b + o c b + o 8 v

right

2 open

m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
Hp :
Sp
E :
PAuxb o = p
⊢
p = PAuxb o
deferred goal
m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
same_onS store_auxm b + o c store_bytesstore_auxm b + o c b + o 8 v

symmetry

2 open

m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
Hp :
Sp
E :
PAuxb o = p
⊢
PAuxb o = p
deferred goal
m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
same_onS store_auxm b + o c store_bytesstore_auxm b + o c b + o 8 v

exact E

deferred goal
m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
same_onS store_auxm b + o c store_bytesstore_auxm b + o c b + o 8 v

–apply store_same_onstore_auxm b + o c b o reg v ; | exact Hl | exact Ho | exact He |

2 open

m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
focused goal
m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
∀p : piece, Sp → ¬bytes8b o p

+exact live_disjoint_samem _ eq_refl Hd

deferred goal
m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
⊢
∀p : piece, Sp → ¬bytes8b o p

+intros p Hp E

m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
Hp :
Sp
E :
bytes8b o p
⊢
False

apply HSp Hp

m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
Hp :
Sp
E :
bytes8b o p
⊢

left

m :
b, o :
Z
reg :
c :
v :
Z
Hl :
live_atm b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
S :
piece → Prop
HS :
∀p : piece, Sp → ¬pcell_piecesb o p
Hp :
Sp
E :
bytes8b o p
⊢
bytes8b o p

exact E

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b o reg c v Hd Hl Ho He S HS
apply same_on_trans with store_auxm b + o c ; reflexivity | |
–apply aux_store_same_onm b o reg c Hd Hl Ho He
intros p Hp E
apply HSp Hp
right
symmetry
exact E
–apply store_same_onstore_auxm b + o c b o reg v ; | exact Hl | exact Ho | exact He |
+exact live_disjoint_samem _ eq_refl Hd
+intros p Hp E
apply HSp Hp
left
exact E

Allocating at a fresh base keeps every footprint: no one owns the new identity, and no byte changes.

691Lemma alloc_same_on
∀ S m q base
freshm q base
same_onS m allocatedm q base
Explore proof 9 tactics

Initial goal

⊢
∀S : fp m : mem q : alloc_req base : Z, freshm q base → same_onS m allocatedm q base

intros S m q base _ & _ & _ & Hn & _ p _

S :
m :
base :
Z
Hn :
⊢
match p with
⇒
∀reg : region, object_regionb m_regionsm = Somereg → object_regionb m_regionsallocatedm q base = Somereg
⇒
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_bytesallocatedm q base b + o = m_bytesm b + o
PAuxb o
⇒
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_auxallocatedm q base b + o = m_auxm b + o
⇒
True

destruct p as b | b o | b o | k ; cbn iota beta ; | | | exact I

3 open

S :
m :
base :
Z
Hn :
b :
Z
⊢
∀reg : region, object_regionb m_regionsm = Somereg → object_regionb m_regionsallocatedm q base = Somereg
focused goal
S :
m :
base :
Z
Hn :
b, o :
Z
⊢
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_bytesallocatedm q base b + o = m_bytesm b + o
focused goal
S :
m :
base :
Z
Hn :
b, o :
Z
⊢
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_auxallocatedm q base b + o = m_auxm b + o

–intros reg E

3 open

S :
m :
base :
Z
Hn :
b :
Z
reg :
E :
⊢
object_regionb m_regionsallocatedm q base = Somereg
deferred goal
S :
m :
base :
Z
Hn :
b, o :
Z
⊢
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_bytesallocatedm q base b + o = m_bytesm b + o
deferred goal
S :
m :
base :
Z
Hn :
b, o :
Z
⊢
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_auxallocatedm q base b + o = m_auxm b + o

rewrite object_region_allocated

3 open

S :
m :
base :
Z
Hn :
b :
Z
reg :
E :
⊢
base =? b
→
Somer_base ≔ base; r_end ≔ base + req_extentq; r_kind ≔ req_kindq; r_life ≔ Live
=
Somereg
deferred goal
S :
m :
base :
Z
Hn :
b, o :
Z
⊢
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_bytesallocatedm q base b + o = m_bytesm b + o
deferred goal
S :
m :
base :
Z
Hn :
b, o :
Z
⊢
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_auxallocatedm q base b + o = m_auxm b + o

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

2 open

deferred goal
S :
m :
base :
Z
Hn :
b, o :
Z
⊢
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_bytesallocatedm q base b + o = m_bytesm b + o
deferred goal
S :
m :
base :
Z
Hn :
b, o :
Z
⊢
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_auxallocatedm q base b + o = m_auxm b + o

–intros

2 open

S :
m :
base :
Z
Hn :
b, o :
Z
reg :
H :
live_atallocatedm q base b reg
H0 :
0 ≤ o
H1 :
b + o < r_endreg
⊢
m_bytesallocatedm q base b + o = m_bytesm b + o
deferred goal
S :
m :
base :
Z
Hn :
b, o :
Z
⊢
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_auxallocatedm q base b + o = m_auxm b + o

reflexivity

deferred goal
S :
m :
base :
Z
Hn :
b, o :
Z
⊢
∀reg : region, live_atallocatedm q base b reg → 0 ≤ o → b + o < r_endreg → m_auxallocatedm q base b + o = m_auxm b + o

–intros

S :
m :
base :
Z
Hn :
b, o :
Z
reg :
H :
live_atallocatedm q base b reg
H0 :
0 ≤ o
H1 :
b + o < r_endreg
⊢
m_auxallocatedm q base b + o = m_auxm b + o

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros S m q base _ & _ & _ & Hn & _ p _
destruct p as b | b o | b o | k ; cbn iota beta ; | | | exact I
–intros reg E
destruct Z.eqb_specbase b as [ <-| _ ] ; congruence | exact E
–intros
reflexivity
–intros
reflexivity

Allocating at a fresh base moves no object.

700Lemma alloc_grows
∀ m q base
freshm q base
growsm allocatedm q base
Explore proof 4 tactics

Initial goal

⊢
∀m : mem q : alloc_req base : Z, freshm q base → growsm allocatedm q base

intros m q base _ & _ & _ & Hn & _ b reg E

m :
base :
Z
Hn :
b :
Z
reg :
E :
⊢
object_regionb m_regionsallocatedm q base = Somereg ∨ r_lifereg = Live ∧ object_regionb m_regionsallocatedm q base = Somer_base ≔ b; r_end ≔ b; r_kind ≔ r_kindreg; r_life ≔ Freed

left

m :
base :
Z
Hn :
b :
Z
reg :
E :
⊢
object_regionb m_regionsallocatedm q base = Somereg

rewrite object_region_allocated

m :
base :
Z
Hn :
b :
Z
reg :
E :
⊢
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 m q base _ & _ & _ & Hn & _ b reg E
left
destruct Z.eqb_specbase b as [ <-| _ ] ; congruence | exact E

A footprint of objects of m owns nothing of a fresh base.

707Lemma registered_fresh
∀ S m q base p
freshm q base
Sp
piece_idp ≠ base
Explore proof 4 tactics

Initial goal

⊢
∀S : fp m : mem q : alloc_req base : Z p : piece, registeredS m → freshm q base → Sp → piece_idp ≠ base

intros S m q base p Hr _ & _ & _ & Hn & _ Hp E

S :
m :
base :
Z
Hr :
Hn :
Hp :
Sp
E :
piece_idp = base
⊢
False

apply Hrp Hp

S :
m :
base :
Z
Hr :
Hn :
Hp :
Sp
E :
piece_idp = base

rewrite E

S :
m :
base :
Z
Hr :
Hn :
Hp :
Sp
E :
piece_idp = base
⊢

exact Hn

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros S m q base p Hr _ & _ & _ & Hn & _ Hp E
apply Hrp Hp
rewrite E
exact Hn

Updating the owned cell

A write rule carries over a frame on the right that does not own what is written.

714Lemma writes_star_l
∀ W m m′ P P′ Q
keepsW m m′
growsm m′
writesW m m′ P P′
writesW m m′ P ** Q%h P′ ** Q%h
Explore proof 16 tactics

Initial goal

⊢
∀W : piece → Prop m m′ : mem P P′ Q : hprop, keepsW m m′ → growsm m′ → stableQ → writesW m m′ P P′ → writesW m m′ P ** Q%h P′ ** Q%h

intros W m m′ P P′ Q Hk Hg HQ HP S S1 & S2 & HS & Hd & H1 & H2

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
⊢
P′ ** Q%hS m′ ∧ ∀p : piece, Wp → Sp

destruct HPS1 H1 as H1′ HW

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
P′ ** Q%hS m′ ∧ ∀p : piece, Wp → Sp

split

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
P′ ** Q%hS m′
focused goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, Wp → Sp

–exists S1, S2

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∧ ∀p : piece, ¬S1p ∧ S2p ∧ P′S1 m′ ∧ QS2 m′
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, Wp → Sp

split ; exact HS |

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, ¬S1p ∧ S2p ∧ P′S1 m′ ∧ QS2 m′
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, Wp → Sp

split ; exact Hd |

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
P′S1 m′ ∧ QS2 m′
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, Wp → Sp

split ; exact H1′ |

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
QS2 m′
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, Wp → Sp

apply HQS2 m m′ H2 ; | exact Hg

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
same_onS2 m m′
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, Wp → Sp

apply Hk

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, S2p → ¬Wp
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, Wp → Sp

intros p Hp Hw

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
Hp :
S2p
Hw :
Wp
⊢
False
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, Wp → Sp

apply Hdp

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
Hp :
S2p
Hw :
Wp
⊢
S1p ∧ S2p
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, Wp → Sp

split ; apply HW , Hw | exact Hp

deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
⊢
∀p : piece, Wp → Sp

–intros p Hw

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
Hw :
Wp
⊢
Sp

apply HS

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
Hw :
Wp
⊢
S1p ∨ S2p

left

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
PS1 m
H2 :
QS2 m
H1′ :
P′S1 m′
HW :
∀p : piece, Wp → S1p
Hw :
Wp
⊢
S1p

apply HW , Hw

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros W m m′ P P′ Q Hk Hg HQ HP S S1 & S2 & HS & Hd & H1 & H2
destruct HPS1 H1 as H1′ HW
split
–exists S1, S2
split ; exact HS |
split ; exact Hd |
split ; exact H1′ |
apply HQS2 m m′ H2 ; | exact Hg
apply Hk
intros p Hp Hw
apply Hdp
split ; apply HW , Hw | exact Hp
–intros p Hw
apply HS
left
apply HW , Hw

A write rule carries over a frame on the left.

725Lemma writes_star_r
∀ W m m′ P P′ Q
keepsW m m′
growsm m′
writesW m m′ P P′
writesW m m′ Q ** P%h Q ** P′%h
Explore proof 16 tactics

Initial goal

⊢
∀W : piece → Prop m m′ : mem P P′ Q : hprop, keepsW m m′ → growsm m′ → stableQ → writesW m m′ P P′ → writesW m m′ Q ** P%h Q ** P′%h

intros W m m′ P P′ Q Hk Hg HQ HP S S1 & S2 & HS & Hd & H1 & H2

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
⊢
Q ** P′%hS m′ ∧ ∀p : piece, Wp → Sp

destruct HPS2 H2 as H2′ HW

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
Q ** P′%hS m′ ∧ ∀p : piece, Wp → Sp

split

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
Q ** P′%hS m′
focused goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, Wp → Sp

–exists S1, S2

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, Sp ↔ S1p ∨ S2p ∧ ∀p : piece, ¬S1p ∧ S2p ∧ QS1 m′ ∧ P′S2 m′
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, Wp → Sp

split ; exact HS |

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, ¬S1p ∧ S2p ∧ QS1 m′ ∧ P′S2 m′
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, Wp → Sp

split ; exact Hd |

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
QS1 m′ ∧ P′S2 m′
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, Wp → Sp

split ; | exact H2′

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
QS1 m′
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, Wp → Sp

apply HQS1 m m′ H1 ; | exact Hg

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
same_onS1 m m′
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, Wp → Sp

apply Hk

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, S1p → ¬Wp
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, Wp → Sp

intros p Hp Hw

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
Hp :
S1p
Hw :
Wp
⊢
False
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, Wp → Sp

apply Hdp

2 open

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
Hp :
S1p
Hw :
Wp
⊢
S1p ∧ S2p
deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, Wp → Sp

split ; exact Hp | apply HW , Hw

deferred goal
W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
⊢
∀p : piece, Wp → Sp

–intros p Hw

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
Hw :
Wp
⊢
Sp

apply HS

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
Hw :
Wp
⊢
S1p ∨ S2p

right

W :
piece → Prop
m, m′ :
P, P′, Q :
Hk :
keepsW m m′
Hg :
growsm m′
HQ :
HP :
writesW m m′ P P′
S :
S1, S2 :
piece → Prop
HS :
∀p : piece, Sp ↔ S1p ∨ S2p
Hd :
∀p : piece, ¬S1p ∧ S2p
H1 :
QS1 m
H2 :
PS2 m
H2′ :
P′S2 m′
HW :
∀p : piece, Wp → S2p
Hw :
Wp
⊢
S2p

apply HW , Hw

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros W m m′ P P′ Q Hk Hg HQ HP S S1 & S2 & HS & Hd & H1 & H2
destruct HPS2 H2 as H2′ HW
split
–exists S1, S2
split ; exact HS |
split ; exact Hd |
split ; | exact H2′
apply HQS1 m m′ H1 ; | exact Hg
apply Hk
intros p Hp Hw
apply Hdp
split ; exact Hp | apply HW , Hw
–intros p Hw
apply HS
right
apply HW , Hw

After an 8-byte store of an unsigned x at offset o of b, the owned cell there holds x.

737Lemma icell_writes
∀ m b o v x
0 ≤ x < 2 ^ 64
writesbytes8b o m store_bytesm b + o 8 x icellb o v icellb o x
Explore proof 9 tactics

Initial goal

⊢
∀m : mem b o v x : Z, 0 ≤ x < 2 ^ 64 → writesbytes8b o m store_bytesm b + o 8 x icellb o v icellb o x

intros m b o v x Hx S HS & Hb & H

m :
b, o, v, x :
Z
Hx :
0 ≤ x < 2 ^ 64
S :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
⊢
icellb o x S store_bytesm b + o 8 x ∧ ∀p : piece, bytes8b o p → Sp

split ; | intros p Hp ; apply HS , Hp

m :
b, o, v, x :
Z
Hx :
0 ≤ x < 2 ^ 64
S :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
⊢
icellb o x S store_bytesm b + o 8 x

split ; exact HS |

m :
b, o, v, x :
Z
Hx :
0 ≤ x < 2 ^ 64
S :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
⊢
object_regionb m_regionsstore_bytesm b + o 8 x ≠ None ∧ ∀reg : region, live_atstore_bytesm b + o 8 x b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesstore_bytesm b + o 8 x b + o 8 = x

split ; exact Hb |

m :
b, o, v, x :
Z
Hx :
0 ≤ x < 2 ^ 64
S :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
⊢
∀reg : region, live_atstore_bytesm b + o 8 x b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesstore_bytesm b + o 8 x b + o 8 = x

intros reg Hl

m :
b, o, v, x :
Z
Hx :
0 ≤ x < 2 ^ 64
S :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
reg :
Hl :
live_atstore_bytesm b + o 8 x b reg
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesstore_bytesm b + o 8 x b + o 8 = x

destruct Hreg Hl as Ho & He & _

m :
b, o, v, x :
Z
Hx :
0 ≤ x < 2 ^ 64
S :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
reg :
Hl :
live_atstore_bytesm b + o 8 x b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesstore_bytesm b + o 8 x b + o 8 = x

split ; exact Ho |

m :
b, o, v, x :
Z
Hx :
0 ≤ x < 2 ^ 64
S :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
reg :
Hl :
live_atstore_bytesm b + o 8 x b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
⊢
b + o + 8 ≤ r_endreg ∧ load_bytesstore_bytesm b + o 8 x b + o 8 = x

split ; exact He |

m :
b, o, v, x :
Z
Hx :
0 ≤ x < 2 ^ 64
S :
HS :
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = v
reg :
Hl :
live_atstore_bytesm b + o 8 x b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
⊢
load_bytesstore_bytesm b + o 8 x b + o 8 = x

apply load_store_bytes , Hx

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b o v x Hx S HS & Hb & H
split ; | intros p Hp ; apply HS , Hp
split ; exact HS |
split ; exact Hb |
intros reg Hl
destruct Hreg Hl as Ho & He & _
split ; exact Ho |
split ; exact He |
apply load_store_bytes , Hx

After the pointer store of x' at offset o of b, the owned slot there holds x'.

747Lemma pcell_writes
∀ m b o x x′
0 ≤ ptr_addrx′ < 2 ^ 64
writespcell_piecesb o m store_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ pcellb o x pcellb o x′
Explore proof 13 tactics

Initial goal

⊢
∀m : mem b o : Z x x′ : ptr, 0 ≤ ptr_addrx′ < 2 ^ 64 → writespcell_piecesb o m store_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ pcellb o x pcellb o x′

intros m b o x x′ Hx S HS & Hb & H

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
⊢
pcellb o x′ S store_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ ∧ ∀p : piece, pcell_piecesb o p → Sp

split ; | intros p Hp ; apply HS , Hp

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
⊢
pcellb o x′ S store_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′

split ; exact HS |

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
⊢
object_regionb m_regionsstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ ≠ None ∧ ∀reg : region, live_atstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o 8 = ptr_addrx′ ∧ aux_holdsstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o ptr_capx′

split ; exact Hb |

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
⊢
∀reg : region, live_atstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o 8 = ptr_addrx′ ∧ aux_holdsstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o ptr_capx′

intros reg Hl

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
reg :
Hl :
live_atstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b reg
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o 8 = ptr_addrx′ ∧ aux_holdsstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o ptr_capx′

destruct Hreg Hl as Ho & He & _

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
reg :
Hl :
live_atstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
⊢
0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o 8 = ptr_addrx′ ∧ aux_holdsstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o ptr_capx′

split ; exact Ho |

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
reg :
Hl :
live_atstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
⊢
b + o + 8 ≤ r_endreg ∧ load_bytesstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o 8 = ptr_addrx′ ∧ aux_holdsstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o ptr_capx′

split ; exact He |

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
reg :
Hl :
live_atstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
⊢
load_bytesstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o 8 = ptr_addrx′ ∧ aux_holdsstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o ptr_capx′

split ; apply load_store_bytes , Hx |

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
reg :
Hl :
live_atstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
⊢
aux_holdsstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o ptr_capx′

left

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
reg :
Hl :
live_atstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
⊢
m_auxstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b + o = ptr_capx′

cbn [ m_aux store_bytes store_aux ]

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
reg :
Hl :
live_atstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
⊢
b + o =? b + o
→
else
m_auxm b + o
=

rewrite Z.eqb_refl

m :
b, o :
Z
x, x′ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
S :
HS :
onlyS λp : piece ⇒ bytes8b o p ∨ p = PAuxb o
Hb :
H :
∀reg : region, live_atm b reg → 0 ≤ o ∧ b + o + 8 ≤ r_endreg ∧ load_bytesm b + o 8 = ptr_addrx ∧ aux_holdsm b + o ptr_capx
reg :
Hl :
live_atstore_bytesstore_auxm b + o ptr_capx′ b + o 8 ptr_addrx′ b reg
Ho :
0 ≤ o
He :
b + o + 8 ≤ r_endreg
⊢
ptr_capx′ = ptr_capx′

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b o x x′ Hx S HS & Hb & H
split ; | intros p Hp ; apply HS , Hp
split ; exact HS |
split ; exact Hb |
intros reg Hl
destruct Hreg Hl as Ho & He & _
split ; exact Ho |
split ; exact He |
split ; apply load_store_bytes , Hx |
left
rewrite Z.eqb_refl
reflexivity

A node's object is live, a heap object of 16 bytes.

758Lemma node_region
∀ b x v S m
nodeb x v S m
Explore proof 8 tactics

Initial goal

⊢
∀b : Z x : ptr v : Z S : fp m : mem, nodeb x v S m → object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

intros b x v S m S1 & S2 & _ & _ & _ & reg & E & Hk & Hl & S3 & S4 & _ & _ & _ & reg′ & E′ & L′ & _

b :
Z
x :
v :
Z
S :
m :
S1, S2 :
piece → Prop
reg :
E :
Hk :
r_kindreg = Heap
Hl :
r_lifereg = Live → r_endreg = b + 16
S3, S4 :
piece → Prop
reg′ :
E′ :
object_regionb m_regionsm = Somereg′
L′ :
r_lifereg′ = Live
⊢
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

rewrite E in E′

b :
Z
x :
v :
Z
S :
m :
S1, S2 :
piece → Prop
reg :
E :
Hk :
r_kindreg = Heap
Hl :
r_lifereg = Live → r_endreg = b + 16
S3, S4 :
piece → Prop
reg′ :
E′ :
Somereg = Somereg′
L′ :
r_lifereg′ = Live
⊢
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

injection E′ as ←

b :
Z
x :
v :
Z
S :
m :
S1, S2 :
piece → Prop
reg :
E :
Hk :
r_kindreg = Heap
Hl :
r_lifereg = Live → r_endreg = b + 16
S3, S4 :
piece → Prop
L′ :
r_lifereg = Live
⊢
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

specialize HlL′

b :
Z
x :
v :
Z
S :
m :
S1, S2 :
piece → Prop
reg :
E :
Hk :
r_kindreg = Heap
Hl :
r_endreg = b + 16
S3, S4 :
piece → Prop
L′ :
r_lifereg = Live
⊢
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

pose proof object_region_base_ _ _ E as Hb

b :
Z
x :
v :
Z
S :
m :
S1, S2 :
piece → Prop
reg :
E :
Hk :
r_kindreg = Heap
Hl :
r_endreg = b + 16
S3, S4 :
piece → Prop
L′ :
r_lifereg = Live
Hb :
r_basereg = b
⊢
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

rewrite E

b :
Z
x :
v :
Z
S :
m :
S1, S2 :
piece → Prop
reg :
E :
Hk :
r_kindreg = Heap
Hl :
r_endreg = b + 16
S3, S4 :
piece → Prop
L′ :
r_lifereg = Live
Hb :
r_basereg = b
⊢
Somereg = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

destruct reg as rb re rk rl ; cbn in * ; subst

b :
Z
x :
v :
Z
S :
m :
S1, S2 :
piece → Prop
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
S3, S4 :
piece → Prop
⊢
Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b x v S m S1 & S2 & _ & _ & _ & reg & E & Hk & Hl & S3 & S4 & _ & _ & _ & reg′ & E′ & L′ & _
rewrite E in E′
injection E′ as ←
specialize HlL′
pose proof object_region_base_ _ _ E as Hb
rewrite E
destruct reg as rb re rk rl ; cbn in * ; subst
reflexivity

A node's next slot reads as its next pointer.

767Lemma node_next
∀ b x v S m
nodeb x v S m
Explore proof 6 tactics

Initial goal

⊢
∀b : Z x : ptr v : Z S : fp m : mem, nodeb x v S m → load_bytesm b 8 = ptr_addrx ∧ aux_holdsm b ptr_capx

intros b x v S m H

b :
Z
x :
v :
Z
S :
m :
H :
nodeb x v S m
⊢

pose proof node_region_ _ _ _ _ H as Hr

b :
Z
x :
v :
Z
S :
m :
H :
nodeb x v S m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
⊢

destruct H as S1 & S2 & _ & _ & _ & S3 & S4 & _ & _ & _ & S5 & S6 & _ & _ & _ & _ & Hp & _

b :
Z
x :
v :
Z
S :
m :
S1, S2, S3, S4, S5, S6 :
piece → Prop
Hp :
∀reg : region, live_atm b reg → 0 ≤ 0 ∧ b + 0 + 8 ≤ r_endreg ∧ load_bytesm b + 0 8 = ptr_addrx ∧ aux_holdsm b + 0 ptr_capx
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
⊢

destruct Hp_ conjHr eq_refl as _ & _ & Hv & Ha

b :
Z
x :
v :
Z
S :
m :
S1, S2, S3, S4, S5, S6 :
piece → Prop
Hp :
∀reg : region, live_atm b reg → 0 ≤ 0 ∧ b + 0 + 8 ≤ r_endreg ∧ load_bytesm b + 0 8 = ptr_addrx ∧ aux_holdsm b + 0 ptr_capx
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hv :
load_bytesm b + 0 8 = ptr_addrx
Ha :
⊢

rewrite Z.add_0_r in Hv , Ha

b :
Z
x :
v :
Z
S :
m :
S1, S2, S3, S4, S5, S6 :
piece → Prop
Hp :
∀reg : region, live_atm b reg → 0 ≤ 0 ∧ b + 0 + 8 ≤ r_endreg ∧ load_bytesm b + 0 8 = ptr_addrx ∧ aux_holdsm b + 0 ptr_capx
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hv :
⊢

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b x v S m H
pose proof node_region_ _ _ _ _ H as Hr
destruct H as S1 & S2 & _ & _ & _ & S3 & S4 & _ & _ & _ & S5 & S6 & _ & _ & _ & _ & Hp & _
destruct Hp_ conjHr eq_refl as _ & _ & Hv & Ha
rewrite Z.add_0_r in Hv , Ha
auto

The pointer store of x' into the next slot of the node at b, which the assertion owns, makes x' its next pointer, and keeps the frame Q.

778Lemma node_store_next
∀ m b x x′ v Q S
0 ≤ ptr_addrx′ < 2 ^ 64
nodeb x v ** Q%hS m
nodeb x′ v ** Q%hS store_bytesstore_auxm b ptr_capx′ b 8 ptr_addrx′
Explore proof 17 tactics

Initial goal

⊢
∀m : mem b : Z x x′ : ptr v : Z Q : hprop S : fp, live_disjointm → stableQ → 0 ≤ ptr_addrx′ < 2 ^ 64 → nodeb x v ** Q%hS m → nodeb x′ v ** Q%hS store_bytesstore_auxm b ptr_capx′ b 8 ptr_addrx′

intros m b x x′ v Q S Hd HQ Hx H

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
⊢
nodeb x′ v ** Q%hS store_bytesstore_auxm b ptr_capx′ b 8 ptr_addrx′

destruct star_elim_l_ _ _ _ H as S0 & H0

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
⊢
nodeb x′ v ** Q%hS store_bytesstore_auxm b ptr_capx′ b 8 ptr_addrx′

pose proof node_region_ _ _ _ _ H0 as Hr

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
⊢
nodeb x′ v ** Q%hS store_bytesstore_auxm b ptr_capx′ b 8 ptr_addrx′

set m′ := store_bytesstore_auxm b ptr_capx′ b 8 ptr_addrx′

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
⊢
nodeb x′ v ** Q%hS m′

assert Hk : keepspcell_piecesb 0 m m′

2 open

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
⊢
focused goal
m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
⊢
nodeb x′ v ** Q%hS m′

{pose proof pointer_store_same_onm b 0 _ ptr_capx′ ptr_addrx′ Hd conjHr eq_refl as K

2 open

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
K :
0 ≤ 0 → b + 0 + 8 ≤ r_endr_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live → keepspcell_piecesb 0 m store_bytesstore_auxm b + 0 ptr_capx′ b + 0 8 ptr_addrx′
⊢
deferred goal
m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
⊢
nodeb x′ v ** Q%hS m′

rewrite Z.add_0_r in K

2 open

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
K :
0 ≤ 0 → b + 8 ≤ r_endr_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live → keepspcell_piecesb 0 m store_bytesstore_auxm b ptr_capx′ b 8 ptr_addrx′
⊢
deferred goal
m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
⊢
nodeb x′ v ** Q%hS m′

apply K ; cbn ; lia

deferred goal
m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
⊢
nodeb x′ v ** Q%hS m′

assert Hg : growsm m′ by apply grows_same ; reflexivity

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
Hg :
growsm m′
⊢
nodeb x′ v ** Q%hS m′

refine proj1writes_star_l_ _ _ _ _ Q Hk Hg HQ _ S H

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
Hg :
growsm m′
⊢
writespcell_piecesb 0 m m′ nodeb x v nodeb x′ v

unfold node

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
Hg :
growsm m′
⊢
writespcell_piecesb 0 m m′ metab 16 Heap ** liveb ** pcellb 0 x ** icellb 8 v%h metab 16 Heap ** liveb ** pcellb 0 x′ ** icellb 8 v%h

apply writes_star_r ; exact Hk | exact Hg | apply meta_stable |

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
Hg :
growsm m′
⊢
writespcell_piecesb 0 m m′ liveb ** pcellb 0 x ** icellb 8 v%h liveb ** pcellb 0 x′ ** icellb 8 v%h

apply writes_star_r ; exact Hk | exact Hg | apply live_stable |

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
Hg :
growsm m′
⊢
writespcell_piecesb 0 m m′ pcellb 0 x ** icellb 8 v%h pcellb 0 x′ ** icellb 8 v%h

apply writes_star_l ; exact Hk | exact Hg | apply icell_stable |

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
Hg :
growsm m′
⊢
writespcell_piecesb 0 m m′ pcellb 0 x pcellb 0 x′

pose proof pcell_writesm b 0 x x′ Hx as W

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
Hg :
growsm m′
W :
writespcell_piecesb 0 m store_bytesstore_auxm b + 0 ptr_capx′ b + 0 8 ptr_addrx′ pcellb 0 x pcellb 0 x′
⊢
writespcell_piecesb 0 m m′ pcellb 0 x pcellb 0 x′

rewrite Z.add_0_r in W

m :
b :
Z
x, x′ :
v :
Z
S :
HQ :
Hx :
0 ≤ ptr_addrx′ < 2 ^ 64
H :
nodeb x v ** Q%hS m
S0 :
H0 :
nodeb x v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
m′ :=
Hk :
Hg :
growsm m′
⊢
writespcell_piecesb 0 m m′ pcellb 0 x pcellb 0 x′

exact W

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b x x′ v Q S Hd HQ Hx H
destruct star_elim_l_ _ _ _ H as S0 & H0
pose proof node_region_ _ _ _ _ H0 as Hr
set m′ := store_bytesstore_auxm b ptr_capx′ b 8 ptr_addrx′
assert Hk : keepspcell_piecesb 0 m m′
{pose proof pointer_store_same_onm b 0 _ ptr_capx′ ptr_addrx′ Hd conjHr eq_refl as K
rewrite Z.add_0_r in K
apply K ; cbn ; lia
assert Hg : growsm m′ by apply grows_same ; reflexivity
refine proj1writes_star_l_ _ _ _ _ Q Hk Hg HQ _ S H
unfold node
apply writes_star_r ; exact Hk | exact Hg | apply meta_stable |
apply writes_star_r ; exact Hk | exact Hg | apply live_stable |
apply writes_star_l ; exact Hk | exact Hg | apply icell_stable |
pose proof pcell_writesm b 0 x x′ Hx as W
rewrite Z.add_0_r in W
exact W

The 8-byte store of an unsigned x into the value slot of the node at b, which the assertion owns, makes x its value, and keeps the frame Q.

799Lemma node_store_value
∀ m b next v x Q S
0 ≤ x < 2 ^ 64
nodeb next v ** Q%hS m
nodeb next x ** Q%hS store_bytesm b + 8 8 x
Explore proof 11 tactics

Initial goal

⊢
∀m : mem b : Z next : ptr v x : Z Q : hprop S : fp, live_disjointm → stableQ → 0 ≤ x < 2 ^ 64 → nodeb next v ** Q%hS m → nodeb next x ** Q%hS store_bytesm b + 8 8 x

intros m b next v x Q S Hd HQ Hx H

m :
b :
Z
next :
v, x :
Z
S :
HQ :
Hx :
0 ≤ x < 2 ^ 64
H :
nodeb next v ** Q%hS m
⊢
nodeb next x ** Q%hS store_bytesm b + 8 8 x

destruct star_elim_l_ _ _ _ H as S0 & H0

m :
b :
Z
next :
v, x :
Z
S :
HQ :
Hx :
0 ≤ x < 2 ^ 64
H :
nodeb next v ** Q%hS m
S0 :
H0 :
nodeb next v S0 m
⊢
nodeb next x ** Q%hS store_bytesm b + 8 8 x

pose proof node_region_ _ _ _ _ H0 as Hr

m :
b :
Z
next :
v, x :
Z
S :
HQ :
Hx :
0 ≤ x < 2 ^ 64
H :
nodeb next v ** Q%hS m
S0 :
H0 :
nodeb next v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
⊢
nodeb next x ** Q%hS store_bytesm b + 8 8 x

assert Hk : keepsbytes8b 8 m store_bytesm b + 8 8 x by apply store_same_onm b 8 _ x Hd conjHr eq_refl ; cbn ; lia

m :
b :
Z
next :
v, x :
Z
S :
HQ :
Hx :
0 ≤ x < 2 ^ 64
H :
nodeb next v ** Q%hS m
S0 :
H0 :
nodeb next v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hk :
keepsbytes8b 8 m store_bytesm b + 8 8 x
⊢
nodeb next x ** Q%hS store_bytesm b + 8 8 x

assert Hg : growsm store_bytesm b + 8 8 x by apply grows_same ; reflexivity

m :
b :
Z
next :
v, x :
Z
S :
HQ :
Hx :
0 ≤ x < 2 ^ 64
H :
nodeb next v ** Q%hS m
S0 :
H0 :
nodeb next v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hk :
keepsbytes8b 8 m store_bytesm b + 8 8 x
Hg :
growsm store_bytesm b + 8 8 x
⊢
nodeb next x ** Q%hS store_bytesm b + 8 8 x

refine proj1writes_star_l_ _ _ _ _ Q Hk Hg HQ _ S H

m :
b :
Z
next :
v, x :
Z
S :
HQ :
Hx :
0 ≤ x < 2 ^ 64
H :
nodeb next v ** Q%hS m
S0 :
H0 :
nodeb next v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hk :
keepsbytes8b 8 m store_bytesm b + 8 8 x
Hg :
growsm store_bytesm b + 8 8 x
⊢
writesbytes8b 8 m store_bytesm b + 8 8 x nodeb next v nodeb next x

unfold node

m :
b :
Z
next :
v, x :
Z
S :
HQ :
Hx :
0 ≤ x < 2 ^ 64
H :
nodeb next v ** Q%hS m
S0 :
H0 :
nodeb next v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hk :
keepsbytes8b 8 m store_bytesm b + 8 8 x
Hg :
growsm store_bytesm b + 8 8 x
⊢
writesbytes8b 8 m store_bytesm b + 8 8 x metab 16 Heap ** liveb ** pcellb 0 next ** icellb 8 v%h metab 16 Heap ** liveb ** pcellb 0 next ** icellb 8 x%h

apply writes_star_r ; exact Hk | exact Hg | apply meta_stable |

m :
b :
Z
next :
v, x :
Z
S :
HQ :
Hx :
0 ≤ x < 2 ^ 64
H :
nodeb next v ** Q%hS m
S0 :
H0 :
nodeb next v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hk :
keepsbytes8b 8 m store_bytesm b + 8 8 x
Hg :
growsm store_bytesm b + 8 8 x
⊢
writesbytes8b 8 m store_bytesm b + 8 8 x liveb ** pcellb 0 next ** icellb 8 v%h liveb ** pcellb 0 next ** icellb 8 x%h

apply writes_star_r ; exact Hk | exact Hg | apply live_stable |

m :
b :
Z
next :
v, x :
Z
S :
HQ :
Hx :
0 ≤ x < 2 ^ 64
H :
nodeb next v ** Q%hS m
S0 :
H0 :
nodeb next v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hk :
keepsbytes8b 8 m store_bytesm b + 8 8 x
Hg :
growsm store_bytesm b + 8 8 x
⊢
writesbytes8b 8 m store_bytesm b + 8 8 x pcellb 0 next ** icellb 8 v%h pcellb 0 next ** icellb 8 x%h

apply writes_star_r ; exact Hk | exact Hg | apply pcell_stable |

m :
b :
Z
next :
v, x :
Z
S :
HQ :
Hx :
0 ≤ x < 2 ^ 64
H :
nodeb next v ** Q%hS m
S0 :
H0 :
nodeb next v S0 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hk :
keepsbytes8b 8 m store_bytesm b + 8 8 x
Hg :
growsm store_bytesm b + 8 8 x
⊢
writesbytes8b 8 m store_bytesm b + 8 8 x icellb 8 v icellb 8 x

apply icell_writes , Hx

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b next v x Q S Hd HQ Hx H
destruct star_elim_l_ _ _ _ H as S0 & H0
pose proof node_region_ _ _ _ _ H0 as Hr
assert Hk : keepsbytes8b 8 m store_bytesm b + 8 8 x by apply store_same_onm b 8 _ x Hd conjHr eq_refl ; cbn ; lia
assert Hg : growsm store_bytesm b + 8 8 x by apply grows_same ; reflexivity
refine proj1writes_star_l_ _ _ _ _ Q Hk Hg HQ _ S H
unfold node
apply writes_star_r ; exact Hk | exact Hg | apply meta_stable |
apply writes_star_r ; exact Hk | exact Hg | apply live_stable |
apply writes_star_r ; exact Hk | exact Hg | apply pcell_stable |
apply icell_writes , Hx

After allocating a 16-byte heap object at a fresh base b, the pieces node_pieces of b make a node with a null next pointer and the value 0: Fil-C's allocation reads as zero, with no stored capability.

818Lemma alloc_node
Explore proof 49 tactics

Initial goal

⊢
∀m : mem b : Z, freshm heap_req16 16 b → nodeb null 0 node_piecesb allocatedm heap_req16 16 b

intros m b Hf

m :
b :
Z
Hf :
freshm heap_req16 16 b

pose proof Hf as _ & _ & _ & _ & _ & Hz

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + req_extentheap_req16 16 → m_bytesm a = 0 ∧ m_auxm a = CNone

cbn [ req_extent heap_req ] in Hz

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 + 15 / 16 × 16 → m_bytesm a = 0 ∧ m_auxm a = CNone

change 16 + 15 / 16 × 16 with 16 in Hz

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone

set m′ := allocatedm heap_req16 16 b

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
⊢

assert Hr : object_regionb m_regionsm′ = SomemkRegionb b + 16 Heap Live by cbn ; rewrite Z.eqb_refl ; reflexivity

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
⊢

assert Hl : ∀reg, live_atm′ b reg → reg = mkRegionb b + 16 Heap Live by intros reg E _ ; rewrite Hr in E ; injection E as ← ; reflexivity

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
⊢

assert Hn : object_regionb m_regionsm′ ≠ None by rewrite Hr ; discriminate

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢

exists λ_ ⇒ False, node_piecesb

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
∀p : piece, node_piecesb p ↔ False ∨ node_piecesb p ∧ ∀p : piece, ¬False ∧ node_piecesb p ∧ metab 16 Heap λ_ : piece ⇒ False m′ ∧ liveb ** pcellb 0 null ** icellb 8 0%hnode_piecesb m′

split ; intros p ; tauto |

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
∀p : piece, ¬False ∧ node_piecesb p ∧ metab 16 Heap λ_ : piece ⇒ False m′ ∧ liveb ** pcellb 0 null ** icellb 8 0%hnode_piecesb m′

split ; intros p ; tauto |

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
metab 16 Heap λ_ : piece ⇒ False m′ ∧ liveb ** pcellb 0 null ** icellb 8 0%hnode_piecesb m′

split

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
metab 16 Heap λ_ : piece ⇒ False m′
focused goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
liveb ** pcellb 0 null ** icellb 8 0%hnode_piecesb m′

{split ; intros p ; tauto |

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
∃reg : region, object_regionb m_regionsm′ = Somereg ∧ r_kindreg = Heap ∧ r_lifereg = Live → r_endreg = b + 16
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
liveb ** pcellb 0 null ** icellb 8 0%hnode_piecesb m′

exists mkRegionb b + 16 Heap Live

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ r_kindr_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Heap ∧ r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live → r_endr_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = b + 16
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
liveb ** pcellb 0 null ** icellb 8 0%hnode_piecesb m′

split ; exact Hr |

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
r_kindr_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Heap ∧ r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live → r_endr_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = b + 16
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
liveb ** pcellb 0 null ** icellb 8 0%hnode_piecesb m′

split ; reflexivity

deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
liveb ** pcellb 0 null ** icellb 8 0%hnode_piecesb m′

exists eqPLiveb, λp ⇒ pcell_piecesb 0 p ∨ bytes8b 8 p

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
∀p : piece, node_piecesb p ↔ PLiveb = p ∨ pcell_piecesb 0 p ∨ bytes8b 8 p ∧ ∀p : piece, ¬PLiveb = p ∧ pcell_piecesb 0 p ∨ bytes8b 8 p ∧ liveb eqPLiveb m′ ∧ pcellb 0 null ** icellb 8 0%hλp : piece ⇒ pcell_piecesb 0 p ∨ bytes8b 8 p m′

split ; intros p ; unfold node_pieces , pcell_pieces ; split ; intros H ; destruct H as [ <-| [ H | [ H | H ] ] ] | destruct H as [ <-| [ [ H | H ] | H ] ] ; tauto |

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
∀p : piece, ¬PLiveb = p ∧ pcell_piecesb 0 p ∨ bytes8b 8 p ∧ liveb eqPLiveb m′ ∧ pcellb 0 null ** icellb 8 0%hλp : piece ⇒ pcell_piecesb 0 p ∨ bytes8b 8 p m′

split ; intros p ← i & _ & E | E | i & _ & E ; discriminate |

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
liveb eqPLiveb m′ ∧ pcellb 0 null ** icellb 8 0%hλp : piece ⇒ pcell_piecesb 0 p ∨ bytes8b 8 p m′

split ; split ; intros p ; tauto | exists mkRegionb b + 16 Heap Live ; split ; exact Hr | reflexivity |

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
pcellb 0 null ** icellb 8 0%hλp : piece ⇒ pcell_piecesb 0 p ∨ bytes8b 8 p m′

exists pcell_piecesb 0, bytes8b 8

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
∀p : piece, pcell_piecesb 0 p ∨ bytes8b 8 p ↔ pcell_piecesb 0 p ∨ bytes8b 8 p ∧ ∀p : piece, ¬pcell_piecesb 0 p ∧ bytes8b 8 p ∧ pcellb 0 null pcell_piecesb 0 m′ ∧ icellb 8 0 bytes8b 8 m′

split ; intros p ; tauto |

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
∀p : piece, ¬pcell_piecesb 0 p ∧ bytes8b 8 p ∧ pcellb 0 null pcell_piecesb 0 m′ ∧ icellb 8 0 bytes8b 8 m′

split ; intros p i & Hi & → | → j & Hj & E′ ; assert 0 + i = 8 + j by congruence ; lia | discriminate |

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
pcellb 0 null pcell_piecesb 0 m′ ∧ icellb 8 0 bytes8b 8 m′

split

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
focused goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

–split ; intros p ; apply iff_refl |

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
object_regionb m_regionsm′ ≠ None ∧ ∀reg : region, live_atm′ b reg → 0 ≤ 0 ∧ b + 0 + 8 ≤ r_endreg ∧ load_bytesm′ b + 0 8 = ptr_addrnull ∧ aux_holdsm′ b + 0 ptr_capnull
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

split ; exact Hn |

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
∀reg : region, live_atm′ b reg → 0 ≤ 0 ∧ b + 0 + 8 ≤ r_endreg ∧ load_bytesm′ b + 0 8 = ptr_addrnull ∧ aux_holdsm′ b + 0 ptr_capnull
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

intros reg Hreg

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
reg :
Hreg :
live_atm′ b reg
⊢
0 ≤ 0 ∧ b + 0 + 8 ≤ r_endreg ∧ load_bytesm′ b + 0 8 = ptr_addrnull ∧ aux_holdsm′ b + 0 ptr_capnull
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

apply Hl in Hreg as →

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
0 ≤ 0 ∧ b + 0 + 8 ≤ r_endr_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm′ b + 0 8 = ptr_addrnull ∧ aux_holdsm′ b + 0 ptr_capnull
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

split ; lia |

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
b + 0 + 8 ≤ r_endr_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm′ b + 0 8 = ptr_addrnull ∧ aux_holdsm′ b + 0 ptr_capnull
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

split ; cbn ; lia |

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
load_bytesm′ b + 0 8 = ptr_addrnull ∧ aux_holdsm′ b + 0 ptr_capnull
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

rewrite Z.add_0_r

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

split

3 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
focused goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

+apply load_bytes_zero

3 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
∀i : Z, 0 ≤ i < 8 → m_bytesm′ b + i = 0
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

intros i Hi

3 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesm′ b + i = 0
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

apply Hzb + i

3 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
i :
Z
Hi :
0 ≤ i < 8
⊢
b ≤ b + i < b + 16
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

lia

2 open

deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

+left

2 open

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

exact proj2Hzb ltac:lia

deferred goal
m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
icellb 8 0 bytes8b 8 m′

–split ; intros p ; tauto |

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
object_regionb m_regionsm′ ≠ None ∧ ∀reg : region, live_atm′ b reg → 0 ≤ 8 ∧ b + 8 + 8 ≤ r_endreg ∧ load_bytesm′ b + 8 8 = 0

split ; exact Hn |

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
∀reg : region, live_atm′ b reg → 0 ≤ 8 ∧ b + 8 + 8 ≤ r_endreg ∧ load_bytesm′ b + 8 8 = 0

intros reg Hreg

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
reg :
Hreg :
live_atm′ b reg
⊢
0 ≤ 8 ∧ b + 8 + 8 ≤ r_endreg ∧ load_bytesm′ b + 8 8 = 0

apply Hl in Hreg as →

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
0 ≤ 8 ∧ b + 8 + 8 ≤ r_endr_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm′ b + 8 8 = 0

split ; lia |

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
b + 8 + 8 ≤ r_endr_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm′ b + 8 8 = 0

split ; cbn ; lia |

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
load_bytesm′ b + 8 8 = 0

apply load_bytes_zero

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
⊢
∀i : Z, 0 ≤ i < 8 → m_bytesm′ b + 8 + i = 0

intros i Hi

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesm′ b + 8 + i = 0

rewrite <- Z.add_assoc

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
i :
Z
Hi :
0 ≤ i < 8
⊢
m_bytesm′ b + 8 + i = 0

apply Hzb + 8 + i

m :
b :
Z
Hf :
freshm heap_req16 16 b
Hz :
∀a : Z, b ≤ a < b + 16 → m_bytesm a = 0 ∧ m_auxm a = CNone
m′ :=
Hr :
object_regionb m_regionsm′ = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hl :
∀reg : region, live_atm′ b reg → reg = r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hn :
object_regionb m_regionsm′ ≠ None
i :
Z
Hi :
0 ≤ i < 8
⊢
b ≤ b + 8 + i < b + 16

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b Hf
pose proof Hf as _ & _ & _ & _ & _ & Hz
cbn [ req_extent heap_req ] in Hz
change 16 + 15 / 16 × 16 with 16 in Hz
set m′ := allocatedm heap_req16 16 b
assert Hr : object_regionb m_regionsm′ = SomemkRegionb b + 16 Heap Live by cbn ; rewrite Z.eqb_refl ; reflexivity
assert Hl : ∀reg, live_atm′ b reg → reg = mkRegionb b + 16 Heap Live by intros reg E _ ; rewrite Hr in E ; injection E as ← ; reflexivity
assert Hn : object_regionb m_regionsm′ ≠ None by rewrite Hr ; discriminate
exists λ_ ⇒ False, node_piecesb
split ; intros p ; tauto |
split ; intros p ; tauto |
split
{split ; intros p ; tauto |
exists mkRegionb b + 16 Heap Live
split ; exact Hr |
split ; reflexivity
exists eqPLiveb, λp ⇒ pcell_piecesb 0 p ∨ bytes8b 8 p
split ; intros p ; unfold node_pieces , pcell_pieces ; split ; intros H ; destruct H as [ <-| [ H | [ H | H ] ] ] | destruct H as [ <-| [ [ H | H ] | H ] ] ; tauto |
split ; intros p ← i & _ & E | E | i & _ & E ; discriminate |
split ; split ; intros p ; tauto | exists mkRegionb b + 16 Heap Live ; split ; exact Hr | reflexivity |
exists pcell_piecesb 0, bytes8b 8
split ; intros p ; tauto |
split ; intros p i & Hi & → | → j & Hj & E′ ; assert 0 + i = 8 + j by congruence ; lia | discriminate |
split
–split ; intros p ; apply iff_refl |
split ; exact Hn |
intros reg Hreg
apply Hl in Hreg as →
split ; lia |
split ; cbn ; lia |
rewrite Z.add_0_r
split
intros i Hi
apply Hzb + i
lia
+left
exact proj2Hzb ltac:lia
–split ; intros p ; tauto |
split ; exact Hn |
intros reg Hreg
apply Hl in Hreg as →
split ; lia |
split ; cbn ; lia |
intros i Hi
rewrite <- Z.add_assoc
apply Hzb + 8 + i
lia

Allocating a node at a fresh base adds it to any stable assertion P of pieces of objects: the new pieces are disjoint from P's, since no one owned the new identity.

851Lemma alloc_frame
∀ m b P S
nodeb null 0 ** P%hλp ⇒ node_piecesb p ∨ Sp allocatedm heap_req16 16 b
Explore proof 9 tactics

Initial goal

⊢
∀m : mem b : Z P : hprop S : fp, freshm heap_req16 16 b → stableP → owns_registeredP → PS m → nodeb null 0 ** P%hλp : piece ⇒ node_piecesb p ∨ Sp allocatedm heap_req16 16 b

intros m b P S Hf HP Hreg H

m :
b :
Z
S :
Hf :
freshm heap_req16 16 b
HP :
H :
PS m
⊢
nodeb null 0 ** P%hλp : piece ⇒ node_piecesb p ∨ Sp allocatedm heap_req16 16 b

exists node_piecesb, S

m :
b :
Z
S :
Hf :
freshm heap_req16 16 b
HP :
H :
PS m
⊢
∀p : piece, node_piecesb p ∨ Sp ↔ node_piecesb p ∨ Sp ∧ ∀p : piece, ¬node_piecesb p ∧ Sp ∧ nodeb null 0 node_piecesb allocatedm heap_req16 16 b ∧ PS allocatedm heap_req16 16 b

split ; intros p ; tauto |

m :
b :
Z
S :
Hf :
freshm heap_req16 16 b
HP :
H :
PS m
⊢
∀p : piece, ¬node_piecesb p ∧ Sp ∧ nodeb null 0 node_piecesb allocatedm heap_req16 16 b ∧ PS allocatedm heap_req16 16 b

split

2 open

m :
b :
Z
S :
Hf :
freshm heap_req16 16 b
HP :
H :
PS m
⊢
∀p : piece, ¬node_piecesb p ∧ Sp
focused goal
m :
b :
Z
S :
Hf :
freshm heap_req16 16 b
HP :
H :
PS m
⊢

–intros p Hn Hs

2 open

m :
b :
Z
S :
Hf :
freshm heap_req16 16 b
HP :
H :
PS m
Hs :
Sp
⊢
False
deferred goal
m :
b :
Z
S :
Hf :
freshm heap_req16 16 b
HP :
H :
PS m
⊢

apply registered_freshS m _ b p Hreg_ _ H Hf Hs

2 open

m :
b :
Z
S :
Hf :
freshm heap_req16 16 b
HP :
H :
PS m
Hs :
Sp
⊢
piece_idp = b
deferred goal
m :
b :
Z
S :
Hf :
freshm heap_req16 16 b
HP :
H :
PS m
⊢

destruct Hn as [ ->| [ ( i & _ & -> ) | [ ->| ( i & _ & -> ) ] ] ] ; reflexivity

deferred goal
m :
b :
Z
S :
Hf :
freshm heap_req16 16 b
HP :
H :
PS m
⊢

–split ; exact alloc_nodem b Hf |

m :
b :
Z
S :
Hf :
freshm heap_req16 16 b
HP :
H :
PS m
⊢
PS allocatedm heap_req16 16 b

exact HPS m _ H alloc_same_onS m _ b Hf alloc_growsm _ b Hf

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b P S Hf HP Hreg H
exists node_piecesb, S
split ; intros p ; tauto |
split
–intros p Hn Hs
apply registered_freshS m _ b p Hreg_ _ H Hf Hs
destruct Hn as [ ->| [ ( i & _ & -> ) | [ ->| ( i & _ & -> ) ] ] ] ; reflexivity
–split ; exact alloc_nodem b Hf |
exact HPS m _ H alloc_same_onS m _ b Hf alloc_growsm _ b Hf

The list

The empty list at null owns nothing.

863Lemma lst_nil
∀ m
lstnull [ ] λ_ ⇒ False m
Explore proof 2 tactics

Initial goal

⊢
∀m : mem, lstnull [ ] λ_ : piece ⇒ False m

intros m

m :
⊢
lstnull [ ] λ_ : piece ⇒ False m

split ; intros p ; tauto | reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m
split ; intros p ; tauto | reflexivity

A nonempty list is a lst_cons for some next pointer.

867Lemma lst_cons_iff
∀ p v xs S m
lstp v :: xs S m ↔ ∃next, lst_consp v next xs S m
Explore proof 2 tactics

Initial goal

⊢
∀p : ptr v : Z xs : listZ S : fp m : mem, lstp v :: xs S m ↔ ∃next : ptr, lst_consp v next xs S m

intros

p :
v :
Z
xs :
listZ
S :
m :
⊢
lstp v :: xs S m ↔ ∃next : ptr, lst_consp v next xs S m

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros
reflexivity

A list's pointer is null, or a live object's capability.

871Lemma lst_cap
∀ xs p S m
lstp xs S m
ptr_capp = CNone ∨ ∃b reg, ptr_capp = Objb ∧ live_atm b reg
Explore proof 11 tactics

Initial goal

⊢
∀xs : listZ p : ptr S : fp m : mem, lstp xs S m → ptr_capp = CNone ∨ ∃b : Z reg : region, ptr_capp = Objb ∧ live_atm b reg

intros | v xs p S m H ; cbn [ lst ] in H

2 open

p :
S :
m :
H :
purep = null S m
⊢
ptr_capp = CNone ∨ ∃b : Z reg : region, ptr_capp = Objb ∧ live_atm b reg
focused goal
v :
Z
xs :
listZ
p :
S :
m :
H :
hexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h S m
⊢
ptr_capp = CNone ∨ ∃b : Z reg : region, ptr_capp = Objb ∧ live_atm b reg

–destruct H as _ →

2 open

S :
m :
⊢
ptr_capnull = CNone ∨ ∃b : Z reg : region, ptr_capnull = Objb ∧ live_atm b reg
deferred goal
v :
Z
xs :
listZ
p :
S :
m :
H :
hexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h S m
⊢
ptr_capp = CNone ∨ ∃b : Z reg : region, ptr_capp = Objb ∧ live_atm b reg

left

2 open

deferred goal
v :
Z
xs :
listZ
p :
S :
m :
H :
hexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h S m
⊢
ptr_capp = CNone ∨ ∃b : Z reg : region, ptr_capp = Objb ∧ live_atm b reg

reflexivity

deferred goal
v :
Z
xs :
listZ
p :
S :
m :
H :
hexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h S m
⊢
ptr_capp = CNone ∨ ∃b : Z reg : region, ptr_capp = Objb ∧ live_atm b reg

–destruct H as next & S1 & S2 & _ & _ & _ & Hp & _ & H2

v :
Z
xs :
listZ
p :
S :
m :
next :
S1, S2 :
piece → Prop
Hp :
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
⊢
ptr_capp = CNone ∨ ∃b : Z reg : region, ptr_capp = Objb ∧ live_atm b reg

right

v :
Z
xs :
listZ
p :
S :
m :
next :
S1, S2 :
piece → Prop
Hp :
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
⊢
∃b : Z reg : region, ptr_capp = Objb ∧ live_atm b reg

destruct star_elim_l_ _ _ _ H2 as S3 & H3

v :
Z
xs :
listZ
p :
S :
m :
next :
S1, S2 :
piece → Prop
Hp :
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
⊢
∃b : Z reg : region, ptr_capp = Objb ∧ live_atm b reg

exists ptr_addrp, mkRegionptr_addrp ptr_addrp + 16 Heap Live

v :
Z
xs :
listZ
p :
S :
m :
next :
S1, S2 :
piece → Prop
Hp :
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
⊢
ptr_capp = Objptr_addrp ∧ live_atm ptr_addrp r_base ≔ ptr_addrp; r_end ≔ ptr_addrp + 16; r_kind ≔ Heap; r_life ≔ Live

rewrite Hp at 1

v :
Z
xs :
listZ
p :
S :
m :
next :
S1, S2 :
piece → Prop
Hp :
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m

split ; reflexivity |

v :
Z
xs :
listZ
p :
S :
m :
next :
S1, S2 :
piece → Prop
Hp :
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
⊢
live_atm ptr_addrp r_base ≔ ptr_addrp; r_end ≔ ptr_addrp + 16; r_kind ≔ Heap; r_life ≔ Live

split ; exact node_region_ _ _ _ _ H3 | reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros | v xs p S m H ; cbn [ lst ] in H
–destruct H as _ →
left
reflexivity
–destruct H as next & S1 & S2 & _ & _ & _ & Hp & _ & H2
right
destruct star_elim_l_ _ _ _ H2 as S3 & H3
rewrite Hp at 1
split ; reflexivity |
split ; exact node_region_ _ _ _ _ H3 | reflexivity

A list's address is 0 or a node's, inside the address space when every object is (objects_fit).

883Lemma lst_range
∀ xs p S m
0 ≤ ptr_addrp < 2 ^ 48
Explore proof 9 tactics

Initial goal

⊢
∀xs : listZ p : ptr S : fp m : mem, objects_fitm_regionsm → lstp xs S m → 0 ≤ ptr_addrp < 2 ^ 48

intros | v xs p S m Hfit H ; cbn [ lst ] in H

2 open

p :
S :
m :
H :
purep = null S m
⊢
0 ≤ ptr_addrp < 2 ^ 48
focused goal
v :
Z
xs :
listZ
p :
S :
m :
H :
hexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h S m
⊢
0 ≤ ptr_addrp < 2 ^ 48

–destruct H as _ →

2 open

⊢
0 ≤ ptr_addrnull < 2 ^ 48
deferred goal
v :
Z
xs :
listZ
p :
S :
m :
H :
hexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h S m
⊢
0 ≤ ptr_addrp < 2 ^ 48

cbn

2 open

⊢
0 ≤ 0 < 281474976710656
deferred goal
v :
Z
xs :
listZ
p :
S :
m :
H :
hexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h S m
⊢
0 ≤ ptr_addrp < 2 ^ 48

lia

deferred goal
v :
Z
xs :
listZ
p :
S :
m :
H :
hexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs%h S m
⊢
0 ≤ ptr_addrp < 2 ^ 48

–destruct H as next & S1 & S2 & _ & _ & _ & _ & Hpos & _ & H2

v :
Z
xs :
listZ
p :
S :
m :
next :
S1, S2 :
piece → Prop
Hpos :
0 < ptr_addrp
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
⊢
0 ≤ ptr_addrp < 2 ^ 48

destruct star_elim_l_ _ _ _ H2 as S3 & H3

v :
Z
xs :
listZ
p :
S :
m :
next :
S1, S2 :
piece → Prop
Hpos :
0 < ptr_addrp
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
⊢
0 ≤ ptr_addrp < 2 ^ 48

destruct Hfit_ _ node_region_ _ _ _ _ H3

v :
Z
xs :
listZ
p :
S :
m :
next :
S1, S2 :
piece → Prop
Hpos :
0 < ptr_addrp
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
H :
0 ≤ ptr_addrp
H0 :
r_endr_base ≔ ptr_addrp; r_end ≔ ptr_addrp + 16; r_kind ≔ Heap; r_life ≔ Live ≤ 2 ^ 48
⊢
0 ≤ ptr_addrp < 2 ^ 48

cbn in *

v :
Z
xs :
listZ
p :
S :
m :
next :
S1, S2 :
piece → Prop
Hpos :
0 < ptr_addrp
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
H :
0 ≤ ptr_addrp
H0 :
ptr_addrp + 16 ≤ 281474976710656
⊢
0 ≤ ptr_addrp < 281474976710656

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros | v xs p S m Hfit H ; cbn [ lst ] in H
–destruct H as _ →
cbn
lia
–destruct H as next & S1 & S2 & _ & _ & _ & _ & Hpos & _ & H2
destruct star_elim_l_ _ _ _ H2 as S3 & H3
destruct Hfit_ _ node_region_ _ _ _ _ H3
cbn in *
lia

A list at a nonzero address is a node and the rest.

892Lemma lst_nonnull
∀ xs p R S m
ptr_addrp ≠ 0
lstp xs ** R%hS m
∃v next xs′, lst_consp v next xs′ ** R%hS m
Explore proof 8 tactics

Initial goal

⊢
∀xs : listZ p : ptr R : hprop S : fp m : mem, ptr_addrp ≠ 0 → lstp xs ** R%hS m → ∃v : Z next : ptr xs′ : listZ, lst_consp v next xs′ ** R%hS m

intros | v xs p R S m Hp H

2 open

p :
S :
m :
Hp :
ptr_addrp ≠ 0
H :
lstp [ ] ** R%hS m
⊢
∃v : Z next : ptr xs′ : listZ, lst_consp v next xs′ ** R%hS m
focused goal
v :
Z
xs :
listZ
p :
S :
m :
Hp :
ptr_addrp ≠ 0
H :
lstp v :: xs ** R%hS m
⊢
∃v0 : Z next : ptr xs′ : listZ, lst_consp v0 next xs′ ** R%hS m

–destruct star_elim_l_ _ _ _ H as S1 & _ & →

2 open

S :
m :
H :
lstnull [ ] ** R%hS m
Hp :
S1 :
⊢
∃v : Z next : ptr xs′ : listZ, lst_consnull v next xs′ ** R%hS m
deferred goal
v :
Z
xs :
listZ
p :
S :
m :
Hp :
ptr_addrp ≠ 0
H :
lstp v :: xs ** R%hS m
⊢
∃v0 : Z next : ptr xs′ : listZ, lst_consp v0 next xs′ ** R%hS m

cbn in Hp

2 open

S :
m :
H :
lstnull [ ] ** R%hS m
Hp :
0 ≠ 0
S1 :
⊢
∃v : Z next : ptr xs′ : listZ, lst_consnull v next xs′ ** R%hS m
deferred goal
v :
Z
xs :
listZ
p :
S :
m :
Hp :
ptr_addrp ≠ 0
H :
lstp v :: xs ** R%hS m
⊢
∃v0 : Z next : ptr xs′ : listZ, lst_consp v0 next xs′ ** R%hS m

lia

deferred goal
v :
Z
xs :
listZ
p :
S :
m :
Hp :
ptr_addrp ≠ 0
H :
lstp v :: xs ** R%hS m
⊢
∃v0 : Z next : ptr xs′ : listZ, lst_consp v0 next xs′ ** R%hS m

–cbn [ lst ] in H

v :
Z
xs :
listZ
p :
S :
m :
Hp :
ptr_addrp ≠ 0
H :
hexλnext : ptr ⇒ purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs ** R%hS m
⊢
∃v0 : Z next : ptr xs′ : listZ, lst_consp v0 next xs′ ** R%hS m

apply star_hex_l in H as next & H

v :
Z
xs :
listZ
p :
S :
m :
Hp :
ptr_addrp ≠ 0
next :
H :
purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs ** R%hS m
⊢
∃v0 : Z next0 : ptr xs′ : listZ, lst_consp v0 next0 xs′ ** R%hS m

exists v, next, xs

v :
Z
xs :
listZ
p :
S :
m :
Hp :
ptr_addrp ≠ 0
next :
H :
purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs ** R%hS m
⊢
lst_consp v next xs ** R%hS m

exact H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros | v xs p R S m Hp H
–destruct star_elim_l_ _ _ _ H as S1 & _ & →
cbn in Hp
lia
–cbn [ lst ] in H
apply star_hex_l in H as next & H
exists v, next, xs
exact H

What a node of a list gives a step that reads it: its address a, aligned, inside the address space, a live 16-byte heap object whose next slot holds next, address in the bytes and capability, exactly, in the aux.

904Lemma lst_cons_facts
∀ p v next xs R S m
lst_consp v next xs ** R%hS m
∃a, p = mkPtra Obja ∧ 0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = SomemkRegiona a + 16 Heap Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext
Explore proof 15 tactics

Initial goal

⊢
∀p : ptr v : Z next : ptr xs : listZ R : hprop S : fp m : mem, objects_fitm_regionsm → lst_consp v next xs ** R%hS m → ∃a : Z, p = ptr_addr ≔ a; ptr_cap ≔ Obja ∧ 0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext

intros p v next xs R S m Hfit H

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
⊢
∃a : Z, p = ptr_addr ≔ a; ptr_cap ≔ Obja ∧ 0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext

destruct star_elim_l_ _ _ _ H as S0 & S1 & S2 & _ & _ & _ & Hp & Hpos & Hal & H2

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
⊢
∃a : Z, p = ptr_addr ≔ a; ptr_cap ≔ Obja ∧ 0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext

destruct star_elim_l_ _ _ _ H2 as S3 & H3

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
⊢
∃a : Z, p = ptr_addr ≔ a; ptr_cap ≔ Obja ∧ 0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext

destruct star_elim_r_ _ _ _ H2 as S4 & H4

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
S4 :
H4 :
lstnext xs S4 m
⊢
∃a : Z, p = ptr_addr ≔ a; ptr_cap ≔ Obja ∧ 0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext

pose proof node_region_ _ _ _ _ H3 as Hr

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
S4 :
H4 :
lstnext xs S4 m
Hr :
⊢
∃a : Z, p = ptr_addr ≔ a; ptr_cap ≔ Obja ∧ 0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext

destruct node_next_ _ _ _ _ H3 as Hv Ha

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
S4 :
H4 :
lstnext xs S4 m
Hr :
⊢
∃a : Z, p = ptr_addr ≔ a; ptr_cap ≔ Obja ∧ 0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext

exists ptr_addrp

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
S4 :
H4 :
lstnext xs S4 m
Hr :
⊢
p = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ∧ ptr_addrp + 16 ≤ 2 ^ 48 ∧ object_regionptr_addrp m_regionsm = Somer_base ≔ ptr_addrp; r_end ≔ ptr_addrp + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm ptr_addrp 8 = ptr_addrnext ∧ m_auxm ptr_addrp = ptr_capnext

split ; exact Hp |

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
S4 :
H4 :
lstnext xs S4 m
Hr :
⊢
0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ∧ ptr_addrp + 16 ≤ 2 ^ 48 ∧ object_regionptr_addrp m_regionsm = Somer_base ≔ ptr_addrp; r_end ≔ ptr_addrp + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm ptr_addrp 8 = ptr_addrnext ∧ m_auxm ptr_addrp = ptr_capnext

split ; exact Hpos |

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
S4 :
H4 :
lstnext xs S4 m
Hr :
⊢
ptr_addrp mod 8 = 0 ∧ ptr_addrp + 16 ≤ 2 ^ 48 ∧ object_regionptr_addrp m_regionsm = Somer_base ≔ ptr_addrp; r_end ≔ ptr_addrp + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm ptr_addrp 8 = ptr_addrnext ∧ m_auxm ptr_addrp = ptr_capnext

split ; exact Hal |

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
S4 :
H4 :
lstnext xs S4 m
Hr :
⊢
ptr_addrp + 16 ≤ 2 ^ 48 ∧ object_regionptr_addrp m_regionsm = Somer_base ≔ ptr_addrp; r_end ≔ ptr_addrp + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm ptr_addrp 8 = ptr_addrnext ∧ m_auxm ptr_addrp = ptr_capnext

split ; destruct Hfit_ _ Hr ; cbn in * ; lia |

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
S4 :
H4 :
lstnext xs S4 m
Hr :
⊢
object_regionptr_addrp m_regionsm = Somer_base ≔ ptr_addrp; r_end ≔ ptr_addrp + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm ptr_addrp 8 = ptr_addrnext ∧ m_auxm ptr_addrp = ptr_capnext

split ; exact Hr |

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
S4 :
H4 :
lstnext xs S4 m
Hr :
⊢

split ; exact Hv |

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
S4 :
H4 :
lstnext xs S4 m
Hr :
⊢

apply aux_holds_live_ _ _ Ha

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** R%hS m
S0 :
S1, S2 :
piece → Prop
Hp :
Hpos :
0 < ptr_addrp
Hal :
ptr_addrp mod 8 = 0
H2 :
nodeptr_addrp next v ** lstnext xs%hS2 m
S3 :
H3 :
nodeptr_addrp next v S3 m
S4 :
H4 :
lstnext xs S4 m
Hr :
⊢
ptr_capnext = CNone ∨ ∃b : Z reg : region, ptr_capnext = Objb ∧ live_atm b reg

exact lst_cap_ _ _ _ H4

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros p v next xs R S m Hfit H
destruct star_elim_l_ _ _ _ H as S0 & S1 & S2 & _ & _ & _ & Hp & Hpos & Hal & H2
destruct star_elim_l_ _ _ _ H2 as S3 & H3
destruct star_elim_r_ _ _ _ H2 as S4 & H4
pose proof node_region_ _ _ _ _ H3 as Hr
destruct node_next_ _ _ _ _ H3 as Hv Ha
exists ptr_addrp
split ; exact Hp |
split ; exact Hpos |
split ; exact Hal |
split ; destruct Hfit_ _ Hr ; cbn in * ; lia |
split ; exact Hr |
split ; exact Hv |
apply aux_holds_live_ _ _ Ha
exact lst_cap_ _ _ _ H4

A node and the rest of a list make a list one longer.

918Lemma lst_cons_intro
∀ b h v xs S m
0 < b
b mod 8 = 0
nodeb h v ** lsth xs%hS m
lstmkPtrb Objb v :: xs S m
Explore proof 6 tactics

Initial goal

⊢
∀b : Z h : ptr v : Z xs : listZ S : fp m : mem, 0 < b → b mod 8 = 0 → nodeb h v ** lsth xs%hS m → lstptr_addr ≔ b; ptr_cap ≔ Objb v :: xs S m

intros b h v xs S m Hb Hal H

b :
Z
h :
v :
Z
xs :
listZ
S :
m :
Hb :
0 < b
Hal :
b mod 8 = 0
H :
nodeb h v ** lsth xs%hS m
⊢
lstptr_addr ≔ b; ptr_cap ≔ Objb v :: xs S m

cbn [ lst ]

b :
Z
h :
v :
Z
xs :
listZ
S :
m :
Hb :
0 < b
Hal :
b mod 8 = 0
H :
nodeb h v ** lsth xs%hS m
⊢
hexλnext : ptr ⇒ pureptr_addr ≔ b; ptr_cap ≔ Objb = ptr_addr ≔ ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb; ptr_cap ≔ Objptr_addrptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb ∧ ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb mod 8 = 0 ** nodeptr_addrptr_addr ≔ b; ptr_cap ≔ Objb next v ** lstnext xs%h S m

exists h

b :
Z
h :
v :
Z
xs :
listZ
S :
m :
Hb :
0 < b
Hal :
b mod 8 = 0
H :
nodeb h v ** lsth xs%hS m
⊢
pureptr_addr ≔ b; ptr_cap ≔ Objb = ptr_addr ≔ ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb; ptr_cap ≔ Objptr_addrptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb ∧ ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb mod 8 = 0 ** nodeptr_addrptr_addr ≔ b; ptr_cap ≔ Objb h v ** lsth xs%hS m

apply star_pure_intro ; | exact H

b :
Z
h :
v :
Z
xs :
listZ
S :
m :
Hb :
0 < b
Hal :
b mod 8 = 0
H :
nodeb h v ** lsth xs%hS m
⊢
ptr_addr ≔ b; ptr_cap ≔ Objb = ptr_addr ≔ ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb; ptr_cap ≔ Objptr_addrptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb ∧ ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb mod 8 = 0

cbn

b :
Z
h :
v :
Z
xs :
listZ
S :
m :
Hb :
0 < b
Hal :
b mod 8 = 0
H :
nodeb h v ** lsth xs%hS m
⊢
ptr_addr ≔ b; ptr_cap ≔ Objb = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b mod 8 = 0

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b h v xs S m Hb Hal H
cbn [ lst ]
exists h
apply star_pure_intro ; | exact H
cbn
auto

Walking past a node drops it, and its pure facts, into htrue.

926Lemma lst_cons_drop
∀ p v next xs F S m
lst_consp v next xs ** htrue ** F%hS m
lstnext xs ** htrue ** F%hS m
Explore proof 11 tactics

Initial goal

⊢
∀p : ptr v : Z next : ptr xs : listZ F : hprop S : fp m : mem, lst_consp v next xs ** htrue ** F%hS m → lstnext xs ** htrue ** F%hS m

intros p v next xs F S m H

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consp v next xs ** htrue ** F%hS m
⊢
lstnext xs ** htrue ** F%hS m

unfold lst_cons in H

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs ** htrue ** F%hS m
⊢
lstnext xs ** htrue ** F%hS m

apply star_assoc_r in H

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs ** htrue ** F%hS m
⊢
lstnext xs ** htrue ** F%hS m

apply star_mono_r_ _ _ _ _ star_assoc_r_ _ _ in H

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** lstnext xs ** htrue ** F%hS m
⊢
lstnext xs ** htrue ** F%hS m

apply star_mono_r_ _ _ _ _ star_swap_ _ _ in H

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** lstnext xs ** nodeptr_addrp next v ** htrue ** F%hS m
⊢
lstnext xs ** htrue ** F%hS m

apply star_swap in H

p :
v :
Z
next :
xs :
listZ
S :
m :
H :
lstnext xs ** purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** htrue ** F%hS m
⊢
lstnext xs ** htrue ** F%hS m

revert H

p :
v :
Z
next :
xs :
listZ
S :
m :
⊢
lstnext xs ** purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** htrue ** F%hS m → lstnext xs ** htrue ** F%hS m

apply star_mono_r

p :
v :
Z
next :
xs :
listZ
S :
m :
⊢
∀S0 : fp m0 : mem, purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** htrue ** F%hS0 m0 → htrue ** F%hS0 m0

intros S0 m0 H

p :
v :
Z
next :
xs :
listZ
S :
m :
S0 :
m0 :
H :
purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** nodeptr_addrp next v ** htrue ** F%hS0 m0
⊢
htrue ** F%hS0 m0

apply star_mono_r_ _ _ _ _ λS1 m1 ⇒ htrue_absorb_ _ S1 m1 node_registered_ _ _ in H

p :
v :
Z
next :
xs :
listZ
S :
m :
S0 :
m0 :
H :
purep = ptr_addr ≔ ptr_addrp; ptr_cap ≔ Objptr_addrp ∧ 0 < ptr_addrp ∧ ptr_addrp mod 8 = 0 ** λS1 : fp m1 : mem ⇒ htrue ** FS1 m1%hS0 m0
⊢
htrue ** F%hS0 m0

exact htrue_absorb_ _ _ _ pure_registered_ H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros p v next xs F S m H
unfold lst_cons in H
apply star_assoc_r in H
apply star_mono_r_ _ _ _ _ star_assoc_r_ _ _ in H
apply star_mono_r_ _ _ _ _ star_swap_ _ _ in H
apply star_swap in H
revert H
intros S0 m0 H
apply star_mono_r_ _ _ _ _ λS1 m1 ⇒ htrue_absorb_ _ S1 m1 node_registered_ _ _ in H