| gstore0[maxino] = groupblock(gndlist0, lax0, m, m0, m1, false), remove-refsize0(istore0) = istore0, remove-refsize0(gstore2) = gstore2, dom gstore2 ∪ elems nx0 = dom gstore0 ∪ ginval0, elems nx0 ∩ ginval0 = ∅, ax1 = ax0, gstore1 = gstore0, maxino ∈ nx0, btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, ri0, fi2, ld1), inv(groupblock(gndlist0, lax0, m, m0, m1, false)), maxino ∈ gstore0, istore0 ⊑ istore, flushed(istore0), inv(istore0), inv(istore), btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, ri, fi1, ld0), ri-inj(fi0), ri-inj(fi), gstore2 \ ginval0 lpt= gstore0 \ elems nx0, flushed(gstore0 \ (ginval0 ∪ elems nx0)), inv(gstore2), inv(gstore0 \ ginval0), btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, fi, fi0, ld), m0 + gndlist.flashsize ≤ LEB_SIZE, ¬ maxino ∈ ginval0, ¬ dups(nx0), nx = nx0, ⌊err0⌋ ∨ err0 = ESUCCESS, ¬ dups(gstore1[maxino].ladrlist + lax), # lax ≤ # gndlist, inv-flashsize(prefixn(# lax, gndlist), lax), err0 = ESUCCESS ↔ # lax = # gndlist, ax = lax.to-adr(maxino), err = err0, gstore = gstore1[maxino, gstore1[maxino].gndlist:= (gstore1[maxino].gndlist + prefixn(# lax, gndlist))] [maxino, gstore1[maxino, gstore1[maxino].gndlist:= (gstore1[maxino].gndlist + prefixn(# lax, gndlist))][maxino] .ladrlist:= (gstore1[maxino, gstore1[maxino].gndlist:= (gstore1[maxino].gndlist + prefixn(# lax, gndlist))][maxino].ladrlist + lax) ], err = ESUCCESS ⊦ [gstore[maxino].size := gstore[maxino].size + gndlist.flashsize] [choose n with gstore[maxino].flushindex ≤ n ∧ n ≤ # gstore[maxino].gndlist in gstore[maxino].flushindex := n] ( (∃ ri, fi, ld. btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, ri, fi, ld)) ∧ inv(gstore \ ginval0) ∧ flushed(gstore \ (ginval0 ∪ elems nx0)) ∧ dom gstore0 ∪ ginval0 = dom gstore ∪ ginval0 ∧ gstore2 \ ginval0 lpt= gstore \ elems nx0 → ⟨index+persistence_add_gnds#(maxino, gndlist, nx0; ax0, gstore0; err1)⟩ (gstore0 = gstore ∧ btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, fi, fi0, ld) ∧ ax = ax0 ∧ err = err1)) |
gstore0[maxino] = groupblock(gndlist0, lax0, m, m0, m1, false), remove-refsize0(istore0) = istore0, remove-refsize0(gstore2) = gstore2, dom gstore2 ∪ elems nx0 = dom gstore0 ∪ ginval0, elems nx0 ∩ ginval0 = ∅, ax1 = ax0, gstore1 = gstore0, maxino ∈ nx0, btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, ri0, fi2, ld1), inv(groupblock(gndlist0, lax0, m, m0, m1, false)), maxino ∈ gstore0, istore0 ⊑ istore, flushed(istore0), inv(istore0), inv(istore), btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, ri, fi1, ld0), ri-inj(fi0), ri-inj(fi), gstore2 \ ginval0 lpt= gstore0 \ elems nx0, flushed(gstore0 \ (ginval0 ∪ elems nx0)), inv(gstore2), inv(gstore0 \ ginval0), btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, fi, fi0, ld), m0 + gndlist.flashsize ≤ LEB_SIZE, ¬ maxino ∈ ginval0, ¬ dups(nx0), nx = nx0, ⌊err0⌋ ∨ err0 = ESUCCESS, ¬ dups(gstore1[maxino].ladrlist + lax), # lax ≤ # gndlist, inv-flashsize(prefixn(# lax, gndlist), lax), err0 = ESUCCESS ↔ # lax = # gndlist, ax = lax.to-adr(maxino), err = err0, gstore3 = gstore1[maxino, gstore1[maxino].gndlist:= (gstore1[maxino].gndlist + prefixn(# lax, gndlist))] [maxino, gstore1[maxino, gstore1[maxino].gndlist:= (gstore1[maxino].gndlist + prefixn(# lax, gndlist))][maxino] .ladrlist:= (gstore1[maxino, gstore1[maxino].gndlist:= (gstore1[maxino].gndlist + prefixn(# lax, gndlist))][maxino].ladrlist + lax) ], err = ESUCCESS, gstore = gstore3[maxino, gstore3[maxino].size:= (gstore3[maxino].size + gndlist.flashsize)] ⊦ [choose n with gstore[maxino].flushindex ≤ n ∧ n ≤ # gstore[maxino].gndlist in gstore[maxino].flushindex := n] ( (∃ ri, fi, ld. btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, ri, fi, ld)) ∧ inv(gstore \ ginval0) ∧ flushed(gstore \ (ginval0 ∪ elems nx0)) ∧ dom gstore0 ∪ ginval0 = dom gstore ∪ ginval0 ∧ gstore2 \ ginval0 lpt= gstore \ elems nx0 → ⟨index+persistence_add_gnds#(maxino, gndlist, nx0; ax0, gstore0; err1)⟩ (gstore0 = gstore ∧ btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, fi, fi0, ld) ∧ ax = ax0 ∧ err = err1))