Fil-C on Nix

Filnix wiki

the formal campaign

rocq/spikes/SepListSum.v

The listsum spike proved with the hand-rolled separation logic of Sep.v (docs/logic.md): spikes/listsum.c never panics, with no premise, under any runtime, the interpreter's among them.

The proof is Buffer.v's: an assertion at each point of each function, one step from a configuration where it holds is safe_step, and a safepoint keeps it; Panics.v's never_panics_by_invariant turns that into never_panics. What is new is the shape of the assertions. Each is facts about the temporaries and a separation-logic assertion on the memory, and sum has a specification of its own with a frame: from the list lst p xs and any frame F it walks the list, dropping each node it has passed into htrue, and returns an integer with htrue and F still there (sum_step). listsum builds the list one fresh node at a time and calls sum with the empty frame, suspended on the callers' stack.

The configuration invariant ls_inv adds the one fact about the whole memory, live_disjoint: either listsum runs with no caller, or sum runs with listsum suspended after its call. A safepoint (R.at_safepoint is abstract, so one may be due before any instruction that is not evidence-preserving, and at each poll edge) keeps every assertion: it changes no region (collector_live) and no byte, and changes an aux slot only where a freed object's capability is stored, which no list does (sum_safepoint, ls_safepoint).

From Stdlib Require Import String ZArith List Bool Lia
From Nanofil Require Import Term Syntax Values Memory Runtime Ops Semantics Run Machine Transport Panics Symbolic Pieces
From Spike Require Import Sep ListSum
Import ListNotations
Open Scope Z_scope
Arguments Z.add : simpl nomatch
Arguments Z.sub : simpl nomatch
Arguments Z.mul : simpl nomatch
Arguments Z.opp : simpl nomatch

Integer arithmetic on an unknown stays folded when a step is computed (Symbolic.v).

Computing a step over memory the assertions describe

A pointer is its two fields.

45Lemma ptr_eta
Explore proof 2 tactics

Initial goal

⊢
∀p : ptr, p = ptr_addr ≔ ptr_addrp; ptr_cap ≔ ptr_capp

intros a c

a :
Z
c :
⊢
ptr_addr ≔ a; ptr_cap ≔ c = ptr_addr ≔ ptr_addrptr_addr ≔ a; ptr_cap ≔ c; ptr_cap ≔ ptr_capptr_addr ≔ a; ptr_cap ≔ c

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros a c
reflexivity

Rewrite in E every alignment test of an address the context proves 8-aligned to its answer, before drop_wraps would turn the remainder into an unknown.

51Ltac aligned E ≔
repeat match type of E withcontext [?x mod 8]⇒assert_fails has_ifx ; let H ≔ fresh "Hal" in assert H : x mod 8 = 0 by clear E ; arith ; rewrite H in E ; clear Hend

Rewrite in E the facts about memory and the module a step reads besides Symbolic.v's: a node's next slot, as bytes and as aux, a function found by name, a callee's frame, and a pointer rebuilt from its fields.

63Ltac use_more_facts E ≔
repeat match goal withH : load_bytes_ _ _ = _ |- _⇒rewrite H in EH : m_aux_ _ = _ |- _⇒rewrite H in EH : find_fn_ _ = _ |- _⇒rewrite H in EH : ∀x rest, call_frame_ x :: rest = _ |- _⇒rewrite H in Eend;repeat match type of E withcontext [mkPtrptr_addr?p ptr_cap?p]⇒rewrite <- ptr_etap in Eend

Compute E, an equation r = step g c, as Symbolic.v's compute_step does, with stores and aux kept folded, offsets of 0 dropped, and the facts above.

77Ltac step_reduce E ≔
repeat progress cbn - [ load_bytes store_bytes store_aux call_frame ] in E ; rewrite ?store_bytes_regions , ?Z.add_0_r in E ; try unfold sign_extension in E ; try unfold raw_address in E ; try unfold aligned_res in E ; try unfold continue_at in E ; try unfold with_point in E ; try unfold int_load_res in E ; try unfold access_res in E ; try unfold cap_access_res in E ; try unfold aux_at in E ; use_facts E ; use_more_facts E ; cbn [ r_base r_end r_kind r_life ptr_addr ptr_cap ] in E ; aligned E ; drop_wraps E ; decide_compares E

sum

The function sum.

90Definition sum_fn: func ≔
ls_fn"sum"

Every point of sum, numbered: the entry start (0, 1); the loop's head L3, entered from start or from the body (2, 3), before its two instructions and its branch (4 to 6); the body L4, entered (7), then before each of its six instructions and its jump back, which polls (8 to 14); and the exit L5 (15, 16).

97Definition sum_points: listpoint ≔
EnterTAtom"start" None; ls_atsum_fn "start" 0; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ls_atsum_fn "L3" 0; ls_atsum_fn "L3" 1; ls_atsum_fn "L3" 2; EnterTAtom"L4" SomeTAtom"L3" ++ mapls_atsum_fn "L4" seq0 7 ++ EnterTAtom"L5" SomeTAtom"L3"; ls_atsum_fn "L5" 0

At the loop's head, after its first j instructions: the list from pr.1, the sum pr.2 an integer, the walked nodes in htrue, and the frame F; then v7, the list's address, and v8, whether it is not null.

108Definition sum_headj : nat F : hprop e : env m : mem : Prop ≔
∃ p s xs  ,
lookupTAtom"pr.1" e = SomeWPtrp
∧
lookupTAtom"pr.2" e = SomeWInts
∧
j =? 1%nat
→
else
True
∧
j =? 2%nat
→
ptr_addrp ≤ 0 ∧ lookupTAtom"v8" e = SomeWInt0 ∨ 0 < ptr_addrp ∧ lookupTAtom"v8" e = SomeWInt1
else
True
∧
∃S, lstp xs ** htrue ** F%hS m

In the body, after its first j instructions: the node at a, its value v and next pointer next, the rest xs; then the pointer v11 to the value and its checked proof chk0, the value v12, the new sum v13, the half-checked node pointer chk1, and the next pointer v15.

121Definition sum_bodyj : nat F : hprop e : env m : mem : Prop ≔
∃ a s v next xs  ,
lookupTAtom"pr.1" e = SomeWPtrmkPtra Obja
∧
lookupTAtom"pr.2" e = SomeWInts
∧
1 ≤? j%nat
→
lookupTAtom"v11" e = SomeWPtrmkPtra + 8 Obja
else
True
∧
2 ≤? j%nat
→
lookupTAtom"chk0" e = SomeWPtrmkPtra + 8 Obja
else
True
∧
3 ≤? j%nat
→
else
True
∧
4 ≤? j%nat
→
else
True
∧
5 ≤? j%nat
→
lookupTAtom"chk1" e = SomeWPtrmkPtra Obja
else
True
∧
6 ≤? j%nat
→
lookupTAtom"v15" e = SomeWPtrnext
else
True
∧
∃S, lst_consmkPtra Obja v next xs ** htrue ** F%hS m

What holds at point k of sum_points with the frame F: at the entry, the precondition, the list from the parameter v0 and F; on the edge back, the loop's state in v15 and v13; at the head, sum_head; in the body, sum_body; at the exit, the postcondition, the sum an integer, and htrue and F.

137Definition sum_assertk : nat F : hprop e : env m : mem : Prop ≔
match k with
0%nat | 1%nat | 2%nat
⇒
∃p xs, lookupTAtom"v0" e = SomeWPtrp ∧ ∃S, lstp xs ** F%hS m
3%nat
⇒
∃p s xs, lookupTAtom"v15" e = SomeWPtrp ∧ lookupTAtom"v13" e = SomeWInts ∧ ∃S, lstp xs ** htrue ** F%hS m
4%nat | 5%nat | 6%nat
⇒
sum_headk − 4 F e m
7%nat
⇒
sum_body0 F e m
15%nat | 16%nat
⇒
∃s, lookupTAtom"pr.2" e = SomeWInts ∧ ∃S, htrue ** F%hS m
_
⇒
sum_bodyk − 8 F e m

A configuration running sum with the frame F and the callers callers below it: at point k, with no locals and no doom, where the assertion of k holds.

151Definition sum_atF : hprop callers : listframe × pending c : config : Prop ≔
∃k pt e, c = mkConfigmkFramesum_fn e [ ] None pt callers c_memc c_fuelc ∧ nth_errorsum_points k = Somept ∧ sum_assertk F e c_memc

Facts the steps read from the assertions

A list's address is 0 or inside the address space.

158Lemma lst_star_range
∀ p xs R S m
lstp xs ** R%hS m
0 ≤ ptr_addrp < 2 ^ 48
Explore proof 3 tactics

Initial goal

⊢
∀p : ptr xs : listZ R : hprop S : fp m : mem, objects_fitm_regionsm → lstp xs ** R%hS m → 0 ≤ ptr_addrp < 2 ^ 48

intros p xs R S m Hfit H

p :
xs :
listZ
S :
m :
H :
lstp xs ** R%hS m
⊢
0 ≤ ptr_addrp < 2 ^ 48

destruct star_elim_l_ _ _ _ H as S1 & H1

p :
xs :
listZ
S :
m :
H :
lstp xs ** R%hS m
S1 :
H1 :
lstp xs S1 m
⊢
0 ≤ ptr_addrp < 2 ^ 48

exact lst_range_ _ _ _ Hfit H1

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros p xs R S m Hfit H
destruct star_elim_l_ _ _ _ H as S1 & H1
exact lst_range_ _ _ _ Hfit H1

What a node of the list at a gives the steps that read it.

163Lemma cons_facts
∀ a v next xs R S m
lst_consmkPtra Obja v next xs ** R%hS m
0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = SomemkRegiona a + 16 Heap Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext
Explore proof 4 tactics

Initial goal

⊢
∀a v : Z next : ptr xs : listZ R : hprop S : fp m : mem, objects_fitm_regionsm → lst_consptr_addr ≔ a; ptr_cap ≔ Obja v next xs ** R%hS m → 0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext

intros a v next xs R S m Hfit H

a, v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consptr_addr ≔ a; ptr_cap ≔ Obja v next xs ** R%hS m
⊢
0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext

destruct lst_cons_facts_ _ _ _ _ _ _ Hfit H as a′ & E & Hr

a, v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consptr_addr ≔ a; ptr_cap ≔ Obja v next xs ** R%hS m
a′ :
Z
E :
ptr_addr ≔ a; ptr_cap ≔ Obja = ptr_addr ≔ a′; ptr_cap ≔ Obja′
Hr :
0 < a′ ∧ a′ mod 8 = 0 ∧ a′ + 16 ≤ 2 ^ 48 ∧ object_regiona′ m_regionsm = Somer_base ≔ a′; r_end ≔ a′ + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a′ 8 = ptr_addrnext ∧ m_auxm a′ = ptr_capnext
⊢
0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext

injection E as ←

