Fil-C on Nix

Filnix wiki

the formal campaign

rocq/theories/Renew.v

Campaign 3's reuse forms, part two: renew, renew over a hull and half check (formal.md, Campaign 3; rocq.md, Renew and the half check).

All three reuse a check that passed earlier. A renew of a pointer P trusts Q1, the proof of a single-definition check of a pointer P1 (a renew source, renew_source_op/6), whose span covers P's at the distance pointer_distance/4 finds. A half check of P trusts the same kind of source for the bound it does not test (half_known/6). A renew over a hull trusts two sources, QL and QH, whose spans bound P's from below and above (hull_renewable/8). The interpreter makes the run unchecked where that trust was false: Q1 of another capability (unchecked(alias)), a renew whose access test fails but not because the object was freed (unchecked(span)), or a half check whose one-sided native test disagrees with the whole check (unchecked(half)). This file proves none of them happens where the pass accepted the instruction.

The argument is the same for all three. Q1 is an operand of the instruction, so its single definition dominates it and replays (Single.v): Q1 holds the pointer P1 held when its check passed, and memory persists from then, so the object is as it was or freed. P is a known distance from P1, so it has P1's capability (Chain.v). What is left is arithmetic over cap_access_res/7.

Decisions

DecisionWhy
the source's rights are not useda renew asks its own rights; on a read-only object a write traps readonly, which renew_res/4 keeps as the program's trap
the persisting object is split by cases, not read through persists_accessa renew's trap must be on a freed object, which persists_access's conclusion forgets
the source's memory fit the address space (Single.v's replays)once the object is freed, the current memory no longer says where it ended, and a lower half check's address may wrap
objects start at or above 0 and freed objects are empty (objects_fit, freed_bounds)a lower half check reads its address signed and fails on any freed object; the whole check agrees only then
a renew over a hull compares its two sources only through the current memoryeach source's check passed in its own memory, and both persist into the current one, so the object is as both saw it or freed since
an instruction of another class or arity is not the pass's concernit does not step (reuse_shape)
From Stdlib Require Import String ZArith List Bool Lia
From Nanofil Require Import Term Maps Syntax Cfg Values Memory Runtime Ops Semantics Machine Validate Dominance Interval Sites Identity Coverage Walk Invariant Persistence Single Evidence Chain
Import ListNotations
Open Scope Z_scope

Renew sources

A renew source n1 that the pass records for a function f of a module md, of a pointer p1 over the span from lo1 up to hi1 at alignment al1, is the check-like instruction i that is n1's single definition, and p1 is a single-definition name too (stage_sources/4). check_fact reads the span i checks.

53Lemma renew_source_def
∀ md f n1 p1 lo1 hi1 al1
lookupn1 s_renewsfn_srcmd f = Somep1, lo1, hi1, al1
∃i r1, lookupn1 single_definitionsf = SomeDInsti ∧ check_facti = SomemkFactn1 Tmpp1 lo1 hi1 r1 al1 ∧ once_hassingle_definitionsf p1 = true
Proof 28 steps Qed
intros md f n1 p1 lo1 hi1 al1 H
destruct fn_src_casesmd f as _ Esj | _ Esj ; rewrite Esj in H ; cbn [ s_renews ] in H ; discriminate H |
destruct lookup_some_in_ _ _ _ H as n1′ & En & Hin
apply name_eqb_true in En
subst n1'
apply in_flat_map in Hin as b & Hb & Hin
apply in_flat_map in Hin as i & Hi & Hin
destruct renew_sourcesingle_definitionsf i as q1 v | eqn: Er ; | destruct Hin
destruct Hin as E |
injection E as → →
unfold renew_source in Er
destruct i as q k o args | | | | | | | | ; try discriminate Er
destruct k ; try destruct o ; discriminate Er

Each of the five source ops (check, check_ahead, renew_if, check_limit, half_check) has the fact its source records, so it is enough that the source instruction is n1's single definition.

