Fil-C on Nix

Filnix wiki

the formal campaign

rocq/theories/StepRules.v

What one step gives, rule by rule: for each instruction form of the core subset and each jump, the configuration step reaches from a frame at it, under premises small enough to compute on their own. They are the forward reading of Steps.v, whose lemmas say what a step that happened must have been.

A program proof that reduces step itself carries the whole function and memory through every reduction; Cycle.v and Buffer.v spend most of their time there (proof, docs/logic.md). With these rules, a proof names the instruction, checks the premises (a temporary's value, an operation on words, an access check against an object's region) and gets the next configuration as a term. They are the instruction rules of the program logic (docs/logic.md): its weakest-precondition rules are these, lifted.

Every rule is for a frame that is not doomed.

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

Operations

The op o is one inst_step runs through op_res: not a check of a named local, a function check or a read of the argument snapshot, which have their own cases.

28Definition general_opo : op : bool ≔
match o with
⇒
false
_
⇒
true

An instruction's result that continues keeps a frame that is not doomed undoomed.

33Lemma doomed_result_continue
∀ ge fr m i e ls m′
fr_doomedfr = None
doomed_resultge fr m i IContinuee ls m′ = SomeIContinuee ls m′, None
Explore proof 7 tactics

Initial goal

⊢
∀ge : genv fr : frame m : mem i : inst e : env ls : listname × optionZ m′ : mem, fr_doomedfr = None → doomed_resultge fr m i IContinuee ls m′ = SomeIContinuee ls m′, None

intros ge fr m i e ls m′ Hd

ge :
fr :
m :
i :
e :
ls :
listname × optionZ
m′ :
Hd :
fr_doomedfr = None
⊢
doomed_resultge fr m i IContinuee ls m′ = SomeIContinuee ls m′, None

unfold doomed_result

ge :
fr :
m :
i :
e :
ls :
listname × optionZ
m′ :
Hd :
fr_doomedfr = None
⊢
match i with
Let_ W _ _ | _
⇒
SomeIContinuee ls m′, fr_doomedfr
=
SomeIContinuee ls m′, None

rewrite Hd

ge :
fr :
m :
i :
e :
ls :
listname × optionZ
m′ :
Hd :
fr_doomedfr = None
⊢
match i with
Let_ W _ _ | _
⇒
SomeIContinuee ls m′, None
=
SomeIContinuee ls m′, None

destruct i as d k o args | | | | | | | | ; try reflexivity

ge :
fr :
m :
d :
o :
args :
listvalue
e :
ls :
listname × optionZ
m′ :
Hd :
fr_doomedfr = None
⊢
match k with
⇒
match o with
CheckAhead_ _ _ _ _
⇒
match args with
[ ] | _
⇒
SomeIContinuee ls m′, None
_
⇒
SomeIContinuee ls m′, None
_
⇒
SomeIContinuee ls m′, None
=
SomeIContinuee ls m′, None

destruct k ; try reflexivity

ge :
fr :
m :
d :
o :
args :
listvalue
e :
ls :
listname × optionZ
m′ :
Hd :
fr_doomedfr = None
⊢
match o with
CheckAhead_ _ _ _ _
⇒
match args with
[ ] | _
⇒
SomeIContinuee ls m′, None
_
⇒
SomeIContinuee ls m′, None
=
SomeIContinuee ls m′, None

destruct o ; try reflexivity

ge :
fr :
m :
d :
lo, hi :
Z
align, ahi :
Z
args :
listvalue
e :
ls :
listname × optionZ
m′ :
Hd :
fr_doomedfr = None
⊢
match args with
[ ] | _
⇒
SomeIContinuee ls m′, None
=
SomeIContinuee ls m′, None

destruct args as | a | a′ args ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge fr m i e ls m′ Hd
rewrite Hd
destruct i as d k o args | | | | | | | | ; try reflexivity
destruct k ; try reflexivity
destruct o ; try reflexivity
destruct args as | a | a′ args ; reflexivity

An instruction's result that allocates keeps a frame that is not doomed undoomed.

44Lemma doomed_result_fresh_none
∀ ge fr m i q k
fr_doomedfr = None
doomed_resultge fr m i IFreshq k = SomeIFreshq k, None
Explore proof 7 tactics

Initial goal

⊢
∀ge : genv fr : frame m : mem i : inst q : alloc_req k : Z → env × listname × optionZ × mem, fr_doomedfr = None → doomed_resultge fr m i IFreshq k = SomeIFreshq k, None

intros ge fr m i q kk Hd

ge :
fr :
m :
i :
kk :
Z → env × listname × optionZ × mem
Hd :
fr_doomedfr = None
⊢
doomed_resultge fr m i IFreshq kk = SomeIFreshq kk, None

unfold doomed_result

ge :
fr :
m :
i :
kk :
Z → env × listname × optionZ × mem
Hd :
fr_doomedfr = None
⊢
match i with
Let_ W _ _ | _
⇒
SomeIFreshq kk, fr_doomedfr
=
SomeIFreshq kk, None

rewrite Hd

ge :
fr :
m :
i :
kk :
Z → env × listname × optionZ × mem
Hd :
fr_doomedfr = None
⊢
match i with
Let_ W _ _ | _
⇒
SomeIFreshq kk, None
=
SomeIFreshq kk, None

destruct i as d k o args | | | | | | | | ; try reflexivity

ge :
fr :
m :
d :
o :
args :
listvalue
kk :
Z → env × listname × optionZ × mem
Hd :
fr_doomedfr = None
⊢
match k with
⇒
match o with
CheckAhead_ _ _ _ _
⇒
match args with
[ ] | _
⇒
SomeIFreshq kk, None
_
⇒
SomeIFreshq kk, None
_
⇒
SomeIFreshq kk, None
=
SomeIFreshq kk, None

destruct k ; try reflexivity

ge :
fr :
m :
d :
o :
args :
listvalue
kk :
Z → env × listname × optionZ × mem
Hd :
fr_doomedfr = None
⊢
match o with
CheckAhead_ _ _ _ _
⇒
match args with
[ ] | _
⇒
SomeIFreshq kk, None
_
⇒
SomeIFreshq kk, None
=
SomeIFreshq kk, None

destruct o ; try reflexivity

ge :
fr :
m :
d :
lo, hi :
Z
align, ahi :
Z
args :
listvalue
kk :
Z → env × listname × optionZ × mem
Hd :
fr_doomedfr = None
⊢
match args with
[ ] | _
⇒
SomeIFreshq kk, None
=
SomeIFreshq kk, None

destruct args as | a | a′ args ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge fr m i q kk Hd
rewrite Hd
destruct i as d k o args | | | | | | | | ; try reflexivity
destruct k ; try reflexivity
destruct o ; try reflexivity
destruct args as | a | a′ args ; reflexivity

An instruction's result that calls keeps a frame that is not doomed undoomed.

55Lemma doomed_result_call
∀ ge fr m i g xs pd
fr_doomedfr = None
doomed_resultge fr m i ICallg xs pd = SomeICallg xs pd, None
Explore proof 7 tactics

Initial goal

⊢
∀ge : genv fr : frame m : mem i : inst g : func xs : listword pd : pending, fr_doomedfr = None → doomed_resultge fr m i ICallg xs pd = SomeICallg xs pd, None

intros ge fr m i g xs pd Hd

ge :
fr :
m :
i :
g :
xs :
listword
Hd :
fr_doomedfr = None
⊢
doomed_resultge fr m i ICallg xs pd = SomeICallg xs pd, None

unfold doomed_result

ge :
fr :
m :
i :
g :
xs :
listword
Hd :
fr_doomedfr = None
⊢
match i with
Let_ W _ _ | _
⇒
SomeICallg xs pd, fr_doomedfr
=
SomeICallg xs pd, None

rewrite Hd

ge :
fr :
m :
i :
g :
xs :
listword
Hd :
fr_doomedfr = None
⊢
match i with
Let_ W _ _ | _
⇒
SomeICallg xs pd, None
=
SomeICallg xs pd, None

destruct i as d k o args | | | | | | | | ; try reflexivity

ge :
fr :
m :
d :
o :
args :
listvalue
g :
xs :
listword
Hd :
fr_doomedfr = None
⊢
match k with
⇒
match o with
CheckAhead_ _ _ _ _
⇒
match args with
[ ] | _
⇒
SomeICallg xs pd, None
_
⇒
SomeICallg xs pd, None
_
⇒
SomeICallg xs pd, None
=
SomeICallg xs pd, None

destruct k ; try reflexivity

ge :
fr :
m :
d :
o :
args :
listvalue
g :
xs :
listword
Hd :
fr_doomedfr = None
⊢
match o with
CheckAhead_ _ _ _ _
⇒
match args with
[ ] | _
⇒
SomeICallg xs pd, None
_
⇒
SomeICallg xs pd, None
=
SomeICallg xs pd, None

destruct o ; try reflexivity

ge :
fr :
m :
d :
lo, hi :
Z
align, ahi :
Z
args :
listvalue
g :
xs :
listword
Hd :
fr_doomedfr = None
⊢
match args with
[ ] | _
⇒
SomeICallg xs pd, None
=
SomeICallg xs pd, None

destruct args as | a | a′ args ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge fr m i g xs pd Hd
rewrite Hd
destruct i as d k o args | | | | | | | | ; try reflexivity
destruct k ; try reflexivity
destruct o ; try reflexivity
destruct args as | a | a′ args ; reflexivity

A step at an instruction of a frame that is not doomed: what inst_step makes of it, through inst_next.

66Lemma rule_inst
∀ ge f e ls l i rest j cs m fuel out
inst_stepge mkFramef e ls None Execl i :: rest j m i = Someout
doomed_resultge mkFramef e ls None Execl i :: rest j m i out = Someout, None
stepge mkConfigmkFramef e ls None Execl i :: rest j cs m fuel = inst_nextmkConfigmkFramef e ls None Execl i :: rest j cs m fuel l rest j out None
Explore proof 5 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l : name i : inst rest : listinst j : jump cs : listframe × pending m : mem fuel : Z out : inst_out, inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i = Someout → doomed_resultge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i out = Someout, None → stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j out None

intros ge f e ls l i rest j cs m fuel out Hi Hd

ge :
f :
e :
ls :
listname × optionZ
l :
i :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i = Someout
Hd :
doomed_resultge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i out = Someout, None
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j out None

unfold step ; cbn [ fr_at c_frame c_mem fr_doomed ]

ge :
f :
e :
ls :
listname × optionZ
l :
i :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i = Someout
Hd :
doomed_resultge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i out = Someout, None
⊢
or_stuck"instruction"
let* out0 ≔ inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i in
let* od ≔ doomed_resultge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i out0 in
Someinst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j fstod sndod
=
inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j out None

rewrite Hi

ge :
f :
e :
ls :
listname × optionZ
l :
i :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i = Someout
Hd :
doomed_resultge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i out = Someout, None
⊢
or_stuck"instruction"
let* od ≔ doomed_resultge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i out in
Someinst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j fstod sndod
=
inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j out None

rewrite Hd

ge :
f :
e :
ls :
listname × optionZ
l :
i :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i = Someout
Hd :
doomed_resultge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j m i out = Someout, None
⊢
or_stuck"instruction" Someinst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j fstout, None sndout, None = inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl i :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j out None

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge f e ls l i rest j cs m fuel out Hi Hd
unfold step ; cbn [ fr_at c_frame c_mem fr_doomed ]
rewrite Hi
rewrite Hd
reflexivity

A let of a general op whose arguments read as the words xs and whose op_res is the word w, in the memory m': the frame binds w to d and goes on, in m'.