a, v :
Z
next :
xs :
listZ
S :
m :
H :
lst_consptr_addr ≔ a; ptr_cap ≔ Obja v next xs ** R%hS m
H0 :
a = a
Hr :
0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext
⊢
0 < a ∧ a mod 8 = 0 ∧ a + 16 ≤ 2 ^ 48 ∧ object_regiona m_regionsm = Somer_base ≔ a; r_end ≔ a + 16; r_kind ≔ Heap; r_life ≔ Live ∧ load_bytesm a 8 = ptr_addrnext ∧ m_auxm a = ptr_capnext

exact Hr

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros a v next xs R S m Hfit H
destruct lst_cons_facts_ _ _ _ _ _ _ Hfit H as a′ & E & Hr
injection E as ←
exact Hr

Add to the context what the separation-logic facts H give a step: a list's address range, and a node's region and next slot.

175Ltac sep_facts Hfit ≔
try match goal withH : lst?p _ ** _%h_ _ |- _⇒pose proof lst_star_range_ _ _ _ _ Hfit Hend;try match goal withH : lst_consmkPtr?a Obj?a _ _ _ ** _%h_ _ |- _⇒destruct cons_facts_ _ _ _ _ _ _ Hfit H as ? & ? & ? & ? & ? & ?end

sum's step

The point of the next configuration is point n of sum_points or a later one.

184Ltac sum_find pt n ≔
lazymatch n with17%nat⇒fail_⇒first assert Hpt : nth_errorsum_points n = Somept by vm_compute ; reflexivity ; exists n, pt | sum_find pt Snend

Turn the separation-logic hypotheses into what the next point's assertion needs: htrue added at the loop's entry; the list dropped into it at the exit; at a nonnull list, its first node, its pointer taken apart; after the body, the walked node dropped.

196Ltac sum_prep Hfit ≔
try match goal withH : lst?p ?xs ** htrue ** ?G%h?S ?m |- _⇒pose proof htrue_absorb_ _ _ _ lst_registered_ _ Hend;try match goal withH : lst?p ?xs ** ?G%h?S ?m |- _⇒lazymatch G withhtrue ** _%h⇒fail_⇒idtacend;pose proof star_mono_r_ _ _ _ _ htrue_intro_ Hend;try match goal withHp : 0 < ptr_addr?p , H : lst?p ?xs ** ?R%h?S ?m |- _⇒let Hc ≔ fresh "Hc" in destruct lst_nonnullxs p R S m ltac:lia H as ? & ? & ? & Hc ; destruct lst_cons_facts_ _ _ _ _ _ _ Hfit Hc as ? & ? & _ ; subst pend;try match goal withH : lst_cons_ _ _ _ ** htrue ** _%h_ _ |- _⇒pose proof lst_cons_drop_ _ _ _ _ _ _ Hend

The next configuration runs sum at its point, with the same callers and frame and the memory unchanged.

211Ltac sum_next Hfit ≔
cbv beta ; split ; | reflexivity ; unfold sum_at;match goal with|- ∃k pt e, mkConfigmkFrame_ _ _ _ ?pt′ _ _ _ = _ ∧ _⇒sum_find pt′ 0%natend;eexists;split;|subst ; reflexivity|;split;|assumption|;cbn [ c_mem ];cbn [ sum_assert Nat.sub ];try unfold sum_head;try unfold sum_body;cbn [ Nat.leb Nat.eqb ];sum_prep Hfit;show_facts;eassumption

One point of sum_step: the point from Hk, the assertion Ha taken apart with what it gives about memory, the step computed, and its result shown safe.

223Ltac sum_point pts Hk Ha Hfit ≔
cbv in Hk ; injection Hk as ← ; clear pts ; cbn [ sum_assert Nat.sub ] in Ha ; try unfold sum_head in Ha ; try unfold sum_body in Ha ; cbn [ Nat.leb Nat.eqb ] in Ha ; unfold int_at in * ; facts ; sep_facts Hfit ; remember step_ _ as r eqn: E ; step_reduce E ; subst r ; cbn [ safe_step ] ; solve intro ; assumption | sum_next Hfit

sum's specification, as one step: from any configuration running sum where its assertion holds with the frame F, under any callers, the step returns an integer to the caller with htrue and F holding, or is safe_step into such a configuration with the same callers and frame, the memory unchanged. Any frame: sum never writes, and a frame need survive only safepoints (sum_safepoint).

236Lemma sum_step
∀ ge F callers c
∃x S, stepge c = return_stepc RetWIntx ∧ htrue ** F%hS c_memc ∨ safe_stepλc′ ⇒ sum_atF callers c′ ∧ c_memc′ = c_memc c_memc stepge c
Explore proof 29 tactics

Initial goal

⊢
∀ge : genv F : hprop callers : listframe × pending c : config, objects_fitm_regionsc_memc → sum_atF callers c → ∃x : Z S : fp, stepge c = return_stepc RetWIntx ∧ htrue ** F%hS c_memc ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = c_memc c_memc stepge c

intros ge F callers c Hfit k & pt & e & Ec & Hk & Ha

ge :
callers :
listframe × pending
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points k = Somept
Ha :
⊢
∃x : Z S : fp, stepge c = return_stepc RetWIntx ∧ htrue ** F%hS c_memc ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = c_memc c_memc stepge c

rewrite Ec

ge :
callers :
listframe × pending
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points k = Somept
Ha :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc = return_stepc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc RetWIntx ∧ htrue ** F%hS c_memc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = c_memc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc c_memc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc

clear Ec

ge :
callers :
listframe × pending
k :
nat
pt :
e :
Hk :
nth_errorsum_points k = Somept
Ha :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc = return_stepc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc RetWIntx ∧ htrue ** F%hS c_memc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = c_memc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc c_memc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc

cbn [ c_mem ] in Hfit |- *

ge :
callers :
listframe × pending
k :
nat
pt :
e :
Hk :
nth_errorsum_points k = Somept
Ha :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc = return_stepc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc RetWIntx ∧ htrue ** F%hS c_memc ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = c_memc c_memc stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc

set m := c_memc in *

ge :
callers :
listframe × pending
m :=
k :
nat
pt :
e :
Hk :
nth_errorsum_points k = Somept
Ha :
sum_assertk F e m
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ c_fuelc = return_stepc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ c_fuelc RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ c_fuelc

set fuel := c_fuelc in *

ge :
callers :
listframe × pending
m :=
k :
nat
pt :
e :
Hk :
nth_errorsum_points k = Somept
Ha :
sum_assertk F e m
fuel :=
c_fuelc : Z
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel

clearbody m fuel

ge :
callers :
listframe × pending
m :
k :
nat
pt :
e :
Hk :
nth_errorsum_points k = Somept
Ha :
sum_assertk F e m
fuel :
Z
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel

set pts := sum_points in Hk

ge :
callers :
listframe × pending
m :
k :
nat
pt :
e :
pts :=
Hk :
nth_errorpts k = Somept
Ha :
sum_assertk F e m
fuel :
Z
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel

vm_compute in pts

ge :
callers :
listframe × pending
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L3"; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; EnterTAtom"L4" SomeTAtom"L3"; ExecTAtom"L4" FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" [ ] JGotoPollTAtom"L3"; EnterTAtom"L5" SomeTAtom"L3"; ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" : listpoint
Hk :
nth_errorpts k = Somept
Ha :
sum_assertk F e m
fuel :
Z
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel

remember sum_fn as f eqn: Hf

ge :
callers :
listframe × pending
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L3"; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; EnterTAtom"L4" SomeTAtom"L3"; ExecTAtom"L4" FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" [ ] JGotoPollTAtom"L3"; EnterTAtom"L5" SomeTAtom"L3"; ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" : listpoint
Hk :
nth_errorpts k = Somept
Ha :
sum_assertk F e m
fuel :
Z
f :
Hf :
f = sum_fn
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel

block_fact f sum_fn Hf TAtom"start" b0 Hb0

ge :
callers :
listframe × pending
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L3"; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; EnterTAtom"L4" SomeTAtom"L3"; ExecTAtom"L4" FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" [ ] JGotoPollTAtom"L3"; EnterTAtom"L5" SomeTAtom"L3"; ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" : listpoint
Hk :
nth_errorpts k = Somept
Ha :
sum_assertk F e m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel

block_fact f sum_fn Hf TAtom"L3" b3 Hb3

ge :
callers :
listframe × pending
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L3"; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; EnterTAtom"L4" SomeTAtom"L3"; ExecTAtom"L4" FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" [ ] JGotoPollTAtom"L3"; EnterTAtom"L5" SomeTAtom"L3"; ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" : listpoint
Hk :
nth_errorpts k = Somept
Ha :
sum_assertk F e m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel

block_fact f sum_fn Hf TAtom"L4" b4 Hb4

ge :
callers :
listframe × pending
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L3"; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; EnterTAtom"L4" SomeTAtom"L3"; ExecTAtom"L4" FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" [ ] JGotoPollTAtom"L3"; EnterTAtom"L5" SomeTAtom"L3"; ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" : listpoint
Hk :
nth_errorpts k = Somept
Ha :
sum_assertk F e m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel

block_fact f sum_fn Hf TAtom"L5" b5 Hb5

ge :
callers :
listframe × pending
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L3"; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; EnterTAtom"L4" SomeTAtom"L3"; ExecTAtom"L4" FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" [ ] JGotoPollTAtom"L3"; EnterTAtom"L5" SomeTAtom"L3"; ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" : listpoint
Hk :
nth_errorpts k = Somept
Ha :
sum_assertk F e m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel

assert Hret : fn_retf = RClassL by rewrite Hf ; reflexivity

ge :
callers :
listframe × pending
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L3"; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; EnterTAtom"L4" SomeTAtom"L3"; ExecTAtom"L4" FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" [ ] JGotoPollTAtom"L3"; EnterTAtom"L5" SomeTAtom"L3"; ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" : listpoint
Hk :
nth_errorpts k = Somept
Ha :
sum_assertk F e m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel

do 16 destruct k as | k ; right ; sum_point pts Hk Ha Hfit |

ge :
callers :
listframe × pending
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L3"; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; EnterTAtom"L4" SomeTAtom"L3"; ExecTAtom"L4" FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" [ ] JGotoPollTAtom"L3"; EnterTAtom"L5" SomeTAtom"L3"; ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" : listpoint
Hk :
nth_errorpts SSSSSSSSSSSSSSSSk = Somept
Ha :
sum_assertSSSSSSSSSSSSSSSSk F e m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m ∨ safe_stepλc′ : config ⇒ sum_atF callers c′ ∧ c_memc′ = m m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel

destruct k as | k ; left | destruct k ; discriminate Hk

ge :
callers :
listframe × pending
m :
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L3"; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; EnterTAtom"L4" SomeTAtom"L3"; ExecTAtom"L4" FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" [ ] JGotoPollTAtom"L3"; EnterTAtom"L5" SomeTAtom"L3"; ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" : listpoint
Hk :
nth_errorpts 16 = Somept
Ha :
sum_assert16 F e m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m

