Fil-C on Nix

Filnix wiki

the formal campaign

rocq/spikes/IrisListSum.v

Spike: spikes/listsum.c proved never to panic through Iris, with the ghost heap and rules of IrisHeap.v, the same theorem the hand-rolled spike proves.

A node is the life of its 16-byte heap object, the aux slot of its next pointer and the 16 bytes of the next pointer's address and its value (node_ps); a list is a Fixpoint over the values (lst). sum gets one specification (sum_spec): from lst p xs, a call with any caller frame and callers stack is safe if the caller, resumed with any result and any fuel, is; that continuation is a resource the callee carries to its return (the rule for a call that the language, having no evaluation contexts, does not give). Each loop is a Löb induction at the point after its head's phis. Each step is computed as Symbolic.v computes one, without splitting a comparison and without generalising a wrap, so that the next configuration is a term the rule's existential frame can take.

From iris.proofmode Require Import proofmode
From iris.base_logic.lib Require Import gen_heap
From iris.program_logic Require Import language weakestpre
From Stdlib Require Import String ZArith Lia
From Nanofil Require Import Term Syntax Values Memory Runtime Ops Semantics Run Machine Panics Symbolic Pieces Heap
From Spike Require Import ListSum IrisLang IrisHeap
Open Scope Z_scope
Open Scope list_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).

The blocks, computed once

Block l of the function f, or an empty one.

38Definition blkf : func l : string : block ≔
Someb
⇒
b
None
⇒

sum's entry block.

45Definition sum_start: block ≔
Eval vm_compute in blkls_fn"sum" "start"

sum's loop head.

47Definition sum_L3: block ≔
Eval vm_compute in blkls_fn"sum" "L3"

sum's loop body.

49Definition sum_L4: block ≔
Eval vm_compute in blkls_fn"sum" "L4"

sum's exit.

51Definition sum_L5: block ≔
Eval vm_compute in blkls_fn"sum" "L5"

listsum's entry block.

53Definition ls_start: block ≔
Eval vm_compute in blkls_fn"listsum" "start"

listsum's loop head.

55Definition ls_L4: block ≔
Eval vm_compute in blkls_fn"listsum" "L4"

listsum's loop body.

57Definition ls_L5: block ≔
Eval vm_compute in blkls_fn"listsum" "L5"

listsum's exit, the call of sum.

59Definition ls_L7: block ≔
Eval vm_compute in blkls_fn"listsum" "L7"

sum has its entry block.

62Lemma sum_find_start
Explore proof 2 tactics

Initial goal

vm_compute

⊢
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3" = Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L3"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

sum has its loop head.

65Lemma sum_find_L3
Explore proof 2 tactics

Initial goal

vm_compute

⊢
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" = 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"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

sum has its loop body.

68Lemma sum_find_L4
Explore proof 2 tactics

Initial goal

vm_compute

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

sum has its exit.

71Lemma sum_find_L5
Explore proof 2 tactics

Initial goal

vm_compute

⊢
Someb_label ≔ TAtom"L5"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"pr.2" = Someb_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

listsum has its entry block.

74Lemma ls_find_start
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
Explore proof 2 tactics

Initial goal

⊢
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start

vm_compute

⊢
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L4" = Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JGotoToTAtom"L4"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

listsum has its loop head.

77Lemma ls_find_L4
Explore proof 2 tactics

Initial goal

⊢

vm_compute

⊢
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" = 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"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

listsum has its loop body.

80Lemma ls_find_L5
Explore proof 2 tactics

Initial goal

⊢

vm_compute

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

listsum has its exit.

83Lemma ls_find_L7
Explore proof 2 tactics

Initial goal

⊢

vm_compute

⊢
Someb_label ≔ TAtom"L7"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1"; b_jump ≔ JRetTmpTAtom"v23" = Someb_label ≔ TAtom"L7"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1"; b_jump ≔ JRetTmpTAtom"v23"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

sum returns a long.

86Lemma sum_ret
Explore proof 2 tactics

Initial goal

⊢

vm_compute

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

listsum returns a long.

89Lemma listsum_ret
fn_retls_fn"listsum" = RClassL
Explore proof 2 tactics

Initial goal

⊢
fn_retls_fn"listsum" = RClassL

vm_compute

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

Computing a step

Drop the wraps in E that arithmetic over the context proves are the identity, innermost first; leave every other wrap as it is.

96Ltac drop_safe E ≔
repeat match type of E withcontext [?x mod ?m]⇒assert_fails has_ifx ; assert_fails has_modx ; let H ≔ fresh in assert H : x mod m = x by apply Z.mod_small ; clear E ; arith ; rewrite H in E ; clear Hend

Decide the integer comparisons in E that arithmetic over the context decides; leave every other one as it is.

106Ltac decide_safe E ≔
repeat match type of E withcontext [?a <? ?b]⇒assert_fails has_ifa ; assert_fails has_ifb ; first let H ≔ fresh in assert H : a <? b = true by apply Z.ltb_lt ; clear E ; arith ; rewrite H in E ; clear H | let H ≔ fresh in assert H : a <? b = false by apply Z.ltb_ge ; clear E ; arith ; rewrite H in E ; clear Hcontext [?a ≤? ?b]⇒assert_fails has_ifa ; assert_fails has_ifb ; first let H ≔ fresh in assert H : a ≤? b = true by apply Z.leb_le ; clear E ; arith ; rewrite H in E ; clear H | let H ≔ fresh in assert H : a ≤? b = false by apply Z.leb_gt ; clear E ; arith ; rewrite H in E ; clear Hcontext [?a =? ?b]⇒assert_fails has_ifa ; assert_fails has_ifb ; first let H ≔ fresh in assert H : a =? b = true by apply Z.eqb_eq ; clear E ; arith ; rewrite H in E ; clear H | let H ≔ fresh in assert H : a =? b = false by apply Z.eqb_neq ; clear E ; arith ; rewrite H in E ; clear Hend

Rewrite in E what the context knows of memory (a load or an aux slot at an address arithmetic identifies), the module's function sum and its call frame.

131Ltac ls_rewrites E ≔
repeat match goal withH : ∀a, a = _ → load_bytes?mm a 8 = _ |- _⇒match type of E withcontext [load_bytesmm ?a 8]⇒let Hx ≔ fresh in assert Hx := Ha ltac:clear E ; lia ; rewrite Hx in E ; clear HxendH : ∀a, a = _ → m_aux?mm a = _ |- _⇒match type of E withcontext [m_auxmm ?a]⇒let Hx ≔ fresh in assert Hx := Ha ltac:clear E ; lia ; rewrite Hx in E ; clear HxendH : find_fn_ _ = _ |- _⇒rewrite H in EH : ∀x rest, call_frame_ x :: rest = _ |- _⇒rewrite H in Eend

Reduce E, an equation r = step g c, as far as the facts and arithmetic allow, keeping the module, its functions, memory operations and calls folded.

146Ltac reduce_step E ≔
repeat progress cbn - [ load_bytes store_bytes store_aux ls_fn ls_module ls_globals find_fn call_frame ] 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 ; try unfold max_allocation_size in E ; use_facts E ; ls_rewrites E ; cbn [ r_base r_end r_kind r_life ptr_addr ptr_cap ] in E ; drop_safe E ; decide_safe E

Replace each environment put k v e of the goal, e a variable, by a new variable, with what each name looks up to in it.

159Ltac gen_env  ≔
repeat match goal with|- context [put?k ?v ?e]⇒is_var e;let H ≔ fresh "Hput" inassert H : lookupk putk v e = Somev by apply lookup_after_put_same;repeat match goal withH′ : lookup?x e = Some?w |- _⇒first assert lookupx putk v e = Somew by rewrite lookup_after_put_other ; exact H′ | reflexivity | idtac ; clear H′end;let e′ ≔ fresh "e" in set e′ := putk v e in * ; clearbody e′ ; try clear eend

Over any runtime

177Module IrisListSum R : Runtime
178Module IH ≔ IrisHeap R
179Module IM ≔ IH.IM
180Module P ≔ IM.P
Import IM IH

The genv of the module, whose free is R's.

Put the facts about the module's blocks, return classes, sum and its call frame in the context.

Prove a goal step g c = r', with r' possibly holding existential variables, by computing the step.

195Ltac compute_eq  ≔
ls_facts;match goal with|- ?L = _⇒let r ≔ fresh "r" in let E ≔ fresh "E" in remember L as r eqn: E ; reduce_step E ; subst rend;reflexivity

A one-instruction step that changes no memory.

