Fil-C on Nix

Filnix wiki

the formal campaign

rocq/spikes/ListSumLogic.v

Spike: spikes/listsum.c through the program logic of Logic.v.

sum gets an Iris Hoare triple that hands the list back and states its result (sum_spec): from lst p xs, its run returns the sum of xs modulo 2^64 (list_sum) and the list is still there. listsum builds the list and calls sum through that triple (wp_call_bind), then drops the list. Each loop is a Löb induction at the point after its head's phis; sum's carries the walked prefix as a list segment (lseg). Every step is taken by its rule from Logic.v, its premises discharged by Symbolic.v's tactics on the premise alone; step is never reduced on a whole configuration.

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 StepRules Symbolic Pieces Heap Language Logic
From Spike Require Import ListSum
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 premise is computed (Symbolic.v).

The blocks, computed once

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

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

sum's entry block.

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

sum's loop head.

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

sum's loop body.

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

sum's exit.

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

listsum's entry block.

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

listsum's loop head.

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

listsum's loop body.

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

listsum's exit, the call of sum.

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

sum has its entry block.

58Lemma 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.

61Lemma 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.

64Lemma 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.

67Lemma 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.

70Lemma 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.

73Lemma 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.

76Lemma 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.

79Lemma 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.

82Lemma 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.

85Lemma 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

Environments

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.

92Ltac 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

Nodes

A node's region: a 16-byte live heap object at b.

111Definition node_regb : Z : region ≔
mkRegionb b + 16 Heap Live

p is the own pointer of a node at b: positive, 16-aligned, and fitting the address space.

115Definition node_okp : ptr b : Z : Prop ≔
p = mkPtrb Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ b mod 16 = 0

Taking a step

Prove an address premise: an alignment to 1 holds at once; the wraps of raw_address are dropped where arithmetic proves them the identity, then arithmetic.

123Ltac addr  ≔
unfold raw_address ; cbn [ ptr_addr ptr_cap r_end node_reg ] ; rewrite ?Z.mod_1_r ; drop_wraps_goal ; arith

Put the facts about the module's blocks and return classes in the context, for the side goals of wp_enter and wp_ret.

Unfold the blocks of the module that a frame's point names.

Prove one pure premise of a rule of Logic.v: by computation for the op's classes, by a fact for a block and a return class, by addr for an address, by compute_premise for a word, trivially for what the world interpretation must keep (there is no world), and by arithmetic for a bound.

143Ltac side  ≔
lazymatch goal with|- ∀_ : mem _ : unit, _⇒intros ; exact I|- general_op_ = true⇒reflexivity|- op_arg_classes_ _ = _⇒reflexivity|- find_block_ _ = _⇒eassumption|- fn_ret_ = _⇒eassumption|- find_fn_ _ = _⇒eassumption|- call_framels_fn"sum" _ = _⇒apply sum_call_frame|- _ ≤ max_allocation_size⇒apply Z.leb_le ; reflexivity|- ∀m : mem, _⇒intros ? ; compute_premise|- ptr_cap_ = _⇒reflexivity|- context [raw_address]⇒addr|- _ = _⇒first compute_premise | arith|- _⇒cbn [ ptr_addr ptr_cap r_end node_reg ] ; arithend

Sums

The sum of the values xs modulo 2^64, as sum adds longs.

163Definition list_sumxs : listZ : Z ≔
fold_rightZ.add 0 xs mod 2 ^ 64

A sum is a 64-bit unsigned integer.

166Lemma list_sum_range
∀ xs
0 ≤ list_sumxs < 2 ^ 64
Explore proof 2 tactics

Initial goal

xs :
listZ
⊢
0 ≤ list_sumxs < 2 ^ 64

apply Z.mod_pos_bound

xs :
listZ
⊢
0 < 2 ^ 64

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
apply Z.mod_pos_bound
lia

Adding one more value, wrapped as sum's loop adds it.

170Lemma list_sum_snoc
∀ ys y
list_sumys ++ y = list_sumys + y mod 2 ^ 64 mod 2 ^ 64
Explore proof 11 tactics

Initial goal

ys :
listZ
y :
Z
⊢
list_sumys ++ y = list_sumys + y mod 2 ^ 64 mod 2 ^ 64

unfold list_sum

ys :
listZ
y :
Z
⊢
foldrZ.add 0 ys ++ y mod 2 ^ 64 = foldrZ.add 0 ys mod 2 ^ 64 + y mod 2 ^ 64 mod 2 ^ 64

rewrite fold_right_app

ys :
listZ
y :
Z
⊢
foldrZ.add foldrZ.add 0 y ys mod 2 ^ 64 = foldrZ.add 0 ys mod 2 ^ 64 + y mod 2 ^ 64 mod 2 ^ 64

cbn [ fold_right ]

ys :
listZ
y :
Z
⊢
foldrZ.add y + 0 ys mod 2 ^ 64 = foldrZ.add 0 ys mod 2 ^ 64 + y mod 2 ^ 64 mod 2 ^ 64

assert E : ∀zs a, fold_rightZ.add a zs = fold_rightZ.add 0 zs + a

2 open

ys :
listZ
y :
Z
⊢
∀zs : listZ a : Z, foldrZ.add a zs = foldrZ.add 0 zs + a
focused goal
ys :
listZ
y :
Z
E :
∀zs : listZ a : Z, foldrZ.add a zs = foldrZ.add 0 zs + a
⊢
foldrZ.add y + 0 ys mod 2 ^ 64 = foldrZ.add 0 ys mod 2 ^ 64 + y mod 2 ^ 64 mod 2 ^ 64