cbv in Hk

ge :
callers :
listframe × pending
m :
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L3"; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; EnterTAtom"L4" SomeTAtom"L3"; ExecTAtom"L4" FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" [ ] JGotoPollTAtom"L3"; EnterTAtom"L5" SomeTAtom"L3"; ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" : listpoint
Hk :
SomeExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" = Somept
Ha :
sum_assert16 F e m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m

injection Hk as ←

ge :
callers :
listframe × pending
m :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L3"; EnterTAtom"L3" SomeTAtom"start"; EnterTAtom"L3" SomeTAtom"L4"; ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; EnterTAtom"L4" SomeTAtom"L3"; ExecTAtom"L4" FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3"; ExecTAtom"L4" [ ] JGotoPollTAtom"L3"; EnterTAtom"L5" SomeTAtom"L3"; ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" : listpoint
Ha :
sum_assert16 F e m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m

clear pts

ge :
callers :
listframe × pending
m :
e :
Ha :
sum_assert16 F e m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m

cbn [ sum_assert ] in Ha

ge :
callers :
listframe × pending
m :
e :
Ha :
∃s : Z, lookupTAtom"pr.2" e = SomeWInts ∧ ∃S : fp, htrue ** F%hS m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
∃x : Z S : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS m

destruct Ha as s & Hs & S & HS

ge :
callers :
listframe × pending
m :
e :
s :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts
S :
HS :
htrue ** F%hS m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
∃x : Z S0 : fp, stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWIntx ∧ htrue ** F%hS0 m

exists s mod 2 ^ 64, S

ge :
callers :
listframe × pending
m :
e :
s :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts
S :
HS :
htrue ** F%hS m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWInts mod 2 ^ 64 ∧ htrue ** F%hS m

split ; | exact HS

ge :
callers :
listframe × pending
m :
e :
s :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts
S :
HS :
htrue ** F%hS m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWInts mod 2 ^ 64

cbn - [ return_step ]

ge :
callers :
listframe × pending
m :
e :
s :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts
S :
HS :
htrue ** F%hS m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
match fn_retf with
⇒
let* x ≔
let* x ≔ lookupTAtom"pr.2" e in
in
Somereturn_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel Retx
_
⇒
None
=
return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWInts mod 18446744073709551616

rewrite Hret

ge :
callers :
listframe × pending
m :
e :
s :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts
S :
HS :
htrue ** F%hS m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
let* x ≔
let* x ≔ lookupTAtom"pr.2" e in
in
Somereturn_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel Retx
=
return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWInts mod 18446744073709551616

cbn - [ return_step ]

ge :
callers :
listframe × pending
m :
e :
s :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts
S :
HS :
htrue ** F%hS m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
let* x ≔
match lookupTAtom"pr.2" e with
SomeWIntn
⇒
SomeWIntn mod 18446744073709551616
SomeWLimit_ _ as x
⇒
Somex
_
⇒
None
in
Somereturn_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel Retx
=
return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWInts mod 18446744073709551616

rewrite Hs

ge :
callers :
listframe × pending
m :
e :
s :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts
S :
HS :
htrue ** F%hS m
fuel :
Z
f :
Hf :
f = sum_fn
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" : optionblock
Hb0 :
b3 :=
Someb_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" : optionblock
Hb3 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3" : optionblock
Hb4 :
b5 :=
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" : optionblock
Hb5 :
Hret :
⊢
or_stuck"ret" Somereturn_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWInts mod 18446744073709551616 = return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2"; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ fuel RetWInts mod 18446744073709551616

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge F callers c Hfit k & pt & e & Ec & Hk & Ha
rewrite Ec
clear Ec
cbn [ c_mem ] in Hfit |- *
set m := c_memc in *
set fuel := c_fuelc in *
clearbody m fuel
set pts := sum_points in Hk
vm_compute in pts
remember sum_fn as f eqn: Hf
block_fact f sum_fn Hf TAtom"start" b0 Hb0
block_fact f sum_fn Hf TAtom"L3" b3 Hb3
block_fact f sum_fn Hf TAtom"L4" b4 Hb4
block_fact f sum_fn Hf TAtom"L5" b5 Hb5
assert Hret : fn_retf = RClassL by rewrite Hf ; reflexivity
do 16 destruct k as | k ; right ; sum_point pts Hk Ha Hfit |
destruct k as | k ; left | destruct k ; discriminate Hk
cbv in Hk
injection Hk as ←
clear pts
cbn [ sum_assert ] in Ha
destruct Ha as s & Hs & S & HS
exists s mod 2 ^ 64, S
split ; | exact HS
cbn - [ return_step ]
rewrite Hret
cbn - [ return_step ]
rewrite Hs
reflexivity

Safepoints in sum

What survives a safepoint holds after it.

260Lemma sp_apply
∀ P S m m′
PS m′
Explore proof 2 tactics

Initial goal

⊢
∀P : hprop S : fp m m′ : mem, sp_stableP → PS m → same_regionsm m′ → m_bytesm′ = m_bytesm → aux_movesm m′ → PS m′

intros P S m m′ HP H Hr Hb Ha

S :
m, m′ :
H :
PS m
Hr :
Hb :
Ha :
aux_movesm m′
⊢
PS m′

exact HPS m m′ H Hr Hb Ha

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros P S m m′ HP H Hr Hb Ha
exact HPS m m′ H Hr Hb Ha

Prove that an assertion built from star, the list, nodes, emp and htrue, and the frame whose survival is HF, survives a safepoint.

267Ltac sp_auto HF ≔
repeat first exact HF | apply lst_safepoint | apply htrue_sp_stable | apply node_sp_stable | apply pure_sp_stable | apply emp_sp_stable | apply star_sp_stable

Move every separation-logic hypothesis about the memory m to the memory m' after a safepoint.

273Ltac sp_hyps m m′ HF Hr Hb Hx ≔
repeat match goal withH : ?P?S m |- _⇒lazymatch type of P withhprop⇒idtacend;let H′ ≔ fresh "Hsp" in pose proof sp_applyP S m m′ ltac:sp_auto HF H Hr Hb Hx as H′ ; clear Hend

The poll on the back edge leaves the list alone: a safepoint keeps the assertion at every point of sum, for any frame that survives it. The environment and the point do not change; the memory changes only as safepoint_shape allows, which every assertion survives (lst_safepoint).

285Lemma sum_safepoint
∀ F callers c m′
Explore proof 11 tactics

Initial goal

⊢
∀F : hprop callers : listframe × pending c : config m′ : mem, sp_stableF → sum_atF callers c → same_regionsc_memc m′ → m_bytesm′ = m_bytesc_memc → aux_movesc_memc m′ → sum_atF callers c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc

intros F callers c m′ HF k & pt & e & Ec & Hk & Ha Hr Hb Hx

callers :
listframe × pending
m′ :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points k = Somept
Ha :
Hb :
Hx :
⊢
sum_atF callers c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc

exists k, pt, e

callers :
listframe × pending
m′ :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points k = Somept
Ha :
Hb :
Hx :
⊢
c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc; c_fuel ≔ c_fuelc_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ nth_errorsum_points k = Somept ∧ sum_assertk F e c_memc_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc

split ; rewrite Ec ; reflexivity |

callers :
listframe × pending
m′ :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points k = Somept
Ha :
Hb :
Hx :
⊢
nth_errorsum_points k = Somept ∧ sum_assertk F e c_memc_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc

cbn [ c_mem ]

callers :
listframe × pending
m′ :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points k = Somept
Ha :
Hb :
Hx :
⊢
nth_errorsum_points k = Somept ∧ sum_assertk F e m′

split ; exact Hk |

callers :
listframe × pending
m′ :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points k = Somept
Ha :
Hb :
Hx :
⊢
sum_assertk F e m′

set m := c_memc in *

callers :
listframe × pending
m′ :
k :
nat
pt :
e :
m :=
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points k = Somept
Ha :
sum_assertk F e m
Hr :
Hb :
Hx :
aux_movesm m′
⊢
sum_assertk F e m′

clearbody m

callers :
listframe × pending
m′ :
k :
nat
pt :
e :
m :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points k = Somept
Ha :
sum_assertk F e m
Hr :
Hb :
Hx :
aux_movesm m′
⊢
sum_assertk F e m′

assert Hlt : k < lengthsum_points%nat by apply nth_error_Some ; rewrite Hk ; discriminate

callers :
listframe × pending
m′ :
k :
nat
pt :
e :
m :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points k = Somept
Ha :
sum_assertk F e m
Hr :
Hb :
Hx :
aux_movesm m′
Hlt :
k < Datatypes.lengthsum_points%nat
⊢
sum_assertk F e m′

vm_compute in Hlt

callers :
listframe × pending
m′ :
k :
nat
pt :
e :
m :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points k = Somept
Ha :
sum_assertk F e m
Hr :
Hb :
Hx :
aux_movesm m′
Hlt :
Sk ≤ 17%nat
⊢
sum_assertk F e m′

do 17 destruct k as | k ; cbn [ sum_assert Nat.sub ] in Ha |- * ; try unfold sum_head in Ha |- * ; try unfold sum_body in Ha |- * ; cbn [ Nat.leb Nat.eqb ] in Ha |- * ; unfold int_at in * ; facts ; sp_hyps m m′ HF Hr Hb Hx ; show_facts ; eassumption |

callers :
listframe × pending
m′ :
k :
nat
pt :
e :
m :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ callers; c_mem ≔ m; c_fuel ≔ c_fuelc
Hk :
nth_errorsum_points SSSSSSSSSSSSSSSSSk = Somept
Ha :
sum_assertSSSSSSSSSSSSSSSSSk F e m
Hr :
Hb :
Hx :
aux_movesm m′
Hlt :
SSSSSSSSSSSSSSSSSSk ≤ 17%nat
⊢
sum_assertSSSSSSSSSSSSSSSSSk F e m′

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros F callers c m′ HF k & pt & e & Ec & Hk & Ha Hr Hb Hx
exists k, pt, e
split ; rewrite Ec ; reflexivity |
cbn [ c_mem ]
split ; exact Hk |
set m := c_memc in *
clearbody m
assert Hlt : k < lengthsum_points%nat by apply nth_error_Some ; rewrite Hk ; discriminate
vm_compute in Hlt
do 17 destruct k as | k ; cbn [ sum_assert Nat.sub ] in Ha |- * ; try unfold sum_head in Ha |- * ; try unfold sum_body in Ha |- * ; cbn [ Nat.leb Nat.eqb ] in Ha |- * ; unfold int_at in * ; facts ; sp_hyps m m′ HF Hr Hb Hx ; show_facts ; eassumption |
lia

listsum

The function listsum.

304Definition listsum_fn: func ≔
ls_fn"listsum"

