| gndlist0 + prefixn(# lax1, gndlist) = gndlist1, gstore1 = gstore[maxino, groupblock(gndlist0 + prefixn(# lax1, gndlist), lax0 + lax1, m2, LEB_SIZE, m1, true)], gstore[maxino] = groupblock(gndlist0, lax0, m2, m0, m1, false), remove-refsize0(istore0) = istore0, remove-refsize0(gstore2) = gstore2, dom gstore2 ∪ elems nx0 = dom gstore ∪ ginval0, elems nx0 ∩ ginval0 = ∅, gstore0 = gstore[maxino, groupblock(gndlist0 + prefixn(# lax1, gndlist), lax0 + lax1, m2, LEB_SIZE, m1, true)], gndlist ≠ [], # lax1 ≠ # gndlist, m2 ≤ n0, n0 ≤ # gndlist0 + # lax1, btree-inv (rp, adr, gstore[maxino, groupblock(gndlist0 + prefixn(# lax1, gndlist), lax0 + lax1, n0, LEB_SIZE, m1, true)] \ ginval0, istore, istore0, zh, ri1, fi3, ld2), inv(groupblock(gndlist0 + prefixn(# lax1, gndlist), lax0 + lax1, n0, LEB_SIZE, m1, true)), flushed(gstore[maxino, groupblock(gndlist0 + prefixn(# lax1, gndlist), lax0 + lax1, n0, LEB_SIZE, m1, true)] \ (ginval0 ∪ elems nx0)), gstore2 \ ginval0 lpt= gstore \ elems nx0, ⌊err1⌋ , maxino ∈ nx0, btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, ri0, fi2, ld1), istore0 ⊑ istore, flushed(istore0), inv(istore0), inv(istore), btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, ri, fi1, ld0), ri-inj(fi0), ri-inj(fi), flushed(gstore \ (ginval0 ∪ elems nx0)), inv(gstore2), inv(gstore \ ginval0), btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, fi, fi0, ld), m0 + gndlist.flashsize ≤ LEB_SIZE, # lax1 < # gndlist, inv-flashsize(prefixn(# lax1, gndlist), lax1), maxino ∈ gstore, m2 ≤ # gndlist0 + # lax1, inv(groupblock(gndlist0, lax0, m2, m0, m1, false)), ¬ maxino ∈ ginval0, ¬ dups(nx0), ¬ dups(lax1), ax = ax2 ⊦ ∃ n. (m2 ≤ n ∧ n ≤ # gndlist1) ∧ ⟨gstore0[maxino].flushindex := n⟩ ( gstore0 = gstore1[maxino, gstore1[maxino].flushindex:= n0] ∧ btree-inv(rp, adr, gstore1[maxino, gstore1[maxino].flushindex:= n0] \ ginval0, istore, istore0, zh, fi, fi0, ld) ∧ ax2 = ax) |
gstore[maxino] = groupblock(gndlist0, lax0, m2, m0, m1, false), remove-refsize0(istore0) = istore0, remove-refsize0(gstore2) = gstore2, dom gstore2 ∪ elems nx0 = dom gstore ∪ ginval0, elems nx0 ∩ ginval0 = ∅, gndlist ≠ [], # lax1 ≠ # gndlist, m2 ≤ n0, n0 ≤ # gndlist0 + # lax1, btree-inv (rp, adr, gstore[maxino, groupblock(gndlist0 + prefixn(# lax1, gndlist), lax0 + lax1, n0, LEB_SIZE, m1, true)] \ ginval0, istore, istore0, zh, ri1, fi3, ld2), inv(groupblock(gndlist0 + prefixn(# lax1, gndlist), lax0 + lax1, n0, LEB_SIZE, m1, true)), flushed(gstore[maxino, groupblock(gndlist0 + prefixn(# lax1, gndlist), lax0 + lax1, n0, LEB_SIZE, m1, true)] \ (ginval0 ∪ elems nx0)), gstore2 \ ginval0 lpt= gstore \ elems nx0, ⌊err1⌋ , maxino ∈ nx0, btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, ri0, fi2, ld1), istore0 ⊑ istore, flushed(istore0), inv(istore0), inv(istore), btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, ri, fi1, ld0), ri-inj(fi0), ri-inj(fi), flushed(gstore \ (ginval0 ∪ elems nx0)), inv(gstore2), inv(gstore \ ginval0), btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, fi, fi0, ld), m0 + gndlist.flashsize ≤ LEB_SIZE, # lax1 < # gndlist, inv-flashsize(prefixn(# lax1, gndlist), lax1), maxino ∈ gstore, m2 ≤ # gndlist0 + # lax1, inv(groupblock(gndlist0, lax0, m2, m0, m1, false)), ¬ maxino ∈ ginval0, ¬ dups(nx0), ¬ dups(lax1) ⊦ ∃ n. m2 ≤ n ∧ n ≤ # gndlist0 + # lax1 ∧ ⟨gstore0 := gstore[maxino, groupblock(gndlist0 + prefixn(# lax1, gndlist), lax0 + lax1, n, LEB_SIZE, m1, true)]⟩ ( gstore0 = gstore[maxino, groupblock(gndlist0 + prefixn(# lax1, gndlist), lax0 + lax1, n0, LEB_SIZE, m1, true)] ∧ btree-inv (rp, adr, gstore[maxino, groupblock(gndlist0 + prefixn(# lax1, gndlist), lax0 + lax1, n0, LEB_SIZE, m1, true)] \ ginval0, istore, istore0, zh, fi, fi0, ld))
Used simplifier rules: insins: ⊦ gstore[n, gblock][n, gblock0] = gstore[n, gblock0]; from specification store[group-store-ablock-store-nat-store]%upd-06: ⊦ groupblock(gndlist, lax, m, m0, m1, boolvar).flushindex:= m2 = groupblock(gndlist, lax, m2, m0, m1, boolvar); from specification ablock[group-store]%At-same: ⊦ gstore[n, gblock][n] = gblock; from specification store[group-store-ablock-store-nat-store]%a: ⊦ (gndlist + gndlist0) + gndlist1 = gndlist + gndlist0 + gndlist1; from specification list[group-store]%prefixn-len-n: n ≤ # gndlist ⊦ # prefixn(n, gndlist) = n; from specification list-prefixn[group-store]%lels-03: ⊦ m < n → m ≤ n; from specification nat%len: ⊦ #(gndlist + gndlist0) = # gndlist + # gndlist0; from specification list[group-store]