| # lax = # gndx, lax.to-adr(lnum) = ax, jvalid0 ↔ boolvar0, gstore2[lnum] = groupblock(gndx, lax, m), err = ESUCCESS, fi0 = ri, gstore = gstore1, gstore0 = gstore2, jro = ginval, ndx = [], nx = nx0, p_os = ns, pmaxino = maxino, inv(groupblock(gndx, lax, m)), inv(gstore2 \ ginval), ri-cons(ri, nodes(gstore2 ↓, ginval)), lnum ∈ gstore2 ⊦ ⟪while err = ESUCCESS ∧ ax ≠ [] do {/* (prepost-gc-referenced-nodes : invariant (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → (∃ ax0, gndx0. ax` = ax0 + ax ∧ gndx` = gndx0 + gndx ∧ # ax` = # gndx` ∧ # ax = # gndx ∧ ndx = nodes(gstore0 ↓, jro)[referenced-adrs(ax0, fi0)])) wfbound (err = ESUCCESS ⊃ # ax;0)) */; let jvalid = ?, adr0 = ? in {let adr = ax.head, gnd = gndx.head in let key = gnd.nd.key in {index_index_lookup#(key, fi0, fi, jro, gstore0, gstore, nx, pmaxino, p_os, jvalid0; jvalid, adr0; err); if err = ESUCCESS ∧ jvalid ∧ adr0 = adr then ndx := ndx + gnd.nd}; if err = ESUCCESS then {ax := ax.tail; gndx := gndx.tail}}}⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → ndx = nodes(gstore2 ↓, ginval)[referenced-adrs(lax.to-adr(lnum), ri)])), lnum ∈ ginval |
# lax = # gndx1, lax.to-adr(lnum) = ax2, jvalid0 ↔ boolvar0, gstore2[lnum] = groupblock(gndx1, lax, m), ax = ax1, err = err0, err = ESUCCESS, err1 = ESUCCESS, fi0 = ri, gstore = gstore1, gstore0 = gstore2, jro = ginval, ndx0 = [], nx = nx0, p_os = ns, pmaxino = maxino, inv(gstore2 \ ginval), inv(groupblock(gndx1, lax, m)), ri-cons(ri, nodes(gstore2 ↓, ginval)), lnum ∈ gstore2, err = ESUCCESS → (∃ ax0, gndx0. ax2 = ax0 + ax ∧ gndx1 = gndx0 + gndx ∧ # ax2 = # gndx1 ∧ # ax = # gndx ∧ ndx = nodes(gstore0 ↓, jro)[referenced-adrs(ax0, fi0)]), err = ESUCCESS ∨ ⌊err⌋ ⊦ ⟪let jvalid = ?, adr0 = ? in {let adr = ax.head, gnd = gndx.head in let key = gnd.nd.key in {index_index_lookup#(key, fi0, fi, jro, gstore0, gstore, nx, pmaxino, p_os, jvalid0; jvalid, adr0; err); if err = ESUCCESS ∧ jvalid ∧ adr0 = adr then ndx := ndx + gnd.nd}; if err = ESUCCESS then {ax := ax.tail; gndx := gndx.tail}}⟫ ( ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → (∃ ax0, gndx0. ax2 = ax0 + ax ∧ gndx1 = gndx0 + gndx ∧ # ax2 = # gndx1 ∧ # ax = # gndx ∧ ndx = nodes(gstore0 ↓, jro)[referenced-adrs(ax0, fi0)]))) ∧ (err = ESUCCESS ⊃ # ax;0) < (err0 = ESUCCESS ⊃ # ax1;0)), ax = [], lnum ∈ ginval
Used simplifier rules: ⊦ # lax.to-adr(n) = # lax; (s)% ⊦ #(gndx + gndx0) = # gndx + # gndx0; (s)%a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]%fwd-inv-gblock-rem: ⊦ inv(gstore \ ginval) ∧ n ∈ gstore ∧ ¬ n ∈ ginval ∧ gstore[n] = gblock → inv(gblock); (forward) from specification apersistence-base% ⊦ # [] = 0; (s)% ⊦ # gndx = 0 ↔ gndx = []; (s)% ⊦ m + n = m + n0 ↔ n = n0; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ ax + [] = ax; (s)%a: ⊦ (ax + ax0) + ax1 = ax + ax0 + ax1; from specification list[address-list-set]% ⊦ ax = ax0 + ax ↔ ax0 = []; (s)% ⊦ gndx = gndx0 + gndx ↔ gndx0 = []; (s)% ⊦ inv(groupblock(gndx, lax, m0)) → (# gndx = # lax ↔ true); (ss)% ⊦ referenced-adrs([], ri) = []; (s)% ⊦ fs[[]] = []; (s) Used formulas: (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → (∃ ax0, gndx0. ax` = ax0 + ax ∧ gndx` = gndx0 + gndx ∧ # ax` = # gndx` ∧ # ax = # gndx ∧ ndx = nodes(gstore0 ↓, jro)[referenced-adrs(ax0, fi0)])), (err = ESUCCESS ⊃ # ax;0) = (err = ESUCCESS ⊃ # ax;0)