Every point of listsum, numbered: the entry start (0, 1); the loop's head L4, entered from start or from the body (2, 3), its comparison and its branch (4, 5); the body L5, entered (6), then before each of its eight instructions and its jump back, which polls (7 to 15); the exit L7, entered (16), before its call of sum (17) and before its return (18).

312Definition ls_points: listpoint ≔
EnterTAtom"start" None; ls_atlistsum_fn "start" 0; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ls_atlistsum_fn "L4" 0; ls_atlistsum_fn "L4" 1; EnterTAtom"L5" SomeTAtom"L4" ++ mapls_atlistsum_fn "L5" seq0 9 ++ EnterTAtom"L7" SomeTAtom"L4"; ls_atlistsum_fn "L7" 0; ls_atlistsum_fn "L7" 1

In the loop, after the first j instructions of the body: the list built so far from pr.1, the index pr.2 an integer; then, from the allocation on, the new node at b, from v12, at first with a null next pointer and the value 0, its checked proof chk0, after the pointer store with the list for its next pointer, the pointer v16 to its value and the long v18 to store there, its half-checked proof chk1, after the store any value, and the next index v21.

327Definition ls_bodyj : nat e : env m : mem : Prop ≔
∃ h i xs  ,
lookupTAtom"pr.1" e = SomeWPtrh
∧
lookupTAtom"pr.2" e = SomeWInti
∧
j =? 0%nat
→
∃S, lsth xs S m
else
∃ b  ,
lookupTAtom"v12" e = SomeWPtrmkPtrb Objb
∧
0 < b
∧
b mod 16 = 0
∧
2 ≤? j%nat
→
lookupTAtom"chk0" e = SomeWPtrmkPtrb Objb
else
True
∧
4 ≤? j%nat
→
lookupTAtom"v16" e = SomeWPtrmkPtrb + 8 Objb
else
True
∧
5 ≤? j%nat
→
else
True
∧
6 ≤? j%nat
→
lookupTAtom"chk1" e = SomeWPtrmkPtrb + 8 Objb
else
True
∧
8 ≤? j%nat
→
else
True
∧
∃ v  ,
7 ≤? j%nat
→
True
else
v = 0
∧
∃S, nodeb if 3 ≤? j%nat then h else null v ** lsth xs%hS m

What holds at point k of ls_points besides the input: nothing before the loop; on the edge back, the list from v12 and the next index v21; in the loop, ls_body, with the comparison v10 at the branch; at the exit and the call, the list from pr.1; after the call, sum's result v23 an integer.

344Definition ls_assertk : nat e : env m : mem : Prop ≔
match k with
0%nat | 1%nat | 2%nat
⇒
True
3%nat
⇒
∃h i xs, lookupTAtom"v12" e = SomeWPtrh ∧ lookupTAtom"v21" e = SomeWInti ∧ ∃S, lsth xs S m
4%nat | 6%nat
⇒
ls_body0 e m
5%nat
⇒
int_ate TAtom"v10" any ∧ ls_body0 e m
16%nat | 17%nat
⇒
∃h xs, lookupTAtom"pr.1" e = SomeWPtrh ∧ ∃S, lsth xs S m
18%nat
⇒
_
⇒
ls_bodyk − 7 e m

A configuration running listsum with no caller: at point k, with no locals and no doom, the input v0 an integer, and the assertion of k.

359Definition ls_herec : config : Prop ≔
∃k pt e, c = mkConfigmkFramelistsum_fn e [ ] None pt [ ] c_memc c_fuelc ∧ nth_errorls_points k = Somept ∧ int_ate TAtom"v0" any ∧ ls_assertk e c_memc

listsum suspended in its call of sum, with the environment e: it resumes before its return, reading the result into v23.

365Definition ls_callere : env : frame × pending ≔

The configuration invariant: live objects do not overlap, and either listsum runs with no caller, or sum runs, with the empty frame, above listsum suspended in its call.

372Definition ls_invc : config : Prop ≔

Facts listsum's steps read

sum is the module's function of that name.

379Lemma ls_find_direct_sum
Explore proof 2 tactics

Initial goal

vm_compute

⊢
SomeDefinedfn_name ≔ TAtom"sum"; fn_linkage ≔ TAtom"export"; fn_ret ≔ RClassL; fn_params ≔ P, TAtom"v0"; fn_blocks ≔ b_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3"; b_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; b_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3"; b_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" = SomeDefinedfn_name ≔ TAtom"sum"; fn_linkage ≔ TAtom"export"; fn_ret ≔ RClassL; fn_params ≔ P, TAtom"v0"; fn_blocks ≔ b_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3"; b_label ≔ TAtom"L3"; b_phis ≔ PhiTAtom"pr.2" L TAtom"L4", TmpTAtom"v13"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L4", TmpTAtom"v15"; TAtom"start", TmpTAtom"v0"; b_insts ≔ LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0; b_jump ≔ JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5"; b_label ≔ TAtom"L4"; b_phis ≔ [ ]; b_insts ≔ FlightTAtom"v11" Add FAddressTmpTAtom"pr.1"; FValueConst8 LowerOfTmpTAtom"pr.1"; LetTAtom"chk0" A Check0 8 Read 1 TmpTAtom"v11"; LetTAtom"v12" L RawLoadLdL 0 TmpTAtom"chk0"; LetTAtom"v13" L Add TmpTAtom"pr.2"; TmpTAtom"v12"; LetTAtom"chk1" A HalfCheckLower 0 8 Read 8 TmpTAtom"chk0"; TmpTAtom"pr.1"; LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1"; b_jump ≔ JGotoPollTAtom"L3"; b_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

The point listsum resumes at after its call.

383Lemma ls_L7_1
ls_atlistsum_fn "L7" 1 = ExecTAtom"L7" [ ] JRetTmpTAtom"v23"
Explore proof 2 tactics

Initial goal

⊢
ls_atlistsum_fn "L7" 1 = ExecTAtom"L7" [ ] JRetTmpTAtom"v23"

vm_compute

⊢
ExecTAtom"L7" [ ] JRetTmpTAtom"v23" = ExecTAtom"L7" [ ] JRetTmpTAtom"v23"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

The initial memory holds no object.

387Lemma ls_mem_regions
Explore proof 2 tactics

Initial goal

⊢

vm_compute

⊢
[ ] = [ ]

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

A node's region, inside the address space.

391Lemma node_star_facts
∀ b x v R S m
nodeb x v ** R%hS m
object_regionb m_regionsm = SomemkRegionb b + 16 Heap Live ∧ b + 16 ≤ 2 ^ 48
Explore proof 7 tactics

Initial goal

⊢
∀b : Z x : ptr v : Z R : hprop S : fp m : mem, objects_fitm_regionsm → nodeb x v ** R%hS m → object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ b + 16 ≤ 2 ^ 48

intros b x v R S m Hfit H

b :
Z
x :
v :
Z
S :
m :
H :
nodeb x v ** R%hS m
⊢
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ b + 16 ≤ 2 ^ 48

destruct star_elim_l_ _ _ _ H as S1 & H1

b :
Z
x :
v :
Z
S :
m :
H :
nodeb x v ** R%hS m
S1 :
H1 :
nodeb x v S1 m
⊢
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ b + 16 ≤ 2 ^ 48

pose proof node_region_ _ _ _ _ H1 as Hr

b :
Z
x :
v :
Z
S :
m :
H :
nodeb x v ** R%hS m
S1 :
H1 :
nodeb x v S1 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
⊢
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ b + 16 ≤ 2 ^ 48

split ; exact Hr |

b :
Z
x :
v :
Z
S :
m :
H :
nodeb x v ** R%hS m
S1 :
H1 :
nodeb x v S1 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
⊢
b + 16 ≤ 2 ^ 48

destruct Hfit_ _ Hr

b :
Z
x :
v :
Z
S :
m :
H :
nodeb x v ** R%hS m
S1 :
H1 :
nodeb x v S1 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
H0 :
0 ≤ b
H2 :
r_endr_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ≤ 2 ^ 48
⊢
b + 16 ≤ 2 ^ 48

cbn in *

b :
Z
x :
v :
Z
S :
m :
H :
nodeb x v ** R%hS m
S1 :
H1 :
nodeb x v S1 m
Hr :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
H0 :
0 ≤ b
H2 :
b + 16 ≤ 281474976710656
⊢
b + 16 ≤ 281474976710656

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b x v R S m Hfit H
destruct star_elim_l_ _ _ _ H as S1 & H1
pose proof node_region_ _ _ _ _ H1 as Hr
split ; exact Hr |
destruct Hfit_ _ Hr
cbn in *
lia

The list after a node is 0 or inside the address space.

399Lemma node_lst_range
∀ b x v h xs S m
nodeb x v ** lsth xs%hS m
0 ≤ ptr_addrh < 2 ^ 64
Explore proof 4 tactics

Initial goal

⊢
∀b : Z x : ptr v : Z h : ptr xs : listZ S : fp m : mem, objects_fitm_regionsm → nodeb x v ** lsth xs%hS m → 0 ≤ ptr_addrh < 2 ^ 64

intros b x v h xs S m Hfit H

b :
Z
x :
v :
Z
h :
xs :
listZ
S :
m :
H :
nodeb x v ** lsth xs%hS m
⊢
0 ≤ ptr_addrh < 2 ^ 64

destruct star_elim_r_ _ _ _ H as S2 & H2

b :
Z
x :
v :
Z
h :
xs :
listZ
S :
m :
H :
nodeb x v ** lsth xs%hS m
S2 :
H2 :
lsth xs S2 m
⊢
0 ≤ ptr_addrh < 2 ^ 64

pose proof lst_range_ _ _ _ Hfit H2

b :
Z
x :
v :
Z
h :
xs :
listZ
S :
m :
H :
nodeb x v ** lsth xs%hS m
S2 :
H2 :
lsth xs S2 m
H0 :
0 ≤ ptr_addrh < 2 ^ 48
⊢
0 ≤ ptr_addrh < 2 ^ 64

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b x v h xs S m Hfit H
destruct star_elim_r_ _ _ _ H as S2 & H2
pose proof lst_range_ _ _ _ Hfit H2
lia

A fresh node's base is positive, 16-aligned, and ends at or below 2^64.

408Lemma fresh_node
∀ m b
freshm heap_req16 16 b
0 < b ∧ b mod 16 = 0 ∧ b + 16 ≤ 2 ^ 64
Explore proof 3 tactics

Initial goal

⊢
∀m : mem b : Z, freshm heap_req16 16 b → 0 < b ∧ b mod 16 = 0 ∧ b + 16 ≤ 2 ^ 64

intros m b H0 & H1 & H2 & _

m :
b :
Z
H0 :
0 < b
H1 :
b mod req_alignheap_req16 16 = 0
H2 :
b + req_extentheap_req16 16 ≤ 2 ^ 64
⊢
0 < b ∧ b mod 16 = 0 ∧ b + 16 ≤ 2 ^ 64

cbn in *