{induction zs as | z zs IH ; intros a ; cbn [ fold_right ] ; lia |

2 open

ys :
listZ
y, z :
Z
zs :
listZ
IH :
∀a : Z, foldrZ.add a zs = foldrZ.add 0 zs + a
a :
Z
⊢
z + foldrZ.add a zs = z + foldrZ.add 0 zs + a
deferred goal
ys :
listZ
y :
Z
E :
∀zs : listZ a : Z, foldrZ.add a zs = foldrZ.add 0 zs + a
⊢
foldrZ.add y + 0 ys mod 2 ^ 64 = foldrZ.add 0 ys mod 2 ^ 64 + y mod 2 ^ 64 mod 2 ^ 64

rewrite IH

2 open

ys :
listZ
y, z :
Z
zs :
listZ
IH :
∀a : Z, foldrZ.add a zs = foldrZ.add 0 zs + a
a :
Z
⊢
z + foldrZ.add 0 zs + a = z + foldrZ.add 0 zs + a
deferred goal
ys :
listZ
y :
Z
E :
∀zs : listZ a : Z, foldrZ.add a zs = foldrZ.add 0 zs + a
⊢
foldrZ.add y + 0 ys mod 2 ^ 64 = foldrZ.add 0 ys mod 2 ^ 64 + y mod 2 ^ 64 mod 2 ^ 64

lia

deferred goal
ys :
listZ
y :
Z
E :
∀zs : listZ a : Z, foldrZ.add a zs = foldrZ.add 0 zs + a
⊢
foldrZ.add y + 0 ys mod 2 ^ 64 = foldrZ.add 0 ys mod 2 ^ 64 + y mod 2 ^ 64 mod 2 ^ 64

rewrite E

ys :
listZ
y :
Z
E :
∀zs : listZ a : Z, foldrZ.add a zs = foldrZ.add 0 zs + a
⊢
foldrZ.add 0 ys + y + 0 mod 2 ^ 64 = foldrZ.add 0 ys mod 2 ^ 64 + y mod 2 ^ 64 mod 2 ^ 64

rewrite <- Zplus_mod

ys :
listZ
y :
Z
E :
∀zs : listZ a : Z, foldrZ.add a zs = foldrZ.add 0 zs + a
⊢
foldrZ.add 0 ys + y + 0 mod 2 ^ 64 = foldrZ.add 0 ys + y mod 2 ^ 64

f_equal

ys :
listZ
y :
Z
E :
∀zs : listZ a : Z, foldrZ.add a zs = foldrZ.add 0 zs + a
⊢
foldrZ.add 0 ys + y + 0 = foldrZ.add 0 ys + y

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
unfold list_sum
rewrite fold_right_app
cbn [ fold_right ]
assert E : ∀zs a, fold_rightZ.add a zs = fold_rightZ.add 0 zs + a
{induction zs as | z zs IH ; intros a ; cbn [ fold_right ] ; lia |
rewrite IH
lia
rewrite E
rewrite <- Zplus_mod
f_equal
lia

Over any runtime

The proof over the runtime R.

181Module ListSumLogic R : Runtime
182Module LG ≔ Logic R
183Module L ≔ LG.L
184Module P ≔ LG.P
Import L LG

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

The expressions of its language.

190Notation lexpr ≔ language.exprnanofil_langno_contracts lge

The rules as tactics

A let of an op that reads no memory, by wp_let.

195Ltac wp_let_  ≔
iApply wp_let ; first side | iNext ; gen_env

A branch, by wp_branch, its target computed.

198Ltac wp_branch_  ≔
iApply wp_branch ; first side | iNext ; cbn [ edge_label Z.eqb Pos.eqb ]

Entering a block, by wp_enter, its body unfolded.

201Ltac wp_enter_  ≔
iApply wp_enter ; first side | iNext ; unfold_blocks ; gen_env

A goto, by wp_goto.

204Ltac wp_goto_  ≔
iApply wp_goto ; iNext ; unfold_blocks

A flight, by wp_flight.

207Ltac wp_flight_  ≔
iApply wp_flight ; first side | iNext ; gen_env

sum called with the pointer p: its entry frame.

210Definition sum_framep : ptr : frame ≔
mkFramels_fn"sum" TAtom"v0", WPtrp [ ] None EnterTAtom"start" None
213Section proof
214Context `{!invGS_genhlc Σ, !gen_heapGSpiece pval Σ}

The list from p holds the values xs: null for none; otherwise p is its node's own pointer (node_ok), and the node is live, holds the next pointer at offset 0 and the value at offset 8, and the rest of the list follows from the next pointer.

220Fixpoint lstp : ptr xs : listZ : iPropΣ ≔
match xs with
[ ]
⇒
⌜p = null⌝
x :: xs′
⇒
∃b nx, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs′

The list segment from p to q holds the values ys: the nodes of lst, ending at q instead of null.

228Fixpoint lsegp q : ptr ys : listZ : iPropΣ ≔
match ys with
[ ]
⇒
⌜p = q⌝
y :: ys′
⇒
∃b nx, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 y ∗ lsegnx q ys′

A list of one value or more, unfolded once.

235Lemma lst_cons
∀ p x xs
lstp x :: xs ⊣⊢ ∃b nx, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs
Explore proof 1 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
x :
Z
xs :
listZ
⊢
lstp x :: xs ⊣⊢ ∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

A segment to q and the node at q make a segment to the node's next pointer.

241Lemma lseg_snoc
∀ p q ys b nx y
lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y
Explore proof 12 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p, q :
ys :
listZ
b :
Z
nx :
y :
Z
⊢
node_okq b → lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y

intros Hq

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p, q :
ys :
listZ
b :
Z
nx :
y :
Z
Hq :
⊢
lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y

revert p

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
ys :
listZ
b :
Z
nx :
y :
Z
Hq :
⊢
∀p : ptr, lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y

induction ys as | y′ ys IH ; intros p ; cbn [ lseg app ]

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
b :
Z
nx :
y :
Z
Hq :
p :
⊢
⌜p = q⌝ −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ ∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y ∗ ⌜nx0 = nx⌝
focused goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y′ :
Z
ys :
listZ
b :
Z
nx :
y :
Z
Hq :
IH :
∀p : ptr, lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y
p :
⊢
∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y′ ∗ lsegnx0 q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ ∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y′ ∗ lsegnx0 nx ys ++ y

–iIntros → Hl Hp Hi

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
b :
Z
nx :
y :
Z
Hq :
Hp :
pcellb 0 nx
Hi :
icellb 8 y
∗
∃b0 : Z nx0 : ptr, ⌜node_okq b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y ∗ ⌜nx0 = nx⌝
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y′ :
Z
ys :
listZ
b :
Z
nx :
y :
Z
Hq :
IH :
∀p : ptr, lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y
p :
⊢
∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y′ ∗ lsegnx0 q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ ∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y′ ∗ lsegnx0 nx ys ++ y

iExists b, nx

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
b :
Z
nx :
y :
Z
Hq :
Hp :
pcellb 0 nx
Hi :
icellb 8 y
∗
⌜node_okq b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 y ∗ ⌜nx = nx⌝
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y′ :
Z
ys :
listZ
b :
Z
nx :
y :
Z
Hq :
IH :
∀p : ptr, lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y
p :
⊢
∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y′ ∗ lsegnx0 q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ ∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y′ ∗ lsegnx0 nx ys ++ y

by iFrame

deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y′ :
Z
ys :
listZ
b :
Z
nx :
y :
Z
Hq :
IH :
∀p : ptr, lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y
p :
⊢
∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y′ ∗ lsegnx0 q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ ∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y′ ∗ lsegnx0 nx ys ++ y

–iIntros Hs Hl Hp Hi

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y′ :
Z
ys :
listZ
b :
Z
nx :
y :
Z
Hq :
IH :
∀p : ptr, lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y
p :
Hs :
∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y′ ∗ lsegnx0 q ys
Hp :
pcellb 0 nx
Hi :
icellb 8 y
∗
∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y′ ∗ lsegnx0 nx ys ++ y

iDestruct Hs as b′ nx′ (% & Hl′ & Hp′ & Hi′ & Hs)

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y′ :
Z
ys :
listZ
b :
Z
nx :
y :
Z
Hq :
IH :
∀p : ptr, lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y
p :
b′ :
Z
nx′ :
H :
node_okp b′
Hl′ :
liveb′ node_regb′
Hp′ :
pcellb′ 0 nx′
Hi′ :
icellb′ 8 y′
Hs :
lsegnx′ q ys
Hp :
pcellb 0 nx
Hi :
icellb 8 y
∗
∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y′ ∗ lsegnx0 nx ys ++ y

iExists b′, nx′

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y′ :
Z
ys :
listZ
b :
Z
nx :
y :
Z
Hq :
IH :
∀p : ptr, lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y
p :
b′ :
Z
nx′ :
H :
node_okp b′
Hl′ :
liveb′ node_regb′
Hp′ :
pcellb′ 0 nx′
Hi′ :
icellb′ 8 y′
Hs :
lsegnx′ q ys
Hp :
pcellb 0 nx
Hi :
icellb 8 y
∗
⌜node_okp b′⌝ ∗ liveb′ node_regb′ ∗ pcellb′ 0 nx′ ∗ icellb′ 8 y′ ∗ lsegnx′ nx ys ++ y

iFrame Hl′ Hp′ Hi′

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y′ :
Z
ys :
listZ
b :
Z
nx :
y :
Z
Hq :
IH :
∀p : ptr, lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y
p :
b′ :
Z
nx′ :
H :
node_okp b′
Hs :
lsegnx′ q ys
Hp :
pcellb 0 nx
Hi :
icellb 8 y
∗
⌜node_okp b′⌝ ∗ lsegnx′ nx ys ++ y

iSplit ; done |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y′ :
Z
ys :
listZ
b :
Z
nx :
y :
Z
Hq :
IH :
∀p : ptr, lsegp q ys −∗ liveb node_regb −∗ pcellb 0 nx −∗ icellb 8 y −∗ lsegp nx ys ++ y
p :
b′ :
Z
nx′ :
H :
node_okp b′
Hs :
lsegnx′ q ys
Hp :
pcellb 0 nx
Hi :
icellb 8 y
∗
lsegnx′ nx ys ++ y

iApply IH with Hs Hl Hp Hi

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hq
revert p
induction ys as | y′ ys IH ; intros p ; cbn [ lseg app ]
–iIntros → Hl Hp Hi
iExists b, nx
by iFrame
–iIntros Hs Hl Hp Hi
iDestruct Hs as b′ nx′ (% & Hl′ & Hp′ & Hi′ & Hs)
iExists b′, nx′
iFrame Hl′ Hp′ Hi′
iSplit ; done |
iApply IH with Hs Hl Hp Hi

A segment to q and the list from q make the list from p.

252Lemma lseg_lst
∀ p q ys zs
lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs
Explore proof 11 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p, q :
ys, zs :
listZ
⊢
lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs

revert p

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
ys, zs :
listZ
⊢
∀p : ptr, lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs

induction ys as | y ys IH ; intros p ; cbn [ lseg app ]

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
zs :
listZ
p :
⊢
⌜p = q⌝ −∗ lstq zs −∗ lstp zs
focused goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y :
Z
ys, zs :
listZ
IH :
∀p : ptr, lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs
p :
⊢
∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 y ∗ lsegnx q ys −∗ lstq zs −∗ lstp y :: ys ++ zs

–iIntros → Hl

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
zs :
listZ
Hl :
lstq zs
∗
lstq zs
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y :
Z
ys, zs :
listZ
IH :
∀p : ptr, lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs
p :
⊢
∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 y ∗ lsegnx q ys −∗ lstq zs −∗ lstp y :: ys ++ zs

iExact Hl

deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y :
Z
ys, zs :
listZ
IH :
∀p : ptr, lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs
p :
⊢
∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 y ∗ lsegnx q ys −∗ lstq zs −∗ lstp y :: ys ++ zs

–iIntros Hs Hl

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y :
Z
ys, zs :
listZ
IH :
∀p : ptr, lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs
p :
Hs :
∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 y ∗ lsegnx q ys
Hl :
lstq zs
∗
lstp y :: ys ++ zs

iDestruct Hs as b nx (% & Hlv & Hp & Hi & Hs)

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y :
Z
ys, zs :
listZ
IH :
∀p : ptr, lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs
p :
b :
Z
nx :
H :
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 y
Hs :
lsegnx q ys
Hl :
lstq zs
∗
lstp y :: ys ++ zs

cbn [ lst ]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y :
Z
ys, zs :
listZ
IH :
∀p : ptr, lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs
p :
b :
Z
nx :
H :
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 y
Hs :
lsegnx q ys
Hl :
lstq zs
∗
∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 y ∗ lstnx0 ys ++ zs

iExists b, nx

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y :
Z
ys, zs :
listZ
IH :
∀p : ptr, lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs
p :
b :
Z
nx :
H :
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 y
Hs :
lsegnx q ys
Hl :
lstq zs
∗
⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 y ∗ lstnx ys ++ zs

iFrame Hlv Hp Hi

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y :
Z
ys, zs :
listZ
IH :
∀p : ptr, lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs
p :
b :
Z
nx :
H :
Hs :
lsegnx q ys
Hl :
lstq zs
∗
⌜node_okp b⌝ ∗ lstnx ys ++ zs

iSplit ; done |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
q :
y :
Z
ys, zs :
listZ
IH :
∀p : ptr, lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs
p :
b :
Z
nx :
H :
Hs :
lsegnx q ys
Hl :
lstq zs
∗
lstnx ys ++ zs

iApply IH with Hs Hl

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
revert p
induction ys as | y ys IH ; intros p ; cbn [ lseg app ]
–iIntros → Hl
iExact Hl
–iIntros Hs Hl
iDestruct Hs as b nx (% & Hlv & Hp & Hi & Hs)
cbn [ lst ]
iExists b, nx
iFrame Hlv Hp Hi
iSplit ; done |
iApply IH with Hs Hl

The head of a list: its address is in range, and the life of the object its capability names, if any, can be lent out.

262Lemma lst_cap
∀ p xs
lstp xs −∗ ⌜0 ≤ ptr_addrp < 2 ^ 64⌝ ∗ live_capptr_capp node_regptr_addrp ∗ live_capptr_capp node_regptr_addrp −∗ lstp xs
Explore proof 16 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
xs :
listZ
⊢
lstp xs −∗ ⌜0 ≤ ptr_addrp < 2 ^ 64⌝ ∗ live_capptr_capp node_regptr_addrp ∗ live_capptr_capp node_regptr_addrp −∗ lstp xs

destruct xs as | x xs ; cbn [ lst ]

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
⊢
⌜p = null⌝ −∗ ⌜0 ≤ ptr_addrp < 2 ^ 64⌝ ∗ live_capptr_capp node_regptr_addrp ∗ live_capptr_capp node_regptr_addrp −∗ ⌜p = null⌝
focused goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
x :
Z
xs :
listZ
⊢
∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs −∗ ⌜0 ≤ ptr_addrp < 2 ^ 64⌝ ∗ live_capptr_capp node_regptr_addrp ∗ live_capptr_capp node_regptr_addrp −∗ ∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs

–iIntros →

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
x :
Z
xs :
listZ
⊢
∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs −∗ ⌜0 ≤ ptr_addrp < 2 ^ 64⌝ ∗ live_capptr_capp node_regptr_addrp ∗ live_capptr_capp node_regptr_addrp −∗ ∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs

cbn

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗
⌜0 ≤ 0 < 2 ^ 64⌝ ∗ True ∗ True −∗ ⌜null = null⌝
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
x :
Z
xs :
listZ
⊢
∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs −∗ ⌜0 ≤ ptr_addrp < 2 ^ 64⌝ ∗ live_capptr_capp node_regptr_addrp ∗ live_capptr_capp node_regptr_addrp −∗ ∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs

iSplit ; iPureIntro ; lia |

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗
True ∗ True −∗ ⌜null = null⌝
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
x :
Z
xs :
listZ
⊢
∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs −∗ ⌜0 ≤ ptr_addrp < 2 ^ 64⌝ ∗ live_capptr_capp node_regptr_addrp ∗ live_capptr_capp node_regptr_addrp −∗ ∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs

iSplit ; done |

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗
True −∗ ⌜null = null⌝
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
x :
Z
xs :
listZ
⊢
∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs −∗ ⌜0 ≤ ptr_addrp < 2 ^ 64⌝ ∗ live_capptr_capp node_regptr_addrp ∗ live_capptr_capp node_regptr_addrp −∗ ∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs

by iIntros _

deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
x :
Z
xs :
listZ
⊢
∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs −∗ ⌜0 ≤ ptr_addrp < 2 ^ 64⌝ ∗ live_capptr_capp node_regptr_addrp ∗ live_capptr_capp node_regptr_addrp −∗ ∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs

–iIntros H

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
x :
Z
xs :
listZ
H :
∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs
∗
⌜0 ≤ ptr_addrp < 2 ^ 64⌝ ∗ live_capptr_capp node_regptr_addrp ∗ live_capptr_capp node_regptr_addrp −∗ ∃b : Z nx : ptr, ⌜node_okp b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs

iDestruct H as b nx Hn (Hlv & Hp & Hi & Hl)

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
x :
Z
xs :
listZ
b :
Z
nx :
Hn :
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 x
Hl :
lstnx xs
∗
⌜0 ≤ ptr_addrp < 2 ^ 64⌝ ∗ live_capptr_capp node_regptr_addrp ∗ live_capptr_capp node_regptr_addrp −∗ ∃b0 : Z nx0 : ptr, ⌜node_okp b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 x ∗ lstnx0 xs

destruct Hn as → & Hb0 & Hb1 & Hb2

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 x
Hl :
lstnx xs
∗
⌜0 ≤ ptr_addrptr_addr ≔ b; ptr_cap ≔ Objb < 2 ^ 64⌝ ∗ live_capptr_capptr_addr ≔ b; ptr_cap ≔ Objb node_regptr_addrptr_addr ≔ b; ptr_cap ≔ Objb ∗ live_capptr_capptr_addr ≔ b; ptr_cap ≔ Objb node_regptr_addrptr_addr ≔ b; ptr_cap ≔ Objb −∗ ∃b0 : Z nx0 : ptr, ⌜node_okptr_addr ≔ b; ptr_cap ≔ Objb b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 x ∗ lstnx0 xs

cbn [ ptr_addr ptr_cap live_cap ]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 x
Hl :
lstnx xs
∗
⌜0 ≤ b < 2 ^ 64⌝ ∗ liveb node_regb ∗ liveb node_regb −∗ ∃b0 : Z nx0 : ptr, ⌜node_okptr_addr ≔ b; ptr_cap ≔ Objb b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 x ∗ lstnx0 xs

iSplit ; iPureIntro ; lia |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 x
Hl :
lstnx xs
∗
liveb node_regb ∗ liveb node_regb −∗ ∃b0 : Z nx0 : ptr, ⌜node_okptr_addr ≔ b; ptr_cap ≔ Objb b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 x ∗ lstnx0 xs

iFrame Hlv

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hp :
pcellb 0 nx
Hi :
icellb 8 x
Hl :
lstnx xs
∗
liveb node_regb −∗ ∃b0 : Z nx0 : ptr, ⌜node_okptr_addr ≔ b; ptr_cap ≔ Objb b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 x ∗ lstnx0 xs

iIntros Hlv

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hp :
pcellb 0 nx
Hi :
icellb 8 x
Hl :
lstnx xs
Hlv :
∗
∃b0 : Z nx0 : ptr, ⌜node_okptr_addr ≔ b; ptr_cap ≔ Objb b0⌝ ∗ liveb0 node_regb0 ∗ pcellb0 0 nx0 ∗ icellb0 8 x ∗ lstnx0 xs

iExists b, nx

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
Hp :
pcellb 0 nx
Hi :
icellb 8 x
Hl :
lstnx xs
Hlv :
∗
⌜node_okptr_addr ≔ b; ptr_cap ≔ Objb b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 x ∗ lstnx xs

iFrame

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
x :
Z
xs :
listZ
b :
Z
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
∗
⌜node_okptr_addr ≔ b; ptr_cap ≔ Objb b⌝

done

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
destruct xs as | x xs ; cbn [ lst ]
–iIntros →
cbn
iSplit ; iPureIntro ; lia |
iSplit ; done |
by iIntros _
–iIntros H
iDestruct H as b nx Hn (Hlv & Hp & Hi & Hl)
destruct Hn as → & Hb0 & Hb1 & Hb2
iSplit ; iPureIntro ; lia |
iFrame Hlv
iIntros Hlv
iExists b, nx
iFrame
done

sum's loop, from the point after its head's phis, with the walked prefix ys as a segment from p to q, the rest zs as the list from q, pr.1 holding q and pr.2 the prefix's sum: the run returns the whole list's sum and hands the list back. By Löb induction.

277Lemma sum_loop
∀ p Φ
⊢ ∀e q ys zs, ⌜lookupTAtom"pr.1" e = SomeWPtrq ∧ lookupTAtom"pr.2" e = SomeWIntlist_sumys⌝ −∗ lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs −∗ ΦRetWIntlist_sumys ++ zs −∗ WPERunmkFramels_fn"sum" e [ ] None ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 : lexpr {Φ}
Explore proof 43 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
⊢
⊢ ∀e : listname × word q : ptr ys zs : listZ, ⌜lookupTAtom"pr.1" e = SomeWPtrq ∧ lookupTAtom"pr.2" e = SomeWIntlist_sumys⌝ −∗ lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs −∗ ΦRetWIntlist_sumys ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 : lexpr {v. Φv}

iLöb as IH

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
IH :
▷∀e : listname × word q : ptr ys zs : listZ, ⌜lookupTAtom"pr.1" e = SomeWPtrq ∧ lookupTAtom"pr.2" e = SomeWIntlist_sumys⌝ −∗ lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs −∗ ΦRetWIntlist_sumys ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
∀e : listname × word q : ptr ys zs : listZ, ⌜lookupTAtom"pr.1" e = SomeWPtrq ∧ lookupTAtom"pr.2" e = SomeWIntlist_sumys⌝ −∗ lsegp q ys −∗ lstq zs −∗ lstp ys ++ zs −∗ ΦRetWIntlist_sumys ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

iIntros e q ys zs Hq Hs Hs Hl HΦ

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys, zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq zs
HΦ :
lstp ys ++ zs −∗ ΦRetWIntlist_sumys ++ zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

pose proof list_sum_rangeys

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys, zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq zs
HΦ :
lstp ys ++ zs −∗ ΦRetWIntlist_sumys ++ zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

destruct zs as | z zs

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq [ ]
HΦ :
lstp ys ++ [ ] −∗ ΦRetWIntlist_sumys ++ [ ]
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
focused goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

–iDestruct Hl as %→

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
ys :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrnull
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
HΦ :
lstp ys ++ [ ] −∗ ΦRetWIntlist_sumys ++ [ ]
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

cbn [ sum_L3 b_insts b_jump ]

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
ys :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrnull
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
HΦ :
lstp ys ++ [ ] −∗ ΦRetWIntlist_sumys ++ [ ]
∗
WPERunfr_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" {v. Φv}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

ls_facts

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
ys :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrnull
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
IH :
▷∀e0 : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
HΦ :
lstp ys ++ [ ] −∗ ΦRetWIntlist_sumys ++ [ ]
∗
WPERunfr_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" {v. Φv}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

rewrite app_nil_r

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
ys :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrnull
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
IH :
▷∀e0 : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
HΦ :
lstp ys −∗ ΦRetWIntlist_sumys
∗
WPERunfr_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" {v. Φv}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

wp_let_

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
H :
0 ≤ list_sumys < 2 ^ 64
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e0 :
listname × word
Hput :
lookupTAtom"v7" e0 = SomeWInt0
H10 :
lookupTAtom"pr.2" e0 = SomeWIntlist_sumys
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrnull
IH :
∀e : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e = SomeWPtrq ∧ lookupTAtom"pr.2" e = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_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" {v. Φv}
□
Hs :
HΦ :
lstp ys −∗ ΦRetWIntlist_sumys
∗
WPL.ERunfr_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" {v. Φv}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

wp_let_

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
H :
0 ≤ list_sumys < 2 ^ 64
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt0
H12 :
lookupTAtom"pr.1" e = SomeWPtrnull
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWInt0
IH :
∀e0 : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
HΦ :
lstp ys −∗ ΦRetWIntlist_sumys
∗
WPL.ERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" {v. Φv}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

wp_branch_

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
H :
0 ≤ list_sumys < 2 ^ 64
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt0
H12 :
lookupTAtom"pr.1" e = SomeWPtrnull
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWInt0
IH :
∀e0 : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
HΦ :
lstp ys −∗ ΦRetWIntlist_sumys
∗
WPL.ERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L5" SomeTAtom"L3" {v. Φv}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

wp_enter_

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
H :
0 ≤ list_sumys < 2 ^ 64
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt0
H12 :
lookupTAtom"pr.1" e = SomeWPtrnull
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWInt0
IH :
∀e0 : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
HΦ :
lstp ys −∗ ΦRetWIntlist_sumys
∗
WPL.ERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JRetTmpTAtom"pr.2" {v. Φv}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

iApply wp_ret ; first side | iNext

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
H :
0 ≤ list_sumys < 2 ^ 64
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt0
H12 :
lookupTAtom"pr.1" e = SomeWPtrnull
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWInt0
IH :
∀e0 : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
HΦ :
lstp ys −∗ ΦRetWIntlist_sumys
∗
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

iApply HΦ

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
H :
0 ≤ list_sumys < 2 ^ 64
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt0
H12 :
lookupTAtom"pr.1" e = SomeWPtrnull
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWInt0
IH :
∀e0 : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
∗
lstp ys
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

iDestruct lseg_lst_ _ _ [ ] with Hs [//] as H

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
H :
0 ≤ list_sumys < 2 ^ 64
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt0
H12 :
lookupTAtom"pr.1" e = SomeWPtrnull
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWInt0
IH :
∀e0 : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
H :
lstp ys ++ [ ]
∗
lstp ys
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

rewrite app_nil_r

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
H :
0 ≤ list_sumys < 2 ^ 64
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt0
H12 :
lookupTAtom"pr.1" e = SomeWPtrnull
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWInt0
IH :
∀e0 : listname × word q : ptr ys0 zs : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs −∗ lstp ys0 ++ zs −∗ ΦRetWIntlist_sumys0 ++ zs −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
H :
lstp ys
∗
lstp ys
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

iExact H

deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
lstq z :: zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

–rewrite lst_cons

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
q :
ys :
listZ
z :
Z
zs :
listZ
Hq :
lookupTAtom"pr.1" e = SomeWPtrq
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
IH :
▷∀e0 : listname × word q0 : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq0 ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q0 ys0 −∗ lstq0 zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp q ys
Hl :
∃b : Z nx : ptr, ⌜node_okq b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 z ∗ lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

iDestruct Hl as b nx → & Hb0 & Hb1 & Hb2 (Hlv & Hp & Hi & Hl)

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
ys :
listZ
z :
Z
zs :
listZ
b :
Z
Hq :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
IH :
▷∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

ls_facts

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
ys :
listZ
z :
Z
zs :
listZ
b :
Z
Hq :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
IH :
▷∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" b_instssum_L3 b_jumpsum_L3 {v. Φv}

cbn [ sum_L3 b_insts b_jump ]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
e :
listname × word
ys :
listZ
z :
Z
zs :
listZ
b :
Z
Hq :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
Hs :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
IH :
▷∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPERunfr_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" {v. Φv}

wp_let_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e0 :
listname × word
Hput :
lookupTAtom"v7" e0 = SomeWIntb
H10 :
lookupTAtom"pr.2" e0 = SomeWIntlist_sumys
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
IH :
∀e : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e = SomeWPtrq ∧ lookupTAtom"pr.2" e = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPL.ERunfr_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" {v. Φv}

wp_let_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt1
H12 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWIntb
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPL.ERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L3" [ ] JBranchTmpTAtom"v8" ToTAtom"L4" ToTAtom"L5" {v. Φv}

wp_branch_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt1
H12 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWIntb
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPL.ERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L4" SomeTAtom"L3" {v. Φv}

wp_enter_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"v8" e = SomeWInt1
H12 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWIntb
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPL.ERunfr_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" {v. Φv}

wp_flight_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e0 :
listname × word
Hput :
lookupTAtom"v11" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v7" e0 = SomeWIntb
H10 :
lookupTAtom"pr.2" e0 = SomeWIntlist_sumys
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e0 = SomeWInt1
IH :
∀e : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e = SomeWPtrq ∧ lookupTAtom"pr.2" e = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
WPL.ERunfr_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" {v. Φv}

iApply wp_check with Hlv ; first side | iNext ; iIntros Hlv ; gen_env

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H14 :
lookupTAtom"v8" e = SomeWInt1
H12 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWIntb
H13 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hp :
pcellb 0 nx
Hi :
icellb 8 z
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
Hlv :
∗
WPL.ERunfr_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" {v. Φv}

iApply wp_raw_load with Hlv Hi ; first side | iNext ; iIntros Hlv Hi ; gen_env

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e0 :
listname × word
Hput :
lookupTAtom"v12" e0 = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"v11" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v7" e0 = SomeWIntb
H10 :
lookupTAtom"pr.2" e0 = SomeWIntlist_sumys
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e0 = SomeWInt1
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
IH :
∀e : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e = SomeWPtrq ∧ lookupTAtom"pr.2" e = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hp :
pcellb 0 nx
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
Hlv :
Hi :
icellb 8 z
∗
WPL.ERunfr_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" {v. Φv}

wp_let_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e :
listname × word
Hput0 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H16 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H14 :
lookupTAtom"v8" e = SomeWInt1
H12 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWIntb
H13 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H15 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hp :
pcellb 0 nx
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
Hlv :
Hi :
icellb 8 z
∗
WPL.ERunfr_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" {v. Φv}

iApply wp_half_check with Hlv ; first side | iNext ; iIntros Hlv ; gen_env

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e0 :
listname × word
Hput :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"v12" e0 = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"v11" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v7" e0 = SomeWIntb
H10 :
lookupTAtom"pr.2" e0 = SomeWIntlist_sumys
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e0 = SomeWInt1
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H16 :
lookupTAtom"v13" e0 = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e = SomeWPtrq ∧ lookupTAtom"pr.2" e = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hp :
pcellb 0 nx
Hl :
lstnx zs
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
Hi :
icellb 8 z
Hlv :
∗
WPL.ERunfr_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" {v. Φv}

iDestruct lst_cap with Hl as Hnr [Hcap Hl]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
e0 :
listname × word
Hput :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"v12" e0 = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"v11" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v7" e0 = SomeWIntb
H10 :
lookupTAtom"pr.2" e0 = SomeWIntlist_sumys
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e0 = SomeWInt1
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H16 :
lookupTAtom"v13" e0 = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
IH :
∀e : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e = SomeWPtrq ∧ lookupTAtom"pr.2" e = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hp :
pcellb 0 nx
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
Hi :
icellb 8 z
Hlv :
Hl :
∗
WPL.ERunfr_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" {v. Φv}

iApply wp_raw_load_pointer with Hlv Hp Hcap ; first side | iNext ; iIntros Hlv Hp Hcap ; iSpecialize Hl with Hcap ; gen_env

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"v15" e = SomeWPtrnx
H18 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H16 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H14 :
lookupTAtom"v8" e = SomeWInt1
H12 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWIntb
H13 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H15 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H17 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
Hi :
icellb 8 z
Hl :
lstnx zs
Hlv :
Hp :
pcellb 0 nx
∗
WPL.ERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JGotoPollTAtom"L3" {v. Φv}

wp_goto_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"v15" e = SomeWPtrnx
H18 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H16 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H14 :
lookupTAtom"v8" e = SomeWInt1
H12 :
lookupTAtom"pr.1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H11 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys
H10 :
lookupTAtom"v7" e = SomeWIntb
H13 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H15 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H17 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
Hi :
icellb 8 z
Hl :
lstnx zs
Hlv :
Hp :
pcellb 0 nx
∗
WPL.ERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L3" SomeTAtom"L4" {v. Φv}

wp_enter_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
Hi :
icellb 8 z
Hl :
lstnx zs
Hlv :
Hp :
pcellb 0 nx
∗
WPL.ERunfr_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" {v. Φv}

iApply IH $! _ nx ys ++ z zs with [%] [Hs Hlv Hp Hi] Hl [HΦ]

3 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
⊢
lookupTAtom"pr.1" e = SomeWPtrnx ∧ lookupTAtom"pr.2" e = SomeWIntlist_sumys ++ z
focused goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
∗
lsegp nx ys ++ z
focused goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
lstp ys ++ z ++ zs −∗ ΦRetWIntlist_sumys ++ z ++ zs

+split ; eassumption |

3 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
⊢
lookupTAtom"pr.2" e = SomeWIntlist_sumys ++ z
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
∗
lsegp nx ys ++ z
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
lstp ys ++ z ++ zs −∗ ΦRetWIntlist_sumys ++ z ++ zs

rewrite list_sum_snoc

3 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
⊢
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
∗
lsegp nx ys ++ z
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
lstp ys ++ z ++ zs −∗ ΦRetWIntlist_sumys ++ z ++ zs

eassumption

2 open

deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
Hs :
lsegp ptr_addr ≔ b; ptr_cap ≔ Objb ys
Hlv :
Hp :
pcellb 0 nx
Hi :
icellb 8 z
∗
lsegp nx ys ++ z
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
lstp ys ++ z ++ zs −∗ ΦRetWIntlist_sumys ++ z ++ zs

+iApply lseg_snoc with Hs Hlv Hp Hi

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
⊢
node_okptr_addr ≔ b; ptr_cap ≔ Objb b
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
lstp ys ++ z ++ zs −∗ ΦRetWIntlist_sumys ++ z ++ zs

unfold node_ok

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
⊢
ptr_addr ≔ b; ptr_cap ≔ Objb = ptr_addr ≔ b; ptr_cap ≔ Objb ∧ 0 < b ∧ b + 16 ≤ 2 ^ 48 ∧ b mod 16 = 0
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
lstp ys ++ z ++ zs −∗ ΦRetWIntlist_sumys ++ z ++ zs

auto

deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
lstp ys ++ z ++ zs −∗ ΦRetWIntlist_sumys ++ z ++ zs

+rewrite - app_assoc

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
Φ :
outcome → iPropIΣ
ys :
listZ
z :
Z
zs :
listZ
b :
Z
H :
0 ≤ list_sumys < 2 ^ 64
nx :
Hb0 :
0 < b
Hb1 :
b + 16 ≤ 2 ^ 48
Hb2 :
b mod 16 = 0
H4 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H5 :
H6 :
H7 :
H8 :
H9 :
fn_retls_fn"listsum" = RClassL
Hnr :
0 ≤ ptr_addrnx < 2 ^ 64
e :
listname × word
Hput0 :
lookupTAtom"pr.1" e = SomeWPtrnx
H18 :
lookupTAtom"v15" e = SomeWPtrnx
H16 :
lookupTAtom"v13" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H12 :
lookupTAtom"v8" e = SomeWInt1
H10 :
lookupTAtom"v7" e = SomeWIntb
H11 :
lookupTAtom"v11" e = SomeWPtrptr_addr ≔ b + 8; ptr_cap ≔ Objb
H13 :
lookupTAtom"v12" e = SomeWIntz mod 2 ^ 64
H15 :
lookupTAtom"chk1" e = SomeWPtrptr_addr ≔ b; ptr_cap ≔ Objb
H17 :
lookupTAtom"pr.2" e = SomeWIntlist_sumys + z mod 2 ^ 64 mod 2 ^ 64
IH :
∀e0 : listname × word q : ptr ys0 zs0 : listZ, ⌜lookupTAtom"pr.1" e0 = SomeWPtrq ∧ lookupTAtom"pr.2" e0 = SomeWIntlist_sumys0⌝ −∗ lsegp q ys0 −∗ lstq zs0 −∗ lstp ys0 ++ zs0 −∗ ΦRetWIntlist_sumys0 ++ zs0 −∗ WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ e0; 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" {v. Φv}
□
HΦ :
lstp ys ++ z :: zs −∗ ΦRetWIntlist_sumys ++ z :: zs
∗
lstp ys ++ z ++ zs −∗ ΦRetWIntlist_sumys ++ z ++ zs

iExact HΦ

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
iLöb as IH
iIntros e q ys zs Hq Hs Hs Hl HΦ
destruct zs as | z zs
–iDestruct Hl as %→
rewrite app_nil_r
iApply wp_ret ; first side | iNext
iApply HΦ
iDestruct lseg_lst_ _ _ [ ] with Hs [//] as H
rewrite app_nil_r
iExact H
–rewrite lst_cons
iDestruct Hl as b nx → & Hb0 & Hb1 & Hb2 (Hlv & Hp & Hi & Hl)
iApply wp_check with Hlv ; first side | iNext ; iIntros Hlv ; gen_env
iApply wp_raw_load with Hlv Hi ; first side | iNext ; iIntros Hlv Hi ; gen_env
iApply wp_half_check with Hlv ; first side | iNext ; iIntros Hlv ; gen_env
iDestruct lst_cap with Hl as Hnr [Hcap Hl]
iApply wp_raw_load_pointer with Hlv Hp Hcap ; first side | iNext ; iIntros Hlv Hp Hcap ; iSpecialize Hl with Hcap ; gen_env
iApply IH $! _ nx ys ++ z zs with [%] [Hs Hlv Hp Hi] Hl [HΦ]
+split ; eassumption |
eassumption
+iApply lseg_snoc with Hs Hlv Hp Hi
unfold node_ok
auto
+rewrite - app_assoc
iExact HΦ

sum's specification: called with the list from p holding xs, it returns their sum modulo 2^64 and hands the list back.

312Lemma sum_spec
∀ p xs
⊢ ⦃lstp xs⦄ ERunsum_framep : lexpr ⦃RET RetWIntlist_sumxs; lstp xs⦄
Explore proof 8 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
xs :
listZ
⊢
⊢ ⦃lstp xs⦄ ERunsum_framep : lexpr ⦃RET RetWIntlist_sumxs; lstp xs⦄

iIntros Φ !> Hl HΦ

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
xs :
listZ
Φ :
outcome → iPropIΣ
Hl :
lstp xs
HΦ :
▷lstp xs −∗ ΦRetWIntlist_sumxs
∗
WPERunsum_framep {v. Φv}

ls_facts

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
xs :
listZ
Φ :
outcome → iPropIΣ
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
Hl :
lstp xs
HΦ :
▷lstp xs −∗ ΦRetWIntlist_sumxs
∗
WPERunsum_framep {v. Φv}

unfold sum_frame

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
xs :
listZ
Φ :
outcome → iPropIΣ
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
Hl :
lstp xs
HΦ :
▷lstp xs −∗ ΦRetWIntlist_sumxs
∗
WPERunfr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None {v. Φv}

wp_enter_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
xs :
listZ
Φ :
outcome → iPropIΣ
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
Hl :
lstp xs
HΦ :
lstp xs −∗ ΦRetWIntlist_sumxs
∗
WPL.ERunfr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JGotoToTAtom"L3" {v. Φv}

wp_goto_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
xs :
listZ
Φ :
outcome → iPropIΣ
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
Hl :
lstp xs
HΦ :
lstp xs −∗ ΦRetWIntlist_sumxs
∗
WPL.ERunfr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L3" SomeTAtom"start" {v. Φv}

wp_enter_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
xs :
listZ
Φ :
outcome → iPropIΣ
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
Hl :
lstp xs
HΦ :
lstp xs −∗ ΦRetWIntlist_sumxs
∗
WPL.ERunfr_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" {v. Φv}

iApply sum_loopp Φ $! _ p [ ] xs with [%] [//] Hl HΦ

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
p :
xs :
listZ
Φ :
outcome → iPropIΣ
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
⊢
lookupTAtom"pr.1" putTAtom"pr.1" WPtrp putTAtom"pr.2" WInt0 TAtom"v0", WPtrp = SomeWPtrp ∧ lookupTAtom"pr.2" putTAtom"pr.1" WPtrp putTAtom"pr.2" WInt0 TAtom"v0", WPtrp = SomeWIntlist_sum[ ]

split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
iIntros Φ !> Hl HΦ
unfold sum_frame
iApply sum_loopp Φ $! _ p [ ] xs with [%] [//] Hl HΦ
split ; reflexivity

A new node's object, split into the pieces a node owns: its life, a null next pointer and a zero value; the other aux slots are dropped.

325Lemma obj_node
∀ base
objbase heap_req16 16 −∗ livebase node_regbase ∗ pcellbase 0 null ∗ icellbase 8 0
Explore proof 7 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
base :
Z
⊢
objbase heap_req16 16 −∗ livebase node_regbase ∗ pcellbase 0 null ∗ icellbase 8 0

rewrite / obj / live / pcell / icell

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
base :
Z
⊢
ptsobj_psbase heap_req16 16 −∗ ptsPLivebase, VLivenode_regbase ∗ ptsPAuxbase 0, VAuxptr_capnull :: cellbase 0 ptr_addrnull ∗ ptscellbase 8 0

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

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
base :
Z
E :
obj_psbase heap_req16 16 = PLivebase, VLivenode_regbase ++ cellbase 0 0 ++ cellbase 8 0 ++ PAuxbase 0, VAuxCNone ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15
⊢
ptsobj_psbase heap_req16 16 −∗ ptsPLivebase, VLivenode_regbase ∗ ptsPAuxbase 0, VAuxptr_capnull :: cellbase 0 ptr_addrnull ∗ ptscellbase 8 0

rewrite E ! pts_app

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
base :
Z
E :
obj_psbase heap_req16 16 = PLivebase, VLivenode_regbase ++ cellbase 0 0 ++ cellbase 8 0 ++ PAuxbase 0, VAuxCNone ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15
⊢
ptsPLivebase, VLivenode_regbase ∗ ptscellbase 0 0 ∗ ptscellbase 8 0 ∗ ptsPAuxbase 0, VAuxCNone ∗ ptsλi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15 −∗ ptsPLivebase, VLivenode_regbase ∗ ptsPAuxbase 0, VAuxptr_capnull :: cellbase 0 ptr_addrnull ∗ ptscellbase 8 0

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

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
base :
Z
E :
obj_psbase heap_req16 16 = PLivebase, VLivenode_regbase ++ cellbase 0 0 ++ cellbase 8 0 ++ PAuxbase 0, VAuxCNone ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15
Hl :
H0 :
ptscellbase 0 0
H8 :
ptscellbase 8 0
Ha :
∗
ptsPLivebase, VLivenode_regbase ∗ ptsPAuxbase 0, VAuxptr_capnull :: cellbase 0 ptr_addrnull ∗ ptscellbase 8 0

iFrame Hl H8

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
base :
Z
E :
obj_psbase heap_req16 16 = PLivebase, VLivenode_regbase ++ cellbase 0 0 ++ cellbase 8 0 ++ PAuxbase 0, VAuxCNone ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15
H0 :
ptscellbase 0 0
Ha :
∗

rewrite pts_app_ cellbase 0 0

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
base :
Z
E :
obj_psbase heap_req16 16 = PLivebase, VLivenode_regbase ++ cellbase 0 0 ++ cellbase 8 0 ++ PAuxbase 0, VAuxCNone ++ λi : Z ⇒ PAuxbase i, VAuxCNone <$> seqZ1 15
H0 :
ptscellbase 0 0
Ha :
∗
ptsPAuxbase 0, VAuxptr_capnull ∗ ptscellbase 0 0

iFrame

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
rewrite / obj / live / pcell / icell
assert E : obj_psbase heap_req16 16 = PLivebase, VLivenode_regbase ++ 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 Hl H8
rewrite pts_app_ cellbase 0 0
iFrame

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 n, 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 through its triple, and the list it hands back is dropped.

343Lemma ls_loop
∀ n
⊢ ∀e i h xs, ⌜lookupTAtom"pr.2" e = SomeWInti ∧ 0 ≤ i < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth xs −∗ WPERunmkFramels_fn"listsum" e [ ] None ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 : lexpr {_. True}
Explore proof 49 tactics

Initial goal

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

iLöb as IH

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

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

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
e :
listname × word
i :
Z
h :
xs :
listZ
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, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 {_. True}
□
Hl :
lsth xs
∗
WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 {_. True}

ls_facts

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
e :
listname × word
i :
Z
h :
xs :
listZ
Hi :
lookupTAtom"pr.2" e = SomeWInti
Hir :
0 ≤ i < 2 ^ 31
Hh :
lookupTAtom"pr.1" e = SomeWPtrh
Hn :
lookupTAtom"v0" e = SomeWIntn
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
IH :
▷∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 {_. True}
□
Hl :
lsth xs
∗
WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 {_. True}

pose proof ls_find_sumR.free

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
e :
listname × word
i :
Z
h :
xs :
listZ
Hi :
lookupTAtom"pr.2" e = SomeWInti
Hir :
0 ≤ i < 2 ^ 31
Hh :
lookupTAtom"pr.1" e = SomeWPtrh
Hn :
lookupTAtom"v0" e = SomeWIntn
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
IH :
▷∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 {_. True}
□
Hl :
lsth xs
∗
WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" b_instsls_L4 b_jumpls_L4 {_. True}

cbn [ ls_L4 b_insts b_jump ]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
e :
listname × word
i :
Z
h :
xs :
listZ
Hi :
lookupTAtom"pr.2" e = SomeWInti
Hir :
0 ≤ i < 2 ^ 31
Hh :
lookupTAtom"pr.1" e = SomeWPtrh
Hn :
lookupTAtom"v0" e = SomeWIntn
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
IH :
▷∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_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" {_. True}
□
Hl :
lsth xs
∗
WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}

wp_let_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hput :
lookupTAtom"v10" e0
=
Some
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
→
1
else
0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

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

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}
focused goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

–assert Hi1 : i + 1 < 2 ^ 31

3 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
⊢
i + 1 < 2 ^ 31
focused goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

{apply Z.ltb_lt in Hc

3 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
⊢
i + 1 < 2 ^ 31
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

revert Hc

3 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
⊢
i
<
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
→
i + 1 < 2 ^ 31
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

destruct 2 ^ 31 ≤? n mod 2 ^ 32 eqn: Hs ; apply Z.leb_le in Hs | apply Z.leb_gt in Hs ; intros ; pose proof Z.mod_pos_boundn 2 ^ 32 ltac:lia ; lia

2 open

deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

wp_branch_

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L5" SomeTAtom"L4" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

wp_enter_

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hput :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
Hi1 :
i + 1 < 2 ^ 31
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

iApply wp_alloc ; first side | iNext ; iIntros base Hb0 & Hb1 & Hb2 Hobj ; gen_env

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod req_alignheap_req16 16 = 0
Hb2 :
base + req_extentheap_req16 16 ≤ 2 ^ 48
e :
listname × word
Hput0 :
lookupTAtom"v12" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"pr.2" e = SomeWInti
H12 :
lookupTAtom"pr.1" e = SomeWPtrh
H11 :
lookupTAtom"v0" e = SomeWIntn
H10 :
lookupTAtom"v10" e = SomeWInt1
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_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" {_. True}
□
Hl :
lsth xs
Hobj :
objbase heap_req16 16
∗
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

change req_alignheap_req16 16 with 16 in Hb1

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + req_extentheap_req16 16 ≤ 2 ^ 48
e :
listname × word
Hput0 :
lookupTAtom"v12" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"pr.2" e = SomeWInti
H12 :
lookupTAtom"pr.1" e = SomeWPtrh
H11 :
lookupTAtom"v0" e = SomeWIntn
H10 :
lookupTAtom"v10" e = SomeWInt1
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_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" {_. True}
□
Hl :
lsth xs
Hobj :
objbase heap_req16 16
∗
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

change req_extentheap_req16 16 with 16 in Hb2

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
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
H13 :
lookupTAtom"pr.2" e = SomeWInti
H12 :
lookupTAtom"pr.1" e = SomeWPtrh
H11 :
lookupTAtom"v0" e = SomeWIntn
H10 :
lookupTAtom"v10" e = SomeWInt1
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_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" {_. True}
□
Hl :
lsth xs
Hobj :
objbase heap_req16 16
∗
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

iDestruct obj_node with Hobj as (Hlv & Hp & Hi)

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
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
H13 :
lookupTAtom"pr.2" e = SomeWInti
H12 :
lookupTAtom"pr.1" e = SomeWPtrh
H11 :
lookupTAtom"v0" e = SomeWIntn
H10 :
lookupTAtom"v10" e = SomeWInt1
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_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" {_. True}
□
Hl :
lsth xs
Hlv :
livebase node_regbase
Hp :
pcellbase 0 null
Hi :
icellbase 8 0
∗
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

iApply wp_check with Hlv ; first side | iNext ; iIntros Hlv ; gen_env

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
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
H14 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
H13 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
Hp :
pcellbase 0 null
Hi :
icellbase 8 0
Hlv :
livebase node_regbase
∗
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

iApply wp_raw_store_pointer with Hlv Hp ; first side | iNext ; iIntros Hlv Hp ; gen_env

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
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
H14 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
H13 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
Hi :
icellbase 8 0
Hlv :
livebase node_regbase
Hp :
pcellbase 0 h
∗
WPL.ERunfr_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" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

wp_flight_

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
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
H15 :
lookupTAtom"v12" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"pr.2" e = SomeWInti
H12 :
lookupTAtom"pr.1" e = SomeWPtrh
H11 :
lookupTAtom"v0" e = SomeWIntn
H10 :
lookupTAtom"v10" e = SomeWInt1
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_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" {_. True}
□
Hl :
lsth xs
Hi :
icellbase 8 0
Hlv :
livebase node_regbase
Hp :
pcellbase 0 h
∗
WPL.ERunfr_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" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

wp_let_

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"v18" e0 = SomeWInti
H16 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H14 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
H13 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H15 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
Hi :
icellbase 8 0
Hlv :
livebase node_regbase
Hp :
pcellbase 0 h
∗
WPL.ERunfr_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" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

iApply wp_half_check with Hlv ; first side | iNext ; iIntros Hlv ; gen_env

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
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
H17 :
lookupTAtom"v16" e = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"v12" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"pr.2" e = SomeWInti
H12 :
lookupTAtom"pr.1" e = SomeWPtrh
H11 :
lookupTAtom"v0" e = SomeWIntn
H10 :
lookupTAtom"v10" e = SomeWInt1
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H16 :
lookupTAtom"v18" e = SomeWInti
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_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" {_. True}
□
Hl :
lsth xs
Hi :
icellbase 8 0
Hp :
pcellbase 0 h
Hlv :
livebase node_regbase
∗
WPL.ERunfr_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" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

iApply wp_raw_store with Hlv Hi ; first side | iNext ; iIntros Hlv Hi ; gen_env

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
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
H17 :
lookupTAtom"v16" e = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"v12" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"pr.2" e = SomeWInti
H12 :
lookupTAtom"pr.1" e = SomeWPtrh
H11 :
lookupTAtom"v0" e = SomeWIntn
H10 :
lookupTAtom"v10" e = SomeWInt1
H14 :
lookupTAtom"chk0" e = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H16 :
lookupTAtom"v18" e = SomeWInti
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_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" {_. True}
□
Hl :
lsth xs
Hp :
pcellbase 0 h
Hlv :
livebase node_regbase
Hi :
icellbase 8 i
∗
WPL.ERunfr_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" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

wp_let_

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"v21" e0 = SomeWInti + 1
H18 :
lookupTAtom"v18" e0 = SomeWInti
H16 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H14 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
H13 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H15 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
Hp :
pcellbase 0 h
Hlv :
livebase node_regbase
Hi :
icellbase 8 i
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L5" [ ] JGotoPollTAtom"L4" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

wp_goto_

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"v21" e0 = SomeWInti + 1
H18 :
lookupTAtom"v18" e0 = SomeWInti
H16 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H14 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
H13 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H15 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
Hp :
pcellbase 0 h
Hlv :
livebase node_regbase
Hi :
icellbase 8 i
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L4" SomeTAtom"L5" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

wp_enter_

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
Hp :
pcellbase 0 h
Hlv :
livebase node_regbase
Hi :
icellbase 8 i
∗
WPL.ERunfr_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" {_. True}
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

iApply IH $! _ i + 1 mkPtrbase Objbase i :: xs with [%] [Hlv Hp Hi Hl]

3 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
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
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hlv :
livebase node_regbase
Hp :
pcellbase 0 h
Hi :
icellbase 8 i
Hl :
lsth xs
∗
lstptr_addr ≔ base; ptr_cap ≔ Objbase i :: xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

+split ; eassumption |

3 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
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
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hlv :
livebase node_regbase
Hp :
pcellbase 0 h
Hi :
icellbase 8 i
Hl :
lsth xs
∗
lstptr_addr ≔ base; ptr_cap ≔ Objbase i :: xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

split ; lia |

3 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
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
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hlv :
livebase node_regbase
Hp :
pcellbase 0 h
Hi :
icellbase 8 i
Hl :
lsth xs
∗
lstptr_addr ≔ base; ptr_cap ≔ Objbase i :: xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

split ; eassumption

2 open

deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hlv :
livebase node_regbase
Hp :
pcellbase 0 h
Hi :
icellbase 8 i
Hl :
lsth xs
∗
lstptr_addr ≔ base; ptr_cap ≔ Objbase i :: xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

+rewrite lst_cons

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hlv :
livebase node_regbase
Hp :
pcellbase 0 h
Hi :
icellbase 8 i
Hl :
lsth xs
∗
∃b : Z nx : ptr, ⌜node_okptr_addr ≔ base; ptr_cap ≔ Objbase b⌝ ∗ liveb node_regb ∗ pcellb 0 nx ∗ icellb 8 i ∗ lstnx xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

iExists base, h

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hlv :
livebase node_regbase
Hp :
pcellbase 0 h
Hi :
icellbase 8 i
Hl :
lsth xs
∗
⌜node_okptr_addr ≔ base; ptr_cap ≔ Objbase base⌝ ∗ livebase node_regbase ∗ pcellbase 0 h ∗ icellbase 8 i ∗ lsth xs
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

iFrame

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
⌜node_okptr_addr ≔ base; ptr_cap ≔ Objbase base⌝
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

iPureIntro

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
⊢
node_okptr_addr ≔ base; ptr_cap ≔ Objbase base
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

unfold node_ok

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
true
Hi1 :
i + 1 < 2 ^ 31
base :
Z
Hb0 :
0 < base
Hb1 :
base mod 16 = 0
Hb2 :
base + 16 ≤ 2 ^ 48
e0 :
listname × word
Hput :
lookupTAtom"pr.1" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H18 :
lookupTAtom"v21" e0 = SomeWInti + 1
H16 :
lookupTAtom"v18" e0 = SomeWInti
H14 :
lookupTAtom"chk0" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H13 :
lookupTAtom"v10" e0 = SomeWInt1
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"v12" e0 = SomeWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
H12 :
lookupTAtom"v16" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H15 :
lookupTAtom"chk1" e0 = SomeWPtrptr_addr ≔ base + 8; ptr_cap ≔ Objbase
H17 :
lookupTAtom"pr.2" e0 = SomeWInti + 1
⊢
ptr_addr ≔ base; ptr_cap ≔ Objbase = ptr_addr ≔ base; ptr_cap ≔ Objbase ∧ 0 < base ∧ base + 16 ≤ 2 ^ 48 ∧ base mod 16 = 0
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

auto with zarith

deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L4" [ ] JBranchTmpTAtom"v10" ToTAtom"L5" ToTAtom"L7" {_. True}

–wp_branch_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L7" SomeTAtom"L4" {_. True}

wp_enter_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_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" {_. True}

iApply wp_call_bind ; try side

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
▷WPL.ERunfr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrh; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None {o. ∃cf′ : frame, ⌜L.resumefr_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 o = Somecf′⌝ ∗ ▷WPL.ERuncf′ {_. True}}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
Hl :
lsth xs
∗
WPL.ERunfr_fn ≔ ls_fn"sum"; fr_env ≔ TAtom"v0", WPtrh; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None {o. ∃cf′ : frame, ⌜L.resumefr_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 o = Somecf′⌝ ∗ ▷WPL.ERuncf′ {_. True}}

iApply sum_spec with Hl

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
▷lsth xs −∗ ∃cf′ : frame, ⌜L.resumefr_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 RetWIntlist_sumxs = Somecf′⌝ ∗ ▷WPL.ERuncf′ {_. True}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
lsth xs −∗ ∃cf′ : frame, ⌜L.resumefr_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 RetWIntlist_sumxs = Somecf′⌝ ∗ ▷WPL.ERuncf′ {_. True}

iIntros _

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
∃cf′ : frame, ⌜L.resumefr_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 RetWIntlist_sumxs = Somecf′⌝ ∗ ▷WPL.ERuncf′ {_. True}

iExists _

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
⌜L.resumefr_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 RetWIntlist_sumxs = Some?f⌝ ∗ ▷WPL.ERun?f {_. True}
shelved goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti

iSplit ; iPureIntro ; reflexivity |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
▷WPL.ERunfr_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" WIntlist_sumxs mod 2 ^ 64 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" {_. True}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
WPL.ERunfr_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" WIntlist_sumxs mod 2 ^ 64 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" {_. True}

cbn [ fr_fn fr_env fr_locals fr_doomed fr_at ]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
e0 :
listname × word
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
Hput :
lookupTAtom"v10" e0 = SomeWInt0
H10 :
lookupTAtom"v0" e0 = SomeWIntn
H11 :
lookupTAtom"pr.1" e0 = SomeWPtrh
H12 :
lookupTAtom"pr.2" e0 = SomeWInti
IH :
∀e : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e = SomeWPtrh0 ∧ lookupTAtom"v0" e = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; 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" {_. True}
□
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ putTAtom"v23" WIntlist_sumxs mod 2 ^ 64 e0; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23" {_. True}

gen_env

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n, i :
Z
h :
xs :
listZ
Hir :
0 ≤ i < 2 ^ 31
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
H9 :
find_fnls_geR.free TAtom"sum" = SomeDefinedls_fn"sum"
Hc :
i
<?
2 ^ 31 ≤? n mod 2 ^ 32
→
n mod 2 ^ 32 − 2 ^ 32
else
n mod 2 ^ 32
=
false
e :
listname × word
Hput0 :
lookupTAtom"v23" e = SomeWIntlist_sumxs mod 2 ^ 64
H13 :
lookupTAtom"pr.2" e = SomeWInti
H12 :
lookupTAtom"pr.1" e = SomeWPtrh
H11 :
lookupTAtom"v0" e = SomeWIntn
H10 :
lookupTAtom"v10" e = SomeWInt0
IH :
∀e0 : listname × word i0 : Z h0 : ptr xs0 : listZ, ⌜lookupTAtom"pr.2" e0 = SomeWInti0 ∧ 0 ≤ i0 < 2 ^ 31 ∧ lookupTAtom"pr.1" e0 = SomeWPtrh0 ∧ lookupTAtom"v0" e0 = SomeWIntn⌝ −∗ lsth0 xs0 −∗ WPERunfr_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" {_. True}
□
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ e; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"L7" [ ] JRetTmpTAtom"v23" {_. True}

iApply wp_ret ; first side | done

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
iLöb as IH
iIntros e i h xs Hi & Hir & Hh & Hn Hl
pose proof ls_find_sumR.free
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
destruct 2 ^ 31 ≤? n mod 2 ^ 32 eqn: Hs ; apply Z.leb_le in Hs | apply Z.leb_gt in Hs ; intros ; pose proof Z.mod_pos_boundn 2 ^ 32 ltac:lia ; lia
iApply wp_alloc ; first side | iNext ; iIntros base Hb0 & Hb1 & Hb2 Hobj ; gen_env
change req_alignheap_req16 16 with 16 in Hb1
change req_extentheap_req16 16 with 16 in Hb2
iDestruct obj_node with Hobj as (Hlv & Hp & Hi)
iApply wp_check with Hlv ; first side | iNext ; iIntros Hlv ; gen_env
iApply wp_raw_store_pointer with Hlv Hp ; first side | iNext ; iIntros Hlv Hp ; gen_env
iApply wp_half_check with Hlv ; first side | iNext ; iIntros Hlv ; gen_env
iApply wp_raw_store with Hlv Hi ; first side | iNext ; iIntros Hlv Hi ; gen_env
iApply IH $! _ i + 1 mkPtrbase Objbase i :: xs with [%] [Hlv Hp Hi Hl]
+split ; eassumption |
split ; lia |
split ; eassumption
+rewrite lst_cons
iExists base, h
iFrame
iPureIntro
unfold node_ok
auto with zarith
iApply wp_call_bind ; try side
iNext
iApply sum_spec with Hl
iNext
iIntros _
iExists _
iSplit ; iPureIntro ; reflexivity |
iNext
iApply wp_ret ; first side | done

listsum called with the int n is safe.

383Lemma listsum_spec
∀ n
⊢ WPERunmkFramels_fn"listsum" TAtom"v0", WIntn [ ] None EnterTAtom"start" None : lexpr {_. True}
Explore proof 8 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
⊢
⊢ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None : lexpr {_. True}

ls_facts

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
⊢
⊢ WPERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None : lexpr {_. True}

wp_enter_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JGotoToTAtom"L4" {_. True}

wp_goto_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
∗
WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"L4" SomeTAtom"start" {_. True}

wp_enter_

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
∗
WPL.ERunfr_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" {_. True}

iApply ls_loopn $! _ 0 null [ ] with [%] [//]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
⊢
lookupTAtom"pr.2" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWInt0 ∧ 0 ≤ 0 < 2 ^ 31 ∧ lookupTAtom"pr.1" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWPtrnull ∧ lookupTAtom"v0" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWIntn

split ; reflexivity |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
⊢
0 ≤ 0 < 2 ^ 31 ∧ lookupTAtom"pr.1" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWPtrnull ∧ lookupTAtom"v0" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWIntn

split ; lia |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
H3 :
find_blockTAtom"start" fn_blocksls_fn"listsum" = Somels_start
H4 :
H5 :
H6 :
H7 :
H8 :
fn_retls_fn"listsum" = RClassL
⊢
lookupTAtom"pr.1" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWPtrnull ∧ lookupTAtom"v0" putTAtom"pr.1" WPtrptr_addr ≔ 0; ptr_cap ≔ CNone putTAtom"pr.2" WInt0 TAtom"v0", WIntn = SomeWIntn

split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
iApply ls_loopn $! _ 0 null [ ] with [%] [//]
split ; reflexivity |
split ; lia |
split ; reflexivity

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

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

lsΣ has invariants.

398Instance 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.

402Instance 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.

409Theorem 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 ListSum.ls_mem ls_fn"listsum"

4 open

⊢
initial_memoryls_module = Somels_globals, ListSum.ls_mem
focused goal
⊢
find_fnlge TAtom"listsum" = SomeDefinedls_fn"listsum"
focused goal
⊢
live_disjointListSum.ls_mem
focused goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framels_fn"listsum" xs = Somefr ∧ ∀HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ WPL.ERunfr {_. True}

–exact ls_initial

3 open

deferred goal
⊢
find_fnlge TAtom"listsum" = SomeDefinedls_fn"listsum"
deferred goal
⊢
live_disjointListSum.ls_mem
deferred goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framels_fn"listsum" xs = Somefr ∧ ∀HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ WPL.ERunfr {_. True}

–exact ls_find_listsumR.free

2 open

deferred goal
⊢
live_disjointListSum.ls_mem
deferred goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framels_fn"listsum" xs = Somefr ∧ ∀HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ WPL.ERunfr {_. True}

–intros b1 r1 b2 r2 E _

2 open

b1 :
Z
r1 :
b2 :
Z
r2 :
E :
object_regionb1 m_regionsListSum.ls_mem = Somer1
⊢
live_atListSum.ls_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 ∧ ∀HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ WPL.ERunfr {_. True}

vm_compute in E

2 open

b1 :
Z
r1 :
b2 :
Z
r2 :
E :
None = Somer1
⊢
live_atListSum.ls_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 ∧ ∀HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ WPL.ERunfr {_. True}

discriminate E

deferred goal
⊢
∀xs : listword, ∃n : Z rest : listword, xs = WIntn :: rest → ∃fr : frame, call_framels_fn"listsum" xs = Somefr ∧ ∀HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ WPL.ERunfr {_. True}

–intros xs n & rest & →

n :
Z
rest :
listword
⊢
∃fr : frame, call_framels_fn"listsum" WIntn :: rest = Somefr ∧ ∀HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ WPL.ERunfr {_. True}

eexists

2 open

n :
Z
rest :
listword
⊢
call_framels_fn"listsum" WIntn :: rest = Some?fr ∧ ∀HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ WPL.ERun?fr {_. True}
shelved goal
n :
Z
rest :
listword

split ; apply listsum_call_frame |

n :
Z
rest :
listword
⊢
∀HinvG : invGS_genHasNoLc lsΣ HheapG : gen_heapGSpiece pval lsΣ, ⊢ WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None {_. True}

intros HinvG HheapG

n :
Z
rest :
listword
HinvG :
invGS_genHasNoLc lsΣ
HheapG :
gen_heapGSpiece pval lsΣ
⊢
⊢ WPL.ERunfr_fn ≔ ls_fn"listsum"; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None {_. True}

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 ListSum.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 HinvG HheapG

The theorem for the interpreter's runtime.

423Module InterpListSumLogic ≔ ListSumLogic InterpRuntime

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

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

Initial goal

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

exact InterpListSumLogic.listsum_never_panics

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script