| # lax = # gndx1, lax.to-adr(lnum) = ax2, jvalid0 ↔ boolvar0, gstore2[lnum] = groupblock(gndx1, lax, m), adr = ax.head, ax = ax1, err = ESUCCESS, err = err0, err1 = ESUCCESS, fi0 = ri, gnd = gndx.head, gstore = gstore1, gstore0 = gstore2, jro = ginval, key = gnd.nd.key, ndx0 = [], nx = nx0, p_os = ns, pmaxino = maxino, inv(groupblock(gndx1, lax, m)), inv(gstore2 \ ginval), 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⌋ ⊦ ⟪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 = [], gndx = [], lnum ∈ ginval |
# ax1 = # gndx, # lax = # gndx0 + # gndx, lax.to-adr(lnum) = ax + ax1, gstore2[lnum] = groupblock(gndx0 + gndx, lax, m), ax1 ≠ [], gndx ≠ [], inv(gstore2 \ ginval), inv(groupblock(gndx0 + gndx, lax, m)), ri-cons(ri, nodes(gstore2 ↓, ginval)), lnum ∈ gstore2, ¬ lnum ∈ ginval ⊦ ⟪index_index_lookup#(gndx.head.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 = ax1.head then ndx := ndx + gndx.head.nd '; ax := ax1; 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)])) ∧ (err = ESUCCESS ⊃ # ax;0) < # ax1)
Used simplifier rules: 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)%fwd-inv-gblock-rem: ⊦ inv(gstore \ ginval) ∧ n ∈ gstore ∧ ¬ n ∈ ginval ∧ gstore[n] = gblock → inv(gblock); (forward) from specification apersistence-base% ⊦ ndx + nd = ndx + nd '; (s)%a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]% ⊦ #(gndx + gndx0) = # gndx + # gndx0; (s)% ⊦ # lax.to-adr(n) = # lax; (s)