203Ltac wp_emp  ≔
iApply wpc_next_ emp%I with [//] ; let m ≔ fresh "m" in let s ≔ fresh "s" in iIntros m s _ _ ; iPureIntro ; compute_eq | iNext ; iIntros _ ; gen_env

Entering a block: when the fuel F is 0 the run ends with OutOfFuel; otherwise the goal is left with F not 0.

210Ltac wp_fuel  ≔
match goal with|- environments.envs_entails_ wpc_ EConf_ _ ?F⇒let Hz ≔ fresh "Hz" in destruct Z.eq_decF 0 as Hz | Hz ; iApply wpc_done_ emp%I _ _ _ OutOfFuel with [//] ; intros | let m ≔ fresh "m" in let s ≔ fresh "s" in iIntros m s _ _ ; iPureIntro ; compute_eq | end
220Section proof
221Context hlc : has_lc Σ : gFunctors HinvG : invGS_genhlc Σ HheapG : gen_heapGSpiece pval Σ

The pieces of a node at b: its life as a 16-byte heap object, the aux slot holding the next pointer nx's capability, the bytes of nx's address, and the bytes of the value x.

226Definition node_psb : Z nx : ptr x : Z : listpiece × pval ≔
PLiveb, VLivemkRegionb b + 16 Heap Live ++ PAuxb 0, VAuxptr_capnx ++ cellb 0 ptr_addrnx ++ cellb 8 x

The list from p holds the values xs: null for none; otherwise p is its object's own pointer, at a positive, 16-aligned base that fits the address space, and the node there points to the rest.

233Fixpoint lstp : ptr xs : listZ : iPropΣ ≔
match xs with
[ ]
⇒
⌜p = null⌝
x :: xs′
⇒
∃b nx, ⌜p = mkPtrb Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ b mod 16 = 0⌝ ∗ ptsnode_psb nx x ∗ lstnx xs′

The head of a list is null or a live object.

241Lemma lst_head
∀ m s p xs
heap_interpm, s −∗ lstp xs −∗ ⌜ptr_capp = CNone ∧ ptr_addrp = 0 ∨ ∃b, p = mkPtrb Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b mkRegionb b + 16 Heap Live⌝
Explore proof 18 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
p :
xs :
listZ
⊢
heap_interpm, s −∗ lstp xs −∗ ⌜ptr_capp = CNone ∧ ptr_addrp = 0 ∨ ∃b : Z, p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live⌝

destruct xs as | x xs ; cbn [ lst ]

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
p :
⊢
heap_interpm, s −∗ ⌜p = null⌝ −∗ ⌜ptr_capp = CNone ∧ ptr_addrp = 0 ∨ ∃b : Z, p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live⌝
focused goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
p :
x :
Z
xs :
listZ
⊢
heap_interpm, s −∗ ∃b : Z nx : ptr, ⌜p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ b mod 16 = 0⌝ ∗ ptsnode_psb nx x ∗ lstnx xs −∗ ⌜ptr_capp = CNone ∧ ptr_addrp = 0 ∨ ∃b : Z, p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live⌝

–iIntros _ ->

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
∗
⌜ptr_capnull = CNone ∧ ptr_addrnull = 0 ∨ ∃b : Z, null = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live⌝
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
p :
x :
Z
xs :
listZ
⊢
heap_interpm, s −∗ ∃b : Z nx : ptr, ⌜p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ b mod 16 = 0⌝ ∗ ptsnode_psb nx x ∗ lstnx xs −∗ ⌜ptr_capp = CNone ∧ ptr_addrp = 0 ∨ ∃b : Z, p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live⌝

iPureIntro

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
⊢
ptr_capnull = CNone ∧ ptr_addrnull = 0 ∨ ∃b : Z, null = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
p :
x :
Z
xs :
listZ
⊢
heap_interpm, s −∗ ∃b : Z nx : ptr, ⌜p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ b mod 16 = 0⌝ ∗ ptsnode_psb nx x ∗ lstnx xs −∗ ⌜ptr_capp = CNone ∧ ptr_addrp = 0 ∨ ∃b : Z, p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live⌝

left

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
p :
x :
Z
xs :
listZ
⊢
heap_interpm, s −∗ ∃b : Z nx : ptr, ⌜p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ b mod 16 = 0⌝ ∗ ptsnode_psb nx x ∗ lstnx xs −∗ ⌜ptr_capp = CNone ∧ ptr_addrp = 0 ∨ ∃b : Z, p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live⌝

split ; reflexivity

deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
p :
x :
Z
xs :
listZ
⊢
heap_interpm, s −∗ ∃b : Z nx : ptr, ⌜p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ b mod 16 = 0⌝ ∗ ptsnode_psb nx x ∗ lstnx xs −∗ ⌜ptr_capp = CNone ∧ ptr_addrp = 0 ∨ ∃b : Z, p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live⌝

–iIntros Hσ Hl

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
p :
x :
Z
xs :
listZ
Hσ :
heap_interpm, s
Hl :
∃b : Z nx : ptr, ⌜p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ b mod 16 = 0⌝ ∗ ptsnode_psb nx x ∗ lstnx xs
∗
⌜ptr_capp = CNone ∧ ptr_addrp = 0 ∨ ∃b : Z, p = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live⌝

iDestruct Hl as b nx → & Hb0 & Hb1 & _ [Hn _]

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hσ :
heap_interpm, s
Hn :
∗
⌜ptr_capptr_addr ≔ b; ptr_cap ≔ Objb = CNone ∧ ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb = 0 ∨ ∃b0 : Z, ptr_addr ≔ b; ptr_cap ≔ Objb = ptr_addr ≔ b0; ptr_cap ≔ Objb0 ∧ 0 < b0 ∧ b0 + 16 ≤ 2 ^ 48 ∧ live_atm b0 r_base ≔ b0; r_end ≔ b0 + 16; r_kind ≔ Heap; r_life ≔ Live⌝

iDestruct pts_facts with Hσ Hn as %Hf & _

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hf :
Hσ :
heap_interpm, s
Hn :
∗
⌜ptr_capptr_addr ≔ b; ptr_cap ≔ Objb = CNone ∧ ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb = 0 ∨ ∃b0 : Z, ptr_addr ≔ b; ptr_cap ≔ Objb = ptr_addr ≔ b0; ptr_cap ≔ Objb0 ∧ 0 < b0 ∧ b0 + 16 ≤ 2 ^ 48 ∧ live_atm b0 r_base ≔ b0; r_end ≔ b0 + 16; r_kind ≔ Heap; r_life ≔ Live⌝

iPureIntro

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hf :
⊢
ptr_capptr_addr ≔ b; ptr_cap ≔ Objb = CNone ∧ ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb = 0 ∨ ∃b0 : Z, ptr_addr ≔ b; ptr_cap ≔ Objb = ptr_addr ≔ b0; ptr_cap ≔ Objb0 ∧ 0 < b0 ∧ b0 + 16 ≤ 2 ^ 48 ∧ live_atm b0 r_base ≔ b0; r_end ≔ b0 + 16; r_kind ≔ Heap; r_life ≔ Live

right

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hf :
⊢
∃b0 : Z, ptr_addr ≔ b; ptr_cap ≔ Objb = ptr_addr ≔ b0; ptr_cap ≔ Objb0 ∧ 0 < b0 ∧ b0 + 16 ≤ 2 ^ 48 ∧ live_atm b0 r_base ≔ b0; r_end ≔ b0 + 16; r_kind ≔ Heap; r_life ≔ Live

exists b

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hf :
⊢
ptr_addr ≔ b; ptr_cap ≔ Objb = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

split ; reflexivity |

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hf :
⊢
0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

split ; exact Hb0 |

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hf :
⊢
b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

split ; exact Hb1 |

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hf :
⊢
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

unfold node_ps in Hf

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hf :
all_agreem PLiveb, VLiver_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ++ PAuxb 0, VAuxptr_capnx ++ cellb 0 ptr_addrnx ++ cellb 8 x
⊢
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

apply all_agree_app in Hf as Hf _

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hf :
all_agreem PLiveb, VLiver_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
⊢
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

cbn [ all_agree fst snd agree_piece ] in Hf

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hf :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ True
⊢
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live

exact proj1Hf

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
destruct xs as | x xs ; cbn [ lst ]
–iIntros _ ->
iPureIntro
left
split ; reflexivity
–iIntros Hσ Hl
iDestruct Hl as b nx → & Hb0 & Hb1 & _ [Hn _]
iDestruct pts_facts with Hσ Hn as %Hf & _
iPureIntro
right
exists b
split ; reflexivity |
split ; exact Hb0 |
split ; exact Hb1 |
unfold node_ps in Hf
apply all_agree_app in Hf as Hf _
cbn [ all_agree fst snd agree_piece ] in Hf
exact proj1Hf

What a node at b and the list after it tell a step: b's region, the value's and the next address's bytes, and the next pointer's capability in the aux slot, exactly, since its object is live.

257Lemma node_view
∀ m s b nx x xs
heap_interpm, s −∗ ptsnode_psb nx x −∗ lstnx xs −∗ ⌜object_regionb m_regionsm = SomemkRegionb b + 16 Heap Live ∧ ∀a : Z, a = b + 8%Z → load_bytesm a 8 = x mod 2 ^ 64%Z ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx⌝
Explore proof 28 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
⊢
heap_interpm, s −∗ ptsnode_psb nx x −∗ lstnx xs −∗ ⌜object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ ∀a : Z, a = b + 8%Z → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx⌝

iIntros Hσ Hn Hl

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hσ :
heap_interpm, s
Hn :
Hl :
lstnx xs
∗
⌜object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ ∀a : Z, a = b + 8%Z → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx⌝

iDestruct pts_facts with Hσ Hn as %Hf & _

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hf :
Hσ :
heap_interpm, s
Hn :
Hl :
lstnx xs
∗
⌜object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ ∀a : Z, a = b + 8%Z → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx⌝

iDestruct lst_head with Hσ Hl as %Hh

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hf :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hσ :
heap_interpm, s
Hn :
Hl :
lstnx xs
∗
⌜object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ ∀a : Z, a = b + 8%Z → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx⌝

iPureIntro

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hf :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_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 ∧ ∀a : Z, a = b + 8 → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx

unfold node_ps in Hf

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hf :
all_agreem PLiveb, VLiver_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ++ PAuxb 0, VAuxptr_capnx ++ cellb 0 ptr_addrnx ++ cellb 8 x
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_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 ∧ ∀a : Z, a = b + 8 → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx

apply all_agree_app in Hf as Hla Hf

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hla :
all_agreem PLiveb, VLiver_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hf :
all_agreem PAuxb 0, VAuxptr_capnx ++ cellb 0 ptr_addrnx ++ cellb 8 x
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_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 ∧ ∀a : Z, a = b + 8 → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx

apply all_agree_app in Hf as Hax Hf

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hla :
all_agreem PLiveb, VLiver_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hf :
all_agreem cellb 0 ptr_addrnx ++ cellb 8 x
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_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 ∧ ∀a : Z, a = b + 8 → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx

apply all_agree_app in Hf as Hc0 Hc8

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hla :
all_agreem PLiveb, VLiver_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_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 ∧ ∀a : Z, a = b + 8 → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx

cbn [ all_agree fst snd agree_piece ] in Hla , Hax

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hla :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ True
Hax :
registeredm b ∧ in_livem b 0 aux_holdsm b + 0 ptr_capnx ∧ True
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_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 ∧ ∀a : Z, a = b + 8 → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx

destruct Hla as Hlive _

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
registeredm b ∧ in_livem b 0 aux_holdsm b + 0 ptr_capnx ∧ True
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_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 ∧ ∀a : Z, a = b + 8 → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx

destruct Hax as _ & Hax _

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_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 ∧ ∀a : Z, a = b + 8 → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx

pose proof Hlive as E L

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live ∧ ∀a : Z, a = b + 8 → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx

split ; exact E |

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b + 8 → load_bytesm a 8 = x mod 2 ^ 64 ∧ ∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx ∧ ∀a : Z, a = b → m_auxm a = ptr_capnx

split ; | split

3 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b + 8 → load_bytesm a 8 = x mod 2 ^ 64
focused goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx
focused goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b → m_auxm a = ptr_capnx

–intros a →

3 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
load_bytesm b + 8 8 = x mod 2 ^ 64
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b → m_auxm a = ptr_capnx

exact cell_loadm b _ 8 x b + 8 Hlive Hc8 eq_refl

2 open

deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b → load_bytesm a 8 = ptr_addrnx
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b → m_auxm a = ptr_capnx

–intros a →

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b → m_auxm a = ptr_capnx

rewrite cell_loadm b _ 0 ptr_addrnx b Hlive Hc0 ; | lia

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
ptr_addrnx mod 2 ^ 64 = ptr_addrnx
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b → m_auxm a = ptr_capnx

apply Z.mod_small

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
0 ≤ ptr_addrnx < 2 ^ 64
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b → m_auxm a = ptr_capnx

destruct Hh as _ → | nb & → & ? & ? & _ ; cbn ; lia

deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
∀a : Z, a = b → m_auxm a = ptr_capnx

–intros a →

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
m_auxm b = ptr_capnx

destruct Hax_ E L as _ & _ & Hx

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
Hx :
aux_holdsm b + 0 ptr_capnx
⊢
m_auxm b = ptr_capnx

replace b + 0 with b in Hx by lia

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
m_auxm b = ptr_capnx

apply aux_holds_live ; exact Hx |

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b :
Z
nx :
x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capnx
Hc8 :
Hh :
ptr_capnx = CNone ∧ ptr_addrnx = 0 ∨ ∃b : Z, nx = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
⊢
ptr_capnx = CNone ∨ ∃b0 : Z reg : region, ptr_capnx = Objb0 ∧ live_atm b0 reg

destruct Hh as → _ | nb & → & _ & _ & Hl ; left ; reflexivity |

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b, x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
nb :
Z
Hc0 :
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capptr_addr ≔ nb; ptr_cap ≔ Objnb
Hc8 :
Hl :
live_atm nb r_base ≔ nb; r_end ≔ nb + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
Hx :
⊢
ptr_capptr_addr ≔ nb; ptr_cap ≔ Objnb = CNone ∨ ∃b0 : Z reg : region, ptr_capptr_addr ≔ nb; ptr_cap ≔ Objnb = Objb0 ∧ live_atm b0 reg

right

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b, x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
nb :
Z
Hc0 :
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capptr_addr ≔ nb; ptr_cap ≔ Objnb
Hc8 :
Hl :
live_atm nb r_base ≔ nb; r_end ≔ nb + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
Hx :
⊢
∃b0 : Z reg : region, ptr_capptr_addr ≔ nb; ptr_cap ≔ Objnb = Objb0 ∧ live_atm b0 reg

exists nb, mkRegionnb nb + 16 Heap Live

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
m :
s :
R.state
b, x :
Z
xs :
listZ
Hlive :
live_atm b r_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
nb :
Z
Hc0 :
Hax :
in_livem b 0 aux_holdsm b + 0 ptr_capptr_addr ≔ nb; ptr_cap ≔ Objnb
Hc8 :
Hl :
live_atm nb r_base ≔ nb; r_end ≔ nb + 16; r_kind ≔ Heap; r_life ≔ Live
E :
object_regionb m_regionsm = Somer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live
L :
r_lifer_base ≔ b; r_end ≔ b + 16; r_kind ≔ Heap; r_life ≔ Live = Live
Hx :
⊢
ptr_capptr_addr ≔ nb; ptr_cap ≔ Objnb = Objnb ∧ live_atm nb r_base ≔ nb; r_end ≔ nb + 16; r_kind ≔ Heap; r_life ≔ Live

split ; reflexivity | exact Hl

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
iIntros Hσ Hn Hl
iDestruct pts_facts with Hσ Hn as %Hf & _
iDestruct lst_head with Hσ Hl as %Hh
iPureIntro
unfold node_ps in Hf
apply all_agree_app in Hf as Hla Hf
apply all_agree_app in Hf as Hax Hf
apply all_agree_app in Hf as Hc0 Hc8
cbn [ all_agree fst snd agree_piece ] in Hla , Hax
destruct Hla as Hlive _
destruct Hax as _ & Hax _
pose proof Hlive as E L
split ; exact E |
split ; | split
–intros a →
exact cell_loadm b _ 8 x b + 8 Hlive Hc8 eq_refl
–intros a →
rewrite cell_loadm b _ 0 ptr_addrnx b Hlive Hc0 ; | lia
apply Z.mod_small
destruct Hh as _ → | nb & → & ? & ? & _ ; cbn ; lia
–intros a →
destruct Hax_ E L as _ & _ & Hx
replace b + 0 with b in Hx by lia
apply aux_holds_live ; exact Hx |
destruct Hh as → _ | nb & → & _ & _ & Hl ; left ; reflexivity |
right
exists nb, mkRegionnb nb + 16 Heap Live
split ; reflexivity | exact Hl

A step of sum's loop body that may read the node at b.

280Ltac wp_node b nx x xs ≔
iApply wpc_next_ ptsnode_psb nx x ∗ lstnx xs%I with [$Hn $Hl] ; let m ≔ fresh "m" in let s ≔ fresh "s" in iIntros m s Hσ [Hn Hl] ; iDestruct node_view with Hσ Hn Hl as %? & ? & ? & ? ; iPureIntro ; compute_eq | iNext ; iIntros [Hn Hl] ; gen_env

The continuation of a call of sum from the caller frame cf, whose result is bound to d: cf resumed with any result and any fuel.

289Notation cont cf d callers ≔ ∀y fuel′, wpclge EConfmkFramefr_fncf putd WInty fr_envcf fr_localscf fr_doomedcf fr_atcf callers fuel′%I

sum's loop, from the point after its head's phis: with pr.1 the list's pointer p and pr.2 an integer, owning the list and the continuation, the run is safe. By Löb induction.

296Lemma sum_loop
∀ cf d callers
⊢ ∀e p xs fuel, ⌜lookupTAtom"pr.1" e = SomeWPtrp⌝ −∗ ⌜∃s, lookupTAtom"pr.2" e = SomeWInts⌝ −∗ lstp xs −∗ contcf d callers −∗ wpclge EConfmkFramels_fn"sum" e [ ] None ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, mkPendingCResultd L None :: callers fuel
Explore proof 26 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
⊢
⊢ ∀e : listname × word p : ptr xs : listZ fuel : Z, ⌜lookupTAtom"pr.1" e = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e = SomeWInts⌝ −∗ lstp xs −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

iLöb as IH

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
IH :
▷∀e : listname × word p : ptr xs : listZ fuel : Z, ⌜lookupTAtom"pr.1" e = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e = SomeWInts⌝ −∗ lstp xs −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel
□
∀e : listname × word p : ptr xs : listZ fuel : Z, ⌜lookupTAtom"pr.1" e = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e = SomeWInts⌝ −∗ lstp xs −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

iIntros e p xs fuel Hp s0 Hs Hl HK

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
p :
xs :
listZ
fuel :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrp
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
IH :
▷∀e0 : listname × word p0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp0⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp0 xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
Hl :
lstp xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

destruct xs as | x xs

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
p :
fuel :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrp
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
IH :
▷∀e0 : listname × word p0 : ptr xs : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp0⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp0 xs −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
Hl :
lstp [ ]
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel
focused goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
p :
x :
Z
xs :
listZ
fuel :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrp
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
IH :
▷∀e0 : listname × word p0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp0⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp0 xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
Hl :
lstp x :: xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

–iDestruct Hl as %→

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
fuel :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrnull
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
IH :
▷∀e0 : listname × word p : ptr xs : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
p :
x :
Z
xs :
listZ
fuel :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrp
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
IH :
▷∀e0 : listname × word p0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp0⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp0 xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
Hl :
lstp x :: xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_emp

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
fuel, s0 :
Z
e0 :
listname × word
Hput :
lookupTAtom"v7" e0 = SomeWInt0
H :
lookupTAtom"pr.2" e0 = SomeWInts0
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrnull
IH :
∀e : listname × word p : ptr xs : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e = SomeWInts⌝ −∗ lstp xs −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
p :
x :
Z
xs :
listZ
fuel :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrp
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
IH :
▷∀e0 : listname × word p0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp0⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp0 xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
Hl :
lstp x :: xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_emp

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
fuel, s0 :
Z
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt0
H1 :
lookupTAtom"pr.1" e = SomeWPtrnull
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWInt0
IH :
∀e0 : listname × word p : ptr xs : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
p :
x :
Z
xs :
listZ
fuel :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrp
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
IH :
▷∀e0 : listname × word p0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp0⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp0 xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
Hl :
lstp x :: xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_emp

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
fuel, s0 :
Z
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt0
H1 :
lookupTAtom"pr.1" e = SomeWPtrnull
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWInt0
IH :
∀e0 : listname × word p : ptr xs : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L5" SomeTAtom"L3" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
p :
x :
Z
xs :
listZ
fuel :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrp
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
IH :
▷∀e0 : listname × word p0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp0⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp0 xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
Hl :
lstp x :: xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_fuel

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
fuel, s0 :
Z
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt0
H1 :
lookupTAtom"pr.1" e = SomeWPtrnull
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWInt0
Hz :
fuel ≠ 0
IH :
∀e0 : listname × word p : ptr xs : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L5" SomeTAtom"L3" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
p :
x :
Z
xs :
listZ
fuel :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrp
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
IH :
▷∀e0 : listname × word p0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp0⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp0 xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
Hl :
lstp x :: xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_emp

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
fuel, s0 :
Z
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt0
H1 :
lookupTAtom"pr.1" e = SomeWPtrnull
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWInt0
Hz :
fuel ≠ 0
IH :
∀e0 : listname × word p : ptr xs : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
p :
x :
Z
xs :
listZ
fuel :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrp
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
IH :
▷∀e0 : listname × word p0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp0⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp0 xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
Hl :
lstp x :: xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

iApply wpc_next_ emp%I with [//] ; let m ≔ fresh "m" in let s ≔ fresh "s" in iIntros m s _ _ ; iPureIntro ; compute_eq | iNext ; iIntros _ ; iApply HK

deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
p :
x :
Z
xs :
listZ
fuel :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrp
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
IH :
▷∀e0 : listname × word p0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp0⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp0 xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
Hl :
lstp x :: xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

–iDestruct Hl as b na nc → & Hb0 & Hb1 & Hb2 [Hn Hl]

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
e :
listname × word
x :
Z
xs :
listZ
fuel, b :
Z
Hp :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
s0 :
Z
Hs :
lookupTAtom"pr.2" e = SomeWInts0
na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
IH :
▷∀e0 : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
fix lst p : ptr xs0 : listZ {struct xs0} : iPropΣ ≔
match xs0 with
[ ]
⇒
⌜p = null⌝
x0 :: xs′
⇒
∃b0 : Z nx : ptr, ⌜p = ptr_addr ≔ b0; ptr_cap ≔ Objb0 ∧ 0 < b0 ∧ b0 + 16 ≤ 2 ^ 48 ∧ b0 mod 16 = 0⌝ ∗ ptsnode_psb0 nx x0 ∗ lstnx xs′
ptr_addr ≔ na; ptr_cap ≔ nc xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
e0 :
listname × word
Hput :
lookupTAtom"v7" e0 = SomeWIntb
H :
lookupTAtom"pr.2" e0 = SomeWInts0
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
IH :
∀e : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt1
H1 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWIntb
IH :
∀e0 : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt1
H1 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWIntb
IH :
∀e0 : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L4" SomeTAtom"L3" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_fuel

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt1
H1 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWIntb
Hz :
fuel ≠ 0
IH :
∀e0 : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L4" SomeTAtom"L3" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt1
H1 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWIntb
Hz :
fuel ≠ 0
IH :
∀e0 : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hz :
fuel ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"v11" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H2 :
lookupTAtom"v7" e0 = SomeWIntb
H :
lookupTAtom"pr.2" e0 = SomeWInts0
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H1 :
lookupTAtom"v8" e0 = SomeWInt1
IH :
∀e : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hz :
fuel ≠ 0
e :
listname × word
Hput0 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H3 :
lookupTAtom"v8" e = SomeWInt1
H1 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWIntb
H2 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
IH :
∀e0 : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hz :
fuel ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"v12" e0 = SomeWIntx mod 2 ^ 64
H4 :
lookupTAtom"v11" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H2 :
lookupTAtom"v7" e0 = SomeWIntb
H :
lookupTAtom"pr.2" e0 = SomeWInts0
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H1 :
lookupTAtom"v8" e0 = SomeWInt1
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
IH :
∀e : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hz :
fuel ≠ 0
e :
listname × word
Hput0 :
lookupTAtom"v13" e = SomeWInts0 mod 2 ^ 64 + x mod 2 ^ 64 mod 2 ^ 64 mod 2 ^ 64
H5 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H3 :
lookupTAtom"v8" e = SomeWInt1
H1 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWIntb
H2 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H4 :
lookupTAtom"v12" e = SomeWIntx mod 2 ^ 64
IH :
∀e0 : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hz :
fuel ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H6 :
lookupTAtom"v12" e0 = SomeWIntx mod 2 ^ 64
H4 :
lookupTAtom"v11" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H2 :
lookupTAtom"v7" e0 = SomeWIntb
H :
lookupTAtom"pr.2" e0 = SomeWInts0
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H1 :
lookupTAtom"v8" e0 = SomeWInt1
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H5 :
lookupTAtom"v13" e0 = SomeWInts0 mod 2 ^ 64 + x mod 2 ^ 64 mod 2 ^ 64 mod 2 ^ 64
IH :
∀e : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" LetTAtom"v15" P RawLoadPointer0 AuxRead; LowerResolve; AddressRead TmpTAtom"chk1" JGotoPollTAtom"L3" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hz :
fuel ≠ 0
e :
listname × word
Hput0 :
lookupTAtom"v15" e = SomeWPtrptr_addr ≔ na; ptr_cap ≔ nc
H7 :
lookupTAtom"v13" e = SomeWInts0 mod 2 ^ 64 + x mod 2 ^ 64 mod 2 ^ 64 mod 2 ^ 64
H5 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H3 :
lookupTAtom"v8" e = SomeWInt1
H1 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWIntb
H2 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H4 :
lookupTAtom"v12" e = SomeWIntx mod 2 ^ 64
H6 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
IH :
∀e0 : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JGotoPollTAtom"L3" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hz :
fuel ≠ 0
e :
listname × word
Hput0 :
lookupTAtom"v15" e = SomeWPtrptr_addr ≔ na; ptr_cap ≔ nc
H7 :
lookupTAtom"v13" e = SomeWInts0 mod 2 ^ 64 + x mod 2 ^ 64 mod 2 ^ 64 mod 2 ^ 64
H5 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H3 :
lookupTAtom"v8" e = SomeWInt1
H1 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWIntb
H2 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H4 :
lookupTAtom"v12" e = SomeWIntx mod 2 ^ 64
H6 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
IH :
∀e0 : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L3" SomeTAtom"L4" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_fuel

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hz :
fuel ≠ 0
e :
listname × word
Hput0 :
lookupTAtom"v15" e = SomeWPtrptr_addr ≔ na; ptr_cap ≔ nc
H7 :
lookupTAtom"v13" e = SomeWInts0 mod 2 ^ 64 + x mod 2 ^ 64 mod 2 ^ 64 mod 2 ^ 64
H5 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H3 :
lookupTAtom"v8" e = SomeWInt1
H1 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H0 :
lookupTAtom"pr.2" e = SomeWInts0
H :
lookupTAtom"v7" e = SomeWIntb
H2 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H4 :
lookupTAtom"v12" e = SomeWIntx mod 2 ^ 64
H6 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
Hz0 :
fuel − 1 ≠ 0
IH :
∀e0 : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L3" SomeTAtom"L4" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_node b mkPtrna nc x xs

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
x :
Z
xs :
listZ
fuel, b, s0, na :
Z
nc :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ na; ptr_cap ≔ nc
H7 :
lookupTAtom"v15" e = SomeWPtrptr_addr ≔ na; ptr_cap ≔ nc
H5 :
lookupTAtom"v13" e = SomeWInts0 mod 2 ^ 64 + x mod 2 ^ 64 mod 2 ^ 64 mod 2 ^ 64
H3 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H1 :
lookupTAtom"v8" e = SomeWInt1
H :
lookupTAtom"v7" e = SomeWIntb
H0 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H2 :
lookupTAtom"v12" e = SomeWIntx mod 2 ^ 64
H4 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H6 :
lookupTAtom"pr.2" e = SomeWInts0 mod 2 ^ 64 + x mod 2 ^ 64 mod 2 ^ 64 mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word p : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.1" e0 = SomeWPtrp⌝ −∗ ⌜∃s : Z, lookupTAtom"pr.2" e0 = SomeWInts⌝ −∗ lstp xs0 −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel0
□
HK :
contcf d callers
Hn :
ptsnode_psb ptr_addr ≔ na; ptr_cap ≔ nc x
Hl :
lstptr_addr ≔ na; ptr_cap ≔ nc xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1 − 1

iApply IH $! _ mkPtrna nc xs with [%] [%] Hl HK ; eassumption | eexists ; eassumption

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
iLöb as IH
iIntros e p xs fuel Hp s0 Hs Hl HK
destruct xs as | x xs
–iDestruct Hl as %→
iApply wpc_next_ emp%I with [//] ; let m ≔ fresh "m" in let s ≔ fresh "s" in iIntros m s _ _ ; iPureIntro ; compute_eq | iNext ; iIntros _ ; iApply HK
–iDestruct Hl as b na nc → & Hb0 & Hb1 & Hb2 [Hn Hl]
wp_node b mkPtrna nc x xs
wp_node b mkPtrna nc x xs
wp_node b mkPtrna nc x xs
wp_node b mkPtrna nc x xs
wp_node b mkPtrna nc x xs
wp_node b mkPtrna nc x xs
wp_node b mkPtrna nc x xs
wp_node b mkPtrna nc x xs
wp_node b mkPtrna nc x xs
wp_node b mkPtrna nc x xs
wp_node b mkPtrna nc x xs
wp_node b mkPtrna nc x xs
iApply IH $! _ mkPtrna nc xs with [%] [%] Hl HK ; eassumption | eexists ; eassumption

sum's specification, the rule for calling it: from any caller frame cf whose call binds the result to d, over any callers stack, owning the list from p and the continuation, the call is safe.

327Lemma sum_spec
∀ cf d callers p xs fuel
⊢ lstp xs −∗ contcf d callers −∗ wpclge EConfmkFramels_fn"sum" TAtom"v0", WPtrp [ ] None EnterTAtom"start" None cf, mkPendingCResultd L None :: callers fuel
Explore proof 7 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
p :
xs :
listZ
fuel :
Z
⊢
lstp xs −∗ contcf d callers −∗ wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

iIntros Hl HK

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
p :
xs :
listZ
fuel :
Z
Hl :
lstp xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_fuel

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
p :
xs :
listZ
fuel :
Z
Hz :
fuel ≠ 0
Hl :
lstp xs
HK :
contcf d callers
∗
wpclge EConffr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel

wp_emp

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
p :
xs :
listZ
fuel :
Z
Hz :
fuel ≠ 0
Hl :
lstp xs
HK :
contcf d callers
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JGotoToTAtom"L3" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_emp

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
p :
xs :
listZ
fuel :
Z
Hz :
fuel ≠ 0
Hl :
lstp xs
HK :
contcf d callers
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L3" SomeTAtom"start" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_fuel

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
p :
xs :
listZ
fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
Hl :
lstp xs
HK :
contcf d callers
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L3" SomeTAtom"start" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1

wp_emp

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
cf :
d :
callers :
listframe × pending
p :
xs :
listZ
fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
Hl :
lstp xs
HK :
contcf d callers
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ putTAtom"pr.1" WPtrp putTAtom"pr.2" WInt0 TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" LetTAtom"v7" L Ptoi TmpTAtom"pr.1"; LetTAtom"v8" W CmpNe L TmpTAtom"v7"; Const0 JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" cf, pd_res ≔ CResultd L; pd_conv ≔ None :: callers fuel − 1 − 1

iApply sum_loop with [%] [%] Hl HK ; reflexivity | eexists ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
iIntros Hl HK
iApply sum_loop with [%] [%] Hl HK ; reflexivity | eexists ; reflexivity

A new node's object, split into the pieces the loop body uses: its life, its first aux slot, and its two cells; the other aux slots are dropped.

340Lemma obj_split
∀ base
ptsobj_psbase heap_req16 16 −∗ ptsPLivebase, VLivemkRegionbase base + 16 Heap Live ∗ ptsPAuxbase 0, VAuxCNone ∗ ptscellbase 0 0 ∗ ptscellbase 8 0
Explore proof 4 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
base :
Z
⊢
ptsobj_psbase heap_req16 16 −∗ ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live ∗ ptsPAuxbase 0, VAuxCNone ∗ ptscellbase 0 0 ∗ ptscellbase 8 0

assert E : obj_psbase heap_req16 16 = PLivebase, VLivemkRegionbase base + 16 Heap Live ++ cellbase 0 0 ++ cellbase 8 0 ++ PAuxbase 0, VAuxCNone ++ λi ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15 by reflexivity

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
base :
Z
E :
obj_psbase heap_req16 16 = PLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live ++ cellbase 0 0 ++ cellbase 8 0 ++ PAuxbase 0, VAuxCNone ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15
⊢
ptsobj_psbase heap_req16 16 −∗ ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live ∗ ptsPAuxbase 0, VAuxCNone ∗ ptscellbase 0 0 ∗ ptscellbase 8 0

rewrite E ! pts_app

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
base :
Z
E :
obj_psbase heap_req16 16 = PLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live ++ cellbase 0 0 ++ cellbase 8 0 ++ PAuxbase 0, VAuxCNone ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15
⊢
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live ∗ ptscellbase 0 0 ∗ ptscellbase 8 0 ∗ ptsPAuxbase 0, VAuxCNone ∗ ptsλi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15 −∗ ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live ∗ ptsPAuxbase 0, VAuxCNone ∗ ptscellbase 0 0 ∗ ptscellbase 8 0

iIntros (Hl & H0 & H8 & Ha & _)

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
base :
Z
E :
obj_psbase heap_req16 16 = PLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live ++ cellbase 0 0 ++ cellbase 8 0 ++ PAuxbase 0, VAuxCNone ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15
Hl :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
H0 :
ptscellbase 0 0
H8 :
ptscellbase 8 0
Ha :
∗
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live ∗ ptsPAuxbase 0, VAuxCNone ∗ ptscellbase 0 0 ∗ ptscellbase 8 0

iFrame

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
assert E : obj_psbase heap_req16 16 = PLivebase, VLivemkRegionbase base + 16 Heap Live ++ cellbase 0 0 ++ cellbase 8 0 ++ PAuxbase 0, VAuxCNone ++ λi ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15 by reflexivity
rewrite E ! pts_app
iIntros (Hl & H0 & H8 & Ha & _)
iFrame

A step of listsum's loop body that may read the new object's region.

353Ltac wp_live  ≔
iApply wpc_next_ pts_ with Hlv;|let m ≔ fresh "m" inlet s ≔ fresh "s" iniIntros m s Hσ Hlv ; iDestruct pts_facts with Hσ Hlv as %? ; iPureIntro;match goal withH : owned_facts_ _ |- _⇒let H1 ≔ fresh in destruct H as H1 _ ; cbn [ all_agree fst snd agree_piece ] in H1 ; destruct H1 as ? _ _end;compute_eq|iNext ; iIntros Hlv ; gen_env

listsum's loop, from the point after its head's phis: with pr.2 an int i in range, pr.1 the list's pointer h and v0 the input, owning the list, the run is safe. By Löb induction; each iteration allocates a node, stores h and i in it, and the loop goes on with i + 1 and the longer list; at the end sum is called with the list.

369Lemma ls_loop
∀ n
⊢ ∀e i h xs fuel, ⌜lookupTAtom"pr.2" e = SomeWInti ∧ 0 ≤ i < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth xs −∗ wpclge EConfmkFramels_fn"listsum" e [ ] None ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel
Explore proof 48 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n :
Z
⊢
⊢ ∀e : listname × word i : Z h : ptr xs : listZ fuel : Z, ⌜lookupTAtom"pr.2" e = SomeWInti ∧ 0 ≤ i < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth xs −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel

iLöb as IH

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n :
Z
IH :
▷∀e : listname × word i : Z h : ptr xs : listZ fuel : Z, ⌜lookupTAtom"pr.2" e = SomeWInti ∧ 0 ≤ i < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth xs −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel
□
∀e : listname × word i : Z h : ptr xs : listZ fuel : Z, ⌜lookupTAtom"pr.2" e = SomeWInti ∧ 0 ≤ i < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth xs −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel

iIntros e i h xs fuel Hi & Hir & Hh & Hn Hl

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n :
Z
e :
listname × word
i :
Z
h :
xs :
listZ
fuel :
Z
Hi :
lookupTAtom"pr.2" e = SomeWInti
Hir :
0 ≤ i < 2 ^ 31
Hh :
lookupTAtom"pr.1" e = SomeWPtrh
Hn :
lookupTAtom"v0" e = SomeWIntn
IH :
▷∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel

wp_emp

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hput :
lookupTAtom"v10" e0
=
Some
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
→
1
else
0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

match goal withH : lookupTAtom"v10" _ = SomeWIntif ?c then 1 else 0 |- _⇒destruct c eqn: Hcend

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel
focused goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

–assert Hi1 : i + 1 < 2 ^ 31

3 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
⊢
i + 1 < 2 ^ 31
focused goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

{apply Z.ltb_lt in Hc

3 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
⊢
i + 1 < 2 ^ 31
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

revert Hc

3 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
⊢
i
<
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
→
i + 1 < 2 ^ 31
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

repeat match goal with|- context [if ?b then _ else _]⇒let Hb ≔ fresh in destruct b eqn: Hb ; apply Z.leb_le in Hb | apply Z.leb_gt in Hbend;intros;pose proof Z.mod_pos_boundn 2 ^ 32 ltac:lia;pose proof Z.mod_pos_boundn mod 2 ^ 32 2 ^ 32 ltac:lia;lia

2 open

deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

wp_emp

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L5" SomeTAtom"L4" [ ] fuel
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

wp_fuel

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L5" SomeTAtom"L4" [ ] fuel
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

wp_emp

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

iApply wpc_alloc_ heap_req16 16 ; vm_compute ; reflexivity | vm_compute ; discriminate | let m ≔ fresh "m" in intros m ; compute_eq |

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
▷∀base : Z, ⌜0 < base ∧ base mod req_alignheap_req16 16 = 0 ∧ base + req_extentheap_req16 16 ≤ 2 ^ 48⌝ −∗ ptsobj_psbase heap_req16 16 −∗ wpclge IM.EConfλbase0 : Z ⇒ fr_fn ≔ ls_fn"listsum"; fr_env ≔ putTAtom"v12" WPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0 e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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"base [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

iNext

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
∀base : Z, ⌜0 < base ∧ base mod req_alignheap_req16 16 = 0 ∧ base + req_extentheap_req16 16 ≤ 2 ^ 48⌝ −∗ ptsobj_psbase heap_req16 16 −∗ wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ putTAtom"v12" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

iIntros base Hb0 & Hb1 & Hb2 Hobj

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod req_alignheap_req16 16 = 0
Hb2 :
base + req_extentheap_req16 16 ≤ 2 ^ 48
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hobj :
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ putTAtom"v12" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

cbv beta

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod req_alignheap_req16 16 = 0
Hb2 :
base + req_extentheap_req16 16 ≤ 2 ^ 48
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hobj :
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ putTAtom"v12" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

change req_alignheap_req16 16 with 16 in Hb1

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + req_extentheap_req16 16 ≤ 2 ^ 48
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hobj :
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ putTAtom"v12" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

change req_extentheap_req16 16 with 16 in Hb2

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hobj :
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ putTAtom"v12" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

iDestruct obj_split with Hobj as (Hlv & Hax & Hc0 & Hc8)

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
ptscellbase 0 0
Hc8 :
ptscellbase 8 0
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ putTAtom"v12" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

gen_env

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e :
listname × word
Hput0 :
lookupTAtom"v12" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"pr.2" e = SomeWInti
H1 :
lookupTAtom"pr.1" e = SomeWPtrh
H0 :
lookupTAtom"v0" e = SomeWIntn
H :
lookupTAtom"v10" e = SomeWInt1
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
ptscellbase 0 0
Hc8 :
ptscellbase 8 0
∗
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

wp_live

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H3 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
H2 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hax :
Hc0 :
ptscellbase 0 0
Hc8 :
ptscellbase 8 0
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
∗
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

iApply wpc_write_ PLivebase, VLivemkRegionbase base + 16 Heap Live ++ PAuxbase 0, VAuxCNone ++ cellbase 0 0 PLivebase, VLivemkRegionbase base + 16 Heap Live ++ PAuxbase 0, VAuxptr_caph ++ cellbase 0 ptr_addrh with [Hlv Hax Hc0] ; reflexivity | reflexivity | let m ≔ fresh "m" in intros m Hf & Hd & _ ; apply all_agree_app in Hf as Hf _ ; cbn [ all_agree fst snd agree_piece ] in Hf ; destruct Hf as Hlive _ ; pose proof Hlive as Hor _ ; split ; compute_eq | ; cbv beta ; eapply ptr_store_ok ; exact Hd | exact Hlive | cbn ; lia | lia | rewrite ! pts_app ; iFrame | iNext ; iIntros Hps ; iDestruct pts_app with Hps as [Hlv Hps] ; iDestruct pts_app with Hps as [Hax Hc0] ; gen_env

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H3 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
H2 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hc8 :
ptscellbase 8 0
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

wp_emp

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e :
listname × word
Hput0 :
lookupTAtom"v16" e = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"v12" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"pr.2" e = SomeWInti
H1 :
lookupTAtom"pr.1" e = SomeWPtrh
H0 :
lookupTAtom"v0" e = SomeWIntn
H :
lookupTAtom"v10" e = SomeWInt1
H3 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hc8 :
ptscellbase 8 0
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

wp_emp

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"v18" e0 = SomeWInti
H5 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H3 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
H2 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H4 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hc8 :
ptscellbase 8 0
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ 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" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

wp_live

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e :
listname × word
Hput0 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"v16" e = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"v12" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"pr.2" e = SomeWInti
H1 :
lookupTAtom"pr.1" e = SomeWPtrh
H0 :
lookupTAtom"v0" e = SomeWIntn
H :
lookupTAtom"v10" e = SomeWInt1
H3 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H5 :
lookupTAtom"v18" e = SomeWInti
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hc8 :
ptscellbase 8 0
Hax :
Hc0 :
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" RawStoreWl 0 TmpTAtom"v18" TmpTAtom"chk1"; LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

iApply wpc_write_ PLivebase, VLivemkRegionbase base + 16 Heap Live ++ cellbase 8 0 PLivebase, VLivemkRegionbase base + 16 Heap Live ++ cellbase 8 i with [Hlv Hc8];|reflexivity|reflexivity|let m ≔ fresh "m" inintros m Hf & Hd & _ ; apply all_agree_app in Hf as Hf _ ; cbn [ all_agree fst snd agree_piece ] in Hf ; destruct Hf as Hlive _ ; pose proof Hlive as Hor _ ; split ; compute_eq | ; cbv beta ; split ; reflexivity | ;match goal with|- context [store_bytesm ?a 8 _]⇒destruct cell_store_okm base _ 8 a i Hd Hlive ltac:lia ltac:cbn ; lia ltac:lia as Hcs Hfrend;split;|apply all_agree_app ; split ; | exact Hcs ; cbn [ all_agree fst snd agree_piece ] ; split ; apply live_at_regionsm ; reflexivity | exact Hlive | exact I|eapply frame_ok_mono ; | exact Hfr ; intros l Hin ; rewrite fmap_app ; apply elem_of_app ; right ; exact Hin|rewrite ! pts_app ; iFrame|iNext ; iIntros Hps ; iDestruct pts_app with Hps as [Hlv Hc8] ; gen_env

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e :
listname × word
Hput0 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"v16" e = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"v12" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"pr.2" e = SomeWInti
H1 :
lookupTAtom"pr.1" e = SomeWPtrh
H0 :
lookupTAtom"v0" e = SomeWIntn
H :
lookupTAtom"v10" e = SomeWInt1
H3 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H5 :
lookupTAtom"v18" e = SomeWInti
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hax :
Hc0 :
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hc8 :
ptscellbase 8 i
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" LetTAtom"v21" W Add TmpTAtom"pr.2"; Const1 JGotoPollTAtom"L4" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

wp_emp

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"v21" e0 = SomeWInti + 1
H7 :
lookupTAtom"v18" e0 = SomeWInti
H5 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H3 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
H2 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H4 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hax :
Hc0 :
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hc8 :
ptscellbase 8 i
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JGotoPollTAtom"L4" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

wp_emp

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"v21" e0 = SomeWInti + 1
H7 :
lookupTAtom"v18" e0 = SomeWInti
H5 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H3 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
H2 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H4 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hax :
Hc0 :
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hc8 :
ptscellbase 8 i
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L4" SomeTAtom"L5" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

wp_fuel

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"v21" e0 = SomeWInti + 1
H7 :
lookupTAtom"v18" e0 = SomeWInti
H5 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H3 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
H2 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H4 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
Hz0 :
fuel − 1 ≠ 0
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hax :
Hc0 :
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hc8 :
ptscellbase 8 i
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L4" SomeTAtom"L5" [ ] fuel − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

wp_emp

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
Hax :
Hc0 :
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hc8 :
ptscellbase 8 i
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel − 1 − 1
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

iApply IH $! _ i + 1 mkPtrbase Objbase i :: xs with [%] [Hlv Hax Hc0 Hc8 Hl]

3 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
⊢
lookupTAtom"pr.2" e0 = SomeWInti + 1 ∧ 0 ≤ i + 1 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase ∧ lookupTAtom"v0" e0 = SomeWIntn
focused goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
Hc8 :
ptscellbase 8 i
Hl :
lsth xs
∗
lstptr_addr ≔ base; ptr_cap ≔ Objbase i :: xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

{split ; eassumption |

3 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
⊢
0 ≤ i + 1 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase ∧ lookupTAtom"v0" e0 = SomeWIntn
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
Hc8 :
ptscellbase 8 i
Hl :
lsth xs
∗
lstptr_addr ≔ base; ptr_cap ≔ Objbase i :: xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

split ; lia |

3 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
⊢
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase ∧ lookupTAtom"v0" e0 = SomeWIntn
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
Hc8 :
ptscellbase 8 i
Hl :
lsth xs
∗
lstptr_addr ≔ base; ptr_cap ≔ Objbase i :: xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

split ; eassumption

2 open

deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
Hc8 :
ptscellbase 8 i
Hl :
lsth xs
∗
lstptr_addr ≔ base; ptr_cap ≔ Objbase i :: xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

{cbn [ lst ]

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
Hc8 :
ptscellbase 8 i
Hl :
lsth xs
∗
∃b : Z nx : ptr, ⌜ptr_addr ≔ base; ptr_cap ≔ Objbase = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ b mod 16 = 0⌝ ∗ ptsnode_psb nx i ∗ lstnx xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

iExists base, h

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
Hc8 :
ptscellbase 8 i
Hl :
lsth xs
∗
⌜ptr_addr ≔ base; ptr_cap ≔ Objbase = ptr_addr ≔ base; ptr_cap ≔ Objbase ∧ 0 < base ∧ base + 16 ≤ 2 ^ 48 ∧ base mod 16 = 0⌝ ∗ ptsnode_psbase h i ∗ lsth xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

iSplitR ; iPureIntro ; split ; reflexivity | ; lia |

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
Hc8 :
ptscellbase 8 i
Hl :
lsth xs
∗
ptsnode_psbase h i ∗ lsth xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

iFrame Hl

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
Hc8 :
ptscellbase 8 i
∗
ptsnode_psbase h i
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

rewrite / node_ps ! pts_app

2 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
Hz :
fuel ≠ 0
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
Hz0 :
fuel − 1 ≠ 0
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H7 :
lookupTAtom"v21" e0 = SomeWInti + 1
H5 :
lookupTAtom"v18" e0 = SomeWInti
H3 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H2 :
lookupTAtom"v10" e0 = SomeWInt1
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H1 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H4 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H6 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hlv :
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live
Hax :
Hc0 :
Hc8 :
ptscellbase 8 i
∗
ptsPLivebase, VLiver_base ≔ base; r_end ≔ base + 16; r_kind ≔ Heap; r_life ≔ Live ∗ ptsPAuxbase 0, VAuxptr_caph ∗ ptscellbase 0 ptr_addrh ∗ ptscellbase 8 i
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

iFrame

deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel

–wp_emp

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L7" SomeTAtom"L4" [ ] fuel

wp_fuel

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hz :
fuel ≠ 0
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L7" SomeTAtom"L4" [ ] fuel

wp_emp

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hz :
fuel ≠ 0
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" CallCResultTAtom"v23" L GlobalTAtom"sum" ArgP TmpTAtom"pr.1" JRetTmpTAtom"v23" [ ] fuel − 1

wp_emp

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hz :
fuel ≠ 0
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
Hl :
lsth xs
∗
wpclge IM.EConffr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrh; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None fr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23", pd_res ≔ CResultTAtom"v23" L; pd_conv ≔ None fuel − 1

iApply sum_spec with Hl

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hz :
fuel ≠ 0
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
contfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23" TAtom"v23" [ ]

iIntros y fuel′

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hz :
fuel ≠ 0
y, fuel′ :
Z
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
wpclge EConffr_fn ≔ fr_fnfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; fr_env ≔ putTAtom"v23" WInty fr_envfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; fr_locals ≔ fr_localsfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; fr_doomed ≔ fr_doomedfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23"; fr_at ≔ fr_atfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23" [ ] fuel′

cbn [ fr_fn fr_env fr_locals fr_doomed fr_at ]

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H :
lookupTAtom"v0" e0 = SomeWIntn
H0 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H1 :
lookupTAtom"pr.2" e0 = SomeWInti
Hz :
fuel ≠ 0
y, fuel′ :
Z
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ putTAtom"v23" WInty e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23" [ ] fuel′

gen_env

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
fuel :
Z
Hir :
0 ≤ i < 2 ^ 31
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32 mod 2 ^ 32
→
n mod 2 ^ 32 mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32 mod 2 ^ 32
=
false
Hz :
fuel ≠ 0
y, fuel′ :
Z
e :
listname × word
Hput0 :
lookupTAtom"v23" e = SomeWInty
H2 :
lookupTAtom"pr.2" e = SomeWInti
H1 :
lookupTAtom"pr.1" e = SomeWPtrh
H0 :
lookupTAtom"v0" e = SomeWIntn
H :
lookupTAtom"v10" e = SomeWInt0
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ fuel0 : Z, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 [ ] fuel0
□
wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23" [ ] fuel′

iApply wpc_done_ emp%I _ _ _ Ret_ with [//] ; intros | let m ≔ fresh "m" in let s ≔ fresh "s" in iIntros m s _ _ ; iPureIntro ; compute_eq

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
iLöb as IH
iIntros e i h xs fuel Hi & Hir & Hh & Hn Hl
match goal withH : lookupTAtom"v10" _ = SomeWIntif ?c then 1 else 0 |- _⇒destruct c eqn: Hcend
–assert Hi1 : i + 1 < 2 ^ 31
{apply Z.ltb_lt in Hc
revert Hc
repeat match goal with|- context [if ?b then _ else _]⇒let Hb ≔ fresh in destruct b eqn: Hb ; apply Z.leb_le in Hb | apply Z.leb_gt in Hbend;intros;pose proof Z.mod_pos_boundn 2 ^ 32 ltac:lia;pose proof Z.mod_pos_boundn mod 2 ^ 32 2 ^ 32 ltac:lia;lia
iApply wpc_alloc_ heap_req16 16 ; vm_compute ; reflexivity | vm_compute ; discriminate | let m ≔ fresh "m" in intros m ; compute_eq |
iNext
iIntros base Hb0 & Hb1 & Hb2 Hobj
cbv beta
change req_alignheap_req16 16 with 16 in Hb1
change req_extentheap_req16 16 with 16 in Hb2
iDestruct obj_split with Hobj as (Hlv & Hax & Hc0 & Hc8)
iApply wpc_write_ PLivebase, VLivemkRegionbase base + 16 Heap Live ++ PAuxbase 0, VAuxCNone ++ cellbase 0 0 PLivebase, VLivemkRegionbase base + 16 Heap Live ++ PAuxbase 0, VAuxptr_caph ++ cellbase 0 ptr_addrh with [Hlv Hax Hc0] ; reflexivity | reflexivity | let m ≔ fresh "m" in intros m Hf & Hd & _ ; apply all_agree_app in Hf as Hf _ ; cbn [ all_agree fst snd agree_piece ] in Hf ; destruct Hf as Hlive _ ; pose proof Hlive as Hor _ ; split ; compute_eq | ; cbv beta ; eapply ptr_store_ok ; exact Hd | exact Hlive | cbn ; lia | lia | rewrite ! pts_app ; iFrame | iNext ; iIntros Hps ; iDestruct pts_app with Hps as [Hlv Hps] ; iDestruct pts_app with Hps as [Hax Hc0] ; gen_env
iApply wpc_write_ PLivebase, VLivemkRegionbase base + 16 Heap Live ++ cellbase 8 0 PLivebase, VLivemkRegionbase base + 16 Heap Live ++ cellbase 8 i with [Hlv Hc8];|reflexivity|reflexivity|let m ≔ fresh "m" inintros m Hf & Hd & _ ; apply all_agree_app in Hf as Hf _ ; cbn [ all_agree fst snd agree_piece ] in Hf ; destruct Hf as Hlive _ ; pose proof Hlive as Hor _ ; split ; compute_eq | ; cbv beta ; split ; reflexivity | ;match goal with|- context [store_bytesm ?a 8 _]⇒destruct cell_store_okm base _ 8 a i Hd Hlive ltac:lia ltac:cbn ; lia ltac:lia as Hcs Hfrend;split;|apply all_agree_app ; split ; | exact Hcs ; cbn [ all_agree fst snd agree_piece ] ; split ; apply live_at_regionsm ; reflexivity | exact Hlive | exact I|eapply frame_ok_mono ; | exact Hfr ; intros l Hin ; rewrite fmap_app ; apply elem_of_app ; right ; exact Hin|rewrite ! pts_app ; iFrame|iNext ; iIntros Hps ; iDestruct pts_app with Hps as [Hlv Hc8] ; gen_env
iApply IH $! _ i + 1 mkPtrbase Objbase i :: xs with [%] [Hlv Hax Hc0 Hc8 Hl]
{split ; eassumption |
split ; lia |
split ; eassumption
{cbn [ lst ]
iExists base, h
iSplitR ; iPureIntro ; split ; reflexivity | ; lia |
iFrame Hl
rewrite / node_ps ! pts_app
iFrame
iApply sum_spec with Hl
iIntros y fuel′
iApply wpc_done_ emp%I _ _ _ Ret_ with [//] ; intros | let m ≔ fresh "m" in let s ≔ fresh "s" in iIntros m s _ _ ; iPureIntro ; compute_eq

listsum called with the int n is safe, with any fuel.

443Lemma listsum_spec
∀ n fuel
⊢ wpclge EConfmkFramels_fn"listsum" TAtom"v0", WIntn [ ] None EnterTAtom"start" None [ ] fuel
Explore proof 12 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
⊢
⊢ wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None [ ] fuel

iStartProof

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
∗
wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None [ ] fuel

wp_fuel

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
∗
wpclge EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None [ ] fuel

wp_emp

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JGotoToTAtom"L4" [ ] fuel − 1

wp_emp

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L4" SomeTAtom"start" [ ] fuel − 1

wp_fuel

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L4" SomeTAtom"start" [ ] fuel − 1

wp_emp

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
∗
wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" LetTAtom"v10" W CmpSlt W TmpTAtom"pr.2"; TmpTAtom"v0" JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" [ ] fuel − 1 − 1

iApply ls_loopn $! _ _ _ [ ] with [%] []

4 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
⊢
lookupTAtom"pr.2" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWInt?z ∧ 0 ≤ ?z < 2 ^ 31 ∧ lookupTAtom"pr.1" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWPtr?p ∧ lookupTAtom"v0" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWIntn
focused goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
∗
lst?p [ ]
shelved goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
⊢
Z
shelved goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
⊢

–split ; reflexivity |

3 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
⊢
0 ≤ 0 < 2 ^ 31 ∧ lookupTAtom"pr.1" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWPtr?p ∧ lookupTAtom"v0" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWIntn
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
∗
lst?p [ ]
shelved goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
⊢

split ; lia |

3 open

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
⊢
lookupTAtom"pr.1" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWPtr?p ∧ lookupTAtom"v0" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWIntn
deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
∗
lst?p [ ]
shelved goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
⊢

split ; reflexivity

deferred goal
hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
∗
lstptr_addr ≔ 0; ptr_cap ≔ CNone [ ]

–cbn [ lst ]

hlc :
has_lc
Σ :
gFunctors
HinvG :
invGS_genhlc Σ
HheapG :
gen_heapGSpiece pval Σ
n, fuel :
Z
Hz :
fuel ≠ 0
Hz0 :
fuel − 1 ≠ 0
∗
⌜ptr_addr ≔ 0; ptr_cap ≔ CNone = null⌝

done

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
iStartProof
iApply ls_loopn $! _ _ _ [ ] with [%] []
–split ; reflexivity |
split ; lia |
split ; reflexivity
–cbn [ lst ]
done

The resources the proof uses: invariants and the ghost heap.

457Definition lsΣ: gFunctors ≔
#invΣ; gen_heapΣpiece pval

lsΣ has invariants.

460Instance lsΣ_inv: invGpreSlsΣ
Explore proof 2 tactics

Initial goal

⊢
invGpreSlsΣ

apply subG_invΣ

⊢
subGinvΣ lsΣ

apply _

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
apply subG_invΣ
apply _

lsΣ has the ghost heap of pieces.

464Instance lsΣ_heap: gen_heapGpreSpiece pval lsΣ
Explore proof 2 tactics

Initial goal

⊢
gen_heapGpreSpiece pval lsΣ

apply subG_gen_heapGpreS

⊢
subGgen_heapΣpiece pval lsΣ

apply _

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
apply subG_gen_heapGpreS
apply _

listsum never panics: for every input whose first word is an int, with any fuel, no state of its run fails, whatever bases its nodes get. Proved by Iris adequacy (heap_never_panics) from listsum_spec.

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

Initial goal

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

apply heap_never_panicslsΣ ls_module TAtom"listsum" _ ls_globals ls_mem ls_fn"listsum"

4 open

focused goal
⊢
find_fnlge TAtom"listsum" = SomeDefinedls_fn"listsum"
focused goal
focused goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framels_fn"listsum" xs = Somefr ∧ ∀fuel : Z HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ wpclge IM.EConffr [ ] fuel

–exact ls_initial

3 open

deferred goal
⊢
find_fnlge TAtom"listsum" = SomeDefinedls_fn"listsum"
deferred goal
deferred goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framels_fn"listsum" xs = Somefr ∧ ∀fuel : Z HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ wpclge IM.EConffr [ ] fuel

–exact ls_find_listsumR.free

2 open

deferred goal
deferred goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framels_fn"listsum" xs = Somefr ∧ ∀fuel : Z HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ wpclge IM.EConffr [ ] fuel

–intros b1 r1 b2 r2 E _

2 open

b1 :
Z
r1 :
b2 :
Z
r2 :
⊢
live_atls_mem b2 r2 → b1 ≠ b2 → r_endr1 ≤ b2 ∨ r_endr2 ≤ b1
deferred goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framels_fn"listsum" xs = Somefr ∧ ∀fuel : Z HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ wpclge IM.EConffr [ ] fuel

vm_compute in E

2 open

b1 :
Z
r1 :
b2 :
Z
r2 :
E :
None = Somer1
⊢
live_atls_mem b2 r2 → b1 ≠ b2 → r_endr1 ≤ b2 ∨ r_endr2 ≤ b1
deferred goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framels_fn"listsum" xs = Somefr ∧ ∀fuel : Z HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ wpclge IM.EConffr [ ] fuel

discriminate E

deferred goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framels_fn"listsum" xs = Somefr ∧ ∀fuel : Z HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ wpclge IM.EConffr [ ] fuel

–intros xs n & rest & →

n :
Z
rest :
listword
⊢
∃fr : frame, call_framels_fn"listsum" WIntn :: rest = Somefr ∧ ∀fuel : Z HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ wpclge IM.EConffr [ ] fuel

eexists

2 open

n :
Z
rest :
listword
⊢
call_framels_fn"listsum" WIntn :: rest = Some?fr ∧ ∀fuel : Z HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ wpclge IM.EConf?fr [ ] fuel
shelved goal
n :
Z
rest :
listword

split ; apply listsum_call_frame |

n :
Z
rest :
listword
⊢
∀fuel : Z HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None [ ] fuel

intros fuel HinvG HheapG

n :
Z
rest :
listword
fuel :
Z
HinvG :
invGS_genHasNoLc lsΣ
HheapG :
gen_heapGSpiece pval lsΣ
⊢
⊢ wpclge IM.EConffr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None [ ] fuel

apply listsum_spec

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
apply heap_never_panicslsΣ ls_module TAtom"listsum" _ ls_globals ls_mem ls_fn"listsum"
–exact ls_initial
–exact ls_find_listsumR.free
–intros b1 r1 b2 r2 E _
vm_compute in E
discriminate E
–intros xs n & rest & →
eexists
split ; apply listsum_call_frame |
intros fuel HinvG HheapG