| maxino ∈ nx, gstore[maxino].size + gndlist.flashsize ≤ LEB_SIZE, ¬ gstore[maxino].failed, ginval = ginval0, gstore = gstore0, gstore1 = gstore2, nx = nx0, maxino0 = maxino1, ginval1 = ginval2, btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, fi, fi0, ld), inv-journal(nx, gstore, gstore1, ginval), ri-inj(fi), ri-inj(fi0), ∃ ri, fi, ld. btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, ri, fi, ld), inv-journal(nx0, gstore0, gstore2, ginval0), inv-index(istore, istore0), ax = ax0 ⊦ ⟪btree_add_gnds#(maxino, gndlist, nx0; ax, gstore0; err)⟫ ⟨index+persistence_add_gnds#(maxino, gndlist, nx; ax0, gstore; err0)⟩ ( ( ginval = ginval0 ∧ gstore = gstore0 ∧ gstore1 = gstore2 ∧ nx = nx0 ∧ maxino0 = maxino1 ∧ ginval1 = ginval2 ∧ btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, fi, fi0, ld)) ∧ ax = ax0 ∧ err = err0) |
gstore = gstore0, ax = ax0, elems nx0 ∩ ginval0 = ∅, dom gstore2 ∪ elems nx0 = dom gstore0 ∪ ginval0, remove-refsize0(gstore2) = gstore2, remove-refsize0(istore0) = istore0, maxino ∈ nx0, gstore0[maxino].size + 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)), gstore2 \ ginval0 lpt= gstore0 \ 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, ¬ gstore0[maxino].failed, ¬ dups(nx0), ¬ maxino ∈ ginval0 ⊦ ⟪btree_add_gnds#(maxino, gndlist, nx0; ax, gstore0; err)⟫ ⟨index+persistence_add_gnds#(maxino, gndlist, nx0; ax0, gstore; err0)⟩ (gstore = gstore0 ∧ btree-inv(rp, adr, gstore0 \ ginval0, istore, istore0, zh, fi, fi0, ld) ∧ ax = ax0 ∧ err = err0)
Used simplifier rules: 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]%elems-in-notin-ginval: ⊦ n ∈ nx ∧ elems nx ∩ ns = ∅ → ¬ n ∈ ns; (forward) from specification apersistence-base%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]%inv-index: ⊦ inv-index(istore, istore0) ↔ ¬ ¬ ( inv(istore) ∧ inv(istore0) ∧ flushed(istore0) ∧ istore0 ⊑ istore ∧ remove-refsize0(istore0) = istore0); from specification apersistence-base%inv-journal: ⊦ inv-journal(nx, gstore, gstore0, ginval) ↔ ¬ ¬ ( inv(gstore \ ginval) ∧ inv(gstore0) ∧ flushed(gstore \ (ginval ∪ elems nx)) ∧ elems nx ∩ ginval = ∅ ∧ ¬ dups(nx) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ ginval ∧ gstore0 \ ginval lpt= gstore \ elems nx ∧ remove-refsize0(gstore0) = gstore0); from specification apersistence-base