assert G : ∀p lo hi r al, check_factLetq A o args = SomemkFactq Tmpp lo hi r al → once_hassingle_definitionsf q && once_hassingle_definitionsf p = true → q = n1 → p = p1 → lo = lo1 → hi = hi1 → al = al1 → ∃i r1, lookupn1 single_definitionsf = SomeDInsti ∧ check_facti = SomemkFactn1 Tmpp1 lo1 hi1 r1 al1 ∧ once_hassingle_definitionsf p1 = true
{intros p lo hi r al Hf Ho → → → → →
apply andb_true_iff in Ho as Hq Hp
unfold once_has in Hq
destruct lookupn1 single_definitionsf as D | eqn: Ed ; | discriminate Hq
destruct once_position_ _ _ Ed as s & _ & Hu
destruct In_nth_error_ _ Hi as kk Hk
pose proof inst_positionf b kk Letn1 A o args n1, A Hb Hk or_introleq_refl as Hpos
destruct Hu_ _ Hpos as _ ←
exists Letn1 A o args, r
auto
destruct o ; cbn - [ once_has ] in Er ; try discriminate Er ; cases Er
all: injection Er as → → → → →
all: match goal withHo : match _ with _ ⇒ _ end = Some_ |- _⇒cases Ho ; injection Ho as → → → →end
all: eapply G ; eauto ; reflexivity

Every instruction i of a block b of a function f of a checked_module md passes the validator's per-instruction test valid_inst/3 at some list of classes cls.

93Lemma inst_valid
∀ md f b i
∃cls, valid_instmd cls i = true
Explore proof 16 tactics

Initial goal

⊢
∀md : module f : func b : block i : inst, checked_modulemd → InIFuncf md → Inb fn_blocksf → Ini b_instsb → ∃cls : listname × class, valid_instmd cls i = true

unfold checked_module , valid

⊢
∀ md : module f : func b : block i : inst  ,
existsb
λ it : item  ⇒
match it with
⇒
true
_
⇒
false
md
→
None
else
=
Sometrue
∧
module_checkedmd = true
→
InIFuncf md → Inb fn_blocksf → Ini b_instsb → ∃cls : listname × class, valid_instmd cls i = true

intros md f b i Hv _ Hin Hb Hi

md :
f :
i :
Hv :
existsb
λ it : item  ⇒
match it with
⇒
true
_
⇒
false
md
→
None
else
=
Sometrue
Hin :
InIFuncf md
Hb :
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

destruct existsb_ md ; discriminate Hv |

md :
f :
i :
Hv :
Somevalid_itemsmd = Sometrue
Hin :
InIFuncf md
Hb :
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

injection Hv as Hv

md :
f :
i :
Hv :
valid_itemsmd = true
Hin :
InIFuncf md
Hb :
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

unfold valid_items in Hv

md :
f :
i :
Hv :
&&
forallb
λ it : item  ⇒
match it with
⇒
true
IDatan lk al its
⇒
valid_datamd n lk al its
IAliasn lk t
⇒
valid_aliasmd n lk t
md
=
true
Hin :
InIFuncf md
Hb :
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

apply andb_true_iff in Hv as _ Hv

md :
f :
i :
Hv :
forallb
λ it : item  ⇒
match it with
⇒
true
IDatan lk al its
⇒
valid_datamd n lk al its
IAliasn lk t
⇒
valid_aliasmd n lk t
md
=
true
Hin :
InIFuncf md
Hb :
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

rewrite forallb_forall in Hv

md :
f :
i :
Hv :
∀ x : item  ,
Inx md
→
match x with
⇒
true
IDatan lk al its
⇒
valid_datamd n lk al its
IAliasn lk t
⇒
valid_aliasmd n lk t
=
true
Hin :
InIFuncf md
Hb :
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

specialize Hv_ Hin

md :
f :
i :
Hv :
match IFuncf with
⇒
true
IDatan lk al its
⇒
valid_datamd n lk al its
IAliasn lk t
⇒
valid_aliasmd n lk t
=
true
Hin :
InIFuncf md
Hb :
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

simpl in Hv

md :
f :
i :
Hv :
valid_funcmd f = true
Hin :
InIFuncf md
Hb :
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

unfold valid_func in Hv

md :
f :
i :
Hv :
match fn_blocksf with
[ ]
⇒
false
entry :: l
⇒
match block_intervalsentry :: l with
Somedoms
⇒
match fn_linkagef with
TAtom"weak" | TAtom"export" | TAtom"local"
⇒
true
_
⇒
false
&&
match fn_retf with
⇒
true
⇒
Datatypes.lengthks =? 2%nat && forallbλk : class ⇒ existsbclass_eqbk L; P; Single; Double ks
&&
&&
&&
&&
negbexistsbλb : block ⇒ memb_labelentry succ_labelsb_jumpb fn_blocksf
&&
&&
&&
&&
&&
negbmodule_checkedmd || stage_funcmd f doms
None
⇒
false
=
true
Hin :
InIFuncf md
Hb :
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

destruct fn_blocksf as | b0 bs eqn: Eb ; destruct Hb |

md :
f :
i :
b0 :
bs :
listblock
Eb :
fn_blocksf = b0 :: bs
Hv :
match block_intervalsb0 :: bs with
Somedoms
⇒
match fn_linkagef with
TAtom"weak" | TAtom"export" | TAtom"local"
⇒
true
_
⇒
false
&&
match fn_retf with
⇒
true
⇒
Datatypes.lengthks =? 2%nat && forallbλk : class ⇒ existsbclass_eqbk L; P; Single; Double ks
&&
&&
no_dupsmapb_label b0 :: bs
&&
&&
negbexistsbλb : block ⇒ memb_labelb0 succ_labelsb_jumpb b0 :: bs
&&
&&
&&
&&
forallbvalid_blockmd f temp_defsf b0 :: bs
&&
negbmodule_checkedmd || stage_funcmd f doms
None
⇒
false
=
true
Hin :
InIFuncf md
Hb :
Inb b0 :: bs
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

destruct block_intervalsb0 :: bs ; | discriminate Hv

md :
f :
i :
b0 :
bs :
listblock
Eb :
fn_blocksf = b0 :: bs
n :
nmapZ × Z
Hv :
match fn_linkagef with
TAtom"weak" | TAtom"export" | TAtom"local"
⇒
true
_
⇒
false
&&
match fn_retf with
⇒
true
⇒
Datatypes.lengthks =? 2%nat && forallbλk : class ⇒ existsbclass_eqbk L; P; Single; Double ks
&&
&&
no_dupsmapb_label b0 :: bs
&&
&&
negbexistsbλb : block ⇒ memb_labelb0 succ_labelsb_jumpb b0 :: bs
&&
&&
&&
&&
forallbvalid_blockmd f temp_defsf b0 :: bs
&&
negbmodule_checkedmd || stage_funcmd f n
=
true
Hin :
InIFuncf md
Hb :
Inb b0 :: bs
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

repeat match goal withH : _ && _ = true |- _⇒apply andb_true_iff in H as ? ?end

md :
f :
i :
b0 :
bs :
listblock
Eb :
fn_blocksf = b0 :: bs
n :
nmapZ × Z
H :
match fn_linkagef with
TAtom"weak" | TAtom"export" | TAtom"local"
⇒
true
_
⇒
false
=
true
H9 :
match fn_retf with
⇒
true
⇒
Datatypes.lengthks =? 2%nat && forallbλk : class ⇒ existsbclass_eqbk L; P; Single; Double ks
=
true
H8 :
negbextended_crossesf = true
H7 :
no_dupsmapb_label b0 :: bs = true
H5 :
negbexistsbλb : block ⇒ memb_labelb0 succ_labelsb_jumpb b0 :: bs = true
H4 :
H3 :
H2 :
valid_localsf = true
H1 :
forallbvalid_blockmd f temp_defsf b0 :: bs = true
H0 :
negbmodule_checkedmd || stage_funcmd f n = true
Hin :
InIFuncf md
Hb :
Inb b0 :: bs
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

match goal withH : forallbvalid_blockmd f _ _ = true |- _⇒rewrite forallb_forall in H ; specialize Hb Hb ; unfold valid_block in Hend

md :
f :
i :
b0 :
bs :
listblock
Eb :
fn_blocksf = b0 :: bs
n :
nmapZ × Z
H :
match fn_linkagef with
TAtom"weak" | TAtom"export" | TAtom"local"
⇒
true
_
⇒
false
=
true
H9 :
match fn_retf with
⇒
true
⇒
Datatypes.lengthks =? 2%nat && forallbλk : class ⇒ existsbclass_eqbk L; P; Single; Double ks
=
true
H8 :
negbextended_crossesf = true
H7 :
no_dupsmapb_label b0 :: bs = true
H5 :
negbexistsbλb : block ⇒ memb_labelb0 succ_labelsb_jumpb b0 :: bs = true
H4 :
H3 :
H2 :
valid_localsf = true
H1 :
&&
match b_phisb with
[ ]
⇒
true
_ :: _
⇒
[ ]
⇒
false
_ :: _
⇒
true
=
true
H0 :
negbmodule_checkedmd || stage_funcmd f n = true
Hin :
InIFuncf md
Hb :
Inb b0 :: bs
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

repeat match goal withH : _ && _ = true |- _⇒apply andb_true_iff in H as ? ?end

md :
f :
i :
b0 :
bs :
listblock
Eb :
fn_blocksf = b0 :: bs
n :
nmapZ × Z
H :
match fn_linkagef with
TAtom"weak" | TAtom"export" | TAtom"local"
⇒
true
_
⇒
false
=
true
H9 :
match fn_retf with
⇒
true
⇒
Datatypes.lengthks =? 2%nat && forallbλk : class ⇒ existsbclass_eqbk L; P; Single; Double ks
=
true
H8 :
negbextended_crossesf = true
H7 :
no_dupsmapb_label b0 :: bs = true
H5 :
negbexistsbλb : block ⇒ memb_labelb0 succ_labelsb_jumpb b0 :: bs = true
H4 :
H3 :
H2 :
valid_localsf = true
H12 :
forallbvalid_instmd temp_defsf b_instsb = true
H11 :
H10 :
match b_phisb with
[ ]
⇒
true
_ :: _
⇒
[ ]
⇒
false
_ :: _
⇒
true
=
true
H0 :
negbmodule_checkedmd || stage_funcmd f n = true
Hin :
InIFuncf md
Hb :
Inb b0 :: bs
Hi :
Ini b_instsb
⊢
∃cls : listname × class, valid_instmd cls i = true

match goal withH : forallbvalid_instmd _ b_instsb = true |- _⇒rewrite forallb_forall in H ; exact ex_intro_ _ Hi Hiend

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros md f b i Hv _ Hin Hb Hi
destruct existsb_ md ; discriminate Hv |
injection Hv as Hv
unfold valid_items in Hv
apply andb_true_iff in Hv as _ Hv
rewrite forallb_forall in Hv
specialize Hv_ Hin
simpl in Hv
unfold valid_func in Hv
destruct fn_blocksf as | b0 bs eqn: Eb ; destruct Hb |
destruct block_intervalsb0 :: bs ; | discriminate Hv
repeat match goal withH : _ && _ = true |- _⇒apply andb_true_iff in H as ? ?end
match goal withH : forallbvalid_blockmd f _ _ = true |- _⇒rewrite forallb_forall in H ; specialize Hb Hb ; unfold valid_block in Hend
repeat match goal withH : _ && _ = true |- _⇒apply andb_true_iff in H as ? ?end
match goal withH : forallbvalid_instmd _ b_instsb = true |- _⇒rewrite forallb_forall in H ; exact ex_intro_ _ Hi Hiend

A check-like instruction i of a checked_module md, whose fact fa check_fact reads, checks a nonempty span at one of the alignments valid_op/1 allows (check_align).

114Lemma check_fact_ok
∀ md f b i fa
f_lofa < f_hifa ∧ check_alignf_alfa = true
Explore proof 5 tactics

Initial goal

⊢
∀md : module f : func b : block i : inst fa : fact, checked_modulemd → InIFuncf md → Inb fn_blocksf → Ini b_instsb → check_facti = Somefa → f_lofa < f_hifa ∧ check_alignf_alfa = true

intros md f b i fa Hmd Hin Hb Hi Hf

md :
f :
i :
fa :
Hin :
InIFuncf md
Hb :
Hi :
Ini b_instsb
Hf :
check_facti = Somefa
⊢
f_lofa < f_hifa ∧ check_alignf_alfa = true

destruct inst_valid_ _ _ _ Hmd Hin Hb Hi as cls Hvi

md :
f :
i :
fa :
Hin :
InIFuncf md
Hb :
Hi :
Ini b_instsb
Hf :
check_facti = Somefa
cls :
listname × class
Hvi :
valid_instmd cls i = true
⊢
f_lofa < f_hifa ∧ check_alignf_alfa = true

destruct i as q k o args | | | | | | | | ; try discriminate Hf

md :
f :
q :
o :
args :
listvalue
fa :
Hin :
InIFuncf md
Hb :
Hi :
InLetq k o args b_instsb
Hf :
check_factLetq k o args = Somefa
cls :
listname × class
Hvi :
valid_instmd cls Letq k o args = true
⊢
f_lofa < f_hifa ∧ check_alignf_alfa = true

destruct k ; try destruct o ; discriminate Hf

md :
f :
q :
o :
args :
listvalue
fa :
Hin :
InIFuncf md
Hb :
Hi :
InLetq A o args b_instsb
Hf :
check_factLetq A o args = Somefa
cls :
listname × class
Hvi :
valid_instmd cls Letq A o args = true
⊢
f_lofa < f_hifa ∧ check_alignf_alfa = true

destruct o ; try discriminate Hf ; cbn - [ valid_op ] in Hf ; cases Hf ; injection Hf as ← ; unfold valid_inst in Hvi ; simpl in Hvi ; unfold check_ok in Hvi;repeat match goal withH : _ && _ = true |- _⇒apply andb_true_iff in H as ? ?end;repeat match goal withH : _ <? _ = true |- _⇒apply Z.ltb_lt in Hend;simpl;split ; lia | assumption

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros md f b i fa Hmd Hin Hb Hi Hf
destruct inst_valid_ _ _ _ Hmd Hin Hb Hi as cls Hvi
destruct i as q k o args | | | | | | | | ; try discriminate Hf
destruct k ; try destruct o ; discriminate Hf
destruct o ; try discriminate Hf ; cbn - [ valid_op ] in Hf ; cases Hf ; injection Hf as ← ; unfold valid_inst in Hvi ; simpl in Hvi ; unfold check_ok in Hvi;repeat match goal withH : _ && _ = true |- _⇒apply andb_true_iff in H as ? ?end;repeat match goal withH : _ <? _ = true |- _⇒apply Z.ltb_lt in Hend;simpl;split ; lia | assumption

Renew, over memory

The arithmetic of a renew. Where the span of capability c from A+lo1 up to A+hi1 passed its check in a memory m1, a renew through a pointer p of c of the part from A+off up to A+off+size, at an alignment al that divides the source's al1, in a memory m that persists from m1 and lies in the address space, passes, traps read-only, or traps out of bounds on a freed object (renew_res/4); never unchecked.

137Lemma renew_access
∀ m1 m c A lo1 hi1 r1 al1 u off size r al p
access_resm1 raw_addressA lo1 c hi1 − lo1 r1 al1 = SomeRValu
ptr_capp = c
lo1 ≤ off
off + size ≤ hi1
0 < size
0 < al
al1 mod al = 0
off − lo1 mod al = 0
∃chk rr, access_resm raw_addressA off c size r al = Somechk ∧ renew_reschk p m = Somerr ∧ ∀why, rr ≠ RUncheckedwhy
Proof 44 steps Qed
intros m1 m c A lo1 hi1 r1 al1 off size r al p H Hp Hfit Hc Hlo Hhi Hs Hal Hal1 Hoff
destruct c as | base | base | f | n ; try discriminate H ; destruct object_regionbase m_regionsm1 as reg | eqn: E ; try discriminate H ; destruct base ≤? raw_addressA lo1 && raw_addressA lo1 + hi1 − lo1 ≤? r_endreg eqn: Eb ; try discriminate H ; apply andb_true_iff in Eb as E1 E2 ; apply Z.leb_le in E1 ; apply Z.leb_le in E2 ; pose proof object_region_base_ _ _ E as Hbase
all: assert Haligned : ∀x, x mod al1 = 0 → x + off − lo1 mod al = 0 by intros x Hx ; apply aligned_add ; exact Hal | exact aligned_divisor_ _ _ Hal Hx Hal1 | exact Hoff
all: destruct Hp_ _ E as E′ | E′

the object as it was

–pose proof Hfit_ _ E' as Hend
rewrite E' , raw_address_withinA lo1 off Hlo ltac:lia
replace base ≤? raw_addressA lo1 + off − lo1 && raw_addressA lo1 + off − lo1 + size ≤? r_endreg with true by symmetry ; apply andb_true_iff ; split ; apply Z.leb_le ; lia
injection H as H
rewrite aligned_res_ok_ _ Haligned_ aligned_res_mod_ _ H
exists ok, RValWPtrp
split ; reflexivity |
split ; reflexivity | discriminate

freed: the access traps out of bounds, on a freed object

–rewrite E'
simpl
rewrite Hbase
replace base ≤? raw_addressA off && raw_addressA off + size ≤? base with false by symmetry ; apply andb_false_iff ; destruct Z.le_gt_casesbase raw_addressA off ; right ; apply Z.leb_gt ; lia | left ; apply Z.leb_gt ; lia
split ; reflexivity |
unfold renew_res
rewrite Hc , E'
split ; reflexivity | discriminate

read-only, as it was: a read passes, a write traps read-only

–pose proof Hfit_ _ E' as Hend
rewrite E' , raw_address_withinA lo1 off Hlo ltac:lia
replace base ≤? raw_addressA lo1 + off − lo1 && raw_addressA lo1 + off − lo1 + size ≤? r_endreg with true by symmetry ; apply andb_true_iff ; split ; apply Z.leb_le ; lia
destruct r1 ; simpl in H ; | discriminate H
injection H as H
pose proof Haligned_ aligned_res_mod_ _ H as Ha
destruct r ; simpl ; rewrite ? aligned_res_ok_ _ Ha
+exists ok, RValWPtrp
split ; reflexivity |
split ; reflexivity | discriminate
split ; reflexivity |
split ; reflexivity | discriminate

read-only, freed: as an object freed

–rewrite E'
simpl
rewrite Hbase
replace base ≤? raw_addressA off && raw_addressA off + size ≤? base with false by symmetry ; apply andb_false_iff ; destruct Z.le_gt_casesbase raw_addressA off ; right ; apply Z.leb_gt ; lia | left ; apply Z.leb_gt ; lia
split ; reflexivity |
unfold renew_res
rewrite Hc , E'
split ; reflexivity | discriminate

Renew over a hull, over memory

The address of a renew over a hull. The renewed pointer's address A is Al+dl and Ah+dh modulo 2^64, where Al and Ah are the addresses of the low and high sources. The renew starts E past the low source's span and ends F before the high source's, both near (between 0 and 2^62). Then A+lo is both sums exactly, not merely modulo 2^64: both spans lie in the address space (at or below 2^48), so neither sum wraps.

197Lemma hull_address
∀ Al Ah A lol loh hih dl dh lo hi
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
raw_addressAl lol ≤ 2 ^ 48
raw_addressAh loh + hih − loh ≤ 2 ^ 48
loh < hih
0 ≤ lo + dl − lol ≤ 2 ^ 62
0 ≤ hih − hi − dh ≤ 2 ^ 62
0 < hi − lo ≤ 2 ^ 62
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh
Explore proof 15 tactics

Initial goal

⊢
∀Al Ah A lol loh hih dl dh lo hi : Z, A mod 2 ^ 64 = Al + dl mod 2 ^ 64 → A mod 2 ^ 64 = Ah + dh mod 2 ^ 64 → raw_addressAl lol ≤ 2 ^ 48 → raw_addressAh loh + hih − loh ≤ 2 ^ 48 → loh < hih → 0 ≤ lo + dl − lol ≤ 2 ^ 62 → 0 ≤ hih − hi − dh ≤ 2 ^ 62 → 0 < hi − lo ≤ 2 ^ 62 → raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

intros Al Ah A lol loh hih dl dh lo hi HAl HAh Hl Hh Hs He Hf Hsz

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
⊢
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

assert Hmod : ∀B d o o′, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64

2 open

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
⊢
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
focused goal
Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
⊢
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

{intros B d o o′ HB

2 open

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
B, d, o, o′ :
Z
HB :
A mod 2 ^ 64 = B + d mod 2 ^ 64
⊢
raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
deferred goal
Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
⊢
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

unfold raw_address

2 open

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
B, d, o, o′ :
Z
HB :
A mod 2 ^ 64 = B + d mod 2 ^ 64
⊢
A + o mod 2 ^ 64 = B + o′ mod 2 ^ 64 + o + d − o′ mod 2 ^ 64
deferred goal
Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
⊢
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

rewrite <- Z.add_mod_idemp_lA o 2 ^ 64 , HB , ! Z.add_mod_idemp_l by lia

2 open

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
B, d, o, o′ :
Z
HB :
A mod 2 ^ 64 = B + d mod 2 ^ 64
⊢
B + d + o mod 2 ^ 64 = B + o′ + o + d − o′ mod 2 ^ 64
deferred goal
Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
⊢
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

f_equal

2 open

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
B, d, o, o′ :
Z
HB :
A mod 2 ^ 64 = B + d mod 2 ^ 64
⊢
B + d + o = B + o′ + o + d − o′
deferred goal
Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
⊢
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

ring

deferred goal
Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
⊢
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

pose proof HmodAl dl lo lol HAl as Xl

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
Xl :
raw_addressA lo = raw_addressAl lol + lo + dl − lol mod 2 ^ 64
⊢
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

pose proof HmodAh dh lo loh HAh as Xh

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
Xl :
raw_addressA lo = raw_addressAl lol + lo + dl − lol mod 2 ^ 64
Xh :
raw_addressA lo = raw_addressAh loh + lo + dh − loh mod 2 ^ 64
⊢
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

pose proof Z.mod_pos_boundAl + lol 2 ^ 64 ltac:lia

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
Xl :
raw_addressA lo = raw_addressAl lol + lo + dl − lol mod 2 ^ 64
Xh :
raw_addressA lo = raw_addressAh loh + lo + dh − loh mod 2 ^ 64
H :
0 ≤ Al + lol mod 2 ^ 64 < 2 ^ 64
⊢
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

pose proof Z.mod_pos_boundAh + loh 2 ^ 64 ltac:lia

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
raw_addressAl lol ≤ 2 ^ 48
Hh :
raw_addressAh loh + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
Xl :
raw_addressA lo = raw_addressAl lol + lo + dl − lol mod 2 ^ 64
Xh :
raw_addressA lo = raw_addressAh loh + lo + dh − loh mod 2 ^ 64
H :
0 ≤ Al + lol mod 2 ^ 64 < 2 ^ 64
H0 :
0 ≤ Ah + loh mod 2 ^ 64 < 2 ^ 64
⊢
raw_addressA lo = raw_addressAl lol + lo + dl − lol ∧ raw_addressA lo = raw_addressAh loh + lo + dh − loh

unfold raw_address in *

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
Al + lol mod 2 ^ 64 ≤ 2 ^ 48
Hh :
Ah + loh mod 2 ^ 64 + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → A + o mod 2 ^ 64 = B + o′ mod 2 ^ 64 + o + d − o′ mod 2 ^ 64
Xl :
A + lo mod 2 ^ 64 = Al + lol mod 2 ^ 64 + lo + dl − lol mod 2 ^ 64
Xh :
A + lo mod 2 ^ 64 = Ah + loh mod 2 ^ 64 + lo + dh − loh mod 2 ^ 64
H :
0 ≤ Al + lol mod 2 ^ 64 < 2 ^ 64
H0 :
0 ≤ Ah + loh mod 2 ^ 64 < 2 ^ 64
⊢
A + lo mod 2 ^ 64 = Al + lol mod 2 ^ 64 + lo + dl − lol ∧ A + lo mod 2 ^ 64 = Ah + loh mod 2 ^ 64 + lo + dh − loh

rewrite Z.mod_smallAl + lol mod 2 ^ 64 + lo + dl − lol in Xl by lia

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
Al + lol mod 2 ^ 64 ≤ 2 ^ 48
Hh :
Ah + loh mod 2 ^ 64 + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → A + o mod 2 ^ 64 = B + o′ mod 2 ^ 64 + o + d − o′ mod 2 ^ 64
Xl :
A + lo mod 2 ^ 64 = Al + lol mod 2 ^ 64 + lo + dl − lol
Xh :
A + lo mod 2 ^ 64 = Ah + loh mod 2 ^ 64 + lo + dh − loh mod 2 ^ 64
H :
0 ≤ Al + lol mod 2 ^ 64 < 2 ^ 64
H0 :
0 ≤ Ah + loh mod 2 ^ 64 < 2 ^ 64
⊢
A + lo mod 2 ^ 64 = Al + lol mod 2 ^ 64 + lo + dl − lol ∧ A + lo mod 2 ^ 64 = Ah + loh mod 2 ^ 64 + lo + dh − loh

pose proof Z.div_modAh + loh mod 2 ^ 64 + lo + dh − loh 2 ^ 64 ltac:lia

Al, Ah, A, lol, loh, hih, dl, dh, lo, hi :
Z
HAl :
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
HAh :
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
Hl :
Al + lol mod 2 ^ 64 ≤ 2 ^ 48
Hh :
Ah + loh mod 2 ^ 64 + hih − loh ≤ 2 ^ 48
Hs :
loh < hih
He :
0 ≤ lo + dl − lol ≤ 2 ^ 62
Hf :
0 ≤ hih − hi − dh ≤ 2 ^ 62
Hsz :
0 < hi − lo ≤ 2 ^ 62
Hmod :
∀B d o o′ : Z, A mod 2 ^ 64 = B + d mod 2 ^ 64 → A + o mod 2 ^ 64 = B + o′ mod 2 ^ 64 + o + d − o′ mod 2 ^ 64
Xl :
A + lo mod 2 ^ 64 = Al + lol mod 2 ^ 64 + lo + dl − lol
Xh :
A + lo mod 2 ^ 64 = Ah + loh mod 2 ^ 64 + lo + dh − loh mod 2 ^ 64
H :
0 ≤ Al + lol mod 2 ^ 64 < 2 ^ 64
H0 :
0 ≤ Ah + loh mod 2 ^ 64 < 2 ^ 64
H1 :
Ah + loh mod 2 ^ 64 + lo + dh − loh = 2 ^ 64 × Ah + loh mod 2 ^ 64 + lo + dh − loh / 2 ^ 64 + Ah + loh mod 2 ^ 64 + lo + dh − loh mod 2 ^ 64
⊢
A + lo mod 2 ^ 64 = Al + lol mod 2 ^ 64 + lo + dl − lol ∧ A + lo mod 2 ^ 64 = Ah + loh mod 2 ^ 64 + lo + dh − loh

split ; exact Xl | lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Al Ah A lol loh hih dl dh lo hi HAl HAh Hl Hh Hs He Hf Hsz
assert Hmod : ∀B d o o′, A mod 2 ^ 64 = B + d mod 2 ^ 64 → raw_addressA o = raw_addressB o′ + o + d − o′ mod 2 ^ 64
{intros B d o o′ HB
rewrite <- Z.add_mod_idemp_lA o 2 ^ 64 , HB , ! Z.add_mod_idemp_l by lia
f_equal
ring
pose proof HmodAl dl lo lol HAl as Xl
pose proof HmodAh dh lo loh HAh as Xh
pose proof Z.mod_pos_boundAl + lol 2 ^ 64 ltac:lia
pose proof Z.mod_pos_boundAh + loh 2 ^ 64 ltac:lia
unfold raw_address in *
rewrite Z.mod_smallAl + lol mod 2 ^ 64 + lo + dl − lol in Xl by lia
pose proof Z.div_modAh + loh mod 2 ^ 64 + lo + dh − loh 2 ^ 64 ltac:lia
split ; exact Xl | lia

A renew through a pointer p whose object, at base, is freed in the memory m traps out of bounds on a freed object (renew_res/4); never unchecked.

221Lemma renew_freed
∀ m base reg A off size r al p
r_basereg = base
0 < size
ptr_capp = Objbase ∨ ptr_capp = Robase
∃chk rr, access_resm raw_addressA off ptr_capp size r al = Somechk ∧ renew_reschk p m = Somerr ∧ ∀why, rr ≠ RUncheckedwhy
Explore proof 6 tactics

Initial goal

⊢
∀m : Memory.mem base : Z reg : region A off size : Z r : rights al : Z p : ptr, object_regionbase m_regionsm = Somefreed_regionreg → r_basereg = base → 0 < size → ptr_capp = Objbase ∨ ptr_capp = Robase → ∃chk : resunit rr : resword, access_resm raw_addressA off ptr_capp size r al = Somechk ∧ renew_reschk p m = Somerr ∧ ∀why : reason, rr ≠ RUncheckedwhy

intros m base reg A off size r al p E Hrb Hs Hc

m :
Memory.mem
base :
Z
reg :
A, off, size :
Z
al :
Z
p :
Hrb :
r_basereg = base
Hs :
0 < size
Hc :
ptr_capp = Objbase ∨ ptr_capp = Robase
⊢
∃chk : resunit rr : resword, access_resm raw_addressA off ptr_capp size r al = Somechk ∧ renew_reschk p m = Somerr ∧ ∀why : reason, rr ≠ RUncheckedwhy

exists RTrapOutOfBounds, RTrapOutOfBounds

m :
Memory.mem
base :
Z
reg :
A, off, size :
Z
al :
Z
p :
Hrb :
r_basereg = base
Hs :
0 < size
Hc :
ptr_capp = Objbase ∨ ptr_capp = Robase

unfold access_res , cap_access_res , renew_res

m :
Memory.mem
base :
Z
reg :
A, off, size :
Z
al :
Z
p :
Hrb :
r_basereg = base
Hs :
0 < size
Hc :
ptr_capp = Objbase ∨ ptr_capp = Robase
⊢
match ptr_capp with
Objbase0
⇒
let* reg0 ≔ object_regionbase0 m_regionsm in
Some
base0 ≤? raw_addressA off && raw_addressA off + size ≤? r_endreg0
→
Robase0
⇒
let* reg0 ≔ object_regionbase0 m_regionsm in
Some
base0 ≤? raw_addressA off && raw_addressA off + size ≤? r_endreg0
→
⇒
None
=
∧
match ptr_capp with
Objbase0 | Robase0
⇒
let* reg0 ≔ object_regionbase0 m_regionsm in
=
∧

destruct Hc as Hc | Hc ; rewrite Hc , E ; simpl ; rewrite Hrb

2 open

m :
Memory.mem
base :
Z
reg :
A, off, size :
Z
al :
Z
p :
Hrb :
r_basereg = base
Hs :
0 < size
Hc :
ptr_capp = Objbase
⊢
Some
base ≤? raw_addressA off && raw_addressA off + size ≤? base
→
=
∧
focused goal
m :
Memory.mem
base :
Z
reg :
A, off, size :
Z
al :
Z
p :
Hrb :
r_basereg = base
Hs :
0 < size
Hc :
ptr_capp = Robase
⊢
Some
base ≤? raw_addressA off && raw_addressA off + size ≤? base
→
=
∧

all: replace base ≤? raw_addressA off && raw_addressA off + size ≤? base with false by symmetry ; apply andb_false_iff ; destruct Z.le_gt_casesbase raw_addressA off ; right ; apply Z.leb_gt ; lia | left ; apply Z.leb_gt ; lia

2 open

m :
Memory.mem
base :
Z
reg :
A, off, size :
Z
al :
Z
p :
Hrb :
r_basereg = base
Hs :
0 < size
Hc :
ptr_capp = Objbase
focused goal
m :
Memory.mem
base :
Z
reg :
A, off, size :
Z
al :
Z
p :
Hrb :
r_basereg = base
Hs :
0 < size
Hc :
ptr_capp = Robase

all: split ; reflexivity | split ; reflexivity | discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m base reg A off size r al p E Hrb Hs Hc
destruct Hc as Hc | Hc ; rewrite Hc , E ; simpl ; rewrite Hrb
all: replace base ≤? raw_addressA off && raw_addressA off + size ≤? base with false by symmetry ; apply andb_false_iff ; destruct Z.le_gt_casesbase raw_addressA off ; right ; apply Z.leb_gt ; lia | left ; apply Z.leb_gt ; lia
all: split ; reflexivity | split ; reflexivity | discriminate

The arithmetic of a renew over a hull, as renew_access is a renew's. Where a low span from Al+lol up to Al+hil and a high span from Ah+loh up to Ah+hih, of one capability c, passed their checks in memories ml and mh that the current memory m persists from, a renew from A+lo up to A+hi between them (hull_renewable/8's arithmetic), aligned as one of them is, passes, traps read-only, or finds the object freed; never unchecked. Both sources meet only in m: the object is as both saw it, or freed since.

246Lemma hull_renew_access
∀ ml mh m c Al Ah A lol hil rl all loh hih rh alh lo hi r al p dl dh
access_resml raw_addressAl lol c hil − lol rl all = Someok
access_resmh raw_addressAh loh c hih − loh rh alh = Someok
ptr_capp = c
lol < hil
loh < hih
A mod 2 ^ 64 = Al + dl mod 2 ^ 64
A mod 2 ^ 64 = Ah + dh mod 2 ^ 64
0 ≤ lo + dl − lol ≤ 2 ^ 62
0 ≤ hih − hi − dh ≤ 2 ^ 62
0 < hi − lo ≤ 2 ^ 62
0 < al
all mod al = 0 ∧ lo + dl − lol mod al = 0 ∨ alh mod al = 0 ∧ lo + dh − loh mod al = 0
∃chk rr, access_resm raw_addressA lo c hi − lo r al = Somechk ∧ renew_reschk p m = Somerr ∧ ∀why, rr ≠ RUncheckedwhy
Proof 26 steps Qed
intros ml mh m c Al Ah A lol hil rl all loh hih rh alh lo hi r al p dl dh H1 H2 Hpl Hph Hfit Hc Hl Hh HAl HAh He Hf Hsz Hal Halign
set Ll := raw_addressAl lol in *
set Lh := raw_addressAh loh in *
destruct c as | base | base | fn | n ; try discriminate H1
all: unfold access_res , cap_access_res in H1 , H2
all: destruct object_regionbase m_regionsml as regl | eqn: El ; try discriminate H1 ; destruct object_regionbase m_regionsmh as regh | eqn: Eh ; try discriminate H2 ; destruct base ≤? Ll && Ll + hil − lol ≤? r_endregl eqn: Bl ; try discriminate H1 ; destruct base ≤? Lh && Lh + hih − loh ≤? r_endregh eqn: Bh ; try discriminate H2 ; apply andb_true_iff in Bl as Bl Bl′ ; apply andb_true_iff in Bh as Bh Bh′ ; apply Z.leb_le in Bl , Bl' , Bh , Bh' ; pose proof object_region_base_ _ _ El as Hrl ; pose proof object_region_base_ _ _ Eh as Hrh

The object is as both checks saw it, or freed since.

all: destruct Hpl_ _ El as E | E ; destruct Hph_ _ Eh as E′ | E′ ; rewrite E in E' ; injection E' as E′ | rewrite <- Hc ; exact renew_freedm base regl A lo hi − lo r al p E Hrl ltac:lia ltac:auto

as the low check saw it but freed since the high one: empty, so the low check could not have passed

all: try subst regl ; simpl in Bl' ; lia

both as they were: one object, which holds the hull

all: subst regh ; destruct Hfit_ _ E as Hb0 Hend
all: destruct hull_addressAl Ah A lol loh hih dl dh lo hi HAl HAh ltac:lia ltac:lia Hh He Hf Hsz as Xl Xh
all: unfold access_res , cap_access_res ; rewrite E
all: replace base ≤? raw_addressA lo && raw_addressA lo + hi − lo ≤? r_endregl with true by symmetry ; apply andb_true_iff ; split ; apply Z.leb_le ; lia

aligned as the source it is aligned to

all: assert Ha : ∀aal aah : Z, Ll mod aal = 0 → Lh mod aah = 0 → aal mod al = 0 ∧ lo + dl − lol mod al = 0 ∨ aah mod al = 0 ∧ lo + dh − loh mod al = 0 → raw_addressA lo mod al = 0 by intros aal aah Hl1 Hh1 A1 A2 | A1 A2 ; rewrite Xl | rewrite Xh ; apply aligned_add ; auto ; eapply aligned_divisor ; eauto
–injection H1 as H1
injection H2 as H2
rewrite aligned_res_ok_ _ Ha_ _ aligned_res_mod_ _ H1 aligned_res_mod_ _ H2 Halign
do 2 eexists
split ; reflexivity |
split ; reflexivity | discriminate
–destruct rl ; simpl in H1 ; | discriminate H1
destruct rh ; simpl in H2 ; | discriminate H2
injection H1 as H1
injection H2 as H2
pose proof Ha_ _ aligned_res_mod_ _ H1 aligned_res_mod_ _ H2 Halign as Hx
destruct r ; simpl ; rewrite aligned_res_ok_ _ Hx |
all: do 2 eexists ; split ; reflexivity | ; split ; unfold renew_res ; reflexivity | discriminate

The half check, over memory

A half check's address A+lo is its source span's start A1+lo1 plus e = D + lo - lo1, modulo 2^64, where D is the distance d0 between A and A1 that half_known/6 reads as a signed 64-bit number.

305Lemma half_address
∀ A A1 d0 lo lo1
A mod 2 ^ 64 = A1 + d0 mod 2 ^ 64
raw_addressA lo = raw_addressA1 lo1 + d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 + lo − lo1 mod 2 ^ 64
Explore proof 8 tactics

Initial goal

⊢
∀A A1 d0 lo lo1 : Z, A mod 2 ^ 64 = A1 + d0 mod 2 ^ 64 → raw_addressA lo = raw_addressA1 lo1 + d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 + lo − lo1 mod 2 ^ 64

intros A A1 d0 lo lo1 HA

A, A1, d0, lo, lo1 :
Z
HA :
A mod 2 ^ 64 = A1 + d0 mod 2 ^ 64
⊢
raw_addressA lo = raw_addressA1 lo1 + d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 + lo − lo1 mod 2 ^ 64

unfold raw_address

A, A1, d0, lo, lo1 :
Z
HA :
A mod 2 ^ 64 = A1 + d0 mod 2 ^ 64
⊢
A + lo mod 2 ^ 64 = A1 + lo1 mod 2 ^ 64 + d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 + lo − lo1 mod 2 ^ 64

rewrite Z.add_mod_idemp_l by lia

A, A1, d0, lo, lo1 :
Z
HA :
A mod 2 ^ 64 = A1 + d0 mod 2 ^ 64
⊢
A + lo mod 2 ^ 64 = A1 + lo1 + d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 + lo − lo1 mod 2 ^ 64

assert E : d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 = d0 + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64 by rewrite Z.mod_eq by lia ; lia

A, A1, d0, lo, lo1 :
Z
HA :
A mod 2 ^ 64 = A1 + d0 mod 2 ^ 64
E :
d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 = d0 + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64
⊢
A + lo mod 2 ^ 64 = A1 + lo1 + d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 + lo − lo1 mod 2 ^ 64

rewrite E

A, A1, d0, lo, lo1 :
Z
HA :
A mod 2 ^ 64 = A1 + d0 mod 2 ^ 64
E :
d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 = d0 + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64
⊢
A + lo mod 2 ^ 64 = A1 + lo1 + d0 + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64 + lo − lo1 mod 2 ^ 64

replace A1 + lo1 + d0 + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64 + lo − lo1 with A1 + d0 + lo + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64 by ring

A, A1, d0, lo, lo1 :
Z
HA :
A mod 2 ^ 64 = A1 + d0 mod 2 ^ 64
E :
d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 = d0 + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64
⊢
A + lo mod 2 ^ 64 = A1 + d0 + lo + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64 mod 2 ^ 64

rewrite Z_mod_plus_full , <- Z.add_mod_idemp_lA1 + d0 , <- HA , Z.add_mod_idemp_l by lia

A, A1, d0, lo, lo1 :
Z
HA :
A mod 2 ^ 64 = A1 + d0 mod 2 ^ 64
E :
d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 = d0 + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64
⊢
A + lo mod 2 ^ 64 = A + lo mod 2 ^ 64

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros A A1 d0 lo lo1 HA
rewrite Z.add_mod_idemp_l by lia
assert E : d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 = d0 + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64 by rewrite Z.mod_eq by lia ; lia
rewrite E
replace A1 + lo1 + d0 + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64 + lo − lo1 with A1 + d0 + lo + −d0 + 2 ^ 63 / 2 ^ 64 × 2 ^ 64 by ring
rewrite Z_mod_plus_full , <- Z.add_mod_idemp_lA1 + d0 , <- HA , Z.add_mod_idemp_l by lia
reflexivity

The bound bd that a half check tests natively (half_bound/6) says what both bounds of the whole check say. The access is at address b, e past the start of a span from U up to U+span that passed earlier, and that span proves the other bound (f is how far the access ends before the span does). The object, from base, ends at end1 as it was, empty if freed, or is freed since. The span lies in the address space, so the address wraps only where a lower check, read signed, falls below 0, which fails both tests.

327Lemma half_bound_agrees
∀ bd base U span end1 e f size b end′ life′
0 ≤ base ≤ U
U + span ≤ end1 ≤ 2 ^ 48
0 < span
0 < size ≤ 2 ^ 62
−2 ^ 62 ≤ f
e ≤ 2 ^ 62
e − f = span − size
b = U + e mod 2 ^ 64
match bd with
⇒
0 ≤ e
⇒
f ≤ 0
end′ = end1 ∧ life′ = Freed → end1 = base ∨ end′ = base ∧ life′ = Freed
half_boundbd b size base end′ life′ = base ≤? b && b + size ≤? end′
Explore proof 22 tactics

Initial goal

⊢
∀ bd : bound base U span end1 e f size b end′ : Z life′ : life  ,
0 ≤ base ≤ U
→
U + span ≤ end1 ≤ 2 ^ 48
→
0 < span
→
0 < size ≤ 2 ^ 62
→
−2 ^ 62 ≤ f
→
e ≤ 2 ^ 62
→
e − f = span − size
→
b = U + e mod 2 ^ 64
→
match bd with
⇒
0 ≤ e
⇒
f ≤ 0
→
end′ = end1 ∧ life′ = Freed → end1 = base ∨ end′ = base ∧ life′ = Freed → half_boundbd b size base end′ life′ = base ≤? b && b + size ≤? end′

intros bd base U span end1 e f size b end′ life′ Hb Hend Hspan Hsize Hf He Hef Haddr Hbd Hobj

bd :
base, U, span, end1, e, f, size, b, end′ :
Z
life′ :
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
match bd with
⇒
0 ≤ e
⇒
f ≤ 0
Hobj :
end′ = end1 ∧ life′ = Freed → end1 = base ∨ end′ = base ∧ life′ = Freed
⊢
half_boundbd b size base end′ life′ = base ≤? b && b + size ≤? end′

destruct bd ; unfold half_bound

2 open

base, U, span, end1, e, f, size, b, end′ :
Z
life′ :
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
0 ≤ e
Hobj :
end′ = end1 ∧ life′ = Freed → end1 = base ∨ end′ = base ∧ life′ = Freed
⊢
b + size ≤? end′ = base ≤? b && b + size ≤? end′
focused goal
base, U, span, end1, e, f, size, b, end′ :
Z
life′ :
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hobj :
end′ = end1 ∧ life′ = Freed → end1 = base ∨ end′ = base ∧ life′ = Freed
⊢
match life′ with
⇒
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
⇒
false
=
base ≤? b && b + size ≤? end′

–replace b with U + e in * by rewrite Haddr ; apply Z.mod_unique_ _ 0 ; lia

2 open

base, U, span, end1, e, f, size, b, end′ :
Z
life′ :
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
U + e = U + e mod 2 ^ 64
Hbd :
0 ≤ e
Hobj :
end′ = end1 ∧ life′ = Freed → end1 = base ∨ end′ = base ∧ life′ = Freed
⊢
U + e + size ≤? end′ = base ≤? U + e && U + e + size ≤? end′
deferred goal
base, U, span, end1, e, f, size, b, end′ :
Z
life′ :
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hobj :
end′ = end1 ∧ life′ = Freed → end1 = base ∨ end′ = base ∧ life′ = Freed
⊢
match life′ with
⇒
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
⇒
false
=
base ≤? b && b + size ≤? end′

replace base ≤? U + e with true by symmetry ; apply Z.leb_le ; lia

2 open

base, U, span, end1, e, f, size, b, end′ :
Z
life′ :
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
U + e = U + e mod 2 ^ 64
Hbd :
0 ≤ e
Hobj :
end′ = end1 ∧ life′ = Freed → end1 = base ∨ end′ = base ∧ life′ = Freed
⊢
U + e + size ≤? end′ = true && U + e + size ≤? end′
deferred goal
base, U, span, end1, e, f, size, b, end′ :
Z
life′ :
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hobj :
end′ = end1 ∧ life′ = Freed → end1 = base ∨ end′ = base ∧ life′ = Freed
⊢
match life′ with
⇒
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
⇒
false
=
base ≤? b && b + size ≤? end′

reflexivity

deferred goal
base, U, span, end1, e, f, size, b, end′ :
Z
life′ :
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hobj :
end′ = end1 ∧ life′ = Freed → end1 = base ∨ end′ = base ∧ life′ = Freed
⊢
match life′ with
⇒
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
⇒
false
=
base ≤? b && b + size ≤? end′

–destruct Hobj as → & Hlife | → & →

2 open

base, U, span, end1, e, f, size, b :
Z
life′ :
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
life′ = Freed → end1 = base
⊢
match life′ with
⇒
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
⇒
false
=
base ≤? b && b + size ≤? end1
focused goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

+destruct life′ ; | specialize Hlifeeq_refl ; lia

2 open

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
⊢
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
=
base ≤? b && b + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

destruct Z.le_gt_cases0 U + e as Hw | Hw

3 open

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
0 ≤ U + e
⊢
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
=
base ≤? b && b + size ≤? end1
focused goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
U + e < 0
⊢
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
=
base ≤? b && b + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

∗replace b with U + e in * by rewrite Haddr ; apply Z.mod_unique_ _ 0 ; lia

3 open

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
U + e = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
0 ≤ U + e
⊢
base
≤?
2 ^ 63 ≤? U + e
→
U + e − 2 ^ 64
else
U + e
=
base ≤? U + e && U + e + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
U + e < 0
⊢
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
=
base ≤? b && b + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

replace 2 ^ 63 ≤? U + e with false by symmetry ; apply Z.leb_gt ; lia

3 open

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
U + e = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
0 ≤ U + e
⊢
base ≤? U + e = base ≤? U + e && U + e + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
U + e < 0
⊢
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
=
base ≤? b && b + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

replace U + e + size ≤? end1 with true by symmetry ; apply Z.leb_le ; lia

3 open

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
U + e = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
0 ≤ U + e
⊢
base ≤? U + e = base ≤? U + e && true
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
U + e < 0
⊢
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
=
base ≤? b && b + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

rewrite andb_true_r

3 open

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
U + e = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
0 ≤ U + e
⊢
base ≤? U + e = base ≤? U + e
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
U + e < 0
⊢
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
=
base ≤? b && b + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

reflexivity

2 open

deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
U + e < 0
⊢
base
≤?
2 ^ 63 ≤? b
→
b − 2 ^ 64
else
b
=
base ≤? b && b + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

∗replace b with U + e + 2 ^ 64 in * by rewrite Haddr ; apply Z.mod_unique_ _ −1 ; lia

2 open

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
U + e + 2 ^ 64 = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
U + e < 0
⊢
base
≤?
2 ^ 63 ≤? U + e + 2 ^ 64
→
U + e + 2 ^ 64 − 2 ^ 64
else
U + e + 2 ^ 64
=
base ≤? U + e + 2 ^ 64 && U + e + 2 ^ 64 + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

replace 2 ^ 63 ≤? U + e + 2 ^ 64 with true by symmetry ; apply Z.leb_le ; lia

2 open

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
U + e + 2 ^ 64 = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
U + e < 0
⊢
base ≤? U + e + 2 ^ 64 − 2 ^ 64 = base ≤? U + e + 2 ^ 64 && U + e + 2 ^ 64 + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

replace base ≤? U + e + 2 ^ 64 − 2 ^ 64 with false by symmetry ; apply Z.leb_gt ; lia

2 open

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
U + e + 2 ^ 64 = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
U + e < 0
⊢
false = base ≤? U + e + 2 ^ 64 && U + e + 2 ^ 64 + size ≤? end1
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

replace U + e + 2 ^ 64 + size ≤? end1 with false by symmetry ; apply Z.leb_gt ; lia

2 open

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
U + e + 2 ^ 64 = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
U + e < 0
⊢
false = base ≤? U + e + 2 ^ 64 && false
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

rewrite andb_false_r

2 open

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
U + e + 2 ^ 64 = U + e mod 2 ^ 64
Hbd :
f ≤ 0
Hlife :
Live = Freed → end1 = base
Hw :
U + e < 0
⊢
false = false
deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

reflexivity

deferred goal
base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
false = base ≤? b && b + size ≤? base

+symmetry

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
base ≤? b && b + size ≤? base = false

apply andb_false_iff

base, U, span, end1, e, f, size, b :
Z
Hb :
0 ≤ base ≤ U
Hend :
U + span ≤ end1 ≤ 2 ^ 48
Hspan :
0 < span
Hsize :
0 < size ≤ 2 ^ 62
Hf :
−2 ^ 62 ≤ f
He :
e ≤ 2 ^ 62
Hef :
e − f = span − size
Haddr :
b = U + e mod 2 ^ 64
Hbd :
f ≤ 0
⊢
base ≤? b = false ∨ b + size ≤? base = false

destruct Z.le_gt_casesbase b ; right ; apply Z.leb_gt ; lia | left ; apply Z.leb_gt ; lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros bd base U span end1 e f size b end′ life′ Hb Hend Hspan Hsize Hf He Hef Haddr Hbd Hobj
destruct bd ; unfold half_bound

upper: the address does not wrap, so it lies at or above the base

–replace b with U + e in * by rewrite Haddr ; apply Z.mod_unique_ _ 0 ; lia
replace base ≤? U + e with true by symmetry ; apply Z.leb_le ; lia
reflexivity
–destruct Hobj as → & Hlife | → & →

lower, the object as it was: live, since a freed object is empty

+destruct life′ ; | specialize Hlifeeq_refl ; lia
destruct Z.le_gt_cases0 U + e as Hw | Hw
∗replace b with U + e in * by rewrite Haddr ; apply Z.mod_unique_ _ 0 ; lia
replace 2 ^ 63 ≤? U + e with false by symmetry ; apply Z.leb_gt ; lia
replace U + e + size ≤? end1 with true by symmetry ; apply Z.leb_le ; lia
rewrite andb_true_r
reflexivity

wrapped: read signed it is below 0, and no object reaches it

∗replace b with U + e + 2 ^ 64 in * by rewrite Haddr ; apply Z.mod_unique_ _ −1 ; lia
replace 2 ^ 63 ≤? U + e + 2 ^ 64 with true by symmetry ; apply Z.leb_le ; lia
replace base ≤? U + e + 2 ^ 64 − 2 ^ 64 with false by symmetry ; apply Z.leb_gt ; lia
replace U + e + 2 ^ 64 + size ≤? end1 with false by symmetry ; apply Z.leb_gt ; lia
rewrite andb_false_r
reflexivity

lower, freed since: both fail

+symmetry
apply andb_false_iff
destruct Z.le_gt_casesbase b ; right ; apply Z.leb_gt ; lia | left ; apply Z.leb_gt ; lia

Where the native test agrees with the whole check's bounds, the half check's result is the check's: half_res/4 is never unchecked.

362Lemma half_res_agrees
∀ inb ro : bool r a al p why
inb && negbrights_eqbr Write && ro && a mod al =? 0
≠
Explore proof 3 tactics

Initial goal

⊢
∀ inb ro : bool r : rights a al : Z p : ptr why : reason  ,
inb && negbrights_eqbr Write && ro && a mod al =? 0
≠

intros inb ro r a al p why

inb, ro :
bool
a, al :
Z
p :
why :
⊢
inb && negbrights_eqbr Write && ro && a mod al =? 0
≠

unfold readonly_access_res , aligned_res

inb, ro :
bool
a, al :
Z
p :
why :
⊢
inb
→
ro
→
match r with
⇒
a mod al =? 0
→
a mod al =? 0
→
inb && negbrights_eqbr Write && ro && a mod al =? 0
≠

destruct inb , ro , r , a mod al =? 0 ; simpl ; discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros inb ro r a al p why
destruct inb , ro , r , a mod al =? 0 ; simpl ; discriminate

Where the span of capability c from A1+lo1 up to A1+hi1 passed its check in a memory m1 that lay in the address space, a half check at address A, d0 past A1, whose known bound that span proves (half_known/6), in a memory m that persists from m1 and whose freed objects are empty, tests natively what the whole check tests: its result is never unchecked.

376Lemma half_access
∀ m1 m c A1 A lo1 hi1 r1 al1 u bd lo hi r al d0 p
access_resm1 raw_addressA1 lo1 c hi1 − lo1 r1 al1 = SomeRValu
A mod 2 ^ 64 = A1 + d0 mod 2 ^ 64
lo1 < hi1
lo < hi
half_knownbd lo hi d0 lo1 hi1 = true
∃chk passes, access_resm raw_addressA lo c hi − lo r al = Somechk ∧ half_passesbd m raw_addressA lo hi − lo c r al = SomeSomepasses ∧ ∀why, half_reschk passes WPtrp ≠ RUncheckedwhy
Proof 30 steps Qed
intros m1 m c A1 A lo1 hi1 r1 al1 u bd lo hi r al d0 p H Hfit1 Hp Hfe HA Hl1 Hl Hk
pose proof half_address_ _ _ lo lo1 HA as Hb
unfold half_known , near_offset in Hk
cbv zeta in Hk
repeat rewrite andb_true_iff in Hk
destruct Hk as _ & He & Hf & _ & Hsz & Hbd
apply Z.leb_le in He , Hf , Hsz
assert Hbd′ : match bd with Upper ⇒ 0 ≤ d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 + lo − lo1 | Lower ⇒ d0 + 2 ^ 63 mod 2 ^ 64 − 2 ^ 63 + hi − hi1 ≤ 0 end by destruct bd ; apply Z.leb_le ; exact Hbd
assert HU : 0 ≤ raw_addressA1 lo1 by apply Z.mod_pos_bound ; lia
destruct c as | base | base | fn | n ; try discriminate H ; destruct object_regionbase m_regionsm1 as reg | eqn: E ; try discriminate H ; destruct base ≤? raw_addressA1 lo1 && raw_addressA1 lo1 + hi1 − lo1 ≤? r_endreg eqn: Ein ; try discriminate H ; apply andb_true_iff in Ein as Ein1 Ein2 ; apply Z.leb_le in Ein1 , Ein2 ; destruct Hfit1_ _ E as Hbase Hend ; pose proof object_region_base_ _ _ E as Hrb

The object is as it was, or freed since; either way the native test's bound says what the check's bounds say.

all: destruct Hp_ _ E as E′ | E′ ; rewrite E'
all: do 2 eexists ; split ; reflexivity | ; split ; reflexivity | ; intros why
all: rewrite half_bound_agreesbd base raw_addressA1 lo1 hi1 − lo1 r_endreg _ _ hi − lo _ _ _ ltac:lia ltac:lia ltac:lia ltac:lia Hf He ltac:lia Hb Hbd' ; first exact half_res_agrees_ false r _ al p why | exact half_res_agrees_ true r _ al p why |

an object, as it was: empty if freed

–left
split ; reflexivity |
intros Hlife
exact Hfe_ _ E' Hlife

an object, freed since

–right
simpl
rewrite Hrb
auto

a read-only object, as it was

–left
split ; reflexivity |
intros Hlife
exact Hfe_ _ E' Hlife

a read-only object, freed since

–right
simpl
rewrite Hrb
auto

What a reuse form reads at its point

An element el of a guard chain (guard_chain/3) is its start p itself, or p is a name whose single definition is a flight with a lower donor. distance_pointer uses it to show the chain starts at something that holds a pointer.

425Lemma chain_go_head
∀ once fuel p lo hi el
Inel guard_chain_goonce fuel p lo hi
el = p, lo, hi ∨ ∃y d o args b, p = Tmpy ∧ lookupy once = SomeDInstFlightd o args LowerOfb
Explore proof 10 tactics

Initial goal

⊢
∀once : listname × def fuel : nat p : value lo hi : Z el : value × Z × Z, Inel guard_chain_goonce fuel p lo hi → el = p, lo, hi ∨ ∃y d : name o : op args : listflight_arg b : value, p = Tmpy ∧ lookupy once = SomeDInstFlightd o args LowerOfb

intros once fuel p lo hi el H

once :
listname × def
fuel :
nat
lo, hi :
Z
el :
value × Z × Z
H :
Inel guard_chain_goonce fuel p lo hi
⊢
el = p, lo, hi ∨ ∃y d : name o : op args : listflight_arg b : value, p = Tmpy ∧ lookupy once = SomeDInstFlightd o args LowerOfb

destruct fuel as | fuel ; simpl in H

2 open

once :
listname × def
lo, hi :
Z
el :
value × Z × Z
H :
p, lo, hi = el ∨ False
⊢
el = p, lo, hi ∨ ∃y d : name o : op args : listflight_arg b : value, p = Tmpy ∧ lookupy once = SomeDInstFlightd o args LowerOfb
focused goal
once :
listname × def
fuel :
nat
lo, hi :
Z
el :
value × Z × Z
H :
p, lo, hi = el
∨
Inel
match p with
⇒
match lookupx once with
⇒
[ ]
SomeDInstFlight_ o args LowerOfb
⇒
match flight_termo args b with
Someov, sign
⇒
match offset_intervalonce ov L with
Someolo, ohi
⇒
sign =? 1
→
guard_chain_goonce fuel b lo + olo hi + ohi
else
guard_chain_goonce fuel b lo − ohi hi − olo
None
⇒
[ ]
None
⇒
[ ]
_
⇒
[ ]
_
⇒
[ ]
⊢
el = p, lo, hi ∨ ∃y d : name o : op args : listflight_arg b : value, p = Tmpy ∧ lookupy once = SomeDInstFlightd o args LowerOfb

–destruct H as E |

2 open

once :
listname × def
lo, hi :
Z
el :
value × Z × Z
E :
p, lo, hi = el
⊢
el = p, lo, hi ∨ ∃y d : name o : op args : listflight_arg b : value, p = Tmpy ∧ lookupy once = SomeDInstFlightd o args LowerOfb
deferred goal
once :
listname × def
fuel :
nat
lo, hi :
Z
el :
value × Z × Z
H :
p, lo, hi = el
∨
Inel
match p with
⇒
match lookupx once with
⇒
[ ]
SomeDInstFlight_ o args LowerOfb
⇒
match flight_termo args b with
Someov, sign
⇒
match offset_intervalonce ov L with
Someolo, ohi
⇒
sign =? 1
→
guard_chain_goonce fuel b lo + olo hi + ohi
else
guard_chain_goonce fuel b lo − ohi hi − olo
None
⇒
[ ]
None
⇒
[ ]
_
⇒
[ ]
_
⇒
[ ]
⊢
el = p, lo, hi ∨ ∃y d : name o : op args : listflight_arg b : value, p = Tmpy ∧ lookupy once = SomeDInstFlightd o args LowerOfb

left

2 open

once :
listname × def
lo, hi :
Z
el :
value × Z × Z
E :
p, lo, hi = el
⊢
el = p, lo, hi
deferred goal
once :
listname × def
fuel :
nat
lo, hi :
Z
el :
value × Z × Z
H :
p, lo, hi = el
∨
Inel
match p with
⇒
match lookupx once with
⇒
[ ]
SomeDInstFlight_ o args LowerOfb
⇒
match flight_termo args b with
Someov, sign
⇒
match offset_intervalonce ov L with
Someolo, ohi
⇒
sign =? 1
→
guard_chain_goonce fuel b lo + olo hi + ohi
else
guard_chain_goonce fuel b lo − ohi hi − olo
None
⇒
[ ]
None
⇒
[ ]
_
⇒
[ ]
_
⇒
[ ]
⊢
el = p, lo, hi ∨ ∃y d : name o : op args : listflight_arg b : value, p = Tmpy ∧ lookupy once = SomeDInstFlightd o args LowerOfb

auto

deferred goal
once :
listname × def
fuel :
nat
lo, hi :
Z
el :
value × Z × Z
H :
p, lo, hi = el
∨
Inel
match p with
⇒
match lookupx once with
⇒
[ ]
SomeDInstFlight_ o args LowerOfb
⇒
match flight_termo args b with
Someov, sign
⇒
match offset_intervalonce ov L with
Someolo, ohi
⇒
sign =? 1
→
guard_chain_goonce fuel b lo + olo hi + ohi
else
guard_chain_goonce fuel b lo − ohi hi − olo
None
⇒
[ ]
None
⇒
[ ]
_
⇒
[ ]
_
⇒
[ ]
⊢
el = p, lo, hi ∨ ∃y d : name o : op args : listflight_arg b : value, p = Tmpy ∧ lookupy once = SomeDInstFlightd o args LowerOfb

–destruct H as E | H ; left ; auto | right

once :
listname × def
fuel :
nat
lo, hi :
Z
el :
value × Z × Z
H :
Inel
match p with
⇒
match lookupx once with
⇒
[ ]
SomeDInstFlight_ o args LowerOfb
⇒
match flight_termo args b with
Someov, sign
⇒
match offset_intervalonce ov L with
Someolo, ohi
⇒
sign =? 1
→
guard_chain_goonce fuel b lo + olo hi + ohi
else
guard_chain_goonce fuel b lo − ohi hi − olo
None
⇒
[ ]
None
⇒
[ ]
_
⇒
[ ]
_
⇒
[ ]
⊢
∃y d : name o : op args : listflight_arg b : value, p = Tmpy ∧ lookupy once = SomeDInstFlightd o args LowerOfb

destruct p as y | c | g ; | simpl in H ; contradiction | simpl in H ; contradiction

once :
listname × def
fuel :
nat
y :
lo, hi :
Z
el :
value × Z × Z
H :
Inel
match lookupy once with
⇒
[ ]
SomeDInstFlight_ o args LowerOfb
⇒
match flight_termo args b with
Someov, sign
⇒
match offset_intervalonce ov L with
Someolo, ohi
⇒
sign =? 1
→
guard_chain_goonce fuel b lo + olo hi + ohi
else
guard_chain_goonce fuel b lo − ohi hi − olo
None
⇒
[ ]
None
⇒
[ ]
_
⇒
[ ]
⊢
∃y0 d : name o : op args : listflight_arg b : value, Tmpy = Tmpy0 ∧ lookupy0 once = SomeDInstFlightd o args LowerOfb

destruct lookupy once as | ph | i | eqn: Ey ; try simpl in H ; contradiction

once :
listname × def
fuel :
nat
y :
lo, hi :
Z
el :
value × Z × Z
i :
Ey :
lookupy once = SomeDInsti
H :
Inel
match i with
⇒
[ ]
Flight_ o args LowerOfb
⇒
match flight_termo args b with
Someov, sign
⇒
match offset_intervalonce ov L with
Someolo, ohi
⇒
sign =? 1
→
guard_chain_goonce fuel b lo + olo hi + ohi
else
guard_chain_goonce fuel b lo − ohi hi − olo
None
⇒
[ ]
None
⇒
[ ]
_
⇒
[ ]
⊢
∃y0 d : name o : op args : listflight_arg b : value, Tmpy = Tmpy0 ∧ lookupy0 once = SomeDInstFlightd o args LowerOfb

destruct i as | d o args lw | | | | | | | ; try simpl in H ; contradiction

once :
listname × def
fuel :
nat
y :
lo, hi :
Z
el :
value × Z × Z
d :
o :
args :
Ey :
lookupy once = SomeDInstFlightd o args lw
H :
Inel
match lw with
⇒
[ ]
⇒
match flight_termo args b with
Someov, sign
⇒
match offset_intervalonce ov L with
Someolo, ohi
⇒
sign =? 1
→
guard_chain_goonce fuel b lo + olo hi + ohi
else
guard_chain_goonce fuel b lo − ohi hi − olo
None
⇒
[ ]
None
⇒
[ ]
⊢
∃y0 d0 : name o0 : op args0 : listflight_arg b : value, Tmpy = Tmpy0 ∧ lookupy0 once = SomeDInstFlightd0 o0 args0 LowerOfb

destruct lw ; simpl in H ; contradiction | eauto 8

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros once fuel p lo hi el H
destruct fuel as | fuel ; simpl in H
–destruct H as E |
left
auto
–destruct H as E | H ; left ; auto | right
destruct p as y | c | g ; | simpl in H ; contradiction | simpl in H ; contradiction
destruct lookupy once as | ph | i | eqn: Ey ; try simpl in H ; contradiction
destruct i as | d o args lw | | | | | | | ; try simpl in H ; contradiction
destruct lw ; simpl in H ; contradiction | eauto 8

A flight d that steps and continues binds d to a pointer.

439Lemma flight_step_ptr
∀ ge fr m d o args lw e1 l1 m1
inst_stepge fr m Flightd o args lw = SomeIContinuee1 l1 m1
∃pf, lookupd e1 = SomeWPtrpf
Explore proof 6 tactics

Initial goal

⊢
∀ge : genv fr : frame m : Memory.mem d : name o : op args : listflight_arg lw : flight_lower e1 : env l1 : listname × optionZ m1 : Memory.mem, inst_stepge fr m Flightd o args lw = SomeIContinuee1 l1 m1 → ∃pf : ptr, lookupd e1 = SomeWPtrpf

intros ge fr m d o args lw e1 l1 m1 H

ge :
fr :
m :
Memory.mem
d :
o :
args :
e1 :
l1 :
listname × optionZ
m1 :
Memory.mem
H :
inst_stepge fr m Flightd o args lw = SomeIContinuee1 l1 m1
⊢
∃pf : ptr, lookupd e1 = SomeWPtrpf

simpl in H

ge :
fr :
m :
Memory.mem
d :
o :
args :
e1 :
l1 :
listname × optionZ
m1 :
Memory.mem
H :
let* xs ≔ map_optionflight_arg_xge fr_envfr args in
let* a ≔ aluo L xs in
let* c ≔ flight_capge fr_envfr lw in
match a with
⇒
_
⇒
None
=
SomeIContinuee1 l1 m1
⊢
∃pf : ptr, lookupd e1 = SomeWPtrpf

cases H

ge :
fr :
m :
Memory.mem
d :
o :
args :
e1 :
l1 :
listname × optionZ
m1 :
Memory.mem
l :
listword
Heqo0 :
map_optionflight_arg_xge fr_envfr args = Somel
w :
n :
Z
Heqw0 :
w = WIntn
Heqo1 :
aluo L l = SomeWIntn
c :
Heqo2 :
flight_capge fr_envfr lw = Somec
H :
SomeIContinueputd WPtrptr_addr ≔ n; ptr_cap ≔ c fr_envfr fr_localsfr m = SomeIContinuee1 l1 m1
⊢
∃pf : ptr, lookupd e1 = SomeWPtrpf

injection H as ← _ _

ge :
fr :
m :
Memory.mem
d :
o :
args :
l1 :
listname × optionZ
m1 :
Memory.mem
l :
listword
Heqo0 :
map_optionflight_arg_xge fr_envfr args = Somel
w :
n :
Z
Heqw0 :
w = WIntn
Heqo1 :
aluo L l = SomeWIntn
c :
Heqo2 :
flight_capge fr_envfr lw = Somec
⊢
∃pf : ptr, lookupd putd WPtrptr_addr ≔ n; ptr_cap ≔ c fr_envfr = SomeWPtrpf

rewrite lookup_put_same

ge :
fr :
m :
Memory.mem
d :
o :
args :
l1 :
listname × optionZ
m1 :
Memory.mem
l :
listword
Heqo0 :
map_optionflight_arg_xge fr_envfr args = Somel
w :
n :
Z
Heqw0 :
w = WIntn
Heqo1 :
aluo L l = SomeWIntn
c :
Heqo2 :
flight_capge fr_envfr lw = Somec
⊢
∃pf : ptr, SomeWPtrptr_addr ≔ n; ptr_cap ≔ c = SomeWPtrpf

eauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge fr m d o args lw e1 l1 m1 H
simpl in H
injection H as ← _ _
eauto

A check-like instruction (one check_fact reads) is replayable: Single.v's invariant covers it.

448Lemma check_fact_replayable
∀ i fa
check_facti = Somefa
replayablei = true
Explore proof 4 tactics

Initial goal

⊢
∀i : inst fa : fact, check_facti = Somefa → replayablei = true

intros i fa H

i :
fa :
H :
check_facti = Somefa
⊢
replayablei = true

destruct i as q k o args | | | | | | | | ; try discriminate H

q :
o :
args :
listvalue
fa :
H :
check_factLetq k o args = Somefa
⊢
replayableLetq k o args = true

destruct o ; try reflexivity

q :
align :
Z
args :
listvalue
fa :
H :
check_factLetq k Allocalign args = Somefa
⊢
replayableLetq k Allocalign args = true

destruct k ; discriminate H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros i fa H
destruct i as q k o args | | | | | | | | ; try discriminate H
destruct o ; try reflexivity
destruct k ; discriminate H

A check-like instruction also has an access fact, the range its own access checks (access_fact).

456Lemma access_fact_some
∀ i fa
check_facti = Somefa
∃fb, access_facti = Somefb
Explore proof 7 tactics

Initial goal

⊢
∀i : inst fa : fact, check_facti = Somefa → ∃fb : fact, access_facti = Somefb

intros i fa H

i :
fa :
H :
check_facti = Somefa
⊢
∃fb : fact, access_facti = Somefb

destruct i as q k o args | | | | | | | | ; try discriminate H

q :
o :
args :
listvalue
fa :
H :
check_factLetq k o args = Somefa
⊢
∃fb : fact, access_factLetq k o args = Somefb

destruct k ; try eexists ; exact H

q :
o :
args :
listvalue
fa :
H :
check_factLetq A o args = Somefa
⊢
∃fb : fact, access_factLetq A o args = Somefb

destruct o ; try eexists ; exact H

q :
lo, hi :
Z
align, ahi :
Z
args :
listvalue
fa :
H :
check_factLetq A CheckAheadlo hi r align ahi args = Somefa
⊢
∃fb : fact, access_factLetq A CheckAheadlo hi r align ahi args = Somefb

destruct args as | a | a2 args ; try eexists ; exact H

q :
lo, hi :
Z
align, ahi :
Z
fa :
H :
check_factLetq A CheckAheadlo hi r align ahi a = Somefa
⊢
∃fb : fact, access_factLetq A CheckAheadlo hi r align ahi a = Somefb

eexists

2 open

q :
lo, hi :
Z
align, ahi :
Z
fa :
H :
check_factLetq A CheckAheadlo hi r align ahi a = Somefa
⊢
access_factLetq A CheckAheadlo hi r align ahi a = Some?fb
shelved goal
q :
lo, hi :
Z
align, ahi :
Z
fa :
H :
check_factLetq A CheckAheadlo hi r align ahi a = Somefa
⊢

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros i fa H
destruct i as q k o args | | | | | | | | ; try discriminate H
destruct k ; try eexists ; exact H
destruct o ; try eexists ; exact H
destruct args as | a | a2 args ; try eexists ; exact H
eexists
reflexivity

Lemmas for a frame fr of a checked_module md, in memory m, at index k of a reachable block l, where every single definition in scope but a check_ahead replays (scope_plain). A doomed frame keeps that much, so Doomed.v uses these too.

467Section Plain
469Variables ge : genv
469Variables md : module
469Variables fr : frame
469Variables m : Memory.mem
469Variables l : name
469Variables k : Z
470Hypothesis Hmd
471Hypothesis Hin
472Hypothesis Hr
473Hypothesis Hs
474Hypothesis Hpt

A value p a known distance d from a value p1 that holds a pointer (pointer_distance/4) holds a pointer too, where the single definitions of both dominate the point. p's guard chain starts at a single definition: the exact base itself, which p1's chain reads, or a flight, which binds a pointer (chain_go_head).

482Lemma distance_pointer
∀ p p1 pp1 d
∃pp, value_xge fr_envfr P p = SomeWPtrpp
Proof 27 steps Qed
intros p p1 pp1 d Hp1 Hd Hd1 H
rewrite pointer_distance_eq in H
destruct first_some_in_ _ _ _ _ H as el & Hel & Hf
destruct exact_basesingle_definitionsfr_fnfr el as n0 k0 | eqn: Eb ; | discriminate Hf
destruct first_some_in_ _ _ _ _ Hf as el1 & Hel1 & Hf1
destruct el1 as n1 | c1 | g1 k1 k1′ ; try discriminate Hf1
destruct name_eqbn1 n0 && k1 =? k1' eqn: E1 ; | discriminate Hf1
apply andb_true_iff in E1 as En _
apply name_eqb_true in En
subst n1
rewrite guard_chain_eq in Hel
destruct chain_go_head_ _ _ _ _ _ Hel as → | y & d′ & o & args & b & → & Ey

the exact base is p itself, which p1's chain reads

–destruct p as y | c | g ; try discriminate Eb
unfold exact_base in Eb
destruct once_hassingle_definitionsfr_fnfr y eqn: Ho ; | discriminate Eb
injection Eb as ← _
assert Hst : stablesingle_definitionsfr_fnfr Tmpy by intros y′ E ; injection E as ← ; exact Ho
destruct guard_chain_soundge md fr m l k Hmd Hin Hr Hs Hpt _ _ _ _ _ Hp1 Hd1 Hel1 Hst as pb & _ & Hpb & _
eauto

p is a flight, which binds a pointer

–assert Ho : once_hassingle_definitionsfr_fnfr y = true by unfold once_has ; rewrite Ey ; reflexivity
pose proof flight_def_name_ _ _ _ _ _ Ey as →
destruct plain_replays_ _ _ _ _ _ _ Hs Hpt Ey eq_refl eq_refl Hdy eq_refl Ho as fr0 & m0 & e1 & l1 & m1 & Hst & Hy & _
destruct flight_step_ptr_ _ _ _ _ _ _ _ _ _ Hst as pf Hpf
exists pf
simpl
rewrite <- Hy , Hpf
reflexivity

Lemmas for a frame fr as in Plain, but where every replayable single definition in scope replays (scope_holds), check_ahead included, since a renew's source may be one.

519Section Reuse
521Variables ge : genv
521Variables md : module
521Variables fr : frame
521Variables m : Memory.mem
521Variables l : name
521Variables k : Z
522Hypothesis Hmd
523Hypothesis Hin
524Hypothesis Hr
525Hypothesis Hs
526Hypothesis Hpt

A single-definition operand y of the instruction i at the frame's point, index kk of block b, has a site that dominates the point: the validator requires an operand's definition to dominate its use (definitions_dominate/3).

532Lemma operand_at
∀ b kk i y
nth_errorb_instsb kk = Somei
k = Z.of_natkk
Explore proof 10 tactics

Initial goal

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
⊢
∀b : block kk : nat i : inst y : name, find_blockl fn_blocksfr_fnfr = Someb → nth_errorb_instsb kk = Somei → k = Z.of_natkk → Iny inst_usesi → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y

intros b kk i y Hb Hk → Hu Ho

ge :
md :
fr :
m :
Memory.mem
l :
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
kk :
nat
Hpt :
point_sitefr_fnfr fr_atfr = Somel, Z.of_natkk
i :
y :
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hu :
⊢
dominatingfr_fnfr l Z.of_natkk y

destruct func_facts_ _ Hmd Hin as b0 & rest & _ & _ & _ & Hdd

ge :
md :
fr :
m :
Memory.mem
l :
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
kk :
nat
Hpt :
point_sitefr_fnfr fr_atfr = Somel, Z.of_natkk
i :
y :
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hu :
b0 :
rest :
listblock
⊢
dominatingfr_fnfr l Z.of_natkk y

destruct find_block_in_ _ _ Hb as Hbin Hl

ge :
md :
fr :
m :
Memory.mem
l :
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
kk :
nat
Hpt :
point_sitefr_fnfr fr_atfr = Somel, Z.of_natkk
i :
y :
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hu :
b0 :
rest :
listblock
Hbin :
Hl :
b_labelb = l
⊢
dominatingfr_fnfr l Z.of_natkk y

unfold once_has in Ho

ge :
md :
fr :
m :
Memory.mem
l :
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
kk :
nat
Hpt :
point_sitefr_fnfr fr_atfr = Somel, Z.of_natkk
i :
y :
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hu :
Ho :
Some_
⇒
true
None
⇒
false
=
true
b0 :
rest :
listblock
Hbin :
Hl :
b_labelb = l
⊢
dominatingfr_fnfr l Z.of_natkk y

destruct lookupy single_definitionsfr_fnfr as D | eqn: Ey ; | discriminate Ho

ge :
md :
fr :
m :
Memory.mem
l :
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
kk :
nat
Hpt :
point_sitefr_fnfr fr_atfr = Somel, Z.of_natkk
i :
y :
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hu :
D :
Ho :
true = true
b0 :
rest :
listblock
Hbin :
Hl :
b_labelb = l
⊢
dominatingfr_fnfr l Z.of_natkk y

rewrite <- Hl in Hr

ge :
md :
fr :
m :
Memory.mem
l :
Hin :
InIFuncfr_fnfr md
Hs :
kk :
nat
Hpt :
point_sitefr_fnfr fr_atfr = Somel, Z.of_natkk
i :
y :
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hu :
D :
Ho :
true = true
b0 :
rest :
listblock
Hbin :
Hl :
b_labelb = l
⊢
dominatingfr_fnfr l Z.of_natkk y

destruct use_dominated_ _ _ _ _ _ _ Hdd Hbin Hr Hk Hu Ey as s & Hpos & Hsd

ge :
md :
fr :
m :
Memory.mem
l :
Hin :
InIFuncfr_fnfr md
Hs :
kk :
nat
Hpt :
point_sitefr_fnfr fr_atfr = Somel, Z.of_natkk
i :
y :
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hu :
D :
Ho :
true = true
b0 :
rest :
listblock
Hbin :
Hl :
b_labelb = l
s :
Hpos :
Iny, s, D def_positionsfr_fnfr
Hsd :
site_dominatesfn_domsfr_fnfr b_labelb Z.of_natkk s = true
⊢
dominatingfr_fnfr l Z.of_natkk y

exists s, D

ge :
md :
fr :
m :
Memory.mem
l :
Hin :
InIFuncfr_fnfr md
Hs :
kk :
nat
Hpt :
point_sitefr_fnfr fr_atfr = Somel, Z.of_natkk
i :
y :
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hu :
D :
Ho :
true = true
b0 :
rest :
listblock
Hbin :
Hl :
b_labelb = l
s :
Hpos :
Iny, s, D def_positionsfr_fnfr
Hsd :
site_dominatesfn_domsfr_fnfr b_labelb Z.of_natkk s = true
⊢
lookupy single_definitionsfr_fnfr = SomeD ∧ Iny, s, D def_positionsfr_fnfr ∧ site_dominatesSites.fn_domsfr_fnfr l Z.of_natkk s = true

rewrite <- Hl

ge :
md :
fr :
m :
Memory.mem
l :
Hin :
InIFuncfr_fnfr md
Hs :
kk :
nat
Hpt :
point_sitefr_fnfr fr_atfr = Somel, Z.of_natkk
i :
y :
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hu :
D :
Ho :
true = true
b0 :
rest :
listblock
Hbin :
Hl :
b_labelb = l
s :
Hpos :
Iny, s, D def_positionsfr_fnfr
Hsd :
site_dominatesfn_domsfr_fnfr b_labelb Z.of_natkk s = true
⊢
lookupy single_definitionsfr_fnfr = SomeD ∧ Iny, s, D def_positionsfr_fnfr ∧ site_dominatesSites.fn_domsfr_fnfr b_labelb Z.of_natkk s = true

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b kk i y Hb Hk → Hu Ho
destruct func_facts_ _ Hmd Hin as b0 & rest & _ & _ & _ & Hdd
destruct find_block_in_ _ _ Hb as Hbin Hl
unfold once_has in Ho
destruct lookupy single_definitionsfr_fnfr as D | eqn: Ey ; | discriminate Ho
rewrite <- Hl in Hr
destruct use_dominated_ _ _ _ _ _ _ Hdd Hbin Hr Hk Hu Ey as s & Hpos & Hsd
exists s, D
rewrite <- Hl
auto

A renew source n1 of the pointer p1 that dominates the point holds the pointer pp that p1 holds, and the check n1 made of pp passed (check_passes) in a memory m1 that lay in the address space and that the current memory persists from. p1 dominates the point too, and the checked span is nonempty.

550Lemma renew_source_holds
∀ n1 p1 lo1 hi1 al1
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
∃pp m1 r1, lookupn1 fr_envfr = SomeWPtrpp ∧ value_xge fr_envfr P Tmpp1 = SomeWPtrpp ∧ check_passesm1 pp lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1
Explore proof 21 tactics

Initial goal

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
⊢
∀n1 p1 : name lo1 hi1 al1 : Z, lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1 → dominatingfr_fnfr l k n1 → ∃pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp ∧ value_xge fr_envfr P Tmpp1 = SomeWPtrpp ∧ check_passesm1 pp lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

intros n1 p1 lo1 hi1 al1 Hsrc Hdom

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
⊢
∃pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp ∧ value_xge fr_envfr P Tmpp1 = SomeWPtrpp ∧ check_passesm1 pp lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

destruct renew_source_def_ _ _ _ _ _ _ Hsrc as i1 & r1 & Hn1 & Hcf & Hop1

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
⊢
∃pp : ptr m1 : Memory.mem r0 : rights, lookupn1 fr_envfr = SomeWPtrpp ∧ value_xge fr_envfr P Tmpp1 = SomeWPtrpp ∧ check_passesm1 pp lo1 hi1 r0 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

destruct dominating_replays_ _ _ _ _ _ _ Hs Hpt Hn1 check_fact_replayable_ _ Hcf Hdom as fr0 & m0 & e1 & l1 & m1 & Hst & He1 & Hops & Hp & Hfit

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
e1 :
l1 :
listname × optionZ
m1 :
Memory.mem
Hst :
inst_stepge fr0 m0 i1 = SomeIContinuee1 l1 m1
He1 :
lookupn1 e1 = lookupn1 fr_envfr
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
⊢
∃pp : ptr m2 : Memory.mem r0 : rights, lookupn1 fr_envfr = SomeWPtrpp ∧ value_xge fr_envfr P Tmpp1 = SomeWPtrpp ∧ check_passesm2 pp lo1 hi1 r0 al1 ∧ persistsm2 m ∧ objects_fitm_regionsm2 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

destruct access_fact_some_ _ Hcf as fb Hfb

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
e1 :
l1 :
listname × optionZ
m1 :
Memory.mem
Hst :
inst_stepge fr0 m0 i1 = SomeIContinuee1 l1 m1
He1 :
lookupn1 e1 = lookupn1 fr_envfr
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
⊢
∃pp : ptr m2 : Memory.mem r0 : rights, lookupn1 fr_envfr = SomeWPtrpp ∧ value_xge fr_envfr P Tmpp1 = SomeWPtrpp ∧ check_passesm2 pp lo1 hi1 r0 al1 ∧ persistsm2 m ∧ objects_fitm_regionsm2 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

destruct check_like_continue_ _ _ _ _ _ _ _ _ Hcf Hfb Hst as → & _ & _ & pp & → & Hx & Hc & _

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P f_pf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 = SomeWPtrpp
Hc :
check_passesm0 pp f_lof_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 f_hif_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 f_rf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 f_alf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
⊢
∃pp0 : ptr m1 : Memory.mem r0 : rights, lookupn1 fr_envfr = SomeWPtrpp0 ∧ value_xge fr_envfr P Tmpp1 = SomeWPtrpp0 ∧ check_passesm1 pp0 lo1 hi1 r0 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

cbn [ f_q f_p f_lo f_hi f_r f_al ] in Hx , Hc , He1

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
⊢
∃pp0 : ptr m1 : Memory.mem r0 : rights, lookupn1 fr_envfr = SomeWPtrpp0 ∧ value_xge fr_envfr P Tmpp1 = SomeWPtrpp0 ∧ check_passesm1 pp0 lo1 hi1 r0 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

assert Hu1 : Inp1 inst_usesi1 by exact check_fact_uses_ _ _ Hcf eq_refl

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
∃pp0 : ptr m1 : Memory.mem r0 : rights, lookupn1 fr_envfr = SomeWPtrpp0 ∧ value_xge fr_envfr P Tmpp1 = SomeWPtrpp0 ∧ check_passesm1 pp0 lo1 hi1 r0 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

exists pp, m0, r1

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
lookupn1 fr_envfr = SomeWPtrpp ∧ value_xge fr_envfr P Tmpp1 = SomeWPtrpp ∧ check_passesm0 pp lo1 hi1 r1 al1 ∧ persistsm0 m ∧ objects_fitm_regionsm0 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

split ; rewrite <- He1 ; apply lookup_put_same |

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
value_xge fr_envfr P Tmpp1 = SomeWPtrpp ∧ check_passesm0 pp lo1 hi1 r1 al1 ∧ persistsm0 m ∧ objects_fitm_regionsm0 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

split ; rewrite <- Hx ; symmetry ; apply value_x_agree ; intros y E ; injection E as ← ; exact Hops_ Hu1 Hop1 |

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
check_passesm0 pp lo1 hi1 r1 al1 ∧ persistsm0 m ∧ objects_fitm_regionsm0 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

split ; exact Hc |

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
persistsm0 m ∧ objects_fitm_regionsm0 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

split ; exact Hp |

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
objects_fitm_regionsm0 ∧ lo1 < hi1 ∧ dominatingfr_fnfr l k p1

split ; exact Hfit |

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
lo1 < hi1 ∧ dominatingfr_fnfr l k p1

split

2 open

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
lo1 < hi1
focused goal
ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢

–destruct Hdom as s & D & Hn & Hpos & _

2 open

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
s :
D :
Hpos :
Inn1, s, D def_positionsfr_fnfr
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
lo1 < hi1
deferred goal
ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢

rewrite Hn1 in Hn

2 open

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
s :
D :
i1 :
Hn :
SomeDInsti1 = SomeD
Hpos :
Inn1, s, D def_positionsfr_fnfr
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
lo1 < hi1
deferred goal
ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢

injection Hn as ←

2 open

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
s :
i1 :
Hpos :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
lo1 < hi1
deferred goal
ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢

destruct dinst_site_ _ _ _ Hpos as d & j & →

2 open

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
i1 :
d :
j :
Z
Hpos :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢
lo1 < hi1
deferred goal
ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢

destruct position_inst_ _ _ _ _ Hpos as b1 & kk1 & Hb1 & _ & Hk1 & _ & _

2 open

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
i1 :
d :
j :
Z
Hpos :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
b1 :
kk1 :
nat
Hb1 :
Hk1 :
nth_errorb_instsb1 kk1 = Somei1
⊢
lo1 < hi1
deferred goal
ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢

exact proj1check_fact_ok_ _ _ _ _ Hmd Hin Hb1 nth_error_In_ _ Hk1 Hcf

deferred goal
ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
n1, p1 :
lo1, hi1, al1 :
Z
Hsrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Hdom :
i1 :
r1 :
Hcf :
check_facti1 = Somef_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1
fr0 :
m0 :
Memory.mem
l1 :
listname × optionZ
pp :
He1 :
lookupn1 putn1 WPtrpp fr_envfr0 = lookupn1 fr_envfr
Hst :
inst_stepge fr0 m0 i1 = SomeIContinueputf_qf_q ≔ n1; f_p ≔ Tmpp1; f_lo ≔ lo1; f_hi ≔ hi1; f_r ≔ r1; f_al ≔ al1 WPtrpp fr_envfr0 l1 m0
Hops :
∀a : name, Ina inst_usesi1 → once_hassingle_definitionsfr_fnfr a = true → lookupa fr_envfr0 = lookupa fr_envfr
Hp :
fb :
Hfb :
access_facti1 = Somefb
Hx :
value_xge fr_envfr0 P Tmpp1 = SomeWPtrpp
Hc :
check_passesm0 pp lo1 hi1 r1 al1
Hu1 :
Inp1 inst_usesi1
⊢

–exact operand_dominating_ _ _ _ _ _ _ Hmd Hin Hr Hn1 Hdom Hu1 Hop1

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros n1 p1 lo1 hi1 al1 Hsrc Hdom
destruct renew_source_def_ _ _ _ _ _ _ Hsrc as i1 & r1 & Hn1 & Hcf & Hop1
destruct dominating_replays_ _ _ _ _ _ _ Hs Hpt Hn1 check_fact_replayable_ _ Hcf Hdom as fr0 & m0 & e1 & l1 & m1 & Hst & He1 & Hops & Hp & Hfit
destruct access_fact_some_ _ Hcf as fb Hfb
destruct check_like_continue_ _ _ _ _ _ _ _ _ Hcf Hfb Hst as → & _ & _ & pp & → & Hx & Hc & _
cbn [ f_q f_p f_lo f_hi f_r f_al ] in Hx , Hc , He1
assert Hu1 : Inp1 inst_usesi1 by exact check_fact_uses_ _ _ Hcf eq_refl
exists pp, m0, r1
split ; rewrite <- He1 ; apply lookup_put_same |
split ; rewrite <- Hx ; symmetry ; apply value_x_agree ; intros y E ; injection E as ← ; exact Hops_ Hu1 Hop1 |
split ; exact Hc |
split ; exact Hp |
split ; exact Hfit |
split
–destruct Hdom as s & D & Hn & Hpos & _
rewrite Hn1 in Hn
injection Hn as ←
destruct dinst_site_ _ _ _ Hpos as d & j & →
destruct position_inst_ _ _ _ _ Hpos as b1 & kk1 & Hb1 & _ & Hk1 & _ & _
exact proj1check_fact_ok_ _ _ _ _ Hmd Hin Hb1 nth_error_In_ _ Hk1 Hcf
–exact operand_dominating_ _ _ _ _ _ _ Hmd Hin Hr Hn1 Hdom Hu1 Hop1

What a renew or half check i the pass accepted reads at the frame's point, index kk of block b. Q1, the name n1, holds the pointer PP1 of a renew source's check that passed in m1, a memory in the address space that the current one persists from; the renewed value p holds a pointer PP of PP1's capability, d past it modulo 2^64 (renew_source_holds, pointer_distance_sound).

581Lemma reuse_operands
∀ b kk i n1 p p1 lo1 hi1 al1 d
nth_errorb_instsb kk = Somei
k = Z.of_natkk
Inn1 inst_usesi
∀y, p = Tmpy → Iny inst_usesi
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
∃pp1 pp m1 r1, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Explore proof 15 tactics

Initial goal

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
⊢
∀b : block kk : nat i : inst n1 : name p : value p1 : name lo1 hi1 al1 d : Z, find_blockl fn_blocksfr_fnfr = Someb → nth_errorb_instsb kk = Somei → k = Z.of_natkk → Inn1 inst_usesi → ∀y : name, p = Tmpy → Iny inst_usesi → lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1 → pointer_distances_oncefn_srcmd fr_fnfr p Tmpp1 = Somed → ∃pp1 pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64

intros b kk i n1 p p1 lo1 hi1 al1 d Hb Hk Hkk Hu1 Hu Esrc Ed

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
⊢
∃pp1 pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64

destruct fn_src_casesmd fr_fnfr as _ Esj | _ Esj

2 open

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ [ ]; s_once ≔ [ ]; s_ahead ≔ [ ]; s_getters ≔ [ ]
⊢
∃pp1 pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
focused goal
ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
⊢
∃pp1 pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64

{rewrite Esj in Esrc

2 open

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewss_renews ≔ [ ]; s_once ≔ [ ]; s_ahead ≔ [ ]; s_getters ≔ [ ] = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ [ ]; s_once ≔ [ ]; s_ahead ≔ [ ]; s_getters ≔ [ ]
⊢
∃pp1 pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
deferred goal
ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
⊢
∃pp1 pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64

discriminate Esrc

deferred goal
ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
⊢
∃pp1 pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64

rewrite Esj in Ed

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
⊢
∃pp1 pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64

cbn [ s_once ] in Ed

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
⊢
∃pp1 pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64

destruct renew_source_def_ _ _ _ _ _ _ Esrc as i1 & _ & En1 & _

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
i1 :
⊢
∃pp1 pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64

assert Hdn1 : dominatingfr_fnfr l k n1 by apply operand_atb kk i n1 Hb Hk Hkk Hu1 ; unfold once_has ; rewrite En1 ; reflexivity

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
i1 :
Hdn1 :
⊢
∃pp1 pp : ptr m1 : Memory.mem r1 : rights, lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64

destruct renew_source_holdsn1 p1 lo1 hi1 al1 Esrc Hdn1 as pp1 & m1 & r1 & Hn1 & Hp1 & Hc1 & Hp & Hfit1 & Hl1 & Hdp1

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
i1 :
Hdn1 :
pp1 :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hp1 :
value_xge fr_envfr P Tmpp1 = SomeWPtrpp1
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hdp1 :
⊢
∃pp0 pp : ptr m0 : Memory.mem r0 : rights, lookupn1 fr_envfr = SomeWPtrpp0 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm0 pp0 lo1 hi1 r0 al1 ∧ persistsm0 m ∧ objects_fitm_regionsm0 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp0 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp0 + d mod 2 ^ 64

assert Hdp : ∀y, p = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y by intros y E Ho ; exact operand_atb kk i y Hb Hk Hkk Huy E Ho

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
i1 :
Hdn1 :
pp1 :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hp1 :
value_xge fr_envfr P Tmpp1 = SomeWPtrpp1
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hdp1 :
Hdp :
∀y : name, p = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y
⊢
∃pp0 pp : ptr m0 : Memory.mem r0 : rights, lookupn1 fr_envfr = SomeWPtrpp0 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm0 pp0 lo1 hi1 r0 al1 ∧ persistsm0 m ∧ objects_fitm_regionsm0 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp0 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp0 + d mod 2 ^ 64

assert Hdq : ∀y, Tmpp1 = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y by intros y E _ ; injection E as ← ; exact Hdp1

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
i1 :
Hdn1 :
pp1 :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hp1 :
value_xge fr_envfr P Tmpp1 = SomeWPtrpp1
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hdp1 :
Hdp :
∀y : name, p = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y
Hdq :
∀y : name, Tmpp1 = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y
⊢
∃pp0 pp : ptr m0 : Memory.mem r0 : rights, lookupn1 fr_envfr = SomeWPtrpp0 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm0 pp0 lo1 hi1 r0 al1 ∧ persistsm0 m ∧ objects_fitm_regionsm0 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp0 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp0 + d mod 2 ^ 64

destruct distance_pointerge md fr m l k Hmd Hin Hr scope_plain_of_ _ _ Hs Hpt p Tmpp1 pp1 d Hp1 Hdp Hdq Ed as pp Hpp

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
i1 :
Hdn1 :
pp1 :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hp1 :
value_xge fr_envfr P Tmpp1 = SomeWPtrpp1
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hdp1 :
Hdp :
∀y : name, p = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y
Hdq :
∀y : name, Tmpp1 = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y
pp :
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
⊢
∃pp0 pp2 : ptr m0 : Memory.mem r0 : rights, lookupn1 fr_envfr = SomeWPtrpp0 ∧ value_xge fr_envfr P p = SomeWPtrpp2 ∧ check_passesm0 pp0 lo1 hi1 r0 al1 ∧ persistsm0 m ∧ objects_fitm_regionsm0 ∧ lo1 < hi1 ∧ ptr_cappp2 = ptr_cappp0 ∧ ptr_addrpp2 mod 2 ^ 64 = ptr_addrpp0 + d mod 2 ^ 64

destruct pointer_distance_soundge md fr m l k Hmd Hin Hr scope_plain_of_ _ _ Hs Hpt p Tmpp1 pp pp1 d Hpp Hp1 Hdp Hdq Ed as Hcap Haddr

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
i1 :
Hdn1 :
pp1 :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hp1 :
value_xge fr_envfr P Tmpp1 = SomeWPtrpp1
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hdp1 :
Hdp :
∀y : name, p = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y
Hdq :
∀y : name, Tmpp1 = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y
pp :
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
⊢
∃pp0 pp2 : ptr m0 : Memory.mem r0 : rights, lookupn1 fr_envfr = SomeWPtrpp0 ∧ value_xge fr_envfr P p = SomeWPtrpp2 ∧ check_passesm0 pp0 lo1 hi1 r0 al1 ∧ persistsm0 m ∧ objects_fitm_regionsm0 ∧ lo1 < hi1 ∧ ptr_cappp2 = ptr_cappp0 ∧ ptr_addrpp2 mod 2 ^ 64 = ptr_addrpp0 + d mod 2 ^ 64

exists pp1, pp, m1, r1

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
i :
n1 :
p1 :
lo1, hi1, al1, d :
Z
Hb :
Hk :
nth_errorb_instsb kk = Somei
Hkk :
k = Z.of_natkk
Hu1 :
Inn1 inst_usesi
Hu :
∀y : name, p = Tmpy → Iny inst_usesi
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
Esj :
fn_srcmd fr_fnfr = s_renews ≔ flat_mapλb : block ⇒ flat_mapλi : inst ⇒ match renew_sourcesingle_definitionsfr_fnfr i with Somer ⇒ r | None ⇒ [ ] end b_instsb fn_blocksfr_fnfr; s_once ≔ single_definitionsfr_fnfr; s_ahead ≔ ahead_justifiedfr_fnfr single_definitionsfr_fnfr; s_getters ≔ repeated_gettersmd fr_fnfr fn_domsfr_fnfr single_definitionsfr_fnfr
i1 :
Hdn1 :
pp1 :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hp1 :
value_xge fr_envfr P Tmpp1 = SomeWPtrpp1
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hdp1 :
Hdp :
∀y : name, p = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y
Hdq :
∀y : name, Tmpp1 = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y
pp :
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
⊢
lookupn1 fr_envfr = SomeWPtrpp1 ∧ value_xge fr_envfr P p = SomeWPtrpp ∧ check_passesm1 pp1 lo1 hi1 r1 al1 ∧ persistsm1 m ∧ objects_fitm_regionsm1 ∧ lo1 < hi1 ∧ ptr_cappp = ptr_cappp1 ∧ ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64

auto 10

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b kk i n1 p p1 lo1 hi1 al1 d Hb Hk Hkk Hu1 Hu Esrc Ed

A function with a setjmp has no renew sources.

destruct fn_src_casesmd fr_fnfr as _ Esj | _ Esj
{rewrite Esj in Esrc
discriminate Esrc
rewrite Esj in Ed
cbn [ s_once ] in Ed
destruct renew_source_def_ _ _ _ _ _ _ Esrc as i1 & _ & En1 & _
assert Hdn1 : dominatingfr_fnfr l k n1 by apply operand_atb kk i n1 Hb Hk Hkk Hu1 ; unfold once_has ; rewrite En1 ; reflexivity
destruct renew_source_holdsn1 p1 lo1 hi1 al1 Esrc Hdn1 as pp1 & m1 & r1 & Hn1 & Hp1 & Hc1 & Hp & Hfit1 & Hl1 & Hdp1
assert Hdp : ∀y, p = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y by intros y E Ho ; exact operand_atb kk i y Hb Hk Hkk Huy E Ho
assert Hdq : ∀y, Tmpp1 = Tmpy → once_hassingle_definitionsfr_fnfr y = true → dominatingfr_fnfr l k y by intros y E _ ; injection E as ← ; exact Hdp1
destruct distance_pointerge md fr m l k Hmd Hin Hr scope_plain_of_ _ _ Hs Hpt p Tmpp1 pp1 d Hp1 Hdp Hdq Ed as pp Hpp
destruct pointer_distance_soundge md fr m l k Hmd Hin Hr scope_plain_of_ _ _ Hs Hpt p Tmpp1 pp pp1 d Hpp Hp1 Hdp Hdq Ed as Hcap Haddr
exists pp1, pp, m1, r1
auto 10

check_align/1 allows only positive alignments.

613Lemma check_align_pos
∀ al
check_alignal = true
0 < al
Explore proof 5 tactics

Initial goal

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
⊢
∀al : Z, check_alignal = true → 0 < al

unfold check_align

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
⊢
∀al : Z, existsbZeq_boolal 1; 2; 4; 8; 16 = true → 0 < al

intros al H

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
al :
Z
H :
existsbZeq_boolal 1; 2; 4; 8; 16 = true
⊢
0 < al

simpl in H

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
al :
Z
H :
al =? 1 || al =? 2 || al =? 4 || al =? 8 || al =? 16 || false = true
⊢
0 < al

repeat apply orb_true_iff in H as H | H ; apply Z.eqb_eq in H ; lia |

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
al :
Z
H :
false = true
⊢
0 < al

discriminate H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros al H
simpl in H
repeat apply orb_true_iff in H as H | H ; apply Z.eqb_eq in H ; lia |
discriminate H

Every capability equals itself by cap_eqb.

620Lemma cap_eqb_refl
∀ c
cap_eqbc c = true
Explore proof 1 tactics

Initial goal

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
⊢
∀c : cap, cap_eqbc c = true

intros ; simpl ; try apply Z.eqb_refl ; try apply name_eqb_refl ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ; simpl ; try apply Z.eqb_refl ; try apply name_eqb_refl ; reflexivity

A renew of the value p from source n1, the instruction at index kk of block b, that the pass accepts (checked_inst_rest, checked_inst_rest/7) does not step to unchecked, in a memory in the address space. Its source holds the pointer whose check passed and the renewed pointer has its capability (reuse_operands), so there is no alias; and its span lies inside the source's (renew_access).

630Theorem renew_not_unchecked
∀ b kk q lo hi r al n1 p rest live out why
nth_errorb_instsb kk = SomeLetq A Renewlo hi r al Tmpn1; p
k = Z.of_natkk
checked_inst_restfn_srcmd fr_fnfr Letq A Renewlo hi r al Tmpn1; p rest live = Someout
inst_stepge fr m Letq A Renewlo hi r al Tmpn1; p ≠ SomeIStopUncheckedwhy
Proof 36 steps Qed
intros b kk q lo hi r al n1 p rest live out why Hfit Hb Hk Hkk H

What the pass checked: a source, a distance, and the span inside.

unfold checked_inst_rest in H
cbn beta iota zeta in H
destruct lookupn1 s_renewsfn_srcmd fr_fnfr as p1 lo1 hi1 al1 | eqn: Esrc ; | discriminate H
destruct pointer_distances_oncefn_srcmd fr_fnfr p Tmpp1 as d | eqn: Ed ; | discriminate H
cbn beta iota in H
destruct negb_ eqn: Eok ; discriminate H |
clear H
apply negb_false_iff in Eok
repeat rewrite andb_true_iff in Eok
destruct Eok as Hlo & Hhi & Hal & Hoff
apply Z.leb_le in Hlo , Hhi
apply Z.eqb_eq in Hal , Hoff

What the operands hold at the point.

destruct reuse_operandsb kk _ n1 p p1 lo1 hi1 al1 d Hb Hk Hkk ltac:simpl ; auto ltac:intros y → ; simpl ; auto Esrc Ed as pp1 & pp & m1 & r1 & Hn1 & Hpp & Hc1 & Hp & _ & _ & Hcap & Haddr

The step: one capability, so no alias; then the memory's answer.

rewrite inst_step_let by reflexivity
cbn beta iota zeta delta [ op_arg_classes map2_option ]
replace value_xge fr_envfr A Tmpn1 with SomeWPtrpp1 by simpl ; rewrite Hn1 ; reflexivity
rewrite Hpp
cbn beta iota
cbn beta iota zeta delta [ fmt_of ]
rewrite Hcap , cap_eqb_refl
destruct find_block_in_ _ _ Hb as Hbin _
destruct check_fact_ok_ _ _ _ _ Hmd Hin Hbin nth_error_In_ _ Hk eq_refl as Hsz Hca
simpl in Hsz , Hca
pose proof check_align_pos_ Hca as Hal0
replace raw_addressptr_addrpp lo with raw_addressptr_addrpp1 lo + d by unfold raw_address ; symmetry ; rewrite <- Z.add_mod_idemp_l , Haddr , Z.add_mod_idemp_l by lia ; f_equal ; lia
destruct renew_accessm1 m ptr_cappp1 ptr_addrpp1 lo1 hi1 r1 al1 tt lo + d hi − lo r al pp Hc1 Hp Hfit Hcap Hlo ltac:lia ltac:lia Hal0 Hal Hoff as chk & rr & Hchk & Hrr & Hnot
rewrite Hchk
cbn beta iota
rewrite Hrr
unfold bind_res
destruct rr as x | w | w ; try discriminate
intros E
injection E as ←
exact Hnotw eq_refl

A half check of the value p from source n1, the instruction at index kk of block b, that the pass accepts (checked_inst_rest) does not step to unchecked, in a memory in the address space whose freed objects are empty. The bound it does not test is proved by the source's span, which passed (half_access).

672Theorem half_not_unchecked
∀ b kk q bd lo hi r al n1 p rest live out why
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
k = Z.of_natkk
checked_inst_restfn_srcmd fr_fnfr Letq A HalfCheckbd lo hi r al Tmpn1; p rest live = Someout
inst_stepge fr m Letq A HalfCheckbd lo hi r al Tmpn1; p ≠ SomeIStopUncheckedwhy
Explore proof 28 tactics

Initial goal

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
⊢
∀b : block kk : nat q : name bd : bound lo hi : Z r : rights al : Z n1 : name p : value rest : listinst live : listfact out : listinst × listfact why : reason, objects_fitm_regionsm → freed_emptym_regionsm → find_blockl fn_blocksfr_fnfr = Someb → nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p → k = Z.of_natkk → checked_inst_restfn_srcmd fr_fnfr Letq A HalfCheckbd lo hi r al Tmpn1; p rest live = Someout → inst_stepge fr m Letq A HalfCheckbd lo hi r al Tmpn1; p ≠ SomeIStopUncheckedwhy

intros b kk q bd lo hi r al n1 p rest live out why Hfit Hfe Hb Hk Hkk H

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
H :
checked_inst_restfn_srcmd fr_fnfr Letq A HalfCheckbd lo hi r al Tmpn1; p rest live = Someout
⊢
inst_stepge fr m Letq A HalfCheckbd lo hi r al Tmpn1; p ≠ SomeIStopUncheckedwhy

unfold checked_inst_rest in H

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
H :
negb
match lookupn1 s_renewsfn_srcmd fr_fnfr with
Somep1, lo1, hi1, _
⇒
Somed0
⇒
half_knownbd lo hi d0 lo1 hi1
None
⇒
false
None
⇒
false
→
None
else
match rest with
[ ]
⇒
None
access :: rest′
⇒
proof_useaccess q lo hi r al
→
Somerest′, after_checkLetq A HalfCheckbd lo hi r al Tmpn1; p access q p lo hi r al live
else
None
=
Someout
⊢
inst_stepge fr m Letq A HalfCheckbd lo hi r al Tmpn1; p ≠ SomeIStopUncheckedwhy

cbn beta iota zeta in H

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
H :
negb
match lookupn1 s_renewsfn_srcmd fr_fnfr with
Somep1, lo1, hi1, _
⇒
Somed0
⇒
half_knownbd lo hi d0 lo1 hi1
None
⇒
false
None
⇒
false
→
None
else
match rest with
[ ]
⇒
None
access :: rest′
⇒
proof_useaccess q lo hi r al
→
Somerest′, after_checkLetq A HalfCheckbd lo hi r al Tmpn1; p access q p lo hi r al live
else
None
=
Someout
⊢
inst_stepge fr m Letq A HalfCheckbd lo hi r al Tmpn1; p ≠ SomeIStopUncheckedwhy

destruct lookupn1 s_renewsfn_srcmd fr_fnfr as p1 lo1 hi1 al1 | eqn: Esrc ; | discriminate H

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
H :
negb
Somed0
⇒
half_knownbd lo hi d0 lo1 hi1
None
⇒
false
→
None
else
match rest with
[ ]
⇒
None
access :: rest′
⇒
proof_useaccess q lo hi r al
→
Somerest′, after_checkLetq A HalfCheckbd lo hi r al Tmpn1; p access q p lo hi r al live
else
None
=
Someout
⊢
inst_stepge fr m Letq A HalfCheckbd lo hi r al Tmpn1; p ≠ SomeIStopUncheckedwhy

destruct pointer_distances_oncefn_srcmd fr_fnfr p Tmpp1 as d | eqn: Ed ; | discriminate H

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
H :
negbhalf_knownbd lo hi d lo1 hi1
→
None
else
match rest with
[ ]
⇒
None
access :: rest′
⇒
proof_useaccess q lo hi r al
→
Somerest′, after_checkLetq A HalfCheckbd lo hi r al Tmpn1; p access q p lo hi r al live
else
None
=
Someout
⊢
inst_stepge fr m Letq A HalfCheckbd lo hi r al Tmpn1; p ≠ SomeIStopUncheckedwhy

destruct half_knownbd lo hi d lo1 hi1 eqn: Ek ; clear H | discriminate H

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
⊢
inst_stepge fr m Letq A HalfCheckbd lo hi r al Tmpn1; p ≠ SomeIStopUncheckedwhy

destruct reuse_operandsb kk _ n1 p p1 lo1 hi1 al1 d Hb Hk Hkk ltac:simpl ; auto ltac:intros y → ; simpl ; auto Esrc Ed as pp1 & pp & m1 & r1 & Hn1 & Hpp & Hc1 & Hp & Hfit1 & Hl1 & Hcap & Haddr

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
⊢
inst_stepge fr m Letq A HalfCheckbd lo hi r al Tmpn1; p ≠ SomeIStopUncheckedwhy

rewrite inst_step_let by reflexivity

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
⊢
let e ≔ fr_envfr in
let locals ≔ fr_localsfr in
let* classes ≔ op_arg_classesHalfCheckbd lo hi r al A in
let* xs ≔ map2_optionvalue_xge e classes Tmpn1; p in
match op_resHalfCheckbd lo hi r al A xs m with
SomeOpResr0 m′
⇒
Somebind_resq r0 e locals m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x e, locals, m′
None
⇒
None
≠

cbn beta iota zeta delta [ op_arg_classes map2_option ]

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
⊢
let* xs ≔
let* z ≔ value_xge fr_envfr A Tmpn1 in
let* zs ≔
let* z0 ≔ value_xge fr_envfr P p in
Somez0
in
Somez :: zs
in
match op_resHalfCheckbd lo hi r al A xs m with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

replace value_xge fr_envfr A Tmpn1 with SomeWPtrpp1 by simpl ; rewrite Hn1 ; reflexivity

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
⊢
let* xs ≔
let* zs ≔
let* z ≔ value_xge fr_envfr P p in
Somez
in
SomeWPtrpp1 :: zs
in
match op_resHalfCheckbd lo hi r al A xs m with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

rewrite Hpp

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
⊢
match op_resHalfCheckbd lo hi r al A WPtrpp1; WPtrpp m with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

cbn beta iota

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
⊢
match op_resHalfCheckbd lo hi r al A WPtrpp1; WPtrpp m with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

unfold op_res , op_res_int

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
⊢
match if cap_eqbptr_cappp1 ptr_cappp then let* chk ≔ access_resm raw_addressptr_addrpp lo ptr_cappp hi − lo r al in match half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp r al with SomeSomeok′ ⇒ SomeOpReshalf_reschk ok′ WPtrpp m | SomeNone ⇒ SomeOpResRUncheckedHalf m | None ⇒ None end else SomeOpResRUncheckedAlias m with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

cbn beta iota zeta delta [ fmt_of ]

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
⊢
match if cap_eqbptr_cappp1 ptr_cappp then let* chk ≔ access_resm raw_addressptr_addrpp lo ptr_cappp hi − lo r al in match half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp r al with SomeSomeok′ ⇒ SomeOpReshalf_reschk ok′ WPtrpp m | SomeNone ⇒ SomeOpResRUncheckedHalf m | None ⇒ None end else SomeOpResRUncheckedAlias m with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

rewrite Hcap , cap_eqb_refl

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
⊢
match let* chk ≔ access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al in match half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al with SomeSomeok′ ⇒ SomeOpReshalf_reschk ok′ WPtrpp m | SomeNone ⇒ SomeOpResRUncheckedHalf m | None ⇒ None end with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

destruct find_block_in_ _ _ Hb as Hbin _

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
⊢
match let* chk ≔ access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al in match half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al with SomeSomeok′ ⇒ SomeOpReshalf_reschk ok′ WPtrpp m | SomeNone ⇒ SomeOpResRUncheckedHalf m | None ⇒ None end with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

destruct check_fact_ok_ _ _ _ _ Hmd Hin Hbin nth_error_In_ _ Hk eq_refl as Hsz _

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
Hsz :
f_lof_q ≔ q; f_p ≔ p; f_lo ≔ lo; f_hi ≔ hi; f_r ≔ r; f_al ≔ al < f_hif_q ≔ q; f_p ≔ p; f_lo ≔ lo; f_hi ≔ hi; f_r ≔ r; f_al ≔ al
⊢
match let* chk ≔ access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al in match half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al with SomeSomeok′ ⇒ SomeOpReshalf_reschk ok′ WPtrpp m | SomeNone ⇒ SomeOpResRUncheckedHalf m | None ⇒ None end with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

simpl in Hsz

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
Hsz :
lo < hi
⊢
match let* chk ≔ access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al in match half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al with SomeSomeok′ ⇒ SomeOpReshalf_reschk ok′ WPtrpp m | SomeNone ⇒ SomeOpResRUncheckedHalf m | None ⇒ None end with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

destruct half_accessm1 m ptr_cappp1 ptr_addrpp1 ptr_addrpp lo1 hi1 r1 al1 tt bd lo hi r al d pp Hc1 Hfit1 Hp Hfe Haddr Hl1 Hsz Ek as chk & passes & Hchk & Hpass & Hnot

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
Hsz :
lo < hi
chk :
resunit
passes :
bool
Hchk :
access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al = Somechk
Hpass :
half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al = SomeSomepasses
Hnot :
∀why : reason, half_reschk passes WPtrpp ≠ RUncheckedwhy
⊢
match let* chk0 ≔ access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al in match half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al with SomeSomeok′ ⇒ SomeOpReshalf_reschk0 ok′ WPtrpp m | SomeNone ⇒ SomeOpResRUncheckedHalf m | None ⇒ None end with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

rewrite Hchk

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
Hsz :
lo < hi
chk :
resunit
passes :
bool
Hchk :
access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al = Somechk
Hpass :
half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al = SomeSomepasses
Hnot :
∀why : reason, half_reschk passes WPtrpp ≠ RUncheckedwhy
⊢
match match half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al with SomeSomeok′ ⇒ SomeOpReshalf_reschk ok′ WPtrpp m | SomeNone ⇒ SomeOpResRUncheckedHalf m | None ⇒ None end with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

cbn beta iota

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
Hsz :
lo < hi
chk :
resunit
passes :
bool
Hchk :
access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al = Somechk
Hpass :
half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al = SomeSomepasses
Hnot :
∀why : reason, half_reschk passes WPtrpp ≠ RUncheckedwhy
⊢
match match half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al with SomeSomeok′ ⇒ SomeOpReshalf_reschk ok′ WPtrpp m | SomeNone ⇒ SomeOpResRUncheckedHalf m | None ⇒ None end with
SomeOpResr0 m′
⇒
Somebind_resq r0 fr_envfr fr_localsfr m′
SomeOpUBwhy0
⇒
SomeIStopUBwhy0
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
≠

rewrite Hpass

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
Hsz :
lo < hi
chk :
resunit
passes :
bool
Hchk :
access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al = Somechk
Hpass :
half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al = SomeSomepasses
Hnot :
∀why : reason, half_reschk passes WPtrpp ≠ RUncheckedwhy
⊢
Somebind_resq half_reschk passes WPtrpp fr_envfr fr_localsfr m ≠ SomeIStopUncheckedwhy

cbn beta iota

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
Hsz :
lo < hi
chk :
resunit
passes :
bool
Hchk :
access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al = Somechk
Hpass :
half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al = SomeSomepasses
Hnot :
∀why : reason, half_reschk passes WPtrpp ≠ RUncheckedwhy
⊢
Somebind_resq half_reschk passes WPtrpp fr_envfr fr_localsfr m ≠ SomeIStopUncheckedwhy

unfold bind_res

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
Hsz :
lo < hi
chk :
resunit
passes :
bool
Hchk :
access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al = Somechk
Hpass :
half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al = SomeSomepasses
Hnot :
∀why : reason, half_reschk passes WPtrpp ≠ RUncheckedwhy
⊢
Some
match half_reschk passes WPtrpp with
≠

destruct half_reschk passes WPtrpp as x | w | w eqn: Eh ; try discriminate

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
Hsz :
lo < hi
chk :
resunit
passes :
bool
Hchk :
access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al = Somechk
Hpass :
half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al = SomeSomepasses
Eh :
half_reschk passes WPtrpp = RUncheckedw
Hnot :
∀why : reason, RUncheckedw ≠ RUncheckedwhy
⊢

intros E

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
why :
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
Hsz :
lo < hi
chk :
resunit
passes :
bool
Hchk :
access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al = Somechk
Hpass :
half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al = SomeSomepasses
Eh :
half_reschk passes WPtrpp = RUncheckedw
Hnot :
∀why : reason, RUncheckedw ≠ RUncheckedwhy
E :
⊢
False

injection E as ←

ge :
md :
fr :
m :
Memory.mem
l :
k :
Z
Hin :
InIFuncfr_fnfr md
Hr :
Hs :
Hpt :
point_sitefr_fnfr fr_atfr = Somel, k
kk :
nat
q :
bd :
lo, hi :
Z
al :
Z
n1 :
rest :
listinst
live :
listfact
out :
listinst × listfact
Hb :
Hk :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; p
Hkk :
k = Z.of_natkk
p1 :
lo1, hi1, al1 :
Z
Esrc :
lookupn1 s_renewsfn_srcmd fr_fnfr = Somep1, lo1, hi1, al1
d :
Z
Ek :
half_knownbd lo hi d lo1 hi1 = true
pp1, pp :
m1 :
Memory.mem
r1 :
Hn1 :
lookupn1 fr_envfr = SomeWPtrpp1
Hpp :
value_xge fr_envfr P p = SomeWPtrpp
Hc1 :
check_passesm1 pp1 lo1 hi1 r1 al1
Hp :
Hl1 :
lo1 < hi1
Hcap :
Haddr :
ptr_addrpp mod 2 ^ 64 = ptr_addrpp1 + d mod 2 ^ 64
Hbin :
Hsz :
lo < hi
chk :
resunit
passes :
bool
Hchk :
access_resm raw_addressptr_addrpp lo ptr_cappp1 hi − lo r al = Somechk
Hpass :
half_passesbd m raw_addressptr_addrpp lo hi − lo ptr_cappp1 r al = SomeSomepasses
Eh :
half_reschk passes WPtrpp = RUncheckedw
Hnot :
∀why : reason, RUncheckedw ≠ RUncheckedwhy
⊢
False

exact Hnotw eq_refl

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b kk q bd lo hi r al n1 p rest live out why Hfit Hfe Hb Hk Hkk H

What the pass checked: a source, a distance, and the known bound.

unfold checked_inst_rest in H
cbn beta iota zeta in H
destruct lookupn1 s_renewsfn_srcmd fr_fnfr as p1 lo1 hi1 al1 | eqn: Esrc ; | discriminate H
destruct pointer_distances_oncefn_srcmd fr_fnfr p Tmpp1 as d | eqn: Ed ; | discriminate H
destruct half_knownbd lo hi d lo1 hi1 eqn: Ek ; clear H | discriminate H

What the operands hold at the point.

destruct reuse_operandsb kk _ n1 p p1 lo1 hi1 al1 d Hb Hk Hkk ltac:simpl ; auto ltac:intros y → ; simpl ; auto Esrc Ed as pp1 & pp & m1 & r1 & Hn1 & Hpp & Hc1 & Hp & Hfit1 & Hl1 & Hcap & Haddr

The step: one capability, so no alias; then the memory's answer.

rewrite inst_step_let by reflexivity
cbn beta iota zeta delta [ op_arg_classes map2_option ]
replace value_xge fr_envfr A Tmpn1 with SomeWPtrpp1 by simpl ; rewrite Hn1 ; reflexivity
rewrite Hpp
cbn beta iota
cbn beta iota zeta delta [ fmt_of ]
rewrite Hcap , cap_eqb_refl
destruct find_block_in_ _ _ Hb as Hbin _
destruct check_fact_ok_ _ _ _ _ Hmd Hin Hbin nth_error_In_ _ Hk eq_refl as Hsz _
simpl in Hsz
destruct half_accessm1 m ptr_cappp1 ptr_addrpp1 ptr_addrpp lo1 hi1 r1 al1 tt bd lo hi r al d pp Hc1 Hfit1 Hp Hfe Haddr Hl1 Hsz Ek as chk & passes & Hchk & Hpass & Hnot
rewrite Hchk
cbn beta iota
rewrite Hpass
cbn beta iota
unfold bind_res
destruct half_reschk passes WPtrpp as x | w | w eqn: Eh ; try discriminate
intros E
injection E as ←
exact Hnotw eq_refl

A renew over a hull of the value p with low source nl and high source nh, the instruction at index kk of block b, that the pass accepts (checked_inst_rest) does not step to unchecked, in a memory in the address space. Each source holds the pointer its check passed, a known distance from the renewed pointer (reuse_operands), so all three share a capability, and the renewed span lies between the two spans (hull_renewable/8, hull_renew_access).

712Theorem hull_renew_not_unchecked
∀ b kk q lo hi r al nl nh p rest live out why
nth_errorb_instsb kk = SomeLetq A RenewHulllo hi r al Tmpnl; Tmpnh; p
k = Z.of_natkk
checked_inst_restfn_srcmd fr_fnfr Letq A RenewHulllo hi r al Tmpnl; Tmpnh; p rest live = Someout
inst_stepge fr m Letq A RenewHulllo hi r al Tmpnl; Tmpnh; p ≠ SomeIStopUncheckedwhy
Proof 42 steps Qed
intros b kk q lo hi r al nl nh p rest live out why Hfit Hb Hk Hkk H

What the pass checked: two sources, two distances, and the span between them.

unfold checked_inst_rest in H
cbn beta iota zeta in H
destruct hull_renewable_ _ _ _ _ _ _ _ eqn: Ehr ; clear H | discriminate H
unfold hull_renewable in Ehr
destruct lookupnl s_renewsfn_srcmd fr_fnfr as pl lol hil all | eqn: El ; | discriminate Ehr
destruct lookupnh s_renewsfn_srcmd fr_fnfr as ph loh hih alh | eqn: Eh ; | discriminate Ehr
destruct pointer_distances_oncefn_srcmd fr_fnfr p Tmppl as dl | eqn: Edl ; | discriminate Ehr
destruct pointer_distances_oncefn_srcmd fr_fnfr p Tmpph as dh | eqn: Edh ; | discriminate Ehr
cbn beta iota zeta in Ehr
repeat match goal withH : _ && _ = true |- _⇒apply andb_true_iff in H as ? ?end
repeat match goal withH : _ ≤? _ = true |- _⇒apply Z.leb_le in Hend
assert Halign : all mod al = 0 ∧ lo + dl − lol mod al = 0 ∨ alh mod al = 0 ∧ lo + dh − loh mod al = 0 by (match goal withH : _ || _ = true |- _⇒apply orb_true_iff in H as H | H ; apply andb_true_iff in H as Ha1 Ha2 ; apply Z.eqb_eq in Ha1 , Ha2 ; left | right ; split ; assumptionend)

What the operands hold at the point.

destruct reuse_operandsb kk _ nl p pl lol hil all dl Hb Hk Hkk ltac:simpl ; auto ltac:intros y → ; simpl ; auto El Edl as ppl & pp & ml & rl & Hnl & Hpp & Hcl & Hpl & _ & Hll & Hcapl & Haddrl
destruct reuse_operandsb kk _ nh p ph loh hih alh dh Hb Hk Hkk ltac:simpl ; auto ltac:intros y → ; simpl ; auto Eh Edh as pph & pp′ & mh & rh & Hnh & Hpp′ & Hch & Hph & _ & Hlh & Hcaph & Haddrh
rewrite Hpp in Hpp'
injection Hpp' as ←

The step: one capability, so no alias; then the memory's answer.

rewrite inst_step_let by reflexivity
cbn beta iota zeta delta [ op_arg_classes map2_option ]
replace value_xge fr_envfr A Tmpnl with SomeWPtrppl by simpl ; rewrite Hnl ; reflexivity
replace value_xge fr_envfr A Tmpnh with SomeWPtrpph by simpl ; rewrite Hnh ; reflexivity
rewrite Hpp
cbn beta iota
cbn beta iota zeta delta [ fmt_of ]
rewrite <- Hcapl , <- Hcaph , cap_eqb_refl
cbn beta iota delta [ andb ]
destruct find_block_in_ _ _ Hb as Hbin _
destruct check_fact_ok_ _ _ _ _ Hmd Hin Hbin nth_error_In_ _ Hk eq_refl as Hsz Hca
simpl in Hsz , Hca
unfold check_passes in Hcl , Hch
rewrite <- Hcapl in Hcl
rewrite <- Hcaph in Hch
destruct hull_renew_accessml mh m ptr_cappp ptr_addrppl ptr_addrpph ptr_addrpp lol hil rl all loh hih rh alh lo hi r al pp dl dh Hcl Hch Hpl Hph Hfit eq_refl Hll Hlh Haddrl Haddrh ltac:lia ltac:lia ltac:lia check_align_pos_ Hca Halign as chk & rr & Hchk & Hrr & Hnot
rewrite Hchk
cbn beta iota
rewrite Hrr
unfold bind_res
destruct rr as x | w | w ; try discriminate
intros E
injection E as ←
exact Hnotw eq_refl

Along every run

The instructions this file covers: a let of a renew, a renew over a hull or a half check, of any class and operands. None is a raw access.

771Definition reuse_formi : inst : Prop ≔
∃q kc lo hi r al args, i = Letq kc Renewlo hi r al args ∨ ∃q kc lo hi r al args, i = Letq kc RenewHulllo hi r al args ∨ ∃q kc bd lo hi r al args, i = Letq kc HalfCheckbd lo hi r al args

A list of operands that map2_option pairs with two classes has two elements.

778Lemma map2_option_two
∀ X Y Z : Type f : X → Y → optionZ x y args zs
map2_optionf x; y args = Somezs
∃a1 a2, args = a1; a2
Explore proof 5 tactics

Initial goal

⊢
∀X Y Z : Type f : X → Y → optionZ x y : X args : listY zs : listZ, map2_optionf x; y args = Somezs → ∃a1 a2 : Y, args = a1; a2

intros X Y Z f x y args zs H

X :
Type
Y :
Type
Z :
Type
f :
X → Y → optionZ
x, y :
X
args :
listY
zs :
listZ
H :
map2_optionf x; y args = Somezs
⊢
∃a1 a2 : Y, args = a1; a2

destruct args as | a1 | a2 | a3 args ; simpl in H ; try discriminate H

3 open

X :
Type
Y :
Type
Z :
Type
f :
X → Y → optionZ
x, y :
X
a1 :
Y
zs :
listZ
H :
let* _ ≔ fx a1 in
None
=
Somezs
⊢
∃a0 a2 : Y, a1 = a0; a2
focused goal
X :
Type
Y :
Type
Z :
Type
f :
X → Y → optionZ
x, y :
X
a1, a2 :
Y
zs :
listZ
H :
let* z ≔ fx a1 in
let* zs ≔
let* z0 ≔ fy a2 in
Somez0
in
Somez :: zs
=
Somezs
⊢
∃a0 a3 : Y, a1; a2 = a0; a3
focused goal
X :
Type
Y :
Type
Z :
Type
f :
X → Y → optionZ
x, y :
X
a1, a2, a3 :
Y
args :
listY
zs :
listZ
H :
let* z ≔ fx a1 in
let* zs ≔
let* _ ≔ fy a2 in
None
in
Somez :: zs
=
Somezs
⊢
∃a0 a4 : Y, a1 :: a2 :: a3 :: args = a0; a4

–destruct fx a1 ; discriminate H

2 open

deferred goal
X :
Type
Y :
Type
Z :
Type
f :
X → Y → optionZ
x, y :
X
a1, a2 :
Y
zs :
listZ
H :
let* z ≔ fx a1 in
let* zs ≔
let* z0 ≔ fy a2 in
Somez0
in
Somez :: zs
=
Somezs
⊢
∃a0 a3 : Y, a1; a2 = a0; a3
deferred goal
X :
Type
Y :
Type
Z :
Type
f :
X → Y → optionZ
x, y :
X
a1, a2, a3 :
Y
args :
listY
zs :
listZ
H :
let* z ≔ fx a1 in
let* zs ≔
let* _ ≔ fy a2 in
None
in
Somez :: zs
=
Somezs
⊢
∃a0 a4 : Y, a1 :: a2 :: a3 :: args = a0; a4

–eauto

deferred goal
X :
Type
Y :
Type
Z :
Type
f :
X → Y → optionZ
x, y :
X
a1, a2, a3 :
Y
args :
listY
zs :
listZ
H :
let* z ≔ fx a1 in
let* zs ≔
let* _ ≔ fy a2 in
None
in
Somez :: zs
=
Somezs
⊢
∃a0 a4 : Y, a1 :: a2 :: a3 :: args = a0; a4

–destruct fx a1 , fy a2 ; discriminate H

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros X Y Z f x y args zs H
destruct args as | a1 | a2 | a3 args ; simpl in H ; try discriminate H
–destruct fx a1 ; discriminate H
–eauto
–destruct fx a1 , fy a2 ; discriminate H

A list of operands that map2_option pairs with three classes has three elements.

789Lemma map2_option_three
∀ X Y Z : Type f : X → Y → optionZ x y w args zs
map2_optionf x; y; w args = Somezs
∃a1 a2 a3, args = a1; a2; a3
Explore proof 2 tactics

Initial goal

⊢
∀X Y Z : Type f : X → Y → optionZ x y w : X args : listY zs : listZ, map2_optionf x; y; w args = Somezs → ∃a1 a2 a3 : Y, args = a1; a2; a3

intros X Y Z f x y w args zs H

X :
Type
Y :
Type
Z :
Type
f :
X → Y → optionZ
x, y, w :
X
args :
listY
zs :
listZ
H :
map2_optionf x; y; w args = Somezs
⊢
∃a1 a2 a3 : Y, args = a1; a2; a3

destruct args as | a1 | a2 | a3 | a4 args ; simpl in H;repeat match goal withH : context [match f?u ?v with _ ⇒ _ end] |- _⇒destruct fu vend;try discriminate H;eauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros X Y Z f x y w args zs H
destruct args as | a1 | a2 | a3 | a4 args ; simpl in H;repeat match goal withH : context [match f?u ?v with _ ⇒ _ end] |- _⇒destruct fu vend;try discriminate H;eauto

A reuse_form that steps to unchecked is of the proof class A, with two operands for a renew or half check and three for a renew over a hull (op_arg_classes/4, kind_res/8); of any other shape it does not step. So the run theorem covers every such instruction with the frame lemmas, which take only that shape.

802Lemma reuse_shape
∀ ge fr m i why
∃q o args, i = Letq A o args ∧ ∃lo hi r al a1 a2, o = Renewlo hi r al ∧ args = a1; a2 ∨ ∃lo hi r al a1 a2 a3, o = RenewHulllo hi r al ∧ args = a1; a2; a3 ∨ ∃bd lo hi r al a1 a2, o = HalfCheckbd lo hi r al ∧ args = a1; a2
Explore proof 7 tactics

Initial goal

⊢
∀ge : genv fr : frame m : Memory.mem i : inst why : reason, reuse_formi → inst_stepge fr m i = SomeIStopUncheckedwhy → ∃q : name o : op args : listvalue, i = Letq A o args ∧ ∃lo hi : Z r : rights al : Z a1 a2 : value, o = Renewlo hi r al ∧ args = a1; a2 ∨ ∃lo hi : Z r : rights al : Z a1 a2 a3 : value, o = RenewHulllo hi r al ∧ args = a1; a2; a3 ∨ ∃bd : bound lo hi : Z r : rights al : Z a1 a2 : value, o = HalfCheckbd lo hi r al ∧ args = a1; a2

intros ge fr m i why q & kc & lo & hi & r & al & args & → | q & kc & lo & hi & r & al & args & → | q & kc & bd & lo & hi & r & al & args & → H ; rewrite inst_step_let in H by reflexivity ; cbn beta iota zeta delta [ op_arg_classes ] in H ; destruct map2_option_ _ args as xs | eqn: Ex ; try discriminate H

3 open

ge :
fr :
m :
Memory.mem
why :
q :
kc :
lo, hi :
Z
al :
Z
args :
listvalue
xs :
listword
Ex :
map2_optionvalue_xge fr_envfr A; P args = Somexs
H :
match op_resRenewlo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args0 : listvalue, Letq kc Renewlo hi r al args = Letq0 A o args0 ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = Renewlo0 hi0 r0 al0 ∧ args0 = a1; a2 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 a3 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args0 = a1; a2; a3 ∨ ∃bd : bound lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = HalfCheckbd lo0 hi0 r0 al0 ∧ args0 = a1; a2
focused goal
ge :
fr :
m :
Memory.mem
why :
q :
kc :
lo, hi :
Z
al :
Z
args :
listvalue
xs :
listword
Ex :
map2_optionvalue_xge fr_envfr A; A; P args = Somexs
H :
match op_resRenewHulllo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args0 : listvalue, Letq kc RenewHulllo hi r al args = Letq0 A o args0 ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = Renewlo0 hi0 r0 al0 ∧ args0 = a1; a2 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 a3 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args0 = a1; a2; a3 ∨ ∃bd : bound lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = HalfCheckbd lo0 hi0 r0 al0 ∧ args0 = a1; a2
focused goal
ge :
fr :
m :
Memory.mem
why :
q :
kc :
bd :
lo, hi :
Z
al :
Z
args :
listvalue
xs :
listword
Ex :
map2_optionvalue_xge fr_envfr A; P args = Somexs
H :
match op_resHalfCheckbd lo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args0 : listvalue, Letq kc HalfCheckbd lo hi r al args = Letq0 A o args0 ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = Renewlo0 hi0 r0 al0 ∧ args0 = a1; a2 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 a3 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args0 = a1; a2; a3 ∨ ∃bd0 : bound lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = HalfCheckbd0 lo0 hi0 r0 al0 ∧ args0 = a1; a2

–destruct map2_option_two_ _ _ _ _ _ _ _ Ex as a1 & a2 & →

3 open

ge :
fr :
m :
Memory.mem
why :
q :
kc :
lo, hi :
Z
al :
Z
xs :
listword
a1, a2 :
Ex :
map2_optionvalue_xge fr_envfr A; P a1; a2 = Somexs
H :
match op_resRenewlo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args : listvalue, Letq kc Renewlo hi r al a1; a2 = Letq0 A o args ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a0 a3 : value, o = Renewlo0 hi0 r0 al0 ∧ args = a0; a3 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a0 a3 a4 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args = a0; a3; a4 ∨ ∃bd : bound lo0 hi0 : Z r0 : rights al0 : Z a0 a3 : value, o = HalfCheckbd lo0 hi0 r0 al0 ∧ args = a0; a3
deferred goal
ge :
fr :
m :
Memory.mem
why :
q :
kc :
lo, hi :
Z
al :
Z
args :
listvalue
xs :
listword
Ex :
map2_optionvalue_xge fr_envfr A; A; P args = Somexs
H :
match op_resRenewHulllo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args0 : listvalue, Letq kc RenewHulllo hi r al args = Letq0 A o args0 ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = Renewlo0 hi0 r0 al0 ∧ args0 = a1; a2 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 a3 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args0 = a1; a2; a3 ∨ ∃bd : bound lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = HalfCheckbd lo0 hi0 r0 al0 ∧ args0 = a1; a2
deferred goal
ge :
fr :
m :
Memory.mem
why :
q :
kc :
bd :
lo, hi :
Z
al :
Z
args :
listvalue
xs :
listword
Ex :
map2_optionvalue_xge fr_envfr A; P args = Somexs
H :
match op_resHalfCheckbd lo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args0 : listvalue, Letq kc HalfCheckbd lo hi r al args = Letq0 A o args0 ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = Renewlo0 hi0 r0 al0 ∧ args0 = a1; a2 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 a3 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args0 = a1; a2; a3 ∨ ∃bd0 : bound lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = HalfCheckbd0 lo0 hi0 r0 al0 ∧ args0 = a1; a2

destruct kc ; unfold op_res , op_res_int in H ; cbn beta iota zeta delta [ fmt_of ] in H ; try discriminate H ; do 3 eexists ; split ; reflexivity | left ; eauto 10

2 open

deferred goal
ge :
fr :
m :
Memory.mem
why :
q :
kc :
lo, hi :
Z
al :
Z
args :
listvalue
xs :
listword
Ex :
map2_optionvalue_xge fr_envfr A; A; P args = Somexs
H :
match op_resRenewHulllo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args0 : listvalue, Letq kc RenewHulllo hi r al args = Letq0 A o args0 ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = Renewlo0 hi0 r0 al0 ∧ args0 = a1; a2 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 a3 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args0 = a1; a2; a3 ∨ ∃bd : bound lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = HalfCheckbd lo0 hi0 r0 al0 ∧ args0 = a1; a2
deferred goal
ge :
fr :
m :
Memory.mem
why :
q :
kc :
bd :
lo, hi :
Z
al :
Z
args :
listvalue
xs :
listword
Ex :
map2_optionvalue_xge fr_envfr A; P args = Somexs
H :
match op_resHalfCheckbd lo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args0 : listvalue, Letq kc HalfCheckbd lo hi r al args = Letq0 A o args0 ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = Renewlo0 hi0 r0 al0 ∧ args0 = a1; a2 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 a3 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args0 = a1; a2; a3 ∨ ∃bd0 : bound lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = HalfCheckbd0 lo0 hi0 r0 al0 ∧ args0 = a1; a2

–destruct map2_option_three_ _ _ _ _ _ _ _ _ Ex as a1 & a2 & a3 & →

2 open

ge :
fr :
m :
Memory.mem
why :
q :
kc :
lo, hi :
Z
al :
Z
xs :
listword
a1, a2, a3 :
Ex :
map2_optionvalue_xge fr_envfr A; A; P a1; a2; a3 = Somexs
H :
match op_resRenewHulllo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args : listvalue, Letq kc RenewHulllo hi r al a1; a2; a3 = Letq0 A o args ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a0 a4 : value, o = Renewlo0 hi0 r0 al0 ∧ args = a0; a4 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a0 a4 a5 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args = a0; a4; a5 ∨ ∃bd : bound lo0 hi0 : Z r0 : rights al0 : Z a0 a4 : value, o = HalfCheckbd lo0 hi0 r0 al0 ∧ args = a0; a4
deferred goal
ge :
fr :
m :
Memory.mem
why :
q :
kc :
bd :
lo, hi :
Z
al :
Z
args :
listvalue
xs :
listword
Ex :
map2_optionvalue_xge fr_envfr A; P args = Somexs
H :
match op_resHalfCheckbd lo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args0 : listvalue, Letq kc HalfCheckbd lo hi r al args = Letq0 A o args0 ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = Renewlo0 hi0 r0 al0 ∧ args0 = a1; a2 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 a3 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args0 = a1; a2; a3 ∨ ∃bd0 : bound lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = HalfCheckbd0 lo0 hi0 r0 al0 ∧ args0 = a1; a2

destruct kc ; unfold op_res , op_res_int in H ; cbn beta iota zeta delta [ fmt_of ] in H ; try discriminate H ; do 3 eexists ; split ; reflexivity | right ; left ; eauto 10

deferred goal
ge :
fr :
m :
Memory.mem
why :
q :
kc :
bd :
lo, hi :
Z
al :
Z
args :
listvalue
xs :
listword
Ex :
map2_optionvalue_xge fr_envfr A; P args = Somexs
H :
match op_resHalfCheckbd lo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args0 : listvalue, Letq kc HalfCheckbd lo hi r al args = Letq0 A o args0 ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = Renewlo0 hi0 r0 al0 ∧ args0 = a1; a2 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a1 a2 a3 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args0 = a1; a2; a3 ∨ ∃bd0 : bound lo0 hi0 : Z r0 : rights al0 : Z a1 a2 : value, o = HalfCheckbd0 lo0 hi0 r0 al0 ∧ args0 = a1; a2

–destruct map2_option_two_ _ _ _ _ _ _ _ Ex as a1 & a2 & →

ge :
fr :
m :
Memory.mem
why :
q :
kc :
bd :
lo, hi :
Z
al :
Z
xs :
listword
a1, a2 :
Ex :
map2_optionvalue_xge fr_envfr A; P a1; a2 = Somexs
H :
match op_resHalfCheckbd lo hi r al kc xs m with
SomeOpResr m′
⇒
Somebind_resq r fr_envfr fr_localsfr m′
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq0 kont
⇒
Some
λ base : Z  ⇒
let x, m′ ≔ kontbase in
putq x fr_envfr, fr_localsfr, m′
None
⇒
None
=
⊢
∃q0 : name o : op args : listvalue, Letq kc HalfCheckbd lo hi r al a1; a2 = Letq0 A o args ∧ ∃lo0 hi0 : Z r0 : rights al0 : Z a0 a3 : value, o = Renewlo0 hi0 r0 al0 ∧ args = a0; a3 ∨ ∃lo0 hi0 : Z r0 : rights al0 : Z a0 a3 a4 : value, o = RenewHulllo0 hi0 r0 al0 ∧ args = a0; a3; a4 ∨ ∃bd0 : bound lo0 hi0 : Z r0 : rights al0 : Z a0 a3 : value, o = HalfCheckbd0 lo0 hi0 r0 al0 ∧ args = a0; a3

destruct kc ; unfold op_res , op_res_int in H ; cbn beta iota zeta delta [ fmt_of ] in H ; try discriminate H ; do 3 eexists ; split ; reflexivity | right ; right ; eauto 10

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge fr m i why q & kc & lo & hi & r & al & args & → | q & kc & lo & hi & r & al & args & → | q & kc & bd & lo & hi & r & al & args & → H ; rewrite inst_step_let in H by reflexivity ; cbn beta iota zeta delta [ op_arg_classes ] in H ; destruct map2_option_ _ args as xs | eqn: Ex ; try discriminate H
–destruct map2_option_two_ _ _ _ _ _ _ _ Ex as a1 & a2 & →
destruct kc ; unfold op_res , op_res_int in H ; cbn beta iota zeta delta [ fmt_of ] in H ; try discriminate H ; do 3 eexists ; split ; reflexivity | left ; eauto 10
–destruct map2_option_three_ _ _ _ _ _ _ _ _ Ex as a1 & a2 & a3 & →
destruct kc ; unfold op_res , op_res_int in H ; cbn beta iota zeta delta [ fmt_of ] in H ; try discriminate H ; do 3 eexists ; split ; reflexivity | right ; left ; eauto 10
–destruct map2_option_two_ _ _ _ _ _ _ _ Ex as a1 & a2 & →
destruct kc ; unfold op_res , op_res_int in H ; cbn beta iota zeta delta [ fmt_of ] in H ; try discriminate H ; do 3 eexists ; split ; reflexivity | right ; right ; eauto 10

The frame theorems carried along every run of the machine of a runtime R, as Chain.v's Hull does: Persistence.v's invariant says the pass accepted the instruction at the point, Single.v's that single definitions replay there, and the runtime's readiness that memory lies in the address space with freed objects empty.

830Module Reuse R : Runtime
832Module H ≔ Hull R

What holds at the point of a frame that is not doomed, in every state c a run reaches from a call of a function f of a checked_module md started ready, at an instruction i that is not a raw access or raw call: the pass accepted it there (checked_inst_rest, checked_inst_rest/7), single definitions replay (scope_holds), and memory lies in the address space with freed objects empty. Guard.v's run theorem uses it too.

841Lemma run_point
∀ ge md f xs fr m fuel s0 c s l i rest j
ge_modulege = md
ge_freege = R.free
InIFuncf md
call_framef xs = Somefr
R.readys0 m
H.P.I.RM.mreachablege mkConfigfr [ ] m fuel, s0 c, s
fr_atc_framec = Execl i :: rest j
raw_accessi = None
∀r cl args, i ≠ RawCallr cl args
∀q, i ≠ Touchq
∃b kk live out, InIFuncfr_fnc_framec md ∧ is_reachablefn_domsfr_fnc_framec l = true ∧ scope_holdsge c_framec c_memc ∧ point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk ∧ find_blockl fn_blocksfr_fnc_framec = Someb ∧ nth_errorb_instsb kk = Somei ∧ checked_inst_restfn_srcmd fr_fnc_framec i rest live = Someout ∧ objects_fitm_regionsc_memc ∧ freed_emptym_regionsc_memc
Proof 33 steps Qed
intros ge md f xs fr m fuel s0 c s l i rest j Hmd Hge Hfree Hin Hcf H0 Hreach Hd Ha Hra Hrc Hrt

The pass accepted the instruction at the point.

pose proof H.P.mreachable_inv_ _ _ _ Hge Hmd Hfree Hreach H0 H.P.start_inv_ _ _ _ _ _ _ s0 Hmd Hin Hcf as Hinf & _ & Hpo _
simpl in Hinf , Hpo
destruct Hpo as Hd0 | Hpo ; congruence |
destruct H.P.I.point_ok_exec_inv_ _ _ _ _ _ _ Hpo Ha as E & b & out & kk & _ & Hb & _ & _ & Hk & Hat
destruct Hat as live & Hw & _ & _ | access & rest′ & live′ & E′ & _ & _ & Hpc

only a raw access, a touch or a raw call follows a check as its access

2: {injection E' as ← _
exfalso
destruct Hpc as fb & pre & Hcov | E′′ & _ | _ & r & q′ & args & p & E′′ & _
–unfold covered_access in Hcov
rewrite Hra in Hcov
discriminate Hcov
–exact Hrt_ E''
–exact Hrc_ _ _ E''
destruct walks_cons_ _ _ _ _ Hw as rest′ & live′ & Hc & _

Single definitions replay there.

pose proof H.S.run_sinv_ _ _ _ _ _ _ _ _ Hmd Hge Hfree Hin Hcf H0 H.mreachable_same_ _ _ Hreach as Hsh Hsc _
simpl in Hsh , Hsc
destruct Hsc as Hsc | Hsc ; congruence |
unfold shaped in Hsh
cbv zeta in Hsh
rewrite Ha in Hsh
destruct Hsh as _ & Hr & _

Memory lies in the address space, freed objects empty.

pose proof H.P.I.RM.mreachable_ready_ _ _ Hfree Hreach H0 as Hready
destruct skipn_cons_ _ _ _ _ eq_symHk as Hnth & _ & Hlen
exists b, kk, live, rest', live'
split ; exact Hinf |
split ; exact Hr |
split ; exact Hsc |
split ; rewrite Ha , Hk ; apply point_site_exec ; exact Hb | lia |
split ; exact Hb |
split ; exact Hnth |
split ; exact Hc |
exact conjR.address_space_ _ Hready R.freed_bounds_ _ Hready

In every state a run reaches from a call of a function f of a checked_module md, started in a memory where the runtime is ready, a frame that is not doomed runs no renew, renew over a hull or half check to an unchecked outcome. Every runtime spares the pass's facts at safepoints (spares_any; see The evidence invariant over runs).

889Theorem run_reuse_checked
∀ ge md f xs fr m fuel s0 c s l i rest j why
ge_modulege = md
ge_freege = R.free
InIFuncf md
call_framef xs = Somefr
R.readys0 m
H.P.I.RM.mreachablege mkConfigfr [ ] m fuel, s0 c, s
fr_atc_framec = Execl i :: rest j
Explore proof 10 tactics

Initial goal

⊢
∀ge : genv md : module f : func xs : listword fr : frame m : Memory.mem fuel : Z s0 : R.state c : config s : R.state l : name i : inst rest : listinst j : jump why : reason, checked_modulemd → ge_modulege = md → ge_freege = R.free → InIFuncf md → call_framef xs = Somefr → R.readys0 m → H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s → fr_doomedc_framec = None → fr_atc_framec = Execl i :: rest j → reuse_formi → inst_stepge c_framec c_memc i ≠ SomeIStopUncheckedwhy

intros ge md f xs fr m fuel s0 c s l i rest j why Hmd Hge Hfree Hin Hcf H0 Hreach Hd Ha Hi Hst

ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
i :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
Ha :
fr_atc_framec = Execl i :: rest j
Hst :
⊢
False

destruct reuse_shape_ _ _ _ _ Hi Hst as q & o & args & → & Ho

ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
o :
args :
listvalue
Hst :
inst_stepge c_framec c_memc Letq A o args = SomeIStopUncheckedwhy
Hi :
Ha :
fr_atc_framec = Execl Letq A o args :: rest j
Ho :
∃lo hi : Z r : rights al : Z a1 a2 : value, o = Renewlo hi r al ∧ args = a1; a2 ∨ ∃lo hi : Z r : rights al : Z a1 a2 a3 : value, o = RenewHulllo hi r al ∧ args = a1; a2; a3 ∨ ∃bd : bound lo hi : Z r : rights al : Z a1 a2 : value, o = HalfCheckbd lo hi r al ∧ args = a1; a2
⊢
False

destruct run_point_ _ _ _ _ _ _ _ _ _ _ _ _ _ Hmd Hge Hfree Hin Hcf H0 Hreach Hd Ha ltac:destruct Ho as ? & ? & ? & ? & ? & ? & → & → | ? & ? & ? & ? & ? & ? & ? & → & → | ? & ? & ? & ? & ? & ? & ? & → & → ; reflexivity ltac:intros ? ? ? E ; discriminate E ltac:intros ? E ; discriminate E as b & kk & live & out & Hinf & Hr & Hsc & Hpt & Hb & Hnth & Hc & Hfit & Hfe

ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
o :
args :
listvalue
Hst :
inst_stepge c_framec c_memc Letq A o args = SomeIStopUncheckedwhy
Hi :
Ha :
fr_atc_framec = Execl Letq A o args :: rest j
Ho :
∃lo hi : Z r : rights al : Z a1 a2 : value, o = Renewlo hi r al ∧ args = a1; a2 ∨ ∃lo hi : Z r : rights al : Z a1 a2 a3 : value, o = RenewHulllo hi r al ∧ args = a1; a2; a3 ∨ ∃bd : bound lo hi : Z r : rights al : Z a1 a2 : value, o = HalfCheckbd lo hi r al ∧ args = a1; a2
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A o args
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A o args rest live = Someout
⊢
False

destruct Ho as lo & hi & r & al & a1 & a2 & → & → | lo & hi & r & al & a1 & a2 & a3 & → & → | bd & lo & hi & r & al & a1 & a2 & → & →

3 open

ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
lo, hi :
Z
al :
Z
a1, a2 :
Hst :
inst_stepge c_framec c_memc Letq A Renewlo hi r al a1; a2 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A Renewlo hi r al a1; a2
Ha :
fr_atc_framec = Execl Letq A Renewlo hi r al a1; a2 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A Renewlo hi r al a1; a2
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A Renewlo hi r al a1; a2 rest live = Someout
⊢
False
focused goal
ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
lo, hi :
Z
al :
Z
a1, a2, a3 :
Hst :
inst_stepge c_framec c_memc Letq A RenewHulllo hi r al a1; a2; a3 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A RenewHulllo hi r al a1; a2; a3
Ha :
fr_atc_framec = Execl Letq A RenewHulllo hi r al a1; a2; a3 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A RenewHulllo hi r al a1; a2; a3
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A RenewHulllo hi r al a1; a2; a3 rest live = Someout
⊢
False
focused goal
ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
bd :
lo, hi :
Z
al :
Z
a1, a2 :
Hst :
inst_stepge c_framec c_memc Letq A HalfCheckbd lo hi r al a1; a2 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A HalfCheckbd lo hi r al a1; a2
Ha :
fr_atc_framec = Execl Letq A HalfCheckbd lo hi r al a1; a2 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al a1; a2
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A HalfCheckbd lo hi r al a1; a2 rest live = Someout
⊢
False

–destruct a1 as n1 | c1 | g1 ; try unfold checked_inst_rest in Hc ; cbn beta iota zeta in Hc ; discriminate Hc

3 open

ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
lo, hi :
Z
al :
Z
n1 :
a2 :
Hst :
inst_stepge c_framec c_memc Letq A Renewlo hi r al Tmpn1; a2 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A Renewlo hi r al Tmpn1; a2
Ha :
fr_atc_framec = Execl Letq A Renewlo hi r al Tmpn1; a2 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A Renewlo hi r al Tmpn1; a2
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A Renewlo hi r al Tmpn1; a2 rest live = Someout
⊢
False
deferred goal
ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
lo, hi :
Z
al :
Z
a1, a2, a3 :
Hst :
inst_stepge c_framec c_memc Letq A RenewHulllo hi r al a1; a2; a3 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A RenewHulllo hi r al a1; a2; a3
Ha :
fr_atc_framec = Execl Letq A RenewHulllo hi r al a1; a2; a3 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A RenewHulllo hi r al a1; a2; a3
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A RenewHulllo hi r al a1; a2; a3 rest live = Someout
⊢
False
deferred goal
ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
bd :
lo, hi :
Z
al :
Z
a1, a2 :
Hst :
inst_stepge c_framec c_memc Letq A HalfCheckbd lo hi r al a1; a2 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A HalfCheckbd lo hi r al a1; a2
Ha :
fr_atc_framec = Execl Letq A HalfCheckbd lo hi r al a1; a2 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al a1; a2
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A HalfCheckbd lo hi r al a1; a2 rest live = Someout
⊢
False

exact renew_not_uncheckedge md c_framec c_memc l Z.of_natkk Hmd Hinf Hr Hsc Hpt b kk q lo hi r al n1 a2 rest live out why Hfit Hb Hnth eq_refl Hc Hst

2 open

deferred goal
ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
lo, hi :
Z
al :
Z
a1, a2, a3 :
Hst :
inst_stepge c_framec c_memc Letq A RenewHulllo hi r al a1; a2; a3 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A RenewHulllo hi r al a1; a2; a3
Ha :
fr_atc_framec = Execl Letq A RenewHulllo hi r al a1; a2; a3 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A RenewHulllo hi r al a1; a2; a3
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A RenewHulllo hi r al a1; a2; a3 rest live = Someout
⊢
False
deferred goal
ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
bd :
lo, hi :
Z
al :
Z
a1, a2 :
Hst :
inst_stepge c_framec c_memc Letq A HalfCheckbd lo hi r al a1; a2 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A HalfCheckbd lo hi r al a1; a2
Ha :
fr_atc_framec = Execl Letq A HalfCheckbd lo hi r al a1; a2 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al a1; a2
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A HalfCheckbd lo hi r al a1; a2 rest live = Someout
⊢
False

–destruct a1 as nl | c1 | g1 , a2 as nh | c2 | g2 ; try unfold checked_inst_rest , hull_renewable in Hc ; cbn beta iota zeta in Hc ; discriminate Hc

2 open

ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
lo, hi :
Z
al :
Z
nl, nh :
a3 :
Hst :
inst_stepge c_framec c_memc Letq A RenewHulllo hi r al Tmpnl; Tmpnh; a3 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A RenewHulllo hi r al Tmpnl; Tmpnh; a3
Ha :
fr_atc_framec = Execl Letq A RenewHulllo hi r al Tmpnl; Tmpnh; a3 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A RenewHulllo hi r al Tmpnl; Tmpnh; a3
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A RenewHulllo hi r al Tmpnl; Tmpnh; a3 rest live = Someout
⊢
False
deferred goal
ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
bd :
lo, hi :
Z
al :
Z
a1, a2 :
Hst :
inst_stepge c_framec c_memc Letq A HalfCheckbd lo hi r al a1; a2 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A HalfCheckbd lo hi r al a1; a2
Ha :
fr_atc_framec = Execl Letq A HalfCheckbd lo hi r al a1; a2 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al a1; a2
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A HalfCheckbd lo hi r al a1; a2 rest live = Someout
⊢
False

exact hull_renew_not_uncheckedge md c_framec c_memc l Z.of_natkk Hmd Hinf Hr Hsc Hpt b kk q lo hi r al nl nh a3 rest live out why Hfit Hb Hnth eq_refl Hc Hst

deferred goal
ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
bd :
lo, hi :
Z
al :
Z
a1, a2 :
Hst :
inst_stepge c_framec c_memc Letq A HalfCheckbd lo hi r al a1; a2 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A HalfCheckbd lo hi r al a1; a2
Ha :
fr_atc_framec = Execl Letq A HalfCheckbd lo hi r al a1; a2 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al a1; a2
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A HalfCheckbd lo hi r al a1; a2 rest live = Someout
⊢
False

–destruct a1 as n1 | c1 | g1 ; try unfold checked_inst_rest in Hc ; cbn beta iota zeta in Hc ; discriminate Hc

ge :
md :
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
s0 :
R.state
s :
R.state
l :
rest :
listinst
j :
why :
Hge :
ge_modulege = md
Hfree :
ge_freege = R.free
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
H0 :
R.readys0 m
Hreach :
H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
q :
bd :
lo, hi :
Z
al :
Z
n1 :
a2 :
Hst :
inst_stepge c_framec c_memc Letq A HalfCheckbd lo hi r al Tmpn1; a2 = SomeIStopUncheckedwhy
Hi :
reuse_formLetq A HalfCheckbd lo hi r al Tmpn1; a2
Ha :
fr_atc_framec = Execl Letq A HalfCheckbd lo hi r al Tmpn1; a2 :: rest j
kk :
nat
live :
listfact
out :
listinst × listfact
Hinf :
Hpt :
point_sitefr_fnc_framec fr_atc_framec = Somel, Z.of_natkk
Hnth :
nth_errorb_instsb kk = SomeLetq A HalfCheckbd lo hi r al Tmpn1; a2
Hc :
checked_inst_restfn_srcmd fr_fnc_framec Letq A HalfCheckbd lo hi r al Tmpn1; a2 rest live = Someout
⊢
False

exact half_not_uncheckedge md c_framec c_memc l Z.of_natkk Hmd Hinf Hr Hsc Hpt b kk q bd lo hi r al n1 a2 rest live out why Hfit Hfe Hb Hnth eq_refl Hc Hst

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge md f xs fr m fuel s0 c s l i rest j why Hmd Hge Hfree Hin Hcf H0 Hreach Hd Ha Hi Hst
destruct reuse_shape_ _ _ _ _ Hi Hst as q & o & args & → & Ho
destruct run_point_ _ _ _ _ _ _ _ _ _ _ _ _ _ Hmd Hge Hfree Hin Hcf H0 Hreach Hd Ha ltac:destruct Ho as ? & ? & ? & ? & ? & ? & → & → | ? & ? & ? & ? & ? & ? & ? & → & → | ? & ? & ? & ? & ? & ? & ? & → & → ; reflexivity ltac:intros ? ? ? E ; discriminate E ltac:intros ? E ; discriminate E as b & kk & live & out & Hinf & Hr & Hsc & Hpt & Hb & Hnth & Hc & Hfit & Hfe

The pass accepts a reuse form only where its sources are proofs' names.

destruct Ho as lo & hi & r & al & a1 & a2 & → & → | lo & hi & r & al & a1 & a2 & a3 & → & → | bd & lo & hi & r & al & a1 & a2 & → & →
–destruct a1 as n1 | c1 | g1 ; try unfold checked_inst_rest in Hc ; cbn beta iota zeta in Hc ; discriminate Hc
exact renew_not_uncheckedge md c_framec c_memc l Z.of_natkk Hmd Hinf Hr Hsc Hpt b kk q lo hi r al n1 a2 rest live out why Hfit Hb Hnth eq_refl Hc Hst
–destruct a1 as nl | c1 | g1 , a2 as nh | c2 | g2 ; try unfold checked_inst_rest , hull_renewable in Hc ; cbn beta iota zeta in Hc ; discriminate Hc
exact hull_renew_not_uncheckedge md c_framec c_memc l Z.of_natkk Hmd Hinf Hr Hsc Hpt b kk q lo hi r al nl nh a3 rest live out why Hfit Hb Hnth eq_refl Hc Hst
–destruct a1 as n1 | c1 | g1 ; try unfold checked_inst_rest in Hc ; cbn beta iota zeta in Hc ; discriminate Hc
exact half_not_uncheckedge md c_framec c_memc l Z.of_natkk Hmd Hinf Hr Hsc Hpt b kk q bd lo hi r al n1 a2 rest live out why Hfit Hfe Hb Hnth eq_refl Hc Hst

The interpreter's runtime

926Module InterpReuse ≔ Reuse InterpRuntime

run_reuse_checked for the interpreter's runtime: in every state of a run of a checked module's function that starts ready, a frame that is not doomed runs no renew, renew over a hull or half check to unchecked. No hypothesis remains but the ready start.

932Corollary interp_reuse_checked
∀ md globals f xs fr m fuel s0 c s l i rest j why
let ge ≔ mkGenvmd globals InterpRuntime.free in
checked_modulemd → InIFuncf md → call_framef xs = Somefr → InterpRuntime.readys0 m → InterpReuse.H.P.I.RM.mreachablege mkConfigfr [ ] m fuel, s0 c, s → fr_doomedc_framec = None → fr_atc_framec = Execl i :: rest j → reuse_formi → inst_stepge c_framec c_memc i ≠ SomeIStopUncheckedwhy
Explore proof 2 tactics

Initial goal

⊢
∀ md : module globals : listname × ptr f : func xs : listword fr : frame m : Memory.mem fuel : Z s0 : InterpRuntime.state c : config s : InterpRuntime.state l : name i : inst rest : listinst j : jump why : reason  ,
let ge ≔ ge_module ≔ md; ge_globals ≔ globals; ge_free ≔ InterpRuntime.free in
checked_modulemd → InIFuncf md → call_framef xs = Somefr → InterpRuntime.readys0 m → InterpReuse.H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s → fr_doomedc_framec = None → fr_atc_framec = Execl i :: rest j → reuse_formi → inst_stepge c_framec c_memc i ≠ SomeIStopUncheckedwhy

intros md globals f xs fr m fuel s0 c s l i rest j why ge Hmd Hin Hcf H0 Hreach Hd Ha Hi

md :
globals :
listname × ptr
f :
xs :
listword
fr :
m :
Memory.mem
fuel :
Z
l :
i :
rest :
listinst
j :
why :
ge :=
ge_module ≔ md; ge_globals ≔ globals; ge_free ≔ InterpRuntime.free : genv
Hin :
InIFuncf md
Hcf :
call_framef xs = Somefr
Hreach :
InterpReuse.H.P.I.RM.mreachablege c_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel, s0 c, s
Hd :
Ha :
fr_atc_framec = Execl i :: rest j
⊢

exact InterpReuse.run_reuse_checkedge md f xs fr m fuel s0 c s l i rest j why Hmd eq_refl eq_refl Hin Hcf H0 Hreach Hd Ha Hi

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros md globals f xs fr m fuel s0 c s l i rest j why ge Hmd Hin Hcf H0 Hreach Hd Ha Hi
exact InterpReuse.run_reuse_checkedge md f xs fr m fuel s0 c s l i rest j why Hmd eq_refl eq_refl Hin Hcf H0 Hreach Hd Ha Hi