| # lax1 = # gndlist, elems nx0 ∩ ginval0 = ∅, dom gstore2 ∪ elems nx0 = dom gstore ∪ ginval0, remove-refsize0(gstore2) = gstore2, remove-refsize0(istore0) = istore0, gstore[maxino] = groupblock(gndlist0, lax0, m, m0, m1, false), gstore1 = gstore[maxino, groupblock(gndlist0 + gndlist, lax0 + lax1, m, m0 + gndlist.flashsize, m1, false)], inv-flashsize(gndlist, lax1), m0 + gndlist.flashsize ≤ LEB_SIZE, btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, fi, fi0, ld), inv(gstore \ ginval0), inv(gstore2), flushed(gstore \ (ginval0 ∪ elems nx0)), ri-inj(fi), ri-inj(fi0), btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, ri, fi1, ld0), inv(istore), inv(istore0), flushed(istore0), istore0 ⊑ istore, maxino ∈ gstore, btree-inv(rp, adr, gstore \ ginval0, istore, istore0, zh, ri0, fi2, ld1), maxino ∈ nx0, inv(groupblock(gndlist0, lax0, m, m0, m1, false)), gstore2 \ ginval0 lpt= gstore \ elems nx0, flushed(gstore[maxino, groupblock(gndlist0 + gndlist, lax0 + lax1, n0, m0 + gndlist.flashsize, m1, false)] \ (ginval0 ∪ elems nx0)), inv(groupblock(gndlist0 + gndlist, lax0 + lax1, n0, m0 + gndlist.flashsize, m1, false)), btree-inv (rp, adr, gstore[maxino, groupblock(gndlist0 + gndlist, lax0 + lax1, n0, m0 + gndlist.flashsize, m1, false)] \ ginval0, istore, istore0, zh, ri1, fi3, ld2), n0 ≤ # gndlist0 + # gndlist, m ≤ n0, m ≤ # gndlist0 + # gndlist, ¬ dups(lax1), ¬ dups(nx0), ¬ maxino ∈ ginval0, ax = lax1.to-adr(maxino), err = ESUCCESS, gstore3 = gstore[maxino, gstore[maxino].gndlist:= (gstore[maxino].gndlist + gndlist)] [maxino, gstore[maxino, gstore[maxino].gndlist:= (gstore[maxino].gndlist + gndlist)][maxino] .ladrlist:= (gstore[maxino, gstore[maxino].gndlist:= (gstore[maxino].gndlist + gndlist)][maxino].ladrlist + lax1) ], gstore0 = gstore3[maxino, gstore3[maxino].size:= (gstore3[maxino].size + gndlist.flashsize)] ⊦ ∃ n. (gstore0[maxino].flushindex ≤ n ∧ n ≤ # gstore0[maxino].gndlist) ∧ ⟨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) ∧ lax1.to-adr(maxino) = ax ∧ ESUCCESS = err) |
gstore[maxino] = groupblock(gndlist0, lax0, m, m0, m1, false), remove-refsize0(istore0) = istore0, remove-refsize0(gstore2) = gstore2, dom gstore2 ∪ elems nx0 = dom gstore ∪ ginval0, elems nx0 ∩ ginval0 = ∅, # lax1 = # gndlist, maxino ∈ gstore, m ≤ # gndlist0 + # gndlist, m ≤ n0, n0 ≤ # gndlist0 + # gndlist, btree-inv (rp, adr, gstore[maxino, groupblock(gndlist0 + gndlist, lax0 + lax1, n0, m0 + gndlist.flashsize, m1, false)] \ ginval0, istore, istore0, zh, ri1, fi3, ld2), inv(groupblock(gndlist0 + gndlist, lax0 + lax1, n0, m0 + gndlist.flashsize, m1, false)), flushed(gstore[maxino, groupblock(gndlist0 + gndlist, lax0 + lax1, n0, m0 + gndlist.flashsize, m1, false)] \ (ginval0 ∪ elems nx0)), gstore2 \ ginval0 lpt= gstore \ elems nx0, inv(groupblock(gndlist0, lax0, m, m0, m1, false)), 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, inv-flashsize(gndlist, lax1), ¬ maxino ∈ ginval0, ¬ dups(nx0), ¬ dups(lax1) ⊦ ∃ n. m ≤ n ∧ n ≤ # gndlist0 + # gndlist ∧ ⟨gstore0 := gstore[maxino, groupblock(gndlist0 + gndlist, lax0 + lax1, n, m0 + gndlist.flashsize, m1, false)]⟩ ( gstore0 = gstore[maxino, groupblock(gndlist0 + gndlist, lax0 + lax1, n0, m0 + gndlist.flashsize, m1, false)] ∧ btree-inv (rp, adr, gstore[maxino, groupblock(gndlist0 + gndlist, lax0 + lax1, n0, m0 + gndlist.flashsize, m1, false)] \ ginval0, istore, istore0, zh, fi, fi0, ld))
Used simplifier rules: upd-07: ⊦ groupblock(gndlist, lax, m, m0, m1, boolvar).size:= m3 = groupblock(gndlist, lax, m, m3, m1, boolvar); from specification ablock[group-store]%sel-07: ⊦ groupblock(gndlist, lax, m, m0, m1, boolvar).size = m0; from specification ablock[group-store]%upd-05: ⊦ groupblock(gndlist, lax, m, m0, m1, boolvar).ladrlist:= lax0 = groupblock(gndlist, lax0, m, m0, m1, boolvar); from specification ablock[group-store]%sel-05: ⊦ groupblock(gndlist, lax, m, m0, m1, boolvar).ladrlist = lax; from specification ablock[group-store]%upd-04: ⊦ groupblock(gndlist, lax, m, m0, m1, boolvar).gndlist:= gndlist0 = groupblock(gndlist0, lax, m, m0, m1, boolvar); from specification ablock[group-store]%sel-04: ⊦ groupblock(gndlist, lax, m, m0, m1, boolvar).gndlist = gndlist; from specification ablock[group-store]%sel-06: ⊦ groupblock(gndlist, lax, m, m0, m1, boolvar).flushindex = m; from specification ablock[group-store]%fwd-in-log-in-gstore: ⊦ n ∈ nx ∧ ginval ∩ elems nx = ∅ ∧ dom gstore0 ∪ elems nx = dom gstore ∪ ginval → n ∈ gstore; (forward) from specification apersistence-base%unc: ⊦ ns ∪ ns0 = ns0 ∪ ns; from specification set-union[nat-set]%una: ⊦ (ns ∪ ns0) ∪ ns1 = ns ∪ ns0 ∪ ns1; from specification set-union[nat-set]%int-c: ⊦ ns ∩ ns0 = ns0 ∩ ns; from specification set-union[nat-set]%int-a: ⊦ (ns ∩ ns0) ∩ ns1 = ns ∩ ns0 ∩ ns1; from specification set-union[nat-set]%upd-06: ⊦ groupblock(gndlist, lax, m, m0, m1, boolvar).flushindex:= m2 = groupblock(gndlist, lax, m2, m0, m1, boolvar); from specification ablock[group-store]%a: ⊦ (gndlist + gndlist0) + gndlist1 = gndlist + gndlist0 + gndlist1; from specification list[group-store]%len: ⊦ #(gndlist + gndlist0) = # gndlist + # gndlist0; from specification list[group-store]%updsel-09: ⊦ (gblock.gndlist:= gndlist).gndlist = gndlist; from specification ablock[group-store]%updsel-26: ⊦ (gblock.ladrlist:= lax).gndlist = gblock.gndlist; from specification ablock[group-store]%updsel-11: ⊦ (gblock.size:= m0).gndlist = gblock.gndlist; from specification ablock[group-store]%updsel-13: ⊦ (gblock.gndlist:= gndlist).flushindex = gblock.flushindex; from specification ablock[group-store]%updsel-33: ⊦ (gblock.ladrlist:= lax).flushindex = gblock.flushindex; from specification ablock[group-store]%updsel-15: ⊦ (gblock.size:= m0).flushindex = gblock.flushindex; from specification ablock[group-store]%updsel-06: ⊦ (gblock.gndlist:= gndlist).size = gblock.size; from specification ablock[group-store]%updsel-31: ⊦ (gblock.ladrlist:= lax).size = gblock.size; from specification ablock[group-store]%insins: ⊦ gstore[n, gblock][n, gblock0] = gstore[n, gblock0]; from specification store[group-store-ablock-store-nat-store]%updsel-28: ⊦ (gblock.gndlist:= gndlist).ladrlist = gblock.ladrlist; from specification ablock[group-store]%At-same: ⊦ gstore[n, gblock][n] = gblock; from specification store[group-store-ablock-store-nat-store]