m :
b :
Z
H0 :
0 < b
H1 :
b mod 16 = 0
H2 :
b + 16 ≤ 18446744073709551616
⊢
0 < b ∧ b mod 16 = 0 ∧ b + 16 ≤ 18446744073709551616

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros m b H0 & H1 & H2 & _
cbn in *
auto

A node at a 16-aligned address and the rest make a list.

412Lemma lst_cons_intro16
∀ b h v xs S m
0 < b
b mod 16 = 0
nodeb h v ** lsth xs%hS m
lstmkPtrb Objb v :: xs S m
Explore proof 4 tactics

Initial goal

⊢
∀b : Z h : ptr v : Z xs : listZ S : fp m : mem, 0 < b → b mod 16 = 0 → nodeb h v ** lsth xs%hS m → lstptr_addr ≔ b; ptr_cap ≔ Objb v :: xs S m

intros b h v xs S m Hb Hm

b :
Z
h :
v :
Z
xs :
listZ
S :
m :
Hb :
0 < b
Hm :
b mod 16 = 0
⊢
nodeb h v ** lsth xs%hS m → lstptr_addr ≔ b; ptr_cap ≔ Objb v :: xs S m

apply lst_cons_intro ; exact Hb |

b :
Z
h :
v :
Z
xs :
listZ
S :
m :
Hb :
0 < b
Hm :
b mod 16 = 0
⊢
b mod 8 = 0

Z.to_euclidean_division_equations

b :
Z
h :
v :
Z
xs :
listZ
S :
m :
Hb :
0 < b
r0 :
Z
Hm :
r0 = 0
q, r :
Z
H :
8 ≠ 0 → b = 8 × q + r
H0 :
0 < 8 → 0 ≤ r < 8
H1 :
8 < 0 → 8 < r ≤ 0
H2 :
8 = 0 → q = 0
H3 :
8 = 0 → r = b
q0 :
Z
H4 :
16 ≠ 0 → b = 16 × q0 + r0
H5 :
0 < 16 → 0 ≤ r0 < 16
H6 :
16 < 0 → 16 < r0 ≤ 0
H7 :
16 = 0 → q0 = 0
H8 :
16 = 0 → r0 = b
⊢
r = 0

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b h v xs S m Hb Hm
apply lst_cons_intro ; exact Hb |
Z.to_euclidean_division_equations
lia

The step from sum's return into listsum, resumed with the result in v23.

418Lemma return_to_listsum
∀ fr e x m fuel
fr_localsfr = [ ]
return_stepmkConfigfr ls_callere m fuel RetWIntx = NextmkConfigmkFramelistsum_fn putTAtom"v23" WIntx mod 2 ^ 64 e [ ] None ExecTAtom"L7" [ ] JRetTmpTAtom"v23" [ ] m fuel
Explore proof 4 tactics

Initial goal

⊢
∀fr : frame e : env x : Z m : mem fuel : Z, fr_localsfr = [ ] → return_stepc_frame ≔ fr; c_callers ≔ ls_callere; c_mem ≔ m; c_fuel ≔ fuel RetWIntx = Nextc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

intros f e0 l d p e x m fuel H

f :
e0 :
l :
listname × optionZ
d :
optionreason
e :
x :
Z
m :
fuel :
Z
H :
fr_localsfr_fn ≔ f; fr_env ≔ e0; fr_locals ≔ l; fr_doomed ≔ d; fr_at ≔ p = [ ]
⊢
return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e0; fr_locals ≔ l; fr_doomed ≔ d; fr_at ≔ p; c_callers ≔ ls_callere; c_mem ≔ m; c_fuel ≔ fuel RetWIntx = Nextc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

cbn in H

f :
e0 :
l :
listname × optionZ
d :
optionreason
e :
x :
Z
m :
fuel :
Z
H :
l = [ ]
⊢
return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e0; fr_locals ≔ l; fr_doomed ≔ d; fr_at ≔ p; c_callers ≔ ls_callere; c_mem ≔ m; c_fuel ≔ fuel RetWIntx = Nextc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

subst l

f :
e0 :
d :
optionreason
e :
x :
Z
m :
fuel :
Z
⊢
return_stepc_frame ≔ fr_fn ≔ f; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ d; fr_at ≔ p; c_callers ≔ ls_callere; c_mem ≔ m; c_fuel ≔ fuel RetWIntx = Nextc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros f e0 l d p e x m fuel H
cbn in H
subst l
reflexivity

safe_step for an invariant is safe_step for a weaker one.

425Lemma safe_step_mono
∀ I J : config → Prop m r
∀c, Ic → Jc
Explore proof 6 tactics

Initial goal

⊢
∀I J : config → Prop m : mem r : step_result, ∀c : config, Ic → Jc → safe_stepI m r → safe_stepJ m r

intros I J m r H Hs

I, J :
config → Prop
m :
H :
∀c : config, Ic → Jc
Hs :
⊢

destruct r as c | o | q k | why ; cbn in * ; auto

I, J :
config → Prop
m :
k :
Z → config
H :
∀c : config, Ic → Jc
Hs :
0 ≤ req_extentq ∧ ∀base : Z, freshm q base → Ikbase
⊢
0 ≤ req_extentq ∧ ∀base : Z, freshm q base → Jkbase

destruct Hs as He Hk

I, J :
config → Prop
m :
k :
Z → config
H :
∀c : config, Ic → Jc
He :
0 ≤ req_extentq
Hk :
∀base : Z, freshm q base → Ikbase
⊢
0 ≤ req_extentq ∧ ∀base : Z, freshm q base → Jkbase

split ; exact He |

I, J :
config → Prop
m :
k :
Z → config
H :
∀c : config, Ic → Jc
He :
0 ≤ req_extentq
Hk :
∀base : Z, freshm q base → Ikbase
⊢
∀base : Z, freshm q base → Jkbase

intros base Hf

I, J :
config → Prop
m :
k :
Z → config
H :
∀c : config, Ic → Jc
He :
0 ≤ req_extentq
Hk :
∀base : Z, freshm q base → Ikbase
base :
Z
Hf :
freshm q base
⊢
Jkbase

apply H , Hk , Hf

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros I J m r H Hs
destruct r as c | o | q k | why ; cbn in * ; auto
destruct Hs as He Hk
split ; exact He |
intros base Hf
apply H , Hk , Hf

Add to the context the region of a node the assertion owns.

432Ltac ls_facts Hfit ≔
try match goal withH : node?b _ _ ** _%h_ _ |- _⇒destruct node_star_facts_ _ _ _ _ _ Hfit H as ? & ?end

The point of the next configuration is point n of ls_points or a later one.

438Ltac ls_find pt n ≔
lazymatch n with19%nat⇒fail_⇒first assert Hpt : nth_errorls_points n = Somept by vm_compute ; reflexivity ; exists n, pt | ls_find pt Snend

Turn the separation-logic hypotheses into what the next point's assertion needs, from the memory the next configuration has: the empty list at the loop's entry; the new node beside the list after the allocation; the node's next slot after the pointer store, and its value after the store of the long; the list one longer on the edge back; the empty frame at the call.

452Ltac ls_prep Hfit Hd ≔
try match goal with|- context [lst_ _ _ ?m]⇒pose proof lst_nilmend;try match goal withHf : fresh?m _ ?b , H : lst?h ?xs ?S ?m |- _⇒pose proof alloc_framem b lsth xs S Hf lst_stable_ _ lst_registered_ _ Hend;try match goal withH : node?b null 0 ** lst?h ?xs%h?S ?m |- context [store_aux?m ?b _]⇒pose proof node_store_nextm b null h 0 lsth xs S Hd lst_stable_ _ node_lst_range_ _ _ _ _ _ _ Hfit H Hend;try match goal withH : node?b ?h 0 ** lst?h ?xs%h?S ?m , Hx : 0 ≤ ?x < _ |- context [store_bytes?m ?b + 8 8 ?x]⇒pose proof node_store_valuem b h 0 x lsth xs S Hd lst_stable_ _ Hx Hend;try match goal withH : node?b ?h ?v ** lst?h ?xs%h?S ?m , Hb : 0 < ?b , Hm : ?b mod 16 = 0 |- _⇒pose proof lst_cons_intro16b h v xs S m Hb Hm Hend;try match goal withH : lst?h ?xs ?S ?m |- context [_ ** emp%h]⇒pose proof star_emp_r_ _ _ Hend

The memory after the step keeps live objects apart: it is the same, a store's, or an allocation's at a fresh base.

468Ltac ls_disjoint Hd ≔
first|exact Hd|exact live_disjoint_same_ _ eq_refl Hd|match goal withHf : fresh_ _ _ |- _⇒exact live_disjoint_allocated_ _ _ Hd Hf ltac:cbn ; liaend

The next configuration is in ls_inv: listsum at its point, or, after the call, sum at its entry with listsum suspended.

475Ltac ls_next Hfit Hd ≔
cbv beta iota ; unfold ls_inv ; cbn [ c_mem ] ; split ; ls_disjoint Hd | ;first|left ; unfold ls_here;match goal with|- ∃k pt e, mkConfigmkFrame_ _ _ _ ?pt′ _ _ _ = _ ∧ _⇒ls_find pt′ 0%natend;eexists;split;|subst ; reflexivity|;split;|assumption|;cbn [ c_mem ];split;|solve show_facts|;cbn [ ls_assert Nat.sub ];try unfold ls_body;cbn [ Nat.leb Nat.eqb ];ls_prep Hfit Hd;solve show_facts ; eassumption|right ; eexists ; split ; unfold sum_at ; exists 0%nat, EnterTAtom"start" None ; eexists ; split ; subst ; reflexivity | ; split ; reflexivity | ; cbn [ sum_assert c_mem lookup ] ; rewrite ?term_eqb_refl ; ls_prep Hfit Hd ; solve show_facts ; eassumption | solve show_facts

An allocation's result is safe: its extent is nonnegative, and every fresh base gives a configuration in ls_inv.

492Ltac ls_fresh Hfit Hd ≔
split ; cbv ; discriminate | ; intros ?base ?Hfresh ; destruct fresh_node_ _ Hfresh as ? & ? & ? ; ls_next Hfit Hd

One point of ls_here_safe: as sum_point.

497Ltac ls_point pts Hk Ha Hfit Hd ≔
cbv in Hk ; injection Hk as ← ; clear pts ; cbn [ ls_assert Nat.sub ] in Ha ; try unfold ls_body in Ha ; cbn [ Nat.leb Nat.eqb ] in Ha ; unfold int_at in * ; facts;repeat match goal withH : ?v = 0 |- _⇒is_var v ; subst vend;ls_facts Hfit;remember step_ _ as r eqn: E;step_reduce E;subst r;cbn [ safe_step ];solve intro ; assumption | ls_next Hfit Hd | ls_fresh Hfit Hd

One step of listsum with no caller is safe_step for ls_inv, in any genv whose sum is the module's.

Explore proof 21 tactics

Initial goal

intros ge c Hfd Hd Hfit k & pt & e & Ec & Hk & Hv0 & Ha

