| # lax = # gndlist, elems nx0 ∩ ginval0 = ∅, dom gstore2 ∪ elems nx0 = dom gstore0 ∪ ginval0, remove-refsize0(gstore2) = gstore2, remove-refsize0(istore0) = istore0, gstore0[maxino] = groupblock(gndlist0, lax0, m, m0, m1, false), gstore = gstore0[maxino, groupblock(gndlist0 + gndlist, lax0 + lax, m, m0 + gndlist.flashsize, m1, false)], inv-flashsize(gndlist, lax), m0 + gndlist.flashsize ≤ LEB_SIZE, btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, fi, fi0, ld), inv(gstore0 \ ginval0), inv(gstore2), flushed(gstore0 \ (ginval0 ∪ elems nx0)), ri-inj(fi), ri-inj(fi0), btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, ri, fi1, ld0), inv(istore), inv(istore0), flushed(istore0), istore0 ⊑ istore, maxino ∈ gstore0, btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, ri0, fi2, ld1), maxino ∈ nx0, inv(groupblock(gndlist0, lax0, m, m0, m1, false)), gstore2 \ ginval0 lpt= gstore0 \ elems nx0, flushed(gstore0[maxino, groupblock(gndlist0 + gndlist, lax0 + lax, n, m0 + gndlist.flashsize, m1, false)] \ (ginval0 ∪ elems nx0)), inv(groupblock(gndlist0 + gndlist, lax0 + lax, n, m0 + gndlist.flashsize, m1, false)), btree-inv (rp, adr, gstore0[maxino, groupblock(gndlist0 + gndlist, lax0 + lax, n, m0 + gndlist.flashsize, m1, false)] \ ginval0, istore, istore0, zh, ri1, fi3, ld2), n ≤ # gndlist0 + # gndlist, m ≤ n, m ≤ # gndlist0 + # gndlist, ¬ dups(lax), ¬ dups(nx0), ¬ maxino ∈ ginval0 ⊦ ⟨index+persistence_add_gnds#(maxino, gndlist, nx0; ax0, gstore0; err1)⟩ ( gstore0 = gstore[maxino, gstore[maxino].flushindex:= n] ∧ btree-inv(rp, adr, gstore[maxino, gstore[maxino].flushindex:= n] \ ginval0, istore, istore0, zh, fi, fi0, ld) ∧ lax.to-adr(maxino) = ax0 ∧ ESUCCESS = err1) |
# lax = # gndlist, elems nx0 ∩ ginval0 = ∅, dom gstore2 ∪ elems nx0 = dom gstore0 ∪ ginval0, remove-refsize0(gstore2) = gstore2, remove-refsize0(istore0) = istore0, gstore0[maxino] = groupblock(gndlist0, lax0, m, m0, m1, false), gstore1 = gstore0[maxino, groupblock(gndlist0 + gndlist, lax0 + lax, m, m0 + gndlist.flashsize, m1, false)], inv-flashsize(gndlist, lax), m0 + gndlist.flashsize ≤ LEB_SIZE, btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, fi, fi0, ld), inv(gstore0 \ ginval0), inv(gstore2), flushed(gstore0 \ (ginval0 ∪ elems nx0)), ri-inj(fi), ri-inj(fi0), btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, ri, fi1, ld0), inv(istore), inv(istore0), flushed(istore0), istore0 ⊑ istore, maxino ∈ gstore0, btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, ri0, fi2, ld1), maxino ∈ nx0, inv(groupblock(gndlist0, lax0, m, m0, m1, false)), gstore2 \ ginval0 lpt= gstore0 \ elems nx0, flushed(gstore0[maxino, groupblock(gndlist0 + gndlist, lax0 + lax, n, m0 + gndlist.flashsize, m1, false)] \ (ginval0 ∪ elems nx0)), inv(groupblock(gndlist0 + gndlist, lax0 + lax, n, m0 + gndlist.flashsize, m1, false)), btree-inv (rp, adr, gstore0[maxino, groupblock(gndlist0 + gndlist, lax0 + lax, n, m0 + gndlist.flashsize, m1, false)] \ ginval0, istore, istore0, zh, ri1, fi3, ld2), n ≤ # gndlist0 + # gndlist, m ≤ n, m ≤ # gndlist0 + # gndlist, ¬ dups(lax), ¬ dups(nx0), ¬ maxino ∈ ginval0, nx = nx0, ax = ax0, gstore = gstore0 ⊦ ⟨if maxino ∈ nx ∧ gstore[maxino].size + gndlist.flashsize ≤ LEB_SIZE ∧ ¬ gstore[maxino].failed then {choose lax, err0 with (⌊err0⌋ ∨ err0 = ESUCCESS) ∧ ¬ dups(gstore[maxino].ladrlist + lax) ∧ # lax ≤ # gndlist ∧ inv-flashsize(prefixn(# lax, gndlist), lax) ∧ (err0 = ESUCCESS ↔ # lax = # gndlist) in {ax := lax.to-adr(maxino), err := err0; gstore[maxino].gndlist := gstore[maxino].gndlist + prefixn(# lax, gndlist); gstore[maxino].ladrlist := gstore[maxino].ladrlist + lax; if err = ESUCCESS then gstore[maxino].size := gstore[maxino].size + gndlist.flashsize else {gstore[maxino].size := LEB_SIZE; gstore[maxino].failed := true; ax := ?}}; choose n with gstore[maxino].flushindex ≤ n ∧ n ≤ # gstore[maxino].gndlist in gstore[maxino].flushindex := n} else abort⟩ ( gstore = gstore1[maxino, gstore1[maxino].flushindex:= n] ∧ btree-inv(rp, adr, gstore1[maxino, gstore1[maxino].flushindex:= n] \ ginval0, istore, istore0, zh, fi, fi0, ld) ∧ lax.to-adr(maxino) = ax ∧ ESUCCESS = err)
Used simplifier rules: index+persistence_add_gnds#(LNUM, GNDLIST, PNL; ADRLIST, PSTORE; ERR) {if LNUM ∈ PNL ∧ PSTORE[LNUM].size + GNDLIST.flashsize ≤ LEB_SIZE ∧ ¬ PSTORE[LNUM].failed then {choose LADRLIST, ERR0 with (⌊ERR0⌋ ∨ ERR0 = ESUCCESS) ∧ ¬ dups(PSTORE[LNUM].ladrlist + LADRLIST) ∧ # LADRLIST ≤ # GNDLIST ∧ inv-flashsize(prefixn(# LADRLIST, GNDLIST), LADRLIST) ∧ (ERR0 = ESUCCESS ↔ # LADRLIST = # GNDLIST) in {ADRLIST := LADRLIST.to-adr(LNUM), ERR := ERR0; PSTORE[LNUM].gndlist := PSTORE[LNUM].gndlist + prefixn(# LADRLIST, GNDLIST); PSTORE[LNUM].ladrlist := PSTORE[LNUM].ladrlist + LADRLIST; if ERR = ESUCCESS then PSTORE[LNUM].size := PSTORE[LNUM].size + GNDLIST.flashsize else {PSTORE[LNUM].size := LEB_SIZE; PSTORE[LNUM].failed := true; ADRLIST := ?}}; choose N with PSTORE[LNUM].flushindex ≤ N ∧ N ≤ # PSTORE[LNUM].gndlist in PSTORE[LNUM].flushindex := N} else abort };