80Lemma rule_let
∀ ge f e ls l d k o args rest j cs m fuel classes xs w m′
general_opo = true
op_arg_classeso k = Someclasses
map2_optionvalue_xge e classes args = Somexs
op_reso k xs m = SomeOpResRValw m′
stepge mkConfigmkFramef e ls None Execl Letd k o args :: rest j cs m fuel = NextmkConfigmkFramef putd w e ls None Execl rest j cs m′ fuel
Explore proof 12 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l d : name k : class o : op args : listvalue rest : listinst j : jump cs : listframe × pending m : mem fuel : Z classes : listclass xs : listword w : word m′ : mem, general_opo = true → op_arg_classeso k = Someclasses → map2_optionvalue_xge e classes args = Somexs → op_reso k xs m = SomeOpResRValw m′ → stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

intros ge f e ls l d k o args rest j cs m fuel classes xs w m′ Hg Hc Hx Ho

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

assert Hi : inst_stepge mkFramef e ls None Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′

2 open

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
⊢
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
focused goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

{transitivity let* classes ≔ op_arg_classeso k in let* xs ≔ map2_optionvalue_xge e classes args in let* out ≔ op_reso k xs m in match out with OpResr m′ ⇒ Somebind_resd r e ls m′ | OpUBwhy ⇒ SomeIStopUBwhy | OpAllocq kont ⇒ SomeIFreshq λbase ⇒ let x, m′ ≔ kontbase in putd x e, ls, m′ end

3 open

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
⊢
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args
=
let* classes0 ≔ op_arg_classeso k in
let* xs0 ≔ map2_optionvalue_xge e classes0 args in
match op_reso k xs0 m with
SomeOpResr m'0
⇒
Somebind_resd r e ls m'0
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq kont
⇒
Some
λ base : Z  ⇒
let x, m'0 ≔ kontbase in
putd x e, ls, m'0
None
⇒
None
focused goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
⊢
let* classes0 ≔ op_arg_classeso k in
let* xs0 ≔ map2_optionvalue_xge e classes0 args in
match op_reso k xs0 m with
SomeOpResr m'0
⇒
Somebind_resd r e ls m'0
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq kont
⇒
Some
λ base : Z  ⇒
let x, m'0 ≔ kontbase in
putd x e, ls, m'0
None
⇒
None
=
SomeIContinueputd w e ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

–destruct o ; try discriminate Hg ; destruct k ; reflexivity

2 open

deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
⊢
let* classes0 ≔ op_arg_classeso k in
let* xs0 ≔ map2_optionvalue_xge e classes0 args in
match op_reso k xs0 m with
SomeOpResr m'0
⇒
Somebind_resd r e ls m'0
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq kont
⇒
Some
λ base : Z  ⇒
let x, m'0 ≔ kontbase in
putd x e, ls, m'0
None
⇒
None
=
SomeIContinueputd w e ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

–rewrite Hc

2 open

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
⊢
let* xs0 ≔ map2_optionvalue_xge e classes args in
match op_reso k xs0 m with
SomeOpResr m'0
⇒
Somebind_resd r e ls m'0
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq kont
⇒
Some
λ base : Z  ⇒
let x, m'0 ≔ kontbase in
putd x e, ls, m'0
None
⇒
None
=
SomeIContinueputd w e ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

cbn - [ op_res map2_option ]

2 open

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
⊢
let* xs0 ≔ map2_optionvalue_xge e classes args in
match op_reso k xs0 m with
SomeOpResr m'0
⇒
Somebind_resd r e ls m'0
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq kont
⇒
Some
λ base : Z  ⇒
let x, m'0 ≔ kontbase in
putd x e, ls, m'0
None
⇒
None
=
SomeIContinueputd w e ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite Hx

2 open

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
⊢
match op_reso k xs m with
SomeOpResr m'0
⇒
Somebind_resd r e ls m'0
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq kont
⇒
Some
λ base : Z  ⇒
let x, m'0 ≔ kontbase in
putd x e, ls, m'0
None
⇒
None
=
SomeIContinueputd w e ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

cbn - [ op_res ]

2 open

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
⊢
match op_reso k xs m with
SomeOpResr m'0
⇒
Somebind_resd r e ls m'0
SomeOpUBwhy
⇒
SomeIStopUBwhy
SomeOpAllocq kont
⇒
Some
λ base : Z  ⇒
let x, m'0 ≔ kontbase in
putd x e, ls, m'0
None
⇒
None
=
SomeIContinueputd w e ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite Ho

2 open

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
⊢
Somebind_resd RValw e ls m′ = SomeIContinueputd w e ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

reflexivity

deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_continue ; reflexivity

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
classes :
listclass
xs :
listword
w :
m′ :
Hg :
general_opo = true
Hc :
op_arg_classeso k = Someclasses
Hx :
map2_optionvalue_xge e classes args = Somexs
Ho :
op_reso k xs m = SomeOpResRValw m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
⊢
inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k o args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j IContinueputd w e ls m′ None = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd w e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge f e ls l d k o args rest j cs m fuel classes xs w m′ Hg Hc Hx Ho
assert Hi : inst_stepge mkFramef e ls None Execl Letd k o args :: rest j m Letd k o args = SomeIContinueputd w e ls m′
{transitivity let* classes ≔ op_arg_classeso k in let* xs ≔ map2_optionvalue_xge e classes args in let* out ≔ op_reso k xs m in match out with OpResr m′ ⇒ Somebind_resd r e ls m′ | OpUBwhy ⇒ SomeIStopUBwhy | OpAllocq kont ⇒ SomeIFreshq λbase ⇒ let x, m′ ≔ kontbase in putd x e, ls, m′ end
–destruct o ; try discriminate Hg ; destruct k ; reflexivity
–rewrite Hc
rewrite Hx
cbn - [ op_res ]
rewrite Ho
reflexivity
rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_continue ; reflexivity
reflexivity

A heap allocation of size bytes, size read as the only argument and within Fil-C's limit: the step asks for heap_req of it, and for any base the frame binds d to the new object's own pointer, in the memory with the object allocated.

110Lemma rule_alloc
∀ ge f e ls l d k al args rest j cs m fuel size
map2_optionvalue_xge e L args = SomeWIntsize
stepge mkConfigmkFramef e ls None Execl Letd k Allocal args :: rest j cs m fuel = Freshheap_reqal size λbase ⇒ mkConfigmkFramef putd WPtrmkPtrbase Objbase e ls None Execl rest j cs allocatedm heap_reqal size base fuel
Explore proof 5 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l d : name k : class al : Z args : listvalue rest : listinst j : jump cs : listframe × pending m : mem fuel size : Z, map2_optionvalue_xge e L args = SomeWIntsize → size ≤ max_allocation_size → stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k Allocal args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Freshheap_reqal size λbase : Z ⇒ c_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ allocatedm heap_reqal size base; c_fuel ≔ fuel

intros ge f e ls l d k al args rest j cs m fuel size Hx Hs

ge :
f :
e :
ls :
listname × optionZ
l, d :
al :
Z
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel, size :
Z
Hx :
map2_optionvalue_xge e L args = SomeWIntsize
Hs :
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k Allocal args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Freshheap_reqal size λbase : Z ⇒ c_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ allocatedm heap_reqal size base; c_fuel ≔ fuel

assert Hi : inst_stepge mkFramef e ls None Execl Letd k Allocal args :: rest j m Letd k Allocal args = SomeIFreshheap_reqal size λbase ⇒ putd WPtrmkPtrbase Objbase e, ls, allocatedm heap_reqal size base

2 open

ge :
f :
e :
ls :
listname × optionZ
l, d :
al :
Z
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel, size :
Z
Hx :
map2_optionvalue_xge e L args = SomeWIntsize
Hs :
⊢
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k Allocal args :: rest j m Letd k Allocal args = SomeIFreshheap_reqal size λbase : Z ⇒ putd WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e, ls, allocatedm heap_reqal size base
focused goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
al :
Z
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel, size :
Z
Hx :
map2_optionvalue_xge e L args = SomeWIntsize
Hs :
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k Allocal args :: rest j m Letd k Allocal args = SomeIFreshheap_reqal size λbase : Z ⇒ putd WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e, ls, allocatedm heap_reqal size base
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k Allocal args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Freshheap_reqal size λbase : Z ⇒ c_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ allocatedm heap_reqal size base; c_fuel ≔ fuel

{destruct k ; cbn - [ map2_option heap_req allocated max_allocation_size ] ; rewrite Hx ; cbn - [ heap_req allocated max_allocation_size ] ; replace max_allocation_size <? size with false by symmetry ; apply Z.ltb_ge ; exact Hs ; reflexivity

deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
al :
Z
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel, size :
Z
Hx :
map2_optionvalue_xge e L args = SomeWIntsize
Hs :
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k Allocal args :: rest j m Letd k Allocal args = SomeIFreshheap_reqal size λbase : Z ⇒ putd WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e, ls, allocatedm heap_reqal size base
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k Allocal args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Freshheap_reqal size λbase : Z ⇒ c_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ allocatedm heap_reqal size base; c_fuel ≔ fuel

rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_fresh_none ; reflexivity

ge :
f :
e :
ls :
listname × optionZ
l, d :
al :
Z
args :
listvalue
rest :
listinst
j :
cs :
listframe × pending
m :
fuel, size :
Z
Hx :
map2_optionvalue_xge e L args = SomeWIntsize
Hs :
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k Allocal args :: rest j m Letd k Allocal args = SomeIFreshheap_reqal size λbase : Z ⇒ putd WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e, ls, allocatedm heap_reqal size base
⊢
inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Letd k Allocal args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j IFreshheap_reqal size λbase : Z ⇒ putd WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e, ls, allocatedm heap_reqal size base None = Freshheap_reqal size λbase : Z ⇒ c_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ allocatedm heap_reqal size base; c_fuel ≔ fuel

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge f e ls l d k al args rest j cs m fuel size Hx Hs
assert Hi : inst_stepge mkFramef e ls None Execl Letd k Allocal args :: rest j m Letd k Allocal args = SomeIFreshheap_reqal size λbase ⇒ putd WPtrmkPtrbase Objbase e, ls, allocatedm heap_reqal size base
{destruct k ; cbn - [ map2_option heap_req allocated max_allocation_size ] ; rewrite Hx ; cbn - [ heap_req allocated max_allocation_size ] ; replace max_allocation_size <? size with false by symmetry ; apply Z.ltb_ge ; exact Hs ; reflexivity
rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_fresh_none ; reflexivity
reflexivity

Flights and stores

A flight whose arguments read as xs, whose address alu computes as n, and whose capability source gives c: the frame binds d to the pointer of n and c.

137Lemma rule_flight
∀ ge f e ls l d o args lw rest j cs m fuel xs n c
map_optionflight_arg_xge e args = Somexs
aluo L xs = SomeWIntn
flight_capge e lw = Somec
stepge mkConfigmkFramef e ls None Execl Flightd o args lw :: rest j cs m fuel = NextmkConfigmkFramef putd WPtrmkPtrn c e ls None Execl rest j cs m fuel
Explore proof 7 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l d : name o : op args : listflight_arg lw : flight_lower rest : listinst j : jump cs : listframe × pending m : mem fuel : Z xs : listword n : Z c : cap, map_optionflight_arg_xge e args = Somexs → aluo L xs = SomeWIntn → flight_capge e lw = Somec → stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ n; ptr_cap ≔ c e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

intros ge f e ls l d o args lw rest j cs m fuel xs n c Hx Ha Hc

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
n :
Z
c :
Hx :
map_optionflight_arg_xge e args = Somexs
Ha :
aluo L xs = SomeWIntn
Hc :
flight_capge e lw = Somec
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ n; ptr_cap ≔ c e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

assert Hi : inst_stepge mkFramef e ls None Execl Flightd o args lw :: rest j m Flightd o args lw = SomeIContinueputd WPtrmkPtrn c e ls m

2 open

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
n :
Z
c :
Hx :
map_optionflight_arg_xge e args = Somexs
Ha :
aluo L xs = SomeWIntn
Hc :
flight_capge e lw = Somec
⊢
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j m Flightd o args lw = SomeIContinueputd WPtrptr_addr ≔ n; ptr_cap ≔ c e ls m
focused goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
n :
Z
c :
Hx :
map_optionflight_arg_xge e args = Somexs
Ha :
aluo L xs = SomeWIntn
Hc :
flight_capge e lw = Somec
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j m Flightd o args lw = SomeIContinueputd WPtrptr_addr ≔ n; ptr_cap ≔ c e ls m
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ n; ptr_cap ≔ c e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

{cbn - [ map_option alu flight_cap ]

2 open

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
n :
Z
c :
Hx :
map_optionflight_arg_xge e args = Somexs
Ha :
aluo L xs = SomeWIntn
Hc :
flight_capge e lw = Somec
⊢
let* xs0 ≔ map_optionflight_arg_xge e args in
let* a ≔ aluo L xs0 in
let* c0 ≔ flight_capge e lw in
match a with
⇒
SomeIContinueputd WPtrptr_addr ≔ n0; ptr_cap ≔ c0 e ls m
_
⇒
None
=
SomeIContinueputd WPtrptr_addr ≔ n; ptr_cap ≔ c e ls m
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
n :
Z
c :
Hx :
map_optionflight_arg_xge e args = Somexs
Ha :
aluo L xs = SomeWIntn
Hc :
flight_capge e lw = Somec
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j m Flightd o args lw = SomeIContinueputd WPtrptr_addr ≔ n; ptr_cap ≔ c e ls m
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ n; ptr_cap ≔ c e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

rewrite Hx , Ha , Hc

2 open

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
n :
Z
c :
Hx :
map_optionflight_arg_xge e args = Somexs
Ha :
aluo L xs = SomeWIntn
Hc :
flight_capge e lw = Somec
⊢
SomeIContinueputd WPtrptr_addr ≔ n; ptr_cap ≔ c e ls m = SomeIContinueputd WPtrptr_addr ≔ n; ptr_cap ≔ c e ls m
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
n :
Z
c :
Hx :
map_optionflight_arg_xge e args = Somexs
Ha :
aluo L xs = SomeWIntn
Hc :
flight_capge e lw = Somec
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j m Flightd o args lw = SomeIContinueputd WPtrptr_addr ≔ n; ptr_cap ≔ c e ls m
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ n; ptr_cap ≔ c e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

reflexivity

deferred goal
ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
n :
Z
c :
Hx :
map_optionflight_arg_xge e args = Somexs
Ha :
aluo L xs = SomeWIntn
Hc :
flight_capge e lw = Somec
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j m Flightd o args lw = SomeIContinueputd WPtrptr_addr ≔ n; ptr_cap ≔ c e ls m
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ n; ptr_cap ≔ c e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_continue ; reflexivity

ge :
f :
e :
ls :
listname × optionZ
l, d :
o :
args :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
n :
Z
c :
Hx :
map_optionflight_arg_xge e args = Somexs
Ha :
aluo L xs = SomeWIntn
Hc :
flight_capge e lw = Somec
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j m Flightd o args lw = SomeIContinueputd WPtrptr_addr ≔ n; ptr_cap ≔ c e ls m
⊢
inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Flightd o args lw :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j IContinueputd WPtrptr_addr ≔ n; ptr_cap ≔ c e ls m None = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ putd WPtrptr_addr ≔ n; ptr_cap ≔ c e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge f e ls l d o args lw rest j cs m fuel xs n c Hx Ha Hc
assert Hi : inst_stepge mkFramef e ls None Execl Flightd o args lw :: rest j m Flightd o args lw = SomeIContinueputd WPtrmkPtrn c e ls m
rewrite Hx , Ha , Hc
reflexivity
rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_continue ; reflexivity
reflexivity

A raw store of width w of the value v, which reads as x, through the proven pointer a, which reads as p, at offset off, where the store passes and leaves the memory m': the frame goes on in m'.

155Lemma rule_raw_store
∀ ge f e ls l w off v a rest j cs m fuel vk x p m′
value_xge e vk v = Somex
value_xge e A a = SomeWPtrp
store_resw m raw_addressptr_addrp off ptr_capp x = Someok, m′
stepge mkConfigmkFramef e ls None Execl RawStorew off v a :: rest j cs m fuel = NextmkConfigmkFramef e ls None Execl rest j cs m′ fuel
Explore proof 7 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l : name w : width off : Z v a : value rest : listinst j : jump cs : listframe × pending m : mem fuel : Z vk : class x : word p : ptr m′ : mem, width_value_classw = Somevk → value_xge e vk v = Somex → value_xge e A a = SomeWPtrp → store_resw m raw_addressptr_addrp off ptr_capp x = Someok, m′ → stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

intros ge f e ls l w off v a rest j cs m fuel vk x p m′ Hw Hv Ha Hs

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
vk :
x :
p :
m′ :
Hw :
Hv :
value_xge e vk v = Somex
Ha :
value_xge e A a = SomeWPtrp
Hs :
store_resw m raw_addressptr_addrp off ptr_capp x = Someok, m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

assert Hi : inst_stepge mkFramef e ls None Execl RawStorew off v a :: rest j m RawStorew off v a = SomeIContinuee ls m′

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
vk :
x :
p :
m′ :
Hw :
Hv :
value_xge e vk v = Somex
Ha :
value_xge e A a = SomeWPtrp
Hs :
store_resw m raw_addressptr_addrp off ptr_capp x = Someok, m′
⊢
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j m RawStorew off v a = SomeIContinuee ls m′
focused goal
ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
vk :
x :
p :
m′ :
Hw :
Hv :
value_xge e vk v = Somex
Ha :
value_xge e A a = SomeWPtrp
Hs :
store_resw m raw_addressptr_addrp off ptr_capp x = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j m RawStorew off v a = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

{cbn - [ width_value_class value_x store_res raw_address ]

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
vk :
x :
p :
m′ :
Hw :
Hv :
value_xge e vk v = Somex
Ha :
value_xge e A a = SomeWPtrp
Hs :
store_resw m raw_addressptr_addrp off ptr_capp x = Someok, m′
⊢
let* vk0 ≔ width_value_classw in
let* x0 ≔ value_xge e vk0 v in
match value_xge e A a with
SomeWPtrp0
⇒
match store_resw m raw_addressptr_addrp0 off ptr_capp0 x0 with
Somer, m'0
⇒
Somestore_outraw_resr e ls m'0
None
⇒
None
_
⇒
None
=
SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
vk :
x :
p :
m′ :
Hw :
Hv :
value_xge e vk v = Somex
Ha :
value_xge e A a = SomeWPtrp
Hs :
store_resw m raw_addressptr_addrp off ptr_capp x = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j m RawStorew off v a = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite Hw , Hv , Ha , Hs

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
vk :
x :
p :
m′ :
Hw :
Hv :
value_xge e vk v = Somex
Ha :
value_xge e A a = SomeWPtrp
Hs :
store_resw m raw_addressptr_addrp off ptr_capp x = Someok, m′
⊢
Somestore_outraw_resok e ls m′ = SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
vk :
x :
p :
m′ :
Hw :
Hv :
value_xge e vk v = Somex
Ha :
value_xge e A a = SomeWPtrp
Hs :
store_resw m raw_addressptr_addrp off ptr_capp x = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j m RawStorew off v a = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

reflexivity

deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
vk :
x :
p :
m′ :
Hw :
Hv :
value_xge e vk v = Somex
Ha :
value_xge e A a = SomeWPtrp
Hs :
store_resw m raw_addressptr_addrp off ptr_capp x = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j m RawStorew off v a = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_continue ; reflexivity

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
vk :
x :
p :
m′ :
Hw :
Hv :
value_xge e vk v = Somex
Ha :
value_xge e A a = SomeWPtrp
Hs :
store_resw m raw_addressptr_addrp off ptr_capp x = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j m RawStorew off v a = SomeIContinuee ls m′
⊢
inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorew off v a :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j IContinuee ls m′ None = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge f e ls l w off v a rest j cs m fuel vk x p m′ Hw Hv Ha Hs
assert Hi : inst_stepge mkFramef e ls None Execl RawStorew off v a :: rest j m RawStorew off v a = SomeIContinuee ls m′
rewrite Hw , Hv , Ha , Hs
reflexivity
rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_continue ; reflexivity
reflexivity

A raw store of the pointer v, which reads as xp, through the proven pointer a, which reads as p, at offset off: where the 8-byte write access there passes and the protocol es leaves the memory m', the frame goes on in m'.

175Lemma rule_raw_store_pointer
∀ ge f e ls l off v a es rest j cs m fuel xp p m′
value_xge e P v = SomeWPtrxp
value_xge e A a = SomeWPtrp
stepge mkConfigmkFramef e ls None Execl RawStorePointeroff v a es :: rest j cs m fuel = NextmkConfigmkFramef e ls None Execl rest j cs m′ fuel
Explore proof 9 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l : name off : Z v a : value es : listeffect rest : listinst j : jump cs : listframe × pending m : mem fuel : Z xp p : ptr m′ : mem, value_xge e P v = SomeWPtrxp → value_xge e A a = SomeWPtrp → access_resm raw_addressptr_addrp off ptr_capp 8 Write 8 = Someok → pointer_store_effectsraw_addressptr_addrp off xp m es = Somem′ → stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

intros ge f e ls l off v a es rest j cs m fuel xp p m′ Hv Ha Hc Hs

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

assert Hi : inst_stepge mkFramef e ls None Execl RawStorePointeroff v a es :: rest j m RawStorePointeroff v a es = SomeIContinuee ls m′

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
⊢
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j m RawStorePointeroff v a es = SomeIContinuee ls m′
focused goal
ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j m RawStorePointeroff v a es = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

{cbn - [ value_x access_res pointer_store_effects raw_address ]

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
⊢
let* x ≔ value_xge e P v in
match value_xge e A a with
SomeWPtrp0
⇒
SomeRVal_
⇒
match x with
WPtrxp0
⇒
let* m'0 ≔ pointer_store_effectsraw_addressptr_addrp0 off xp0 m es in
SomeIContinuee ls m'0
_
⇒
None
SomeRTrapwhy | SomeRUncheckedwhy
⇒
None
⇒
None
_
⇒
None
=
SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j m RawStorePointeroff v a es = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite Hv , Ha , Hc

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
⊢
let* m'0 ≔ pointer_store_effectsraw_addressptr_addrp off xp m es in
SomeIContinuee ls m'0
=
SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j m RawStorePointeroff v a es = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

cbn - [ pointer_store_effects raw_address ]

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
⊢
let* m'0 ≔ pointer_store_effectsraw_addressptr_addrp off xp m es in
SomeIContinuee ls m'0
=
SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j m RawStorePointeroff v a es = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite Hs

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
⊢
SomeIContinuee ls m′ = SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j m RawStorePointeroff v a es = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

reflexivity

deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j m RawStorePointeroff v a es = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_continue ; reflexivity

ge :
f :
e :
ls :
listname × optionZ
l :
off :
Z
v, a :
es :
listeffect
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xp, p :
m′ :
Hv :
value_xge e P v = SomeWPtrxp
Ha :
value_xge e A a = SomeWPtrp
Hs :
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j m RawStorePointeroff v a es = SomeIContinuee ls m′
⊢
inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl RawStorePointeroff v a es :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j IContinuee ls m′ None = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge f e ls l off v a es rest j cs m fuel xp p m′ Hv Ha Hc Hs
assert Hi : inst_stepge mkFramef e ls None Execl RawStorePointeroff v a es :: rest j m RawStorePointeroff v a es = SomeIContinuee ls m′
rewrite Hv , Ha , Hc
rewrite Hs
reflexivity
rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_continue ; reflexivity
reflexivity

Calls

A direct call of the function g, defined in the module, with arguments that read as xs and make its frame callee: the callee runs on top, and the caller waits at the rest of its block for the result r.

198Lemma rule_call
∀ ge f e ls l r g args rest j cs m fuel xs gf callee
map_optionarg_xge e args = Somexs
find_fnge g = SomeDefinedgf
call_framegf xs = Somecallee
stepge mkConfigmkFramef e ls None Execl Callr Globalg args :: rest j cs m fuel = NextmkConfigcallee mkFramef e ls None Execl rest j, mkPendingr None :: cs m fuel
Explore proof 9 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l : name r : call_result g : name args : listarg rest : listinst j : jump cs : listframe × pending m : mem fuel : Z xs : listword gf : func callee : frame, map_optionarg_xge e args = Somexs → find_fnge g = SomeDefinedgf → call_framegf xs = Somecallee → stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ callee; c_callers ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j, pd_res ≔ r; pd_conv ≔ None :: cs; c_mem ≔ m; c_fuel ≔ fuel

intros ge f e ls l r g args rest j cs m fuel xs gf callee Hx Hf Hc

ge :
f :
e :
ls :
listname × optionZ
l :
g :
args :
listarg
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
gf :
callee :
Hx :
map_optionarg_xge e args = Somexs
Hf :
find_fnge g = SomeDefinedgf
Hc :
call_framegf xs = Somecallee
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ callee; c_callers ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j, pd_res ≔ r; pd_conv ≔ None :: cs; c_mem ≔ m; c_fuel ≔ fuel

assert Hi : inst_stepge mkFramef e ls None Execl Callr Globalg args :: rest j m Callr Globalg args = SomeICallgf xs mkPendingr None

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
g :
args :
listarg
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
gf :
callee :
Hx :
map_optionarg_xge e args = Somexs
Hf :
find_fnge g = SomeDefinedgf
Hc :
call_framegf xs = Somecallee
⊢
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j m Callr Globalg args = SomeICallgf xs pd_res ≔ r; pd_conv ≔ None
focused goal
ge :
f :
e :
ls :
listname × optionZ
l :
g :
args :
listarg
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
gf :
callee :
Hx :
map_optionarg_xge e args = Somexs
Hf :
find_fnge g = SomeDefinedgf
Hc :
call_framegf xs = Somecallee
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j m Callr Globalg args = SomeICallgf xs pd_res ≔ r; pd_conv ≔ None
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ callee; c_callers ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j, pd_res ≔ r; pd_conv ≔ None :: cs; c_mem ≔ m; c_fuel ≔ fuel

{cbn - [ map_option find_fn ]

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
g :
args :
listarg
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
gf :
callee :
Hx :
map_optionarg_xge e args = Somexs
Hf :
find_fnge g = SomeDefinedgf
Hc :
call_framegf xs = Somecallee
⊢
let* xs0 ≔ map_optionarg_xge e args in
match find_fnge g with
SomeDefinedg0
⇒
SomeICallg0 xs0 pd_res ≔ r; pd_conv ≔ None
SomeOutsideg0
⇒
None
⇒
external_callge g r args xs0 e ls m
=
SomeICallgf xs pd_res ≔ r; pd_conv ≔ None
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
g :
args :
listarg
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
gf :
callee :
Hx :
map_optionarg_xge e args = Somexs
Hf :
find_fnge g = SomeDefinedgf
Hc :
call_framegf xs = Somecallee
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j m Callr Globalg args = SomeICallgf xs pd_res ≔ r; pd_conv ≔ None
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ callee; c_callers ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j, pd_res ≔ r; pd_conv ≔ None :: cs; c_mem ≔ m; c_fuel ≔ fuel

rewrite Hx , Hf

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
g :
args :
listarg
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
gf :
callee :
Hx :
map_optionarg_xge e args = Somexs
Hf :
find_fnge g = SomeDefinedgf
Hc :
call_framegf xs = Somecallee
⊢
SomeICallgf xs pd_res ≔ r; pd_conv ≔ None = SomeICallgf xs pd_res ≔ r; pd_conv ≔ None
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
g :
args :
listarg
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
gf :
callee :
Hx :
map_optionarg_xge e args = Somexs
Hf :
find_fnge g = SomeDefinedgf
Hc :
call_framegf xs = Somecallee
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j m Callr Globalg args = SomeICallgf xs pd_res ≔ r; pd_conv ≔ None
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ callee; c_callers ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j, pd_res ≔ r; pd_conv ≔ None :: cs; c_mem ≔ m; c_fuel ≔ fuel

reflexivity

deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
g :
args :
listarg
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
gf :
callee :
Hx :
map_optionarg_xge e args = Somexs
Hf :
find_fnge g = SomeDefinedgf
Hc :
call_framegf xs = Somecallee
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j m Callr Globalg args = SomeICallgf xs pd_res ≔ r; pd_conv ≔ None
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ callee; c_callers ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j, pd_res ≔ r; pd_conv ≔ None :: cs; c_mem ≔ m; c_fuel ≔ fuel

rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_call ; reflexivity

ge :
f :
e :
ls :
listname × optionZ
l :
g :
args :
listarg
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
gf :
callee :
Hx :
map_optionarg_xge e args = Somexs
Hf :
find_fnge g = SomeDefinedgf
Hc :
call_framegf xs = Somecallee
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j m Callr Globalg args = SomeICallgf xs pd_res ≔ r; pd_conv ≔ None
⊢
inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j ICallgf xs pd_res ≔ r; pd_conv ≔ None None = Nextc_frame ≔ callee; c_callers ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j, pd_res ≔ r; pd_conv ≔ None :: cs; c_mem ≔ m; c_fuel ≔ fuel

cbn [ inst_next c_frame fr_fn fr_env fr_locals c_callers c_mem c_fuel ]

ge :
f :
e :
ls :
listname × optionZ
l :
g :
args :
listarg
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
gf :
callee :
Hx :
map_optionarg_xge e args = Somexs
Hf :
find_fnge g = SomeDefinedgf
Hc :
call_framegf xs = Somecallee
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j m Callr Globalg args = SomeICallgf xs pd_res ≔ r; pd_conv ≔ None
⊢
match call_framegf xs with
Somecallee0
⇒
Nextc_frame ≔ callee0; c_callers ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j, pd_res ≔ r; pd_conv ≔ None :: cs; c_mem ≔ m; c_fuel ≔ fuel
None
⇒
Stuck"call"
=
Nextc_frame ≔ callee; c_callers ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j, pd_res ≔ r; pd_conv ≔ None :: cs; c_mem ≔ m; c_fuel ≔ fuel

rewrite Hc

ge :
f :
e :
ls :
listname × optionZ
l :
g :
args :
listarg
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
xs :
listword
gf :
callee :
Hx :
map_optionarg_xge e args = Somexs
Hf :
find_fnge g = SomeDefinedgf
Hc :
call_framegf xs = Somecallee
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl Callr Globalg args :: rest j m Callr Globalg args = SomeICallgf xs pd_res ≔ r; pd_conv ≔ None
⊢
Nextc_frame ≔ callee; c_callers ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j, pd_res ≔ r; pd_conv ≔ None :: cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ callee; c_callers ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j, pd_res ≔ r; pd_conv ≔ None :: cs; c_mem ≔ m; c_fuel ≔ fuel

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge f e ls l r g args rest j cs m fuel xs gf callee Hx Hf Hc
assert Hi : inst_stepge mkFramef e ls None Execl Callr Globalg args :: rest j m Callr Globalg args = SomeICallgf xs mkPendingr None
{cbn - [ map_option find_fn ]
rewrite Hx , Hf
reflexivity
rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_call ; reflexivity
rewrite Hc
reflexivity

A call of libc's void freep, a name the module neither defines nor holds as data, whose argument v reads as x, where the genv's free frees x without a trap and leaves the memory m': the frame goes on in m' (external_call).

217Lemma rule_free
∀ ge f e ls l v rest j cs m fuel x m′
find_fnge free_name = None
arg_xge e ArgP v = Somex
ge_freege x m = Someok, m′
stepge mkConfigmkFramef e ls None Execl CallCVoid Globalfree_name ArgP v :: rest j cs m fuel = NextmkConfigmkFramef e ls None Execl rest j cs m′ fuel
Explore proof 11 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l : name v : value rest : listinst j : jump cs : listframe × pending m : mem fuel : Z x : word m′ : mem, find_fnge free_name = None → lookupfree_name ge_globalsge = None → arg_xge e ArgP v = Somex → ge_freege x m = Someok, m′ → stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

intros ge f e ls l v rest j cs m fuel x m′ Hf Hd Hx Hfree

ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

assert Hi : inst_stepge mkFramef e ls None Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
⊢
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′
focused goal
ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

{cbn - [ arg_x find_fn lookup ge_free ]

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
⊢
let* xs ≔
let* y ≔ arg_xge e ArgP v in
Somey
in
match find_fnge free_name with
SomeDefinedg
⇒
SomeICallg xs pd_res ≔ CVoid; pd_conv ≔ None
SomeOutsideg
⇒
None
⇒
=
SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite Hx , Hf

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
⊢
external_callge free_name CVoid ArgP v x e ls m = SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

unfold external_call

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
⊢
None
⇒
else
match ge_freege x m with
Somer′, m'0
⇒
Some
match r′ with
None
⇒
None
=
SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite Hd

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
⊢
else
match ge_freege x m with
Somer′, m'0
⇒
Some
match r′ with
None
⇒
None
=
SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

cbn - [ ge_free ]

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
⊢
match ge_freege x m with
Somer′, m'0
⇒
Some
match r′ with
None
⇒
None
=
SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite Hfree

2 open

ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
⊢
SomeIContinuee ls m′ = SomeIContinuee ls m′
deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

reflexivity

deferred goal
ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_continue ; reflexivity

ge :
f :
e :
ls :
listname × optionZ
l :
rest :
listinst
j :
cs :
listframe × pending
m :
fuel :
Z
x :
m′ :
Hf :
find_fnge free_name = None
Hx :
arg_xge e ArgP v = Somex
Hfree :
ge_freege x m = Someok, m′
Hi :
inst_stepge fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′
⊢
inst_nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl CallCVoid Globalfree_name ArgP v :: rest j; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l rest j IContinuee ls m′ None = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl rest j; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge f e ls l v rest j cs m fuel x m′ Hf Hd Hx Hfree
assert Hi : inst_stepge mkFramef e ls None Execl CallCVoid Globalfree_name ArgP v :: rest j m CallCVoid Globalfree_name ArgP v = SomeIContinuee ls m′
rewrite Hx , Hf
rewrite Hd
cbn - [ ge_free ]
rewrite Hfree
reflexivity
rewrite rule_inst_ _ _ _ _ _ _ _ _ _ _ _ Hi by apply doomed_result_continue ; reflexivity
reflexivity

Blocks and jumps

Entering the block l of f, found as b, from the edge from, with fuel left: its phis bind the environment e', and the frame goes on at its instructions with one fuel less.

238Lemma rule_enter
∀ ge f e ls l from cs m fuel b e′
fuel ≠ 0
phis_envge b_phisb from e = Somee′
stepge mkConfigmkFramef e ls None Enterl from cs m fuel = NextmkConfigmkFramef e′ ls None Execl b_instsb b_jumpb cs m fuel − 1
Explore proof 7 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l : name from : optionname cs : listframe × pending m : mem fuel : Z b : block e′ : env, fuel ≠ 0 → find_blockl fn_blocksf = Someb → phis_envge b_phisb from e = Somee′ → stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e′; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl b_instsb b_jumpb; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel − 1

intros ge f e ls l from cs m fuel b e′ Hf Hb Hp

ge :
f :
e :
ls :
listname × optionZ
l :
from :
optionname
cs :
listframe × pending
m :
fuel :
Z
e′ :
Hf :
fuel ≠ 0
Hb :
Hp :
phis_envge b_phisb from e = Somee′
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e′; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl b_instsb b_jumpb; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel − 1

unfold step ; cbn [ fr_at c_frame c_fuel fr_fn fr_env ]

ge :
f :
e :
ls :
listname × optionZ
l :
from :
optionname
cs :
listframe × pending
m :
fuel :
Z
e′ :
Hf :
fuel ≠ 0
Hb :
Hp :
phis_envge b_phisb from e = Somee′
⊢
fuel =? 0
→
else
or_stuck"block"
let* b0 ≔ find_blockl fn_blocksf in
let* e0 ≔ phis_envge b_phisb0 from e in
SomeNextc_frame ≔ fr_fn ≔ f; fr_env ≔ e0; fr_locals ≔ fr_localsfr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; fr_doomed ≔ fr_doomedfr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; fr_at ≔ Execl b_instsb0 b_jumpb0; c_callers ≔ c_callersc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel; c_mem ≔ c_memc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel; c_fuel ≔ fuel − 1
=
Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e′; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl b_instsb b_jumpb; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel − 1

replace fuel =? 0 with false by symmetry ; apply Z.eqb_neq ; exact Hf

ge :
f :
e :
ls :
listname × optionZ
l :
from :
optionname
cs :
listframe × pending
m :
fuel :
Z
e′ :
Hf :
fuel ≠ 0
Hb :
Hp :
phis_envge b_phisb from e = Somee′
⊢
or_stuck"block"
let* b0 ≔ find_blockl fn_blocksf in
let* e0 ≔ phis_envge b_phisb0 from e in
SomeNextc_frame ≔ fr_fn ≔ f; fr_env ≔ e0; fr_locals ≔ fr_localsfr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; fr_doomed ≔ fr_doomedfr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; fr_at ≔ Execl b_instsb0 b_jumpb0; c_callers ≔ c_callersc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel; c_mem ≔ c_memc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel; c_fuel ≔ fuel − 1
=
Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e′; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl b_instsb b_jumpb; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel − 1

rewrite Hb

ge :
f :
e :
ls :
listname × optionZ
l :
from :
optionname
cs :
listframe × pending
m :
fuel :
Z
e′ :
Hf :
fuel ≠ 0
Hb :
Hp :
phis_envge b_phisb from e = Somee′
⊢
or_stuck"block"
let* e0 ≔ phis_envge b_phisb from e in
SomeNextc_frame ≔ fr_fn ≔ f; fr_env ≔ e0; fr_locals ≔ fr_localsfr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; fr_doomed ≔ fr_doomedfr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; fr_at ≔ Execl b_instsb b_jumpb; c_callers ≔ c_callersc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel; c_mem ≔ c_memc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel; c_fuel ≔ fuel − 1
=
Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e′; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl b_instsb b_jumpb; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel − 1

cbn [ b_phis ]

ge :
f :
e :
ls :
listname × optionZ
l :
from :
optionname
cs :
listframe × pending
m :
fuel :
Z
e′ :
Hf :
fuel ≠ 0
Hb :
Hp :
phis_envge b_phisb from e = Somee′
⊢
or_stuck"block"
let* e0 ≔ phis_envge b_phisb from e in
SomeNextc_frame ≔ fr_fn ≔ f; fr_env ≔ e0; fr_locals ≔ fr_localsfr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; fr_doomed ≔ fr_doomedfr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; fr_at ≔ Execl b_instsb b_jumpb; c_callers ≔ c_callersc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel; c_mem ≔ c_memc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel; c_fuel ≔ fuel − 1
=
Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e′; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl b_instsb b_jumpb; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel − 1

rewrite Hp

ge :
f :
e :
ls :
listname × optionZ
l :
from :
optionname
cs :
listframe × pending
m :
fuel :
Z
e′ :
Hf :
fuel ≠ 0
Hb :
Hp :
phis_envge b_phisb from e = Somee′
⊢
or_stuck"block" SomeNextc_frame ≔ fr_fn ≔ f; fr_env ≔ e′; fr_locals ≔ fr_localsfr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; fr_doomed ≔ fr_doomedfr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; fr_at ≔ Execl b_instsb b_jumpb; c_callers ≔ c_callersc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel; c_mem ≔ c_memc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel; c_fuel ≔ fuel − 1 = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e′; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl b_instsb b_jumpb; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel − 1

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge f e ls l from cs m fuel b e′ Hf Hb Hp
unfold step ; cbn [ fr_at c_frame c_fuel fr_fn fr_env ]
replace fuel =? 0 with false by symmetry ; apply Z.eqb_neq ; exact Hf
rewrite Hb
cbn [ b_phis ]
rewrite Hp
reflexivity

Entering a block with no fuel left ends the run, out of fuel.

251Lemma rule_out_of_fuel
∀ ge f e ls l from cs m
stepge mkConfigmkFramef e ls None Enterl from cs m 0 = DoneOutOfFuel
Explore proof 1 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l : name from : optionname cs : listframe × pending m : mem, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enterl from; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ 0 = DoneOutOfFuel

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

A goto to the target t, polling or not, enters its block from l.

256Lemma rule_goto
∀ ge f e ls l t cs m fuel
stepge mkConfigmkFramef e ls None Execl [ ] JGotot cs m fuel = NextmkConfigmkFramef e ls None Enteredge_labelt Somel cs m fuel
Explore proof 2 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l : name t : target cs : listframe × pending m : mem fuel : Z, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JGotot; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enteredge_labelt Somel; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

intros

ge :
f :
e :
ls :
listname × optionZ
l :
cs :
listframe × pending
m :
fuel :
Z
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JGotot; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enteredge_labelt Somel; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

destruct t ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros
destruct t ; reflexivity

A branch on v, which reads as the integer n, enters t2's block from l if n is 0, else t1's.

263Lemma rule_branch
∀ ge f e ls l v t1 t2 cs m fuel n
value_xge e W v = SomeWIntn
stepge mkConfigmkFramef e ls None Execl [ ] JBranchv t1 t2 cs m fuel
=
mkFramef e ls None
n =? 0
→
t2
else
t1
Somel
cs
m
fuel
Explore proof 5 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l : name v : value t1 t2 : target cs : listframe × pending m : mem fuel n : Z, value_xge e W v = SomeWIntn → stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JBranchv t1 t2; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enteredge_labelif n =? 0 then t2 else t1 Somel; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

intros ge f e ls l v t1 t2 cs m fuel n Hv

ge :
f :
e :
ls :
listname × optionZ
l :
t1, t2 :
cs :
listframe × pending
m :
fuel, n :
Z
Hv :
value_xge e W v = SomeWIntn
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JBranchv t1 t2; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enteredge_labelif n =? 0 then t2 else t1 Somel; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

unfold step ; cbn [ fr_at c_frame fr_doomed jump_step fr_env ]

ge :
f :
e :
ls :
listname × optionZ
l :
t1, t2 :
cs :
listframe × pending
m :
fuel, n :
Z
Hv :
value_xge e W v = SomeWIntn
⊢
or_stuck"branch"
match value_xge e W v with
SomeWIntn0
⇒
Some
edge_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JBranchv t1 t2; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l
n0 =? 0
→
t2
else
t1
_
⇒
None
=
Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enteredge_labelif n =? 0 then t2 else t1 Somel; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

rewrite Hv

ge :
f :
e :
ls :
listname × optionZ
l :
t1, t2 :
cs :
listframe × pending
m :
fuel, n :
Z
Hv :
value_xge e W v = SomeWIntn
⊢
or_stuck"branch"
Some
edge_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JBranchv t1 t2; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l
n =? 0
→
t2
else
t1
=
Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enteredge_labelif n =? 0 then t2 else t1 Somel; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

cbn [ or_stuck ]

ge :
f :
e :
ls :
listname × optionZ
l :
t1, t2 :
cs :
listframe × pending
m :
fuel, n :
Z
Hv :
value_xge e W v = SomeWIntn
⊢
edge_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JBranchv t1 t2; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel l
n =? 0
→
t2
else
t1
=
Nextc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Enteredge_labelif n =? 0 then t2 else t1 Somel; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel

destruct n =? 0 , t1 , t2 ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge f e ls l v t1 t2 cs m fuel n Hv
rewrite Hv
cbn [ or_stuck ]
destruct n =? 0 , t1 , t2 ; reflexivity

A return of v, which reads as x at f's return class k: the invocation ends with Retx (return_step).

274Lemma rule_ret
∀ ge f e ls l v cs m fuel k x
value_xge e k v = Somex
stepge mkConfigmkFramef e ls None Execl [ ] JRetv cs m fuel = return_stepmkConfigmkFramef e ls None Execl [ ] JRetv cs m fuel Retx
Explore proof 4 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l : name v : value cs : listframe × pending m : mem fuel : Z k : class x : word, fn_retf = RClassk → value_xge e k v = Somex → stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetv; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetv; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel Retx

intros ge f e ls l v cs m fuel k x Hk Hv

ge :
f :
e :
ls :
listname × optionZ
l :
cs :
listframe × pending
m :
fuel :
Z
x :
Hk :
Hv :
value_xge e k v = Somex
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetv; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetv; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel Retx

unfold step ; cbn [ fr_at c_frame fr_doomed jump_step fr_env fr_fn ]

ge :
f :
e :
ls :
listname × optionZ
l :
cs :
listframe × pending
m :
fuel :
Z
x :
Hk :
Hv :
value_xge e k v = Somex
⊢
match fn_retf with
⇒
let* x0 ≔ value_xge e k0 v in
Somereturn_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetv; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel Retx0
_
⇒
None
=
return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetv; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel Retx

rewrite Hk , Hv

ge :
f :
e :
ls :
listname × optionZ
l :
cs :
listframe × pending
m :
fuel :
Z
x :
Hk :
Hv :
value_xge e k v = Somex
⊢
or_stuck"ret" Somereturn_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetv; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel Retx = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetv; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel Retx

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge f e ls l v cs m fuel k x Hk Hv
rewrite Hk , Hv
reflexivity

A return from a void function: the invocation ends with RetVoid (return_step).

286Lemma rule_ret_void
∀ ge f e ls l cs m fuel
stepge mkConfigmkFramef e ls None Execl [ ] JRetVoid cs m fuel = return_stepmkConfigmkFramef e ls None Execl [ ] JRetVoid cs m fuel RetVoid
Explore proof 2 tactics

Initial goal

⊢
∀ge : genv f : func e : env ls : listname × optionZ l : name cs : listframe × pending m : mem fuel : Z, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetVoid; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetVoid; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel RetVoid

intros

ge :
f :
e :
ls :
listname × optionZ
l :
cs :
listframe × pending
m :
fuel :
Z
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetVoid; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ ls; fr_doomed ≔ None; fr_at ≔ Execl [ ] JRetVoid; c_callers ≔ cs; c_mem ≔ m; c_fuel ≔ fuel RetVoid

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros
reflexivity

An invocation whose named locals end, leaving the memory m', and that has no caller: the run's outcome is o.

293Lemma rule_return_top
∀ fr m fuel o m′
return_stepmkConfigfr [ ] m fuel o = Doneo
Explore proof 4 tactics

Initial goal

⊢
∀fr : frame m : mem fuel : Z o : outcome m′ : mem, invalidate_localsfr_localsfr m = Somem′ → return_stepc_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel o = Doneo

intros fr m fuel o m′ H

fr :
m :
fuel :
Z
m′ :
H :
⊢
return_stepc_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel o = Doneo

unfold return_step ; cbn [ c_frame c_mem c_callers ]

fr :
m :
fuel :
Z
m′ :
H :
⊢
or_stuck"return"
let* _ ≔ invalidate_localsfr_localsfr m in
SomeDoneo
=

rewrite H

fr :
m :
fuel :
Z
m′ :
H :
⊢
or_stuck"return" SomeDoneo = Doneo

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros fr m fuel o m′ H
rewrite H
reflexivity

An invocation whose named locals end, leaving the memory m', and whose caller cf reads the result as pd says, binding its environment e': the caller goes on, in m'.

301Lemma rule_return
∀ fr cf pd cs m fuel o m′ e′
pd_convpd = None
returned_envpd_respd o fr_envcf = Somee′
return_stepmkConfigfr cf, pd :: cs m fuel o = NextmkConfigmkFramefr_fncf e′ fr_localscf fr_doomedcf fr_atcf cs m′ fuel
Explore proof 4 tactics

Initial goal

⊢
∀fr cf : frame pd : pending cs : listframe × pending m : mem fuel : Z o : outcome m′ : mem e′ : env, invalidate_localsfr_localsfr m = Somem′ → pd_convpd = None → returned_envpd_respd o fr_envcf = Somee′ → return_stepc_frame ≔ fr; c_callers ≔ cf, pd :: cs; c_mem ≔ m; c_fuel ≔ fuel o = Nextc_frame ≔ fr_fn ≔ fr_fncf; fr_env ≔ e′; fr_locals ≔ fr_localscf; fr_doomed ≔ fr_doomedcf; fr_at ≔ fr_atcf; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

intros fr cf pd cs m fuel o m′ e′ H Hc He

fr, cf :
cs :
listframe × pending
m :
fuel :
Z
m′ :
e′ :
H :
Hc :
pd_convpd = None
He :
returned_envpd_respd o fr_envcf = Somee′
⊢
return_stepc_frame ≔ fr; c_callers ≔ cf, pd :: cs; c_mem ≔ m; c_fuel ≔ fuel o = Nextc_frame ≔ fr_fn ≔ fr_fncf; fr_env ≔ e′; fr_locals ≔ fr_localscf; fr_doomed ≔ fr_doomedcf; fr_at ≔ fr_atcf; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

unfold return_step ; cbn [ c_frame c_mem c_callers c_fuel ]

fr, cf :
cs :
listframe × pending
m :
fuel :
Z
m′ :
e′ :
H :
Hc :
pd_convpd = None
He :
returned_envpd_respd o fr_envcf = Somee′
⊢
or_stuck"return"
let* m0 ≔ invalidate_localsfr_localsfr m in
let* o′ ≔
match pd_convpd with
Somecw, kw
⇒
None
⇒
Someo
in
let* e ≔ returned_envpd_respd o′ fr_envcf in
SomeNextc_frame ≔ fr_fn ≔ fr_fncf; fr_env ≔ e; fr_locals ≔ fr_localscf; fr_doomed ≔ fr_doomedcf; fr_at ≔ fr_atcf; c_callers ≔ cs; c_mem ≔ m0; c_fuel ≔ fuel
=
Nextc_frame ≔ fr_fn ≔ fr_fncf; fr_env ≔ e′; fr_locals ≔ fr_localscf; fr_doomed ≔ fr_doomedcf; fr_at ≔ fr_atcf; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

rewrite H , Hc , He

fr, cf :
cs :
listframe × pending
m :
fuel :
Z
m′ :
e′ :
H :
Hc :
pd_convpd = None
He :
returned_envpd_respd o fr_envcf = Somee′
⊢
or_stuck"return" SomeNextc_frame ≔ fr_fn ≔ fr_fncf; fr_env ≔ e′; fr_locals ≔ fr_localscf; fr_doomed ≔ fr_doomedcf; fr_at ≔ fr_atcf; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel = Nextc_frame ≔ fr_fn ≔ fr_fncf; fr_env ≔ e′; fr_locals ≔ fr_localscf; fr_doomed ≔ fr_doomedcf; fr_at ≔ fr_atcf; c_callers ≔ cs; c_mem ≔ m′; c_fuel ≔ fuel

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros fr cf pd cs m fuel o m′ e′ H Hc He
rewrite H , Hc , He
reflexivity

An invocation with no named locals ends without changing memory.

313Lemma invalidate_none
∀ m
invalidate_locals[ ] m = Somem
Explore proof 1 tactics

Initial goal

⊢
∀m : mem, invalidate_locals[ ] m = Somem

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

Access checks

An access of size bytes at the address a through the capability of the object b, live or not, with the region reg: it passes where the bytes lie in its bounds and a is aligned.

321Lemma access_obj
∀ m b reg a size r al
b ≤ a
a + size ≤ r_endreg
a mod al = 0
access_resm a Objb size r al = Someok
Explore proof 7 tactics

Initial goal

⊢
∀m : mem b : Z reg : region a size : Z r : rights al : Z, object_regionb m_regionsm = Somereg → b ≤ a → a + size ≤ r_endreg → a mod al = 0 → access_resm a Objb size r al = Someok

intros m b reg a size r al Hr H1 H2 H3

m :
b :
Z
reg :
a, size :
Z
al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
access_resm a Objb size r al = Someok

unfold access_res , cap_access_res

m :
b :
Z
reg :
a, size :
Z
al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
let* reg0 ≔ object_regionb m_regionsm in
Some
b ≤? a && a + size ≤? r_endreg0
→
=
Someok

rewrite Hr

m :
b :
Z
reg :
a, size :
Z
al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Some
b ≤? a && a + size ≤? r_endreg
→
=
Someok

replace b ≤? a && a + size ≤? r_endreg with true by symmetry ; apply andb_true_iff ; split ; apply Z.leb_le | apply Z.leb_le ; lia

m :
b :
Z
reg :
a, size :
Z
al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Somealigned_resa al = Someok

unfold aligned_res

m :
b :
Z
reg :
a, size :
Z
al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Some
a mod al =? 0
→
=
Someok

rewrite H3

m :
b :
Z
reg :
a, size :
Z
al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Some
0 =? 0
→
=
Someok

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b reg a size r al Hr H1 H2 H3
rewrite Hr
replace b ≤? a && a + size ≤? r_endreg with true by symmetry ; apply andb_true_iff ; split ; apply Z.leb_le | apply Z.leb_le ; lia
rewrite H3
reflexivity

A read through a read-write or read-only capability for the object b with the region reg, of size bytes at a within its bounds and aligned, passes.

335Lemma access_read
∀ m b reg c a size al
c = Objb ∨ c = Rob
b ≤ a
a + size ≤ r_endreg
a mod al = 0
access_resm a c size Read al = Someok
Explore proof 8 tactics

Initial goal

⊢
∀m : mem b : Z reg : region c : cap a size al : Z, c = Objb ∨ c = Rob → object_regionb m_regionsm = Somereg → b ≤ a → a + size ≤ r_endreg → a mod al = 0 → access_resm a c size Read al = Someok

intros m b reg c a size al [ ->| -> ] Hr H1 H2 H3 ; exact access_obj_ _ _ _ _ _ _ Hr H1 H2 H3 |

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
access_resm a Rob size Read al = Someok

unfold access_res , cap_access_res

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
let* reg0 ≔ object_regionb m_regionsm in
Some
b ≤? a && a + size ≤? r_endreg0
→
=
Someok

rewrite Hr

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Some
b ≤? a && a + size ≤? r_endreg
→
=
Someok

replace b ≤? a && a + size ≤? r_endreg with true by symmetry ; apply andb_true_iff ; split ; apply Z.leb_le | apply Z.leb_le ; lia

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Somereadonly_access_resRead a al = Someok

cbn [ readonly_access_res ]

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Somealigned_resa al = Someok

unfold aligned_res

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Some
a mod al =? 0
→
=
Someok

rewrite H3

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Some
0 =? 0
→
=
Someok

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b reg c a size al [ ->| -> ] Hr H1 H2 H3 ; exact access_obj_ _ _ _ _ _ _ Hr H1 H2 H3 |
rewrite Hr
replace b ≤? a && a + size ≤? r_endreg with true by symmetry ; apply andb_true_iff ; split ; apply Z.leb_le | apply Z.leb_le ; lia
rewrite H3
reflexivity

A check of the pointer p whose access passes: p, proven.

349Lemma op_check
∀ m p lo hi r al
access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok
op_resChecklo hi r al A WPtrp m = SomeOpResRValWPtrp m
Explore proof 4 tactics

Initial goal

⊢
∀m : mem p : ptr lo hi : Z r : rights al : Z, access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok → op_resChecklo hi r al A WPtrp m = SomeOpResRValWPtrp m

intros m p lo hi r al H

m :
p :
lo, hi :
Z
al :
Z
H :
access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok
⊢
op_resChecklo hi r al A WPtrp m = SomeOpResRValWPtrp m

cbn - [ access_res raw_address ]

m :
p :
lo, hi :
Z
al :
Z
H :
access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok
⊢
let* chk ≔ access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al in
=

rewrite H

m :
p :
lo, hi :
Z
al :
Z
H :
access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m p lo hi r al H
rewrite H
reflexivity

A half_check of the pointer p, against the proof p1 of the same capability, at a live object b whose bounds hold the bytes, which are aligned, and which ends at or below 2^63: p, proven. Both the full check and the half check's native test pass.

358Lemma op_half_check
∀ m p1 p bd lo hi r al b reg
ptr_capp1 = Objb
r_lifereg = Live
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
lo < hi
r_endreg ≤ 2 ^ 63
raw_addressptr_addrp lo mod al = 0
op_resHalfCheckbd lo hi r al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m
Explore proof 22 tactics

Initial goal

⊢
∀m : mem p1 p : ptr bd : bound lo hi : Z r : rights al b : Z reg : region, ptr_capp1 = Objb → ptr_capp = Objb → object_regionb m_regionsm = Somereg → r_lifereg = Live → b ≤ raw_addressptr_addrp lo → raw_addressptr_addrp lo + hi − lo ≤ r_endreg → lo < hi → r_endreg ≤ 2 ^ 63 → raw_addressptr_addrp lo mod al = 0 → op_resHalfCheckbd lo hi r al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m

intros m p1 p bd lo hi r al b reg H1 H2 Hr Hl Hlo Hhi Hlh Hend Hal

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
⊢
op_resHalfCheckbd lo hi r al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m

assert Hacc : access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok by eapply access_obj ; eauto

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
op_resHalfCheckbd lo hi r al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m

cbn - [ access_res raw_address half_passes ]

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
→
let* chk ≔ access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al in
match half_passesbd m raw_addressptr_addrp lo hi − lo ptr_capp r al with
SomeSomeok′
⇒
SomeOpReshalf_reschk ok′ WPtrp m
SomeNone
⇒
None
⇒
None
=

rewrite H1 , H2

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
→
let* chk ≔ access_resm raw_addressptr_addrp lo Objb hi − lo r al in
match half_passesbd m raw_addressptr_addrp lo hi − lo Objb r al with
SomeSomeok′
⇒
SomeOpReshalf_reschk ok′ WPtrp m
SomeNone
⇒
None
⇒
None
=

cbn [ cap_eqb ]

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
b =? b
→
let* chk ≔ access_resm raw_addressptr_addrp lo Objb hi − lo r al in
match half_passesbd m raw_addressptr_addrp lo hi − lo Objb r al with
SomeSomeok′
⇒
SomeOpReshalf_reschk ok′ WPtrp m
SomeNone
⇒
None
⇒
None
=

rewrite Z.eqb_refl , Hacc

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
match half_passesbd m raw_addressptr_addrp lo hi − lo Objb r al with
SomeSomeok′
⇒
SomeOpReshalf_resok ok′ WPtrp m
SomeNone
⇒
None
⇒
None
=

unfold half_passes

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
match let* reg0 ≔ object_regionb m_regionsm in SomeSomehalf_boundbd raw_addressptr_addrp lo hi − lo b r_endreg0 r_lifereg0 && negbrights_eqbr Write && false && raw_addressptr_addrp lo mod al =? 0 with
SomeSomeok′
⇒
SomeOpReshalf_resok ok′ WPtrp m
SomeNone
⇒
None
⇒
None
=

rewrite Hr

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
SomeOpReshalf_resok half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg && negbrights_eqbr Write && false && raw_addressptr_addrp lo mod al =? 0 WPtrp m = SomeOpResRValWPtrp m

cbn [ option_map ]

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
SomeOpReshalf_resok half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg && negbrights_eqbr Write && false && raw_addressptr_addrp lo mod al =? 0 WPtrp m = SomeOpResRValWPtrp m

replace half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg with true

2 open

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
SomeOpReshalf_resok true && negbrights_eqbr Write && false && raw_addressptr_addrp lo mod al =? 0 WPtrp m = SomeOpResRValWPtrp m
focused goal
m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
true = half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg

–rewrite Hal , Z.eqb_refl

2 open

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
SomeOpReshalf_resok true && negbrights_eqbr Write && false && true WPtrp m = SomeOpResRValWPtrp m
deferred goal
m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
true = half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg

destruct r ; reflexivity

deferred goal
m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
true = half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg

–symmetry

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg = true

unfold half_bound

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
match bd with
⇒
raw_addressptr_addrp lo + hi − lo ≤? r_endreg
⇒
match r_lifereg with
⇒
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
⇒
false
=
true

rewrite Hl

m :
p1, p :
bd :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
match bd with
⇒
raw_addressptr_addrp lo + hi − lo ≤? r_endreg
⇒
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

destruct bd ; apply Z.leb_le ; lia |

m :
p1, p :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

assert Hn : 0 ≤ raw_addressptr_addrp lo < 2 ^ 63

2 open

m :
p1, p :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
⊢
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
focused goal
m :
p1, p :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
Hn :
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
⊢
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

{pose proof Z.mod_pos_boundptr_addrp + lo 2 ^ 64 ltac:lia as Hm

2 open

m :
p1, p :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
Hm :
0 ≤ ptr_addrp + lo mod 2 ^ 64 < 2 ^ 64
⊢
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
deferred goal
m :
p1, p :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
Hn :
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
⊢
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

fold raw_addressptr_addrp lo in Hm

2 open

m :
p1, p :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
Hm :
0 ≤ raw_addressptr_addrp lo < 2 ^ 64
⊢
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
deferred goal
m :
p1, p :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
Hn :
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
⊢
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

lia

deferred goal
m :
p1, p :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
Hn :
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
⊢
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

replace 2 ^ 63 ≤? raw_addressptr_addrp lo with false by symmetry ; apply Z.leb_gt ; lia

m :
p1, p :
lo, hi :
Z
al, b :
Z
reg :
H1 :
ptr_capp1 = Objb
H2 :
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok
Hn :
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
⊢
b ≤? raw_addressptr_addrp lo = true

apply Z.leb_le ; lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m p1 p bd lo hi r al b reg H1 H2 Hr Hl Hlo Hhi Hlh Hend Hal
assert Hacc : access_resm raw_addressptr_addrp lo Objb hi − lo r al = Someok by eapply access_obj ; eauto
rewrite H1 , H2
cbn [ cap_eqb ]
rewrite Z.eqb_refl , Hacc
rewrite Hr
cbn [ option_map ]
replace half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg with true
–rewrite Hal , Z.eqb_refl
destruct r ; reflexivity
–symmetry
unfold half_bound
rewrite Hl
destruct bd ; apply Z.leb_le ; lia |
assert Hn : 0 ≤ raw_addressptr_addrp lo < 2 ^ 63
{pose proof Z.mod_pos_boundptr_addrp + lo 2 ^ 64 ltac:lia as Hm
fold raw_addressptr_addrp lo in Hm
lia
replace 2 ^ 63 ≤? raw_addressptr_addrp lo with false by symmetry ; apply Z.leb_gt ; lia
apply Z.leb_le ; lia

A read half_check of the pointer p, against the proof p1 of the same capability, an object's or a read-only object's, at a live object b whose bounds hold the bytes, which are aligned, and which ends at or below 2^63: p, proven. A read-only capability passes a read's native test as an object's does.

386Lemma op_half_check_read
∀ m p1 p bd lo hi al b reg
ptr_capp = Objb ∨ ptr_capp = Rob
r_lifereg = Live
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
lo < hi
r_endreg ≤ 2 ^ 63
raw_addressptr_addrp lo mod al = 0
op_resHalfCheckbd lo hi Read al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m
Explore proof 23 tactics

Initial goal

⊢
∀m : mem p1 p : ptr bd : bound lo hi al b : Z reg : region, ptr_capp1 = ptr_capp → ptr_capp = Objb ∨ ptr_capp = Rob → object_regionb m_regionsm = Somereg → r_lifereg = Live → b ≤ raw_addressptr_addrp lo → raw_addressptr_addrp lo + hi − lo ≤ r_endreg → lo < hi → r_endreg ≤ 2 ^ 63 → raw_addressptr_addrp lo mod al = 0 → op_resHalfCheckbd lo hi Read al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m

intros m p1 p bd lo hi al b reg E Hc Hr Hl Hlo Hhi Hlh Hend Hal

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Objb ∨ ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
⊢
op_resHalfCheckbd lo hi Read al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m

destruct Hc as Hc | Hc ; rewrite Hc in E ; exact op_half_check_ _ _ _ _ _ Read _ _ _ E Hc Hr Hl Hlo Hhi Hlh Hend Hal |

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
⊢
op_resHalfCheckbd lo hi Read al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m

assert Hacc : access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok by eapply access_read ; eauto

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
op_resHalfCheckbd lo hi Read al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m

cbn - [ access_res raw_address half_passes ]

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
→
let* chk ≔ access_resm raw_addressptr_addrp lo ptr_capp hi − lo Read al in
match half_passesbd m raw_addressptr_addrp lo hi − lo ptr_capp Read al with
SomeSomeok′
⇒
SomeOpReshalf_reschk ok′ WPtrp m
SomeNone
⇒
None
⇒
None
=

rewrite E , Hc

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
→
let* chk ≔ access_resm raw_addressptr_addrp lo Rob hi − lo Read al in
match half_passesbd m raw_addressptr_addrp lo hi − lo Rob Read al with
SomeSomeok′
⇒
SomeOpReshalf_reschk ok′ WPtrp m
SomeNone
⇒
None
⇒
None
=

cbn [ cap_eqb ]

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
b =? b
→
let* chk ≔ access_resm raw_addressptr_addrp lo Rob hi − lo Read al in
match half_passesbd m raw_addressptr_addrp lo hi − lo Rob Read al with
SomeSomeok′
⇒
SomeOpReshalf_reschk ok′ WPtrp m
SomeNone
⇒
None
⇒
None
=

rewrite Z.eqb_refl , Hacc

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
match half_passesbd m raw_addressptr_addrp lo hi − lo Rob Read al with
SomeSomeok′
⇒
SomeOpReshalf_resok ok′ WPtrp m
SomeNone
⇒
None
⇒
None
=

unfold half_passes

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
match let* reg0 ≔ object_regionb m_regionsm in SomeSomehalf_boundbd raw_addressptr_addrp lo hi − lo b r_endreg0 r_lifereg0 && negbrights_eqbRead Write && true && raw_addressptr_addrp lo mod al =? 0 with
SomeSomeok′
⇒
SomeOpReshalf_resok ok′ WPtrp m
SomeNone
⇒
None
⇒
None
=

rewrite Hr

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
SomeOpReshalf_resok half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg && negbrights_eqbRead Write && true && raw_addressptr_addrp lo mod al =? 0 WPtrp m = SomeOpResRValWPtrp m

cbn [ option_map ]

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
SomeOpReshalf_resok half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg && negbrights_eqbRead Write && true && raw_addressptr_addrp lo mod al =? 0 WPtrp m = SomeOpResRValWPtrp m

replace half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg with true

2 open

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
SomeOpReshalf_resok true && negbrights_eqbRead Write && true && raw_addressptr_addrp lo mod al =? 0 WPtrp m = SomeOpResRValWPtrp m
focused goal
m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
true = half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg

–rewrite Hal , Z.eqb_refl

2 open

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
SomeOpReshalf_resok true && negbrights_eqbRead Write && true && true WPtrp m = SomeOpResRValWPtrp m
deferred goal
m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
true = half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg

reflexivity

deferred goal
m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
true = half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg

–symmetry

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg = true

unfold half_bound

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
match bd with
⇒
raw_addressptr_addrp lo + hi − lo ≤? r_endreg
⇒
match r_lifereg with
⇒
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
⇒
false
=
true

rewrite Hl

m :
p1, p :
bd :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
match bd with
⇒
raw_addressptr_addrp lo + hi − lo ≤? r_endreg
⇒
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

destruct bd ; apply Z.leb_le ; lia |

m :
p1, p :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

assert Hn : 0 ≤ raw_addressptr_addrp lo < 2 ^ 63

2 open

m :
p1, p :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
⊢
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
focused goal
m :
p1, p :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
Hn :
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
⊢
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

{pose proof Z.mod_pos_boundptr_addrp + lo 2 ^ 64 ltac:lia as Hm

2 open

m :
p1, p :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
Hm :
0 ≤ ptr_addrp + lo mod 2 ^ 64 < 2 ^ 64
⊢
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
deferred goal
m :
p1, p :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
Hn :
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
⊢
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

fold raw_addressptr_addrp lo in Hm

2 open

m :
p1, p :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
Hm :
0 ≤ raw_addressptr_addrp lo < 2 ^ 64
⊢
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
deferred goal
m :
p1, p :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
Hn :
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
⊢
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

lia

deferred goal
m :
p1, p :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
Hn :
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
⊢
b
≤?
2 ^ 63 ≤? raw_addressptr_addrp lo
→
raw_addressptr_addrp lo − 2 ^ 64
=
true

replace 2 ^ 63 ≤? raw_addressptr_addrp lo with false by symmetry ; apply Z.leb_gt ; lia

m :
p1, p :
lo, hi, al, b :
Z
reg :
E :
Hc :
ptr_capp = Rob
Hr :
Hl :
r_lifereg = Live
Hlo :
Hhi :
raw_addressptr_addrp lo + hi − lo ≤ r_endreg
Hlh :
lo < hi
Hend :
r_endreg ≤ 2 ^ 63
Hal :
raw_addressptr_addrp lo mod al = 0
Hacc :
access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok
Hn :
0 ≤ raw_addressptr_addrp lo < 2 ^ 63
⊢
b ≤? raw_addressptr_addrp lo = true

apply Z.leb_le ; lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m p1 p bd lo hi al b reg E Hc Hr Hl Hlo Hhi Hlh Hend Hal
destruct Hc as Hc | Hc ; rewrite Hc in E ; exact op_half_check_ _ _ _ _ _ Read _ _ _ E Hc Hr Hl Hlo Hhi Hlh Hend Hal |
assert Hacc : access_resm raw_addressptr_addrp lo Rob hi − lo Read al = Someok by eapply access_read ; eauto
rewrite E , Hc
cbn [ cap_eqb ]
rewrite Z.eqb_refl , Hacc
rewrite Hr
cbn [ option_map ]
replace half_boundbd raw_addressptr_addrp lo hi − lo b r_endreg r_lifereg with true
–rewrite Hal , Z.eqb_refl
reflexivity
–symmetry
unfold half_bound
rewrite Hl
destruct bd ; apply Z.leb_le ; lia |
assert Hn : 0 ≤ raw_addressptr_addrp lo < 2 ^ 63
{pose proof Z.mod_pos_boundptr_addrp + lo 2 ^ 64 ltac:lia as Hm
fold raw_addressptr_addrp lo in Hm
lia
replace 2 ^ 63 ≤? raw_addressptr_addrp lo with false by symmetry ; apply Z.leb_gt ; lia
apply Z.leb_le ; lia

A renew of the pointer p, against the proof p1 of the same capability, whose own access check passes: p, proven, as the check it replaced would have proven it.

413Lemma op_renew
∀ m p1 p lo hi r al
access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok
op_resRenewlo hi r al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m
Explore proof 6 tactics

Initial goal

⊢
∀m : mem p1 p : ptr lo hi : Z r : rights al : Z, ptr_capp1 = ptr_capp → access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok → op_resRenewlo hi r al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m

intros m p1 p lo hi r al E H

m :
p1, p :
lo, hi :
Z
al :
Z
E :
H :
access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok
⊢
op_resRenewlo hi r al A WPtrp1; WPtrp m = SomeOpResRValWPtrp m

cbn - [ access_res raw_address cap_eqb ]

m :
p1, p :
lo, hi :
Z
al :
Z
E :
H :
access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok
⊢
→
let* chk ≔ access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al in
let* r′ ≔ renew_reschk p m in
SomeOpResr′ m
=

rewrite E

m :
p1, p :
lo, hi :
Z
al :
Z
E :
H :
access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok
⊢
→
let* chk ≔ access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al in
let* r′ ≔ renew_reschk p m in
SomeOpResr′ m
=

replace cap_eqbptr_capp ptr_capp with true by symmetry ; destruct ptr_capp ; cbn ; try apply Z.eqb_refl ; try apply term_eqb_refl ; reflexivity

m :
p1, p :
lo, hi :
Z
al :
Z
E :
H :
access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok
⊢
let* chk ≔ access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al in
let* r′ ≔ renew_reschk p m in
SomeOpResr′ m
=

rewrite H

m :
p1, p :
lo, hi :
Z
al :
Z
E :
H :
access_resm raw_addressptr_addrp lo ptr_capp hi − lo r al = Someok
⊢
let* r′ ≔ renew_resok p m in
SomeOpResr′ m
=

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m p1 p lo hi r al E H
rewrite E
replace cap_eqbptr_capp ptr_capp with true by symmetry ; destruct ptr_capp ; cbn ; try apply Z.eqb_refl ; try apply term_eqb_refl ; reflexivity
rewrite H
reflexivity

A raw load of 8 bytes at offset off from the proven pointer p, whose read access passes: the little-endian integer there.

426Lemma op_raw_load
Explore proof 8 tactics

Initial goal

⊢
∀m : mem k : class p : ptr off : Z, access_resm raw_addressptr_addrp off ptr_capp 8 Read 1 = Someok → op_resRawLoadLdL off k WPtrp m = SomeOpResRValWIntload_bytesm raw_addressptr_addrp off 8 m

intros m k p off H

assert E : op_resRawLoadLdL off k WPtrp m = op_res_intRawLoadLdL off k WPtrp m by destruct k ; reflexivity

rewrite E

cbn - [ access_res raw_address load_bytes ]

unfold int_load_res

m :
p :
off :
Z
⊢
let* r ≔
SomeRTrapwhy
⇒
SomeRTrapwhy
SomeRUncheckedwhy
⇒
SomeRUncheckedwhy
None
⇒
None
in
=

cbn - [ access_res raw_address load_bytes ]

m :
p :
off :
Z
⊢
let* r ≔
SomeRTrapwhy
⇒
SomeRTrapwhy
SomeRUncheckedwhy
⇒
SomeRUncheckedwhy
None
⇒
None
in
=

rewrite H

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m k p off H
assert E : op_resRawLoadLdL off k WPtrp m = op_res_intRawLoadLdL off k WPtrp m by destruct k ; reflexivity
rewrite E
rewrite H
reflexivity

A raw load of the one-byte narrow type n at offset off from the proven pointer p, whose read access passes: the byte there, extended to the class k.

440Lemma op_raw_load_byte
∀ m k n p off
op_resRawLoadLdNarrown off k WPtrp m = option_mapλy ⇒ OpResRValy m extendedn k m_bytesm raw_addressptr_addrp off
Explore proof 12 tactics

Initial goal

⊢
∀m : mem k : class n : narrow p : ptr off : Z, fstnarrow_typen = 1 → access_resm raw_addressptr_addrp off ptr_capp 1 Read 1 = Someok → op_resRawLoadLdNarrown off k WPtrp m = option_mapλy : word ⇒ OpResRValy m extendedn k m_bytesm raw_addressptr_addrp off

intros m k n p off Hn H

m :
p :
off :
Z
Hn :
fstnarrow_typen = 1
⊢
op_resRawLoadLdNarrown off k WPtrp m = option_mapλy : word ⇒ OpResRValy m extendedn k m_bytesm raw_addressptr_addrp off

assert E : op_resRawLoadLdNarrown off k WPtrp m = op_res_intRawLoadLdNarrown off k WPtrp m by destruct k ; reflexivity

m :
p :
off :
Z
Hn :
fstnarrow_typen = 1
⊢
op_resRawLoadLdNarrown off k WPtrp m = option_mapλy : word ⇒ OpResRValy m extendedn k m_bytesm raw_addressptr_addrp off

assert Hl : load_bytesm raw_addressptr_addrp off 1 = m_bytesm raw_addressptr_addrp off

2 open

focused goal

{unfold load_bytes

2 open

m :
p :
off :
Z
Hn :
fstnarrow_typen = 1
⊢
fix go n0 : nat acc : Z {struct n0} : Z ≔
match n0 with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm raw_addressptr_addrp off + Z.of_natn′
Z.to_nat1 0
=
deferred goal

change Z.to_nat1 with 1%nat

2 open

m :
p :
off :
Z
Hn :
fstnarrow_typen = 1
⊢
fix go n0 : nat acc : Z {struct n0} : Z ≔
match n0 with
0%nat
⇒
acc
Sn′
⇒
gon′ acc × 256 + m_bytesm raw_addressptr_addrp off + Z.of_natn′
1%nat 0
=
deferred goal

cbn - [ raw_address ]

2 open

deferred goal

now rewrite Z.add_0_r

deferred goal

rewrite E

cbn - [ access_res raw_address load_bytes narrow_type extended ]

unfold int_load_res

⊢
let* r ≔
SomeRVal_
⇒
let* x0 ≔ extendedn k load_bytesm raw_addressptr_addrp off fstnarrow_typen in
SomeRValx0
SomeRTrapwhy
⇒
SomeRTrapwhy
SomeRUncheckedwhy
⇒
SomeRUncheckedwhy
None
⇒
None
in
=
option_mapλy : word ⇒ OpResRValy m extendedn k m_bytesm raw_addressptr_addrp off

rewrite Hn , H , Hl

⊢
let* r ≔
let* x ≔ extendedn k m_bytesm raw_addressptr_addrp off in
SomeRValx
in
=
option_mapλy : word ⇒ OpResRValy m extendedn k m_bytesm raw_addressptr_addrp off

destruct extendedn k _ ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m k n p off Hn H
assert E : op_resRawLoadLdNarrown off k WPtrp m = op_res_intRawLoadLdNarrown off k WPtrp m by destruct k ; reflexivity
{unfold load_bytes
change Z.to_nat1 with 1%nat
cbn - [ raw_address ]
now rewrite Z.add_0_r
rewrite E
rewrite Hn , H , Hl
destruct extendedn k _ ; reflexivity

A raw pointer load at offset off from the proven pointer p, whose 8-byte read access passes and whose protocol es loads x: x.

457Lemma op_raw_load_pointer
Explore proof 6 tactics

Initial goal

⊢
∀m : mem p : ptr off : Z es : listeffect x : ptr, access_resm raw_addressptr_addrp off ptr_capp 8 Read 8 = Someok → pointer_load_effectsm raw_addressptr_addrp off es = Somex → op_resRawLoadPointeroff es P WPtrp m = SomeOpResRValWPtrx m

intros m p off es x H He

m :
p :
off :
Z
es :
listeffect
x :

cbn - [ access_res raw_address pointer_load_effects ]

m :
p :
off :
Z
es :
listeffect
x :
⊢
SomeRVal_
⇒
SomeRTrapwhy | SomeRUncheckedwhy
⇒
None
⇒
None
=

rewrite H

m :
p :
off :
Z
es :
listeffect
x :
⊢

cbn - [ raw_address pointer_load_effects ]

m :
p :
off :
Z
es :
listeffect
x :
⊢

rewrite He

m :
p :
off :
Z
es :
listeffect
x :
⊢
SomeOpResRValWPtrx m = SomeOpResRValWPtrx m

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m p off es x H He
rewrite H
rewrite He
reflexivity

The load protocol nanofil emits for a plain pointer load reads the aux capability, takes it as the lower, then reads the address: the pointer of the 8 bytes at a and the capability stored there.

470Lemma pointer_load_plain
Explore proof 1 tactics

Initial goal

⊢

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

The store protocol nanofil emits for a plain pointer store writes the capability to the aux, then the address to the bytes.

Explore proof 1 tactics

Initial goal

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

A read of size bytes at the address a through the read-only capability of the object b, with the region reg: it passes where the bytes lie in its bounds and a is aligned, as access_obj for a read.

486Lemma access_ro_read
∀ m b reg a size al
b ≤ a
a + size ≤ r_endreg
a mod al = 0
access_resm a Rob size Read al = Someok
Explore proof 7 tactics

Initial goal

⊢
∀m : mem b : Z reg : region a size al : Z, object_regionb m_regionsm = Somereg → b ≤ a → a + size ≤ r_endreg → a mod al = 0 → access_resm a Rob size Read al = Someok

intros m b reg a size al Hr H1 H2 H3

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
access_resm a Rob size Read al = Someok

unfold access_res , cap_access_res

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
let* reg0 ≔ object_regionb m_regionsm in
Some
b ≤? a && a + size ≤? r_endreg0
→
=
Someok

rewrite Hr

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Some
b ≤? a && a + size ≤? r_endreg
→
=
Someok

replace b ≤? a && a + size ≤? r_endreg with true by symmetry ; apply andb_true_iff ; split ; apply Z.leb_le | apply Z.leb_le ; lia

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Somereadonly_access_resRead a al = Someok

unfold readonly_access_res , aligned_res

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Some
a mod al =? 0
→
=
Someok

rewrite H3

m :
b :
Z
reg :
a, size, al :
Z
Hr :
H1 :
b ≤ a
H2 :
a + size ≤ r_endreg
H3 :
a mod al = 0
⊢
Some
0 =? 0
→
=
Someok

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b reg a size al Hr H1 H2 H3
rewrite Hr
replace b ≤? a && a + size ≤? r_endreg with true by symmetry ; apply andb_true_iff ; split ; apply Z.leb_le | apply Z.leb_le ; lia
rewrite H3
reflexivity

A store of the integer v as a long at the address a through the capability c, whose 8-byte write access passes: its bytes.

499Lemma store_res_long
∀ m a c v
access_resm a c 8 Write 1 = Someok
store_resWl m a c WIntv = Someok, store_bytesm a 8 v
Explore proof 4 tactics

Initial goal

⊢
∀m : mem a : Z c : cap v : Z, access_resm a c 8 Write 1 = Someok → store_resWl m a c WIntv = Someok, store_bytesm a 8 v

intros m a c v H

m :
a :
Z
c :
v :
Z
H :
access_resm a c 8 Write 1 = Someok
⊢
store_resWl m a c WIntv = Someok, store_bytesm a 8 v

cbn - [ access_res store_bytes ]

m :
a :
Z
c :
v :
Z
H :
access_resm a c 8 Write 1 = Someok
⊢
let* chk ≔ access_resm a c 8 Write 1 in
Some
chk
match chk with
⇒
_
⇒
m
=
Someok, store_bytesm a 8 v

rewrite H

m :
a :
Z
c :
v :
Z
H :
access_resm a c 8 Write 1 = Someok
⊢
Someok, store_bytesm a 8 v = Someok, store_bytesm a 8 v

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m a c v H
rewrite H
reflexivity