ge :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :

rewrite Ec

ge :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :
⊢
safe_stepls_inv c_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc stepge c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc

clear Ec

ge :
k :
nat
pt :
e :
Hk :
nth_errorls_points k = Somept
Hv0 :
⊢
safe_stepls_inv c_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc stepge c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc

cbn [ c_mem ] in *

ge :
k :
nat
pt :
e :
Hk :
nth_errorls_points k = Somept
Hv0 :
⊢
safe_stepls_inv c_memc stepge c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc

set m := c_memc in *

ge :
m :=
k :
nat
pt :
e :
Hk :
nth_errorls_points k = Somept
Hv0 :
Ha :
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ c_fuelc

set fuel := c_fuelc in *

ge :
m :=
k :
nat
pt :
e :
Hk :
nth_errorls_points k = Somept
Hv0 :
Ha :
fuel :=
c_fuelc : Z
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

clearbody m fuel

ge :
m :
k :
nat
pt :
e :
Hk :
nth_errorls_points k = Somept
Hv0 :
Ha :
fuel :
Z
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

set pts := ls_points in Hk

ge :
m :
k :
nat
pt :
e :
pts :=
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

vm_compute in pts

ge :
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

remember listsum_fn as f eqn: Hf

ge :
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
f :
Hf :
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

remember sum_fn as fs eqn: Hfs in Hfd |- *

ge :
fs :
Hfs :
fs = sum_fn
Hfd :
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
f :
Hf :
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

assert Hff : find_fnge TAtom"sum" = SomeDefinedfs by unfold find_fn ; rewrite Hfd ; reflexivity

ge :
fs :
Hfs :
fs = sum_fn
Hfd :
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
f :
Hf :
Hff :
find_fnge TAtom"sum" = SomeDefinedfs
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

clear Hfd

ge :
fs :
Hfs :
fs = sum_fn
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
f :
Hf :
Hff :
find_fnge TAtom"sum" = SomeDefinedfs
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

assert Hcf : ∀x rest, call_framefs x :: rest = SomemkFramefs TAtom"v0", x [ ] None EnterTAtom"start" None by subst fs ; exact sum_call_frame

ge :
fs :
Hfs :
fs = sum_fn
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
f :
Hf :
Hff :
find_fnge TAtom"sum" = SomeDefinedfs
Hcf :
∀x : word rest : listword, call_framefs x :: rest = Somefr_fn ≔ fs; fr_env ≔ TAtom"v0", x; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

block_fact f listsum_fn Hf TAtom"start" b0 Hb0

ge :
fs :
Hfs :
fs = sum_fn
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
f :
Hf :
Hff :
find_fnge TAtom"sum" = SomeDefinedfs
Hcf :
∀x : word rest : listword, call_framefs x :: rest = Somefr_fn ≔ fs; fr_env ≔ TAtom"v0", x; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L4" : optionblock
Hb0 :
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

block_fact f listsum_fn Hf TAtom"L4" b4 Hb4

ge :
fs :
Hfs :
fs = sum_fn
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
f :
Hf :
Hff :
find_fnge TAtom"sum" = SomeDefinedfs
Hcf :
∀x : word rest : listword, call_framefs x :: rest = Somefr_fn ≔ fs; fr_env ≔ TAtom"v0", x; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L4" : optionblock
Hb0 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ PhiTAtom"pr.2" W TAtom"L5", TmpTAtom"v21"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L5", TmpTAtom"v12"; TAtom"start", Const0; b_insts ≔ LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0"; b_jump ≔ JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" : optionblock
Hb4 :
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

block_fact f listsum_fn Hf TAtom"L5" b5 Hb5

ge :
fs :
Hfs :
fs = sum_fn
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
f :
Hf :
Hff :
find_fnge TAtom"sum" = SomeDefinedfs
Hcf :
∀x : word rest : listword, call_framefs x :: rest = Somefr_fn ≔ fs; fr_env ≔ TAtom"v0", x; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L4" : optionblock
Hb0 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ PhiTAtom"pr.2" W TAtom"L5", TmpTAtom"v21"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L5", TmpTAtom"v12"; TAtom"start", Const0; b_insts ≔ LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0"; b_jump ≔ JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" : optionblock
Hb4 :
Hb5 :
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

block_fact f listsum_fn Hf TAtom"L7" b7 Hb7

ge :
fs :
Hfs :
fs = sum_fn
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
f :
Hf :
Hff :
find_fnge TAtom"sum" = SomeDefinedfs
Hcf :
∀x : word rest : listword, call_framefs x :: rest = Somefr_fn ≔ fs; fr_env ≔ TAtom"v0", x; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L4" : optionblock
Hb0 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ PhiTAtom"pr.2" W TAtom"L5", TmpTAtom"v21"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L5", TmpTAtom"v12"; TAtom"start", Const0; b_insts ≔ LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0"; b_jump ≔ JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" : optionblock
Hb4 :
Hb5 :
b7 :=
Someb_label ≔ TAtom"L7"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1"; b_jump ≔ JRetTmpTAtom"v23" : optionblock
Hb7 :
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

assert Hret : fn_retf = RClassL by rewrite Hf ; reflexivity

ge :
fs :
Hfs :
fs = sum_fn
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts k = Somept
Hv0 :
Ha :
fuel :
Z
f :
Hf :
Hff :
find_fnge TAtom"sum" = SomeDefinedfs
Hcf :
∀x : word rest : listword, call_framefs x :: rest = Somefr_fn ≔ fs; fr_env ≔ TAtom"v0", x; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L4" : optionblock
Hb0 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ PhiTAtom"pr.2" W TAtom"L5", TmpTAtom"v21"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L5", TmpTAtom"v12"; TAtom"start", Const0; b_insts ≔ LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0"; b_jump ≔ JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" : optionblock
Hb4 :
Hb5 :
b7 :=
Someb_label ≔ TAtom"L7"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1"; b_jump ≔ JRetTmpTAtom"v23" : optionblock
Hb7 :
Hret :
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

do 19 destruct k as | k ; ls_point pts Hk Ha Hfit Hd |

ge :
fs :
Hfs :
fs = sum_fn
m :
k :
nat
pt :
e :
pts :=
EnterTAtom"start" None; ExecTAtom"start" [ ] JGotoToTAtom"L4"; EnterTAtom"L4" SomeTAtom"start"; EnterTAtom"L4" SomeTAtom"L5"; ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7"; EnterTAtom"L5" SomeTAtom"L4"; ExecTAtom"L5" LetTAtom"v12" P Alloc16 Const16; LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk0" A Check0 8 Write 8 TmpTAtom"v12"; RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStorePointer0 TmpTAtom"pr.1" TmpTAtom"chk0" AuxEnsure; LowerBarrier; RootedReload; LowerWrite; AddressWrite; FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" FlightTAtom"v16" Add FAddressTmpTAtom"v12"; FValueConst8 LowerOfTmpTAtom"v12"; LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v18" L ExtSw TmpTAtom"pr.2"; LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"chk1" A HalfCheckUpper 0 8 Write 1 TmpTAtom"chk0"; TmpTAtom"v16"; RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4"; ExecTAtom"L5" [ ] JGotoPollTAtom"L4"; EnterTAtom"L7" SomeTAtom"L4"; ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23"; ExecTAtom"L7" [ ] JRetTmpTAtom"v23" : listpoint
Hk :
nth_errorpts SSSSSSSSSSSSSSSSSSSk = Somept
Hv0 :
Ha :
ls_assertSSSSSSSSSSSSSSSSSSSk e m
fuel :
Z
f :
Hf :
Hff :
find_fnge TAtom"sum" = SomeDefinedfs
Hcf :
∀x : word rest : listword, call_framefs x :: rest = Somefr_fn ≔ fs; fr_env ≔ TAtom"v0", x; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None
b0 :=
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L4" : optionblock
Hb0 :
b4 :=
Someb_label ≔ TAtom"L4"; b_phis ≔ PhiTAtom"pr.2" W TAtom"L5", TmpTAtom"v21"; TAtom"start", Const0; PhiTAtom"pr.1" P TAtom"L5", TmpTAtom"v12"; TAtom"start", Const0; b_insts ≔ LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0"; b_jump ≔ JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" : optionblock
Hb4 :
Hb5 :
b7 :=
Someb_label ≔ TAtom"L7"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1"; b_jump ≔ JRetTmpTAtom"v23" : optionblock
Hb7 :
Hret :
⊢
safe_stepls_inv m stepge c_frame ≔ fr_fn ≔ f; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ fuel

destruct k ; discriminate Hk

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge c Hfd Hd Hfit k & pt & e & Ec & Hk & Hv0 & Ha
rewrite Ec
clear Ec
cbn [ c_mem ] in *
set m := c_memc in *
set fuel := c_fuelc in *
clearbody m fuel
set pts := ls_points in Hk
vm_compute in pts
remember listsum_fn as f eqn: Hf
remember sum_fn as fs eqn: Hfs in Hfd |- *
assert Hff : find_fnge TAtom"sum" = SomeDefinedfs by unfold find_fn ; rewrite Hfd ; reflexivity
clear Hfd
assert Hcf : ∀x rest, call_framefs x :: rest = SomemkFramefs TAtom"v0", x [ ] None EnterTAtom"start" None by subst fs ; exact sum_call_frame
block_fact f listsum_fn Hf TAtom"start" b0 Hb0
block_fact f listsum_fn Hf TAtom"L4" b4 Hb4
block_fact f listsum_fn Hf TAtom"L5" b5 Hb5
block_fact f listsum_fn Hf TAtom"L7" b7 Hb7
assert Hret : fn_retf = RClassL by rewrite Hf ; reflexivity
do 19 destruct k as | k ; ls_point pts Hk Ha Hfit Hd |
destruct k ; discriminate Hk

One step from any configuration of ls_inv is safe_step: listsum's own, or sum's by its specification with the empty frame, where a return resumes listsum after its call.

Explore proof 22 tactics

Initial goal

intros ge c Hfd Hd Hh | e & Hs & Hv0 Hfit

2 open

focused goal

–exact ls_here_safege c Hfd Hd Hfit Hh

deferred goal

–destruct sum_stepge emp _ c Hfit Hs as x & S & E & _ | Hsafe

2 open

focused goal

+rewrite E

2 open

deferred goal

destruct Hs as k & pt & e′ & Ec & _

2 open

ge :
e :
k :
nat
pt :
e′ :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e′; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ ls_callere; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hv0 :
x :
Z
S :
deferred goal

rewrite Ec , return_to_listsum by reflexivity

2 open

ge :
e :
k :
nat
pt :
e′ :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e′; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ ls_callere; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hv0 :
x :
Z
S :
⊢
safe_stepls_inv c_memc_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e′; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ ls_callere; c_mem ≔ c_memc; c_fuel ≔ c_fuelc Nextc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
deferred goal

cbn [ safe_step ]

2 open

