| syn1 ↔ syn0, zh0[rp] = mkznode(r0, zbrar0, boolvar0, false, m4), zh[rp] = mkznode(r, zbrar, boolvar, true, m), istore0[m0] = indexblock(indx, lax, m3), adr0 = adr, ginval1 = ginval4, ginval2 = ginval, gstore3 = gstore2, gstore4 = gstore1, istore2 = istore1, maxino2 = m0, maxino3 = maxino1, n0 = istore0[m0].ref-size - m2, nx0 = nx, pstate0 = readonly, remove-refsize0(gstore1) = gstore1, remove-refsize0(istore1) = istore1, dom remove-refsize0(gstore2) ∩ ginval4 = ∅, elems nx ∩ ginval4 = ∅, dom gstore1 ∪ elems nx = dom gstore2 ∪ ginval4, btree-inv(rp, adr, istore0[m0, indexblock(indx, lax, m3 - m2)], istore1, zh0[rp, mkznode(r0, zbrar0, boolvar0, true, m4)], ri, fi), btree-inv(rp, @(m0, m1, m2), istore0, istore0, zh0, ri, ri), btree-inv(rp, adr, istore3, istore1, zh, ri, fi), btree-inv(rp, adr, istore3[n, indexblock([], [], 0)], istore1, zh, ri, fi), inv(indexblock(indx, lax, m3)), inv(istore0), inv(gstore2 \ ginval4), inv(gstore1), inv(istore3), inv(istore1), inv(istore3[n, indexblock([], [], 0)]), inv-index(istore0, istore1), inv-journal(nx, gstore2, gstore1, ginval4), inv-state(readonly, nx, gstore2, istore0, syn0), rp ∈ zh, m0 ∈ istore0, istore3[n, indexblock([], [], 0)] ⊑ istore0, istore1 ⊑ istore3, istore1 ⊑ istore3[n, indexblock([], [], 0)], istore1 ⊑ istore0 ⊦ [apersistence_set_iblock_refsize# (m0, istore0[m0].ref-size - m2, adr, istore1, ginval4, gstore2, gstore1, nx, maxino1, ginval, readonly, syn0; istore0)] ( inv-index(istore0, istore2) ∧ inv-state(pstate0, nx0, gstore3, istore0, syn1) → (∃ ri0, fi0. btree-inv(rp, adr, istore0, istore1, zh0[rp, mkznode(r0, zbrar0, boolvar0, true, m4)], ri0, fi0)) ∧ inv(istore0) ∧ istore1 ⊑ istore0), dups(nx), n ∈ istore3 |
istore0[m0] = indexblock(indx, lax, m3), zh[rp] = mkznode(r, zbrar, boolvar, true, m), zh0[rp] = mkznode(r0, zbrar0, boolvar0, false, m4), remove-refsize0(istore1) = istore1, remove-refsize0(gstore1) = gstore1, elems nx ∩ ginval4 = ∅, dom remove-refsize0(gstore2) ∩ ginval4 = ∅, dom gstore1 ∪ elems nx = dom gstore2 ∪ ginval4, btree-inv(rp, adr, istore3[n, indexblock([], [], 0)], istore1, zh, ri, fi), btree-inv(rp, adr, istore3, istore1, zh, ri, fi), btree-inv(rp, @(m0, m1, m2), istore0, istore0, zh0, ri, ri), btree-inv(rp, adr, istore0[m0, indexblock(indx, lax, m3 - m2)], istore1, zh0[rp, mkznode(r0, zbrar0, boolvar0, true, m4)], ri, fi), inv(istore3[n, indexblock([], [], 0)]), inv(istore1), inv(istore3), inv(gstore1), inv(gstore2 \ ginval4), inv(istore0), inv(indexblock(indx, lax, m3)), m0 ∈ istore0, rp ∈ zh, istore1 ⊑ istore0, istore1 ⊑ istore3[n, indexblock([], [], 0)], istore1 ⊑ istore3, istore3[n, indexblock([], [], 0)] ⊑ istore0, ¬ dups(nx), ¬ n ∈ istore3 ⊦ [apersistence_set_iblock_refsize# (m0, istore0[m0].ref-size - m2, adr, istore1, ginval4, gstore2, gstore1, nx, maxino1, ginval, readonly, syn0; istore0)] ( inv(istore0) ∧ istore1 ⊑ istore0 → (∃ ri0, fi0. btree-inv(rp, adr, istore0, istore1, zh0[rp, mkznode(r0, zbrar0, boolvar0, true, m4)], ri0, fi0)))
Used simplifier rules: ⊦ inv-index(istore, istore0) ↔ inv(istore) ∧ inv(istore0) ∧ istore0 ⊑ istore ∧ remove-refsize0(istore0) = istore0; (s)%⊦ inv-journal(nx, gstore, gstore0, ginval) ↔ inv(gstore \ ginval) ∧ inv(gstore0) ∧ elems nx ∩ ginval = ∅ ∧ ¬ dups(nx) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ ginval ∧ remove-refsize0(gstore0) = gstore0; (s)% ⊦ unbuffered ≠ readonly; (s)% ⊦ ¬ readonly.index?; (s)% ⊦ ¬ readonly.journal?; (s)%⊦ inv-state(pstate, nx, gstore, istore, syn) ↔ ( pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore) ∧ (pstate.index? → pstate.lnum ∈ istore) ∧ (pstate = unbuffered → syn); (s)