rocq/theories/Evidence.v
Campaign 3's evidence invariant, at one instruction (docs/formal.md, Campaign 3, Proof persistence; docs/rocq.md, The evidence invariant, instruction by instruction).
ir.pl's evidence pass (checked_inst_rest/7, Validate.v's checked_inst_rest) keeps a list of live facts as it walks a block: a fact live(Q, P, Lo, Hi, Rights, Align) is added where a check let(Q, a, check(Lo, Hi, Rights, Align), [P]) passes, and a raw access through Q is accepted where a live fact of Q covers it (covered_access/6). This file says what a fact means at run time (fact_holds) and proves that the pass's bookkeeping keeps it true across one instruction or one edge. A check reads only the regions of memory, so a step that changes no region keeps it passing; and the facts the pass drops at a definition (evidence_kill/3) are exactly those whose Q or P it redefines.
Persistence.v carries this along the runs of Machine R. A check_ahead whose wider check failed dooms its frame (doomed), and its fact then does not hold; that, and the reuse forms' own rules (that a renew finds its bounds, and hull_covered/7), are Campaign 3's corollaries.
Names
Looking up the name k right after putting the value v for it gives v.
Explore proof 5 tactics
Initial goal
intros A k v ps
simpl
unfold name_eqb
rewrite term_eqb_refl
reflexivity
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Putting a value for the name d leaves the value of every other name k.
Explore proof 10 tactics
Initial goal
intros A k d v ps H
simpl
rewrite H
induction ps as | k′ v′ ps IH ; simpl ; auto
destruct name_eqbd k′ eqn: E ; simpl
2 open–apply term_eqb_eq in E
2 opensubst k′
2 openrewrite H
2 openexact IH
–destruct name_eqbk k′ ; auto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
What a fact means
The environment e' gives every name but d what the environment e gives it, as after a step that defines only d.
The live fact fa, live(Q, P, Lo, Hi, Rights, Align), holds in memory m and environment e: the temporary Q holds a pointer word, P evaluates to the same word (a check yields its operand), and the access check of that pointer from Lo up to Hi passes in m (check_passes).
Every fact of the list fs holds.
A check reads only the region list, so one that passes in m passes in any memory m' with the same regions.
Explore proof 4 tactics
Initial goal
unfold check_passes , access_res
intros m m′ p lo hi r al E H
rewrite E
exact H
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
A fact that names neither d as its Q nor the temporary d (tmp(d)) as its P survives a step that changes no region and no temporary but d (env_agree).
Explore proof 9 tactics
Initial goal
intros ge m m′ e e′ d fa Hr He Hq Hp p & Eq & Ep & Hc
exists p
split ; | split
3 openfocused goal
–rewrite He by exact Hq
3 opendeferred goal
exact Eq
2 opendeferred goal
–destruct f_pfa as n | c | g ; simpl in * ; auto
2 openrewrite He by exact Hp
2 openexact Ep
–eapply check_passes_regions ; eauto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
So the facts the pass keeps when d is defined, those kill d leaves (evidence_kill/3), hold after such a step.
Explore proof 5 tactics
Initial goal
unfold kill
intros ge m m′ e e′ d fs Hr He H fa Hin
apply filter_In in Hin as Hin Hk
apply negb_true_iff , orb_false_iff in Hk as Hq Hp
eapply fact_holds_kill ; eauto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Facts that hold in m hold in any memory with the same regions.
Explore proof 5 tactics
Initial goal
intros ge m m′ e fs Hr H fa Hin
destruct Hfa Hin as p & Eq & Ep & Hc
exists p
repeat split ; auto
eapply check_passes_regions ; eauto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Steps that keep evidence
A store (store_res, store_res/7) writes bytes but leaves the region list unchanged.
Explore proof 3 tactics
Initial goal
unfold store_res
intros w m a c x r m′ H
destruct w , x ; try discriminate ; cases H ; inversion H ; subst ; reflexivity
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Reading a variadic argument through the argument pointer p (va_arg_res) leaves the region list unchanged, though it may write memory.
Explore proof 3 tactics
Initial goal
unfold va_arg_res
intros k p m r m′ H
cases H;match type of H withSome_, = Some_, ⇒assert x = y as ← by congruenceend;first
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Explore proof 3 tactics
Initial goal
unfold op_res , float_integer
intros o k xs m r m′ H
destruct o ; cases H ; inversion H ; subst;first
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Binding the result r to the name d (bind_res) continues only with a value x: the environment gains d bound to x, and memory is unchanged.
Explore proof 3 tactics
Initial goal
unfold bind_res
intros d r e l m e′ l′ m′ H
destruct r ; inversion H ; subst ; eauto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Putting a value for d changes no other name.
Explore proof 3 tactics
Initial goal
intros d x e n H
apply lookup_put_other
exact H
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
An evidence-preserving instruction i (evidence_preserving/1) that continues changes no region, and no temporary but the one it defines (inst_def_first); one that defines none leaves the environment as it was.
Proof 28 steps Qed
let
raw_store, not of a pointer
loc
touch
The pass's bookkeeping
Where the facts fs hold before the instruction i of the frame fr and i continues, the facts evidence_after/3 keeps after it hold: a preserving instruction kills what it redefines, any other keeps nothing. The pass's kill is exactly what the proof needs.
Explore proof 8 tactics
Initial goal
unfold evidence_after
intros ge fr m i e′ l′ m′ fs H Hs
destruct evidence_preservingi eqn: Hp ; | intros fa
destruct preserving_step_ _ _ _ _ _ _ Hp Hs as Hr Hd
destruct inst_def_firsti as d |
2 openfocused goal
–eapply facts_hold_kill ; eauto
deferred goal
–subst e′
eapply facts_hold_same ; eauto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Accesses through a live fact
The newest live fact of q (fact_of) is one of the facts, and is q's.
Explore proof 9 tactics
Initial goal
intros q fs fa
induction fs as | f fs IH ; simpl ; discriminate |
destruct name_eqbf_qf q eqn: E
2 open–intros H
2 openinjection H as ←
2 opensplit ; left ; reflexivity | apply term_eqb_eq ; exact E
–intros H
destruct IHH
split ; right | ; auto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Where objects fit the address space (objects_fit) and the facts fs hold, a raw access i that the newest live fact fa of its address operand q covers (covered_access), as the pass's reusing case asks, gives no unchecked. With evidence_after_holds and check_like_holds this is proof persistence within a block.
Explore proof 5 tactics
Initial goal
intros ge fr m i q fs fa why Hfit H Hf Hc
destruct fact_of_in_ _ _ Hf as Hin Hq
destruct Hfa Hin as p & Eq & _ & Hp
rewrite Hq in Eq
exact covered_access_not_unchecked_ _ _ _ _ _ _ _ _ _ _ Hfit Hc Eq Hp
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
A fact that holds, put before a list of facts that hold.
Explore proof 1 tactics
Initial goal
intros ge m e fa fs H Hs fb ← | Hin ; auto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Every form the pass adds a fact for
Each check-like op, check, check_ahead, renew, renew_hull, half_check, renew_if and check_limit, continues only where the access check of its pointer operand passed: a renew's renew_res/4, a half check's half_res/4 and a limit's checked result are values only then. So the fact the pass adds after any of them (after_check) holds, and so does the wider range a check_ahead asks of the access it is checked for.
The fact checked_inst_rest/7 adds after the check-like instruction i, live(Q, P, Lo, Hi, Rights, Align), read off its op and its pointer operand P; None for any other instruction.
The range the access after the check-like instruction i must lie in (proof_use/6): its fact's, except that a check_ahead's reaches to its wider end AHi.
Where P evaluates to the pointer pp in e (value_x), it still does once Q is bound to pp too, even if P is the temporary Q itself.
Explore proof 11 tactics
Initial goal
intros ge e q p pp Ex
destruct p as n | c | g ; | exact Ex | exact Ex
unfold value_x in *
destruct name_eqbn q eqn: E
2 open–apply term_eqb_eq in E
2 opensubst n
2 openrewrite lookup_put_same
2 opendestruct lookupq e as w | ; simpl in Ex ; | discriminate Ex
2 openreflexivity
–rewrite lookup_put_other by exact E
exact Ex
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Splits on every match a hypothesis is stuck on, and uses every equation between constructors: the case analysis behind check_like_continue and let_step.
An access check (cap_access_res, cap_access_res/7) traps or passes; it is never unchecked.
Explore proof 3 tactics
Initial goal
unfold cap_access_res , readonly_access_res , aligned_res
intros c rs a size r al why H
destruct c ; try discriminate H ; destruct object_region_ _ ; try discriminate H ; destruct _ && _ ; try discriminate H ; try destruct r ; try discriminate H ; destruct _ =? 0 ; discriminate H
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
What every check-like op i that continues leaves: Q bound to P's pointer pp, memory as it was, and its checks passed: that of its fact fa (check_fact), and that of the range fb its access must lie in (access_fact), which has the same Q and P.
Proof 11 steps Qed
After a check-like op that continues, its fact fa holds, and so does fb, the range its access must lie in.
Explore proof 3 tactics
Initial goal
intros ge fr m i fa fb e′ l′ m′ Hf Hg H
destruct check_like_continue_ _ _ _ _ _ _ _ _ Hf Hg H as → & Hq & Hp & pp & → & Ex & Ha & Hb
split ; exists pp ; | rewrite Hq , Hp ; split ; apply lookup_put_same | split ; apply value_x_put_same ; exact Ex | assumption
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Every let
A let of the name d that continues changes no region and no temporary but d.
Explore proof 9 tactics
Initial goal
intros ge fr m d k o args e′ l′ m′ H
destruct special_leto eqn: Es
2 open–destruct o ; try discriminate Es ; unfold inst_step in H ; cbn zeta in H ; crush ; unfold bind_res in * ; crush ; split ; try reflexivity ; apply env_agree_put
–rewrite inst_step_let_ _ _ _ _ _ _ Es in H
cbn zeta in H
cases H
injection H as Hb
destruct bind_res_continue_ _ _ _ _ _ _ _ Hb as x & → & → & →
split ; eapply op_res_regions ; eauto | apply env_agree_put
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Block entry
A block is entered by an edge from the block before it, and its phis bind their temporaries. An unpolled edge changes nothing; the entry facts of ir.pl's pass are the meet of the exit facts of the blocks it may come from, less those that name a phi's temporary (Validate.v's evidence_pass).
The facts fs less those that name a temporary of the phis phs as Q or P: what Validate.v's evidence_pass keeps at a block's entry of the meet of the facts that reach it.
The temporary a phi defines.
A fact entry_kill keeps is one of fs and names no phi's temporary, as Q or as P.
Explore proof 6 tactics
Initial goal
induction phs as | d k ps phs IH ; simpl ; intros fs fa H ; split ; exact H | tauto |
destruct IH_ _ H as Hin Hph
apply filter_In in Hin as Hin Hk
apply negb_true_iff , orb_false_iff in Hk
split ; exact Hin |
intros ph ← | Hp ; exact Hk | auto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Once one phi fails to find its value, the fold over the rest fails too.
Explore proof 2 tactics
Initial goal
intros ge phs pred e0
induction phs ; simpl ; auto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Running the phis phs on entry from the block pred changes only their own temporaries: every other name n keeps its value.
Explore proof 9 tactics
Initial goal
induction phs as | d k ps phs IH ; simpl ; intros pred e0 e1 e H n Hn
2 openfocused goal
–injection H as ←
2 opendeferred goal
reflexivity
deferred goal
–destruct lookuppred ps as v | ; simpl in H ; | rewrite phis_fold_none in H ; discriminate H
destruct value_xge e0 k v as x | ; simpl in H ; | rewrite phis_fold_none in H ; discriminate H
rewrite IH_ _ _ _ H n by auto
apply lookup_put_other
apply HnPhid k ps
auto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Entering a block from the block pred, where its phis bind (phis_env, phis_env/6) and the facts fs held before them, the facts that name no phi temporary (entry_kill) hold after.
Explore proof 16 tactics
Initial goal
unfold phis_env
intros ge m phs pred e0 e fs Hp H fa Hin
destruct entry_kill_in_ _ _ Hin as Hin′ Hph
destruct Hfa Hin′ as p & Eq & Ep & Hc
exists p
split ; | split ; | exact Hc
2 openfocused goal
–rewrite phis_env_agree_ _ _ _ _ _ Hp ; exact Eq |
2 opendeferred goal
intros ph Hi
2 opendeferred goal
apply Hphph Hi
deferred goal
–destruct f_pfa as n | c | g eqn: Ef ; | exact Ep | exact Ep
simpl in *
rewrite phis_env_agree_ _ _ _ _ _ Hp ; exact Ep |
intros ph Hi
pose proof proj2Hphph Hi as Hv
simpl in Hv
exact Hv
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
value_eqb is equality of values.
Explore proof 1 tactics
Initial goal
intros a | a | a b | b | b H ; simpl in H ; try discriminate H ; f_equal ; first apply Z.eqb_eq | apply term_eqb_eq ; exact H
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
fact_eqb is equality of facts.
Explore proof 10 tactics
Initial goal
intros q p lo hi r al q′ p′ lo′ hi′ r′ al′ H
unfold fact_eqb in H
simpl in H
repeat rewrite andb_true_iff in H
destruct H as Hq & Hp & Hl & Hh & Hr & Ha
apply term_eqb_eq in Hq
apply value_eqb_eq in Hp
apply Z.eqb_eq in Hl , Hh , Ha
destruct r , r′ ; try discriminate Hr
2 openall: subst ; reflexivity
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
A fact of the meet (evidence_meet, evidence_meet/2) of the sets of facts that reach a block is a fact of every set it meets.
Explore proof 10 tactics
Initial goal
unfold evidence_meet
intros | s0 ss s fa H Hs ; destruct H |
apply filter_In in H as H0 Hall
destruct Hs as ← | Hs ; exact H0 |
rewrite forallb_forall in Hall
pose proof Halls Hs as Ex
apply existsb_exists in Ex as y & Hy & E
apply fact_eqb_eq in E
subst y
exact Hy
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
A taken edge t from the block from (edge_step) changes neither memory nor temporaries; it leaves the frame at the entry of t's label, entered from from.
Explore proof 3 tactics
Entering the block l from pred runs its phis on what the edge left: memory is unchanged, and the frame goes on to the block's instructions and jump.
Explore proof 12 tactics
Initial goal
intros ge c l pred c′ Ha H
unfold step in H
rewrite Ha in H
destruct c_fuelc =? 0 ; discriminate H |
apply or_stuck_next in H
destruct find_block_ _ as b | ; simpl in H ; | discriminate H
destruct phis_envge b_phisb Somepred fr_envc_framec as e | eqn: Ep ; unfold phis_env in Ep ; rewrite Ep in H ; simpl in H ; | discriminate H
injection H as ←
simpl
split ; reflexivity |
exists b
auto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Where the facts fs hold as a block is left by the edge t (edge_step), and fs is one of the sets the pass meets at the entry of t's block b, the pass's entry facts of b (entry_kill of the meet) hold once its phis have run.
Explore proof 11 tactics
Initial goal
intros ge c c1 c2 from t sets fs b He Hs Hb H Hin
destruct edge_step_next_ _ _ _ He as Hm1 & He1 & Ha1
destruct enter_step_ _ _ _ _ Ha1 Hs as Hm2 & b′ & Hb′ & Hp & _
rewrite Hb in Hb′
injection Hb′ as ←
rewrite Hm2 , Hm1
eapply phis_facts_hold ; exact Hp |
rewrite He1
intros fa Hfa
apply H
eapply evidence_meet_in ; eauto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
The pass, instruction by instruction
checked_inst_rest/7 takes the check-like instructions together with the access they are checked for, ends the facts at a check_local or check_function, and otherwise keeps evidence_after/3 of the facts (or kills a repeated getter's temporary). pass_special names the instructions it treats apart; generic_rest is its last case, copied.
The instructions checked_inst_rest/7 treats apart: a check_local, a check_function, and every check-like op (check_fact).
The last case of checked_inst_rest/7, copied for the proof. It gives the facts after the instruction i (evidence_after, or a repeated getter's temporary killed) and accepts i unless i is a raw access with no live fact of its operand that covers it (covered_access or hull_covered), a raw call, a call through a temporary, or pointer arithmetic or a pointer copy outside a flight.
For an instruction it does not treat apart, checked_inst_rest/7 is generic_rest, by computation. So Validate.v, the transcription the gates compare, needs no refactoring for the proof.
Explore proof 3 tactics
Initial goal
intros s i rest live H
destruct i as q k o args | | | | | | | | ; try reflexivity
destruct k ; try reflexivity ; destruct o ; try reflexivity ; destruct args as | a1 | a2 | a3 | a4 args ; try reflexivity ; discriminate H
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
What generic_rest answers: the same remaining instructions; the facts evidence_after keeps, or a getter copy's temporary killed; and, for a raw access through q, a live fact of q that covers it by covered_access or hull_covered.
Explore proof 19 tactics
Initial goal
unfold generic_rest
intros s i rest live rest′ live′ H
cbn zeta in H
match type of H withif then _ else _ = _⇒destruct b eqn: Hok ; | discriminate Hend
injection H as ← ←
split ; reflexivity |
split
2 openfocused goal
–destruct i as d k o args | | | | | | | | ; auto
2 opendeferred goal
destruct k , o ; auto ; destruct args as | n | c | g | a2 args ; auto
2 opendeferred goal
destruct lookupd s_getterss ; auto
2 opendeferred goal
destruct name_eqb_ _ ; eauto
deferred goal
–intros q x off need Hr
rewrite Hr in Hok
apply andb_true_iff in Hok as _ Hok
destruct fact_ofq live as fa | ; | discriminate Hok
exists fa
split ; reflexivity |
apply orb_true_iff
exact Hok
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
A check-like instruction has an access range too.
Explore proof 3 tactics
Initial goal
intros i fa H
destruct i as q k o args | | | | | | | | ; try discriminate H
destruct k , o ; try discriminate H ; destruct args as | a1 | a2 | a3 | a4 args ; simpl in * ; try discriminate H ; eauto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
The pass takes a check-like instruction i together with the next instruction, its access: the access must lie in i's range (proof_use, proof_use/6), and the facts after both are those evidence_after keeps across the access, from i's fact put before the facts kept across i.
Explore proof 9 tactics
Initial goal
intros s i rest live rest′ live′ fa fb Hf Hg H
destruct i as q k o args | | | | | | | | ; try discriminate Hf
destruct k ; try destruct o ; discriminate Hf
destruct o ; try discriminate Hf ; destruct args as | a1 | a2 | a3 | a4 args ; simpl in Hf , Hg ; try discriminate Hf ; injection Hf as ← ; injection Hg as ← ; cbn [ f_q f_p f_lo f_hi f_r f_al ]
7 openfocused goal
focused goal
focused goal
focused goal
focused goal
focused goal
all: unfold checked_inst_rest in H ; cbn zeta in H
7 openfocused goal
focused goal
focused goal
focused goal
focused goal
focused goal
all: repeat match type of H withcontext [match with _ ⇒ _ end]⇒destruct x eqn :? ; try discriminate Hend
7 openfocused goal
focused goal
focused goal
focused goal
focused goal
focused goal
all: injection H as ← ← ; eexists ; split ; reflexivity |
7 openfocused goal
focused goal
focused goal
focused goal
focused goal
focused goal
all: repeat match goal withE : _ && _ = true |- _⇒apply andb_true_iff in E as ? ?end
7 openfocused goal
focused goal
focused goal
focused goal
focused goal
focused goal
all: split ; assumption | reflexivity
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
The pass takes a check_local with its access too, and keeps after the access the facts it had with q killed.
Explore proof 6 tactics
Initial goal
intros s q x off bytes r al rest live rest′ live′ H
unfold checked_inst_rest in H
cbn zeta in H
repeat match type of H withcontext [match with _ ⇒ _ end]⇒destruct y eqn :? ; try discriminate Hend
injection H as ← ←
eauto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
After a check_function and its call, the pass keeps no fact.
Explore proof 5 tactics
Initial goal
intros s q args rest live rest′ live′ H
unfold checked_inst_rest in H
destruct rest as | rest ; try discriminate H ; simpl in H ; destruct callee ; try discriminate H ; destruct name_eqb_ _ ; try discriminate H
injection H as _ ←
reflexivity
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
Where the facts live hold before an instruction i the pass accepts and i continues, the pass's facts after it hold; or, for an instruction the pass takes with its access, they hold after that access, whatever frame fr1 with i's environment runs it.
Proof 43 steps Qed
As proof_use/6's two clauses: an instruction that uses the proof q right after its check is a touch of q, which accesses nothing, or an access q's range covers.
Explore proof 7 tactics
Initial goal
intros i q lo hi r al H
destruct i as d k o args | | | | | | | | q′ ; try right ; unfold proof_use in H ; apply andb_true_iff in H as H _ ; exact H
left
unfold proof_use in H
apply term_eqb_eq in H
subst q′
reflexivity
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
The access a check-like instruction i is checked for, run right after it, gives no unchecked, where objects fit the address space.
Explore proof 11 tactics
Initial goal
intros ge s fr m i rest live rest′ live′ e1 l1 m1 fr1 access why Hfit Hf Hc Hs He
destruct check_facti as fa | eqn: Ef ; | contradiction
assert ∃fb, access_facti = Somefb as fb Hg by eapply access_fact_some ; eauto
destruct checked_inst_rest_check_ _ _ _ _ _ _ _ Ef Hg Hc as access′ & E & Hu & _
injection E as ← _
destruct proof_use_cases_ _ _ _ _ _ Hu as → | Hcov
2 openfocused goal
{cbn
2 opendeferred goal
discriminate
deferred goal
destruct proj2check_like_holds_ _ _ _ _ _ _ _ _ Ef Hg Hs as p & Eq & _ & Hp
rewrite <- He in Eq
exact covered_access_not_unchecked_ _ _ _ _ _ _ _ _ _ _ Hfit Hcov Eq Hp
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.
Source script
A raw access i that the pass accepts on its own (not with a check) gives no unchecked where the facts hold and objects fit the address space, unless the pass accepted it by hull_covered/7, whose case Chain.v's hull_access_not_unchecked closes.
Explore proof 5 tactics
Initial goal
intros ge s fr m i rest live rest′ live′ q x off need why Hfit Hl Hp Hc Hr
rewrite checked_inst_rest_generic_ _ _ _ Hp in Hc
destruct generic_rest_shape_ _ _ _ _ _ Hc as _ & _ & Ha
destruct Ha_ _ _ _ Hr as fa & Hfa & Hcov | Hh ; left | right ; eauto
eapply live_access_not_unchecked ; eauto
No remaining goals.
Qed
✓ Proof checked and closed by Rocq.