| # lax = # gndx0 + # gndx, # ax2 + 1 = # gndx, lax.to-adr(lnum) = ax + adr ' + ax2, gstore2[lnum] = groupblock(gndx0 + gndx, lax, m), gndx = gnd + gndx2, inv(groupblock(gndx0 + gndx, lax, m)), inv(gstore2 \ ginval), ri-cons(ri, nodes(gstore2 ↓, ginval)), lnum ∈ gstore2 ⊦ ⟪index_index_lookup#(gnd.nd.key, ri, fi, ginval, gstore2, gstore, nx, pmaxino, p_os, jvalid0; jvalid, adr0; err); ndx := nodes(gstore2 ↓, ginval)[referenced-adrs(ax, ri)]; if err = ESUCCESS ∧ jvalid ∧ adr0 = adr then ndx := ndx + gnd.nd '; ax := adr ' + ax2; gndx1 := gndx0 + gndx; if err = ESUCCESS then {ax := ax.tail; gndx := gndx.tail}⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → (∃ ax0, gndx0. lax.to-adr(lnum) = ax0 + ax ∧ gndx1 = gndx0 + gndx ∧ # ax = # gndx ∧ ndx = nodes(gstore2 ↓, ginval)[referenced-adrs(ax0, ri)])) ∧ ¬ # ax2 < (err = ESUCCESS ⊃ # ax;0)), gndx = [], lnum ∈ ginval |
# ax2 = # gndx2, # lax = # gndx0 + # gndx2 + 1, lax.to-adr(lnum) = ax + adr ' + ax2, gstore2[lnum] = groupblock(gndx0 + gnd ' + gndx2, lax, m), inv(gstore2 \ ginval), inv(groupblock(gndx0 + gnd ' + gndx2, lax, m)), ri-cons(ri, nodes(gstore2 ↓, ginval)), lnum ∈ gstore2, ¬ lnum ∈ ginval ⊦ ⟪index_index_lookup#(gnd.nd.key, ri, fi, ginval, gstore2, gstore, nx, pmaxino, p_os, jvalid0; jvalid, adr0; err); ndx := nodes(gstore2 ↓, ginval)[referenced-adrs(ax, ri)]; if err = ESUCCESS ∧ jvalid ∧ adr0 = adr then ndx := ndx + gnd.nd '; ax := adr ' + ax2; gndx1 := gndx0 + gnd ' + gndx2; gndx := gnd ' + gndx2; if err = ESUCCESS then {ax := ax.tail; gndx := gndx.tail}⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → (∃ ax0, gndx0. lax.to-adr(lnum) = ax0 + ax ∧ gndx1 = gndx0 + gndx ∧ # ax = # gndx ∧ ndx = nodes(gstore2 ↓, ginval)[referenced-adrs(ax0, ri)])) ∧ ¬ # ax2 < (err = ESUCCESS ⊃ # ax;0))
Used simplifier rules: fwd-inv-gblock-rem: ⊦ inv(gstore \ ginval) ∧ n ∈ gstore ∧ ¬ n ∈ ginval ∧ gstore[n] = gblock → inv(gblock); (forward) from specification apersistence-base% ⊦ gnd ' + gndx ≠ []; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + n = m + n0 ↔ n = n0; (s)% ⊦ m +1 = m + 1; (s)% ⊦ #(gnd ' + gndx) = (# gndx)+1; (s)%a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]% ⊦ gnd + gndx = gnd ' + gndx; (s)