ge :
e :
k :
nat
pt :
e′ :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e′; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ ls_callere; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hv0 :
x :
Z
S :
⊢
ls_invc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
deferred goal

split ; exact Hd |

2 open

ge :
e :
k :
nat
pt :
e′ :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e′; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ ls_callere; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hv0 :
x :
Z
S :
⊢
ls_herec_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any
deferred goal

left

2 open

ge :
e :
k :
nat
pt :
e′ :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e′; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ ls_callere; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hv0 :
x :
Z
S :
⊢
ls_herec_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
deferred goal

unfold int_at in Hv0

2 open

ge :
e :
k :
nat
pt :
e′ :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e′; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ ls_callere; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hv0 :
∃v : Z, lookupTAtom"v0" e = SomeWIntv ∧ anyv
x :
Z
S :
⊢
ls_herec_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
deferred goal

destruct Hv0 as n & Hn & _

2 open

ge :
e :
k :
nat
pt :
e′ :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e′; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ ls_callere; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
n :
Z
Hn :
lookupTAtom"v0" e = SomeWIntn
x :
Z
S :
⊢
ls_herec_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
deferred goal

exists 18%nat, ExecTAtom"L7" [ ] JRetTmpTAtom"v23", putTAtom"v23" WIntx mod 2 ^ 64 e

2 open

ge :
e :
k :
nat
pt :
e′ :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e′; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ ls_callere; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
n :
Z
Hn :
lookupTAtom"v0" e = SomeWIntn
x :
Z
S :
⊢
c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc; c_fuel ≔ c_fuelc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc ∧ nth_errorls_points 18 = SomeExecTAtom"L7" [ ] JRetTmpTAtom"v23" ∧ int_atputTAtom"v23" WIntx mod 2 ^ 64 e TAtom"v0" any ∧ ls_assert18 putTAtom"v23" WIntx mod 2 ^ 64 e c_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
deferred goal

split ; reflexivity |

2 open

ge :
e :
k :
nat
pt :
e′ :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e′; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ ls_callere; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
n :
Z
Hn :
lookupTAtom"v0" e = SomeWIntn
x :
Z
S :
⊢
nth_errorls_points 18 = SomeExecTAtom"L7" [ ] JRetTmpTAtom"v23" ∧ int_atputTAtom"v23" WIntx mod 2 ^ 64 e TAtom"v0" any ∧ ls_assert18 putTAtom"v23" WIntx mod 2 ^ 64 e c_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
deferred goal

split ; vm_compute ; reflexivity |

2 open

ge :
e :
k :
nat
pt :
e′ :
Ec :
c = c_frame ≔ fr_fn ≔ sum_fn; fr_env ≔ e′; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ ls_callere; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
n :
Z
Hn :
lookupTAtom"v0" e = SomeWIntn
x :
Z
S :
⊢
int_atputTAtom"v23" WIntx mod 2 ^ 64 e TAtom"v0" any ∧ ls_assert18 putTAtom"v23" WIntx mod 2 ^ 64 e c_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ putTAtom"v23" WIntx mod 2 ^ 64 e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
deferred goal

split ; show_facts | cbn [ ls_assert ] ; show_facts

deferred goal

+revert Hsafe

apply safe_step_mono

intros c′ Hc′ Em

split ; rewrite Em ; exact Hd |

⊢
ls_herec′ ∨ ∃e0 : env, sum_atemp ls_callere0 c′ ∧ int_ate0 TAtom"v0" any

right

⊢
∃e0 : env, sum_atemp ls_callere0 c′ ∧ int_ate0 TAtom"v0" any

exists e

split ; assumption

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros ge c Hfd Hd Hh | e & Hs & Hv0 Hfit
–exact ls_here_safege c Hfd Hd Hfit Hh
–destruct sum_stepge emp _ c Hfit Hs as x & S & E & _ | Hsafe
+rewrite E
destruct Hs as k & pt & e′ & Ec & _
rewrite Ec , return_to_listsum by reflexivity
cbn [ safe_step ]
split ; exact Hd |
left
unfold int_at in Hv0
destruct Hv0 as n & Hn & _
exists 18%nat, ExecTAtom"L7" [ ] JRetTmpTAtom"v23", putTAtom"v23" WIntx mod 2 ^ 64 e
split ; reflexivity |
split ; vm_compute ; reflexivity |
split ; show_facts | cbn [ ls_assert ] ; show_facts
+revert Hsafe
intros c′ Hc′ Em
split ; rewrite Em ; exact Hd |
right
exists e
split ; assumption

The poll on the back edge leaves the list alone: a safepoint keeps ls_inv, given that it keeps live objects apart, for listsum's points as for sum's (sum_safepoint).

Explore proof 18 tactics

Initial goal

⊢
∀c : config m′ : mem, ls_invc → live_disjointm′ → same_regionsc_memc m′ → m_bytesm′ = m_bytesc_memc → aux_movesc_memc m′ → ls_invc_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc

intros c m′ _ Hh | e & Hs & Hv0 Hd′ Hr Hb Hx ; split ; exact Hd′ | | exact Hd′ |

2 open

m′ :
Hh :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e : env, sum_atemp ls_callere c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate TAtom"v0" any
focused goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

–left

2 open

m′ :
Hh :
Hd′ :
Hb :
Hx :
⊢
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

destruct Hh as k & pt & e & Ec & Hk & Hv0 & Ha

2 open

m′ :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :
Hd′ :
Hb :
Hx :
⊢
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

exists k, pt, e

2 open

m′ :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :
Hd′ :
Hb :
Hx :
⊢
c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc; c_fuel ≔ c_fuelc_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ nth_errorls_points k = Somept ∧ int_ate TAtom"v0" any ∧ ls_assertk e c_memc_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

split ; rewrite Ec ; reflexivity |

2 open

m′ :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :
Hd′ :
Hb :
Hx :
⊢
nth_errorls_points k = Somept ∧ int_ate TAtom"v0" any ∧ ls_assertk e c_memc_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

split ; exact Hk |

2 open

m′ :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :
Hd′ :
Hb :
Hx :
⊢
int_ate TAtom"v0" any ∧ ls_assertk e c_memc_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

split ; exact Hv0 |

2 open

m′ :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :
Hd′ :
Hb :
Hx :
⊢
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

cbn [ c_mem ]

2 open

m′ :
k :
nat
pt :
e :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ c_memc; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_assertk e m′
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

set m := c_memc in *

2 open

m′ :
k :
nat
pt :
e :
m :=
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :
Ha :
Hd′ :
Hr :
Hb :
Hx :
aux_movesm m′
⊢
ls_assertk e m′
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

clearbody m

2 open

m′ :
k :
nat
pt :
e :
m :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :
Ha :
Hd′ :
Hr :
Hb :
Hx :
aux_movesm m′
⊢
ls_assertk e m′
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

assert Hlt : k < lengthls_points%nat by apply nth_error_Some ; rewrite Hk ; discriminate

2 open

m′ :
k :
nat
pt :
e :
m :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :
Ha :
Hd′ :
Hr :
Hb :
Hx :
aux_movesm m′
Hlt :
k < Datatypes.lengthls_points%nat
⊢
ls_assertk e m′
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

vm_compute in Hlt

2 open

m′ :
k :
nat
pt :
e :
m :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points k = Somept
Hv0 :
Ha :
Hd′ :
Hr :
Hb :
Hx :
aux_movesm m′
Hlt :
Sk ≤ 19%nat
⊢
ls_assertk e m′
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

do 19 (destruct k as | k;|cbn [ ls_assert Nat.sub ] in Ha |- * ; try unfold ls_body in Ha |- * ; cbn [ Nat.leb Nat.eqb ] in Ha |- * ; unfold int_at in * ; facts;repeat match goal withH : ?v = 0 |- _⇒is_var v ; subst vend;sp_hyps m m′ emp_sp_stable Hr Hb Hx;show_facts;eassumption|)

2 open

m′ :
k :
nat
pt :
e :
m :
Ec :
c = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ pt; c_callers ≔ [ ]; c_mem ≔ m; c_fuel ≔ c_fuelc
Hk :
nth_errorls_points SSSSSSSSSSSSSSSSSSSk = Somept
Hv0 :
Ha :
ls_assertSSSSSSSSSSSSSSSSSSSk e m
Hd′ :
Hr :
Hb :
Hx :
aux_movesm m′
Hlt :
SSSSSSSSSSSSSSSSSSSSk ≤ 19%nat
⊢
ls_assertSSSSSSSSSSSSSSSSSSSk e m′
deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

lia

deferred goal
m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
ls_herec_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∨ ∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

–right

m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢
∃e0 : env, sum_atemp ls_callere0 c_frame ≔ c_framec; c_callers ≔ c_callersc; c_mem ≔ m′; c_fuel ≔ c_fuelc ∧ int_ate0 TAtom"v0" any

exists e

m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :
⊢

split ; | exact Hv0

m′ :
e :
Hv0 :
Hd′ :
Hb :
Hx :

exact sum_safepointemp _ c m′ emp_sp_stable Hs Hr Hb Hx

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros c m′ _ Hh | e & Hs & Hv0 Hd′ Hr Hb Hx ; split ; exact Hd′ | | exact Hd′ |
–left
destruct Hh as k & pt & e & Ec & Hk & Hv0 & Ha
exists k, pt, e
split ; rewrite Ec ; reflexivity |
split ; exact Hk |
split ; exact Hv0 |
cbn [ c_mem ]
set m := c_memc in *
clearbody m
assert Hlt : k < lengthls_points%nat by apply nth_error_Some ; rewrite Hk ; discriminate
vm_compute in Hlt
do 19 (destruct k as | k;|cbn [ ls_assert Nat.sub ] in Ha |- * ; try unfold ls_body in Ha |- * ; cbn [ Nat.leb Nat.eqb ] in Ha |- * ; unfold int_at in * ; facts;repeat match goal withH : ?v = 0 |- _⇒is_var v ; subst vend;sp_hyps m m′ emp_sp_stable Hr Hb Hx;show_facts;eassumption|)
lia
–right
exists e
split ; | exact Hv0
exact sum_safepointemp _ c m′ emp_sp_stable Hs Hr Hb Hx

A call with an integer first argument starts where ls_inv holds, with any fuel: the initial memory holds no object.

573Lemma ls_start
∀ n fuel
ls_invmkConfigmkFramelistsum_fn TAtom"v0", WIntn [ ] None EnterTAtom"start" None [ ] ls_mem fuel
Explore proof 11 tactics

Initial goal

⊢
∀n fuel : Z, ls_invc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel

intros n fuel

n, fuel :
Z
⊢
ls_invc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel

split

2 open

n, fuel :
Z
⊢
live_disjointc_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel
focused goal
n, fuel :
Z
⊢
ls_herec_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel ∨ ∃e : env, sum_atemp ls_callere c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel ∧ int_ate TAtom"v0" any

–intros b1 r1 b2 r2 E _

2 open

n, fuel, b1 :
Z
r1 :
b2 :
Z
r2 :
E :
object_regionb1 m_regionsc_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel = Somer1
⊢
live_atc_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel b2 r2 → b1 ≠ b2 → r_endr1 ≤ b2 ∨ r_endr2 ≤ b1
deferred goal
n, fuel :
Z
⊢
ls_herec_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel ∨ ∃e : env, sum_atemp ls_callere c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel ∧ int_ate TAtom"v0" any

cbn [ c_mem ] in E

2 open

n, fuel, b1 :
Z
r1 :
b2 :
Z
r2 :
⊢
live_atc_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel b2 r2 → b1 ≠ b2 → r_endr1 ≤ b2 ∨ r_endr2 ≤ b1
deferred goal
n, fuel :
Z
⊢
ls_herec_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel ∨ ∃e : env, sum_atemp ls_callere c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel ∧ int_ate TAtom"v0" any

rewrite ls_mem_regions in E

2 open

n, fuel, b1 :
Z
r1 :
b2 :
Z
r2 :
E :
object_regionb1 [ ] = Somer1
⊢
live_atc_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel b2 r2 → b1 ≠ b2 → r_endr1 ≤ b2 ∨ r_endr2 ≤ b1
deferred goal
n, fuel :
Z
⊢
ls_herec_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel ∨ ∃e : env, sum_atemp ls_callere c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel ∧ int_ate TAtom"v0" any

discriminate

deferred goal
n, fuel :
Z
⊢
ls_herec_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel ∨ ∃e : env, sum_atemp ls_callere c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel ∧ int_ate TAtom"v0" any

–left

n, fuel :
Z
⊢
ls_herec_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel

exists O, EnterTAtom"start" None, TAtom"v0", WIntn

n, fuel :
Z
⊢
c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel = c_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ c_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel; c_fuel ≔ c_fuelc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel ∧ nth_errorls_points 0 = SomeEnterTAtom"start" None ∧ int_atTAtom"v0", WIntn TAtom"v0" any ∧ ls_assert0 TAtom"v0", WIntn c_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel

split ; reflexivity |

n, fuel :
Z
⊢
nth_errorls_points 0 = SomeEnterTAtom"start" None ∧ int_atTAtom"v0", WIntn TAtom"v0" any ∧ ls_assert0 TAtom"v0", WIntn c_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel

split ; vm_compute ; reflexivity |

n, fuel :
Z
⊢
int_atTAtom"v0", WIntn TAtom"v0" any ∧ ls_assert0 TAtom"v0", WIntn c_memc_frame ≔ fr_fn ≔ listsum_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel

split ; exists n ; split ; reflexivity | exact I | exact I

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros n fuel
split
–intros b1 r1 b2 r2 E _
cbn [ c_mem ] in E
rewrite ls_mem_regions in E
discriminate
–left
exists O, EnterTAtom"start" None, TAtom"v0", WIntn
split ; reflexivity |
split ; vm_compute ; reflexivity |
split ; exists n ; split ; reflexivity | exact I | exact I

Over any runtime

listsum.c never panics under the runtime R.

587Module SepListSum R : Runtime

Panics.v's property over R.

590Module P ≔ Panics R

What a safepoint of R does (Pieces.v).

593Module SS ≔ SafepointShape R

listsum.c never panics: for every input whose first word is an integer, with any fuel, no state of its run fails, wherever its nodes are placed.

598Theorem listsum_never_panics
P.never_panicsls_module TAtom"listsum" λxs ⇒ ∃n rest, xs = WIntn :: rest
Explore proof 13 tactics

Initial goal

⊢
P.never_panicsls_module TAtom"listsum" λxs : listword ⇒ ∃n : Z rest : listword, xs = WIntn :: rest

apply P.never_panics_by_invariant_ _ _ ls_globals ls_mem listsum_fn ls_inv

5 open

focused goal
focused goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framelistsum_fn xs = Somefr ∧ ∀fuel : Z, ls_invc_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel
focused goal
⊢
∀c : config s : R.state, ls_invc → R.readys c_memc → safe_stepls_inv c_memc stepP.program_genvls_module ls_globals c
focused goal
⊢
∀c : config s s′ : R.state m′ : mem, ls_invc → R.readys c_memc → P.RM.safepoint_dueP.program_genvls_module ls_globals c = true → R.safepoints c_memc s′ m′ → ls_invP.RM.with_memc m′

–exact ls_initial

4 open

deferred goal
deferred goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framelistsum_fn xs = Somefr ∧ ∀fuel : Z, ls_invc_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel
deferred goal
⊢
∀c : config s : R.state, ls_invc → R.readys c_memc → safe_stepls_inv c_memc stepP.program_genvls_module ls_globals c
deferred goal
⊢
∀c : config s s′ : R.state m′ : mem, ls_invc → R.readys c_memc → P.RM.safepoint_dueP.program_genvls_module ls_globals c = true → R.safepoints c_memc s′ m′ → ls_invP.RM.with_memc m′

–apply ls_find_listsum

3 open

deferred goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framelistsum_fn xs = Somefr ∧ ∀fuel : Z, ls_invc_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel
deferred goal
⊢
∀c : config s : R.state, ls_invc → R.readys c_memc → safe_stepls_inv c_memc stepP.program_genvls_module ls_globals c
deferred goal
⊢
∀c : config s s′ : R.state m′ : mem, ls_invc → R.readys c_memc → P.RM.safepoint_dueP.program_genvls_module ls_globals c = true → R.safepoints c_memc s′ m′ → ls_invP.RM.with_memc m′

–intros xs n & rest & →

3 open

n :
Z
rest :
listword
⊢
∃fr : frame, call_framelistsum_fn WIntn :: rest = Somefr ∧ ∀fuel : Z, ls_invc_frame ≔ fr; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel
deferred goal
⊢
∀c : config s : R.state, ls_invc → R.readys c_memc → safe_stepls_inv c_memc stepP.program_genvls_module ls_globals c
deferred goal
⊢
∀c : config s s′ : R.state m′ : mem, ls_invc → R.readys c_memc → P.RM.safepoint_dueP.program_genvls_module ls_globals c = true → R.safepoints c_memc s′ m′ → ls_invP.RM.with_memc m′

eexists

4 open

n :
Z
rest :
listword
⊢
call_framelistsum_fn WIntn :: rest = Some?fr ∧ ∀fuel : Z, ls_invc_frame ≔ ?fr; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel
deferred goal
⊢
∀c : config s : R.state, ls_invc → R.readys c_memc → safe_stepls_inv c_memc stepP.program_genvls_module ls_globals c
deferred goal
⊢
∀c : config s s′ : R.state m′ : mem, ls_invc → R.readys c_memc → P.RM.safepoint_dueP.program_genvls_module ls_globals c = true → R.safepoints c_memc s′ m′ → ls_invP.RM.with_memc m′
shelved goal
n :
Z
rest :
listword

split ; apply listsum_call_frame |

3 open

n :
Z
rest :
listword
⊢
∀fuel : Z, ls_invc_frame ≔ fr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel
deferred goal
⊢
∀c : config s : R.state, ls_invc → R.readys c_memc → safe_stepls_inv c_memc stepP.program_genvls_module ls_globals c
deferred goal
⊢
∀c : config s s′ : R.state m′ : mem, ls_invc → R.readys c_memc → P.RM.safepoint_dueP.program_genvls_module ls_globals c = true → R.safepoints c_memc s′ m′ → ls_invP.RM.with_memc m′

intros fuel

3 open

n :
Z
rest :
listword
fuel :
Z
⊢
ls_invc_frame ≔ fr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None; c_callers ≔ [ ]; c_mem ≔ ls_mem; c_fuel ≔ fuel
deferred goal
⊢
∀c : config s : R.state, ls_invc → R.readys c_memc → safe_stepls_inv c_memc stepP.program_genvls_module ls_globals c
deferred goal
⊢
∀c : config s s′ : R.state m′ : mem, ls_invc → R.readys c_memc → P.RM.safepoint_dueP.program_genvls_module ls_globals c = true → R.safepoints c_memc s′ m′ → ls_invP.RM.with_memc m′

apply ls_start

2 open

deferred goal
⊢
∀c : config s : R.state, ls_invc → R.readys c_memc → safe_stepls_inv c_memc stepP.program_genvls_module ls_globals c
deferred goal
⊢
∀c : config s s′ : R.state m′ : mem, ls_invc → R.readys c_memc → P.RM.safepoint_dueP.program_genvls_module ls_globals c = true → R.safepoints c_memc s′ m′ → ls_invP.RM.with_memc m′

–intros c s Hc Hr

2 open

deferred goal
⊢
∀c : config s s′ : R.state m′ : mem, ls_invc → R.readys c_memc → P.RM.safepoint_dueP.program_genvls_module ls_globals c = true → R.safepoints c_memc s′ m′ → ls_invP.RM.with_memc m′

apply ls_safe ; exact ls_find_direct_sum | exact Hc | exact R.address_space_ _ Hr

deferred goal
⊢
∀c : config s s′ : R.state m′ : mem, ls_invc → R.readys c_memc → P.RM.safepoint_dueP.program_genvls_module ls_globals c = true → R.safepoints c_memc s′ m′ → ls_invP.RM.with_memc m′

–intros c s s′ m′ Hc _ _ Hsp

s, s′ :
R.state
m′ :
Hc :
Hsp :
R.safepoints c_memc s′ m′

destruct SS.safepoint_shape_ _ _ _ Hsp as Hr & Hb & Ha

s, s′ :
R.state
m′ :
Hc :
Hsp :
R.safepoints c_memc s′ m′
Hb :
Ha :

exact ls_safepointc m′ Hc SS.live_disjoint_safepoint_ _ _ _ Hsp proj1Hc Hr Hb Ha

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
–exact ls_initial
–intros xs n & rest & →
eexists
split ; apply listsum_call_frame |
intros fuel
apply ls_start
–intros c s Hc Hr
apply ls_safe ; exact ls_find_direct_sum | exact Hc | exact R.address_space_ _ Hr
–intros c s s′ m′ Hc _ _ Hsp
destruct SS.safepoint_shape_ _ _ _ Hsp as Hr & Hb & Ha
exact ls_safepointc m′ Hc SS.live_disjoint_safepoint_ _ _ _ Hsp proj1Hc Hr Hb Ha

The theorem for the interpreter's runtime.

613Module InterpSepListSum ≔ SepListSum InterpRuntime

listsum.c never panics under the interpreter's runtime.

616Theorem interp_listsum_never_panics
InterpSepListSum.P.never_panicsls_module TAtom"listsum" λxs ⇒ ∃n rest, xs = WIntn :: rest
Explore proof 1 tactics

Initial goal

⊢
InterpSepListSum.P.never_panicsls_module TAtom"listsum" λxs : listword ⇒ ∃n : Z rest : listword, xs = WIntn :: rest

exact InterpSepListSum.listsum_never_panics

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script