| zh[r] = mkznode(r0, zbrar, boolvar, true, m0), adr = @(pstate.lnum, maxino1, ind.flashsize), adr2 = adr1, err0 = err, err0 = ESUCCESS, ginval0 = ginval2, gstore = gstore1, gstore0 = gstore2, ind = save(mkznode(r0, zbrar, boolvar, true, m0)), istore = istore1[pstate.lnum, istore1[pstate.lnum].indlist:= (istore1[pstate.lnum].indlist + ind)] [pstate.lnum, istore1[pstate.lnum, istore1[pstate.lnum].indlist:= (istore1[pstate.lnum].indlist + ind)][pstate.lnum] .ladrlist:= (istore1[pstate.lnum, istore1[pstate.lnum].indlist:= (istore1[pstate.lnum].indlist + ind)][pstate.lnum].ladrlist + @(adr.pos, adr.size)) ], istore0 = istore2, istore1 = istore3[n, indexblock([], [], 0)], maxino = 0, pstate = index(n), remove-refsize0(istore2) = istore2, remove-refsize0(gstore1) = gstore1, syn0, elems nx ∩ ginval2 = ∅, dom gstore1 ∪ elems nx = dom gstore2 ∪ ginval2, ((btree(rp, r, adr1, height, dirty, ri, nodes(istore3), as, alladrs, ok) * P))(zh), n0 < save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize, btree-sub-clean(r, m0, zh), inv(istore), inv(istore3[n, indexblock([], [], 0)]), inv(istore2), inv(istore3), inv(gstore1), inv(gstore2 \ ginval2), refsize-cons(istore3, as0 ∪ as), pstate.lnum ∈ istore1, pstate.lnum ∈ istore1[pstate.lnum, istore1[pstate.lnum].indlist:= (istore1[pstate.lnum].indlist + ind)], m ∈ istore3, r ∈ zh, n0 ≤ LEB_SIZE, as ⊆ dom nodes(istore3), as ⊆ alladrs, alladrs ⊆ dom nodes(istore3), as0 ⊆ dom nodes(istore3), istore2 ⊑ istore, istore2 ⊑ istore3[n, indexblock([], [], 0)], istore2 ⊑ istore3, pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore2, pstate.index? → pstate.lnum ∈ istore, pstate = unbuffered → syn, height = 0 → as = ∅, pstate.index? ∨ pstate.journal?, ¬ @(pstate.lnum, maxino1, ind.flashsize) ∈ istore1 ∧ err = ESUCCESS ∨ ⌊err⌋ ⊦ ⟪apersistence_get_iblock_refsize#(adr.lnum, adr0, istore, istore2, ginval2, gstore2, gstore1, nx, maxino0, ginval, pstate, syn; ; maxino); apersistence_set_iblock_refsize# (adr.lnum, maxino + adr.size, adr0, istore2, ginval2, gstore2, gstore1, nx, maxino0, ginval, pstate, syn; istore); if err0 = ESUCCESS then zh[r].dirty := false⟫ ( refsize-cons(istore, as0 ∪ (err0 = ESUCCESS ⊃ as ++ adr;as)) ∧ inv(istore) ∧ istore2 ⊑ istore ∧ (pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore2) ∧ (pstate.index? → pstate.lnum ∈ istore) ∧ (pstate = unbuffered → syn) ∧ istore3 ⊑ istore ∧ r ∈ zh ∧ (err0 = ESUCCESS → ¬ adr ∈ as) ∧ dom nodes(istore) = dom nodes(istore3) ∪ (err0 = ESUCCESS ⊃ ∅ ++ adr;∅) ∧ (err0 = ESUCCESS → ¬ adr ∈ istore3) ∧ (( btree (rp, r, (err0 = ESUCCESS ⊃ adr;adr1), height, err0 ≠ ESUCCESS, ri, nodes(istore), (err0 = ESUCCESS ⊃ as ++ adr;as), (err0 = ESUCCESS ⊃ (alladrs -- adr1) ++ adr;alladrs), ok) * P) )(zh) ∧ (err0 = ESUCCESS ∨ ⌊err0⌋ ) ∧ (err0 = ESUCCESS → pstate.index? ∧ ¬ zh[r].dirty)), dups(nx), n ∈ istore3, adr1 ∈ as |
zh[r] = mkznode(r0, zbrar, boolvar, true, m0), remove-refsize0(gstore1) = gstore1, remove-refsize0(istore2) = istore2, elems nx ∩ ginval2 = ∅, dom gstore1 ∪ elems nx = dom gstore2 ∪ ginval2, ((btree(rp, r, adr1, height, dirty, ri, nodes(istore3), as, alladrs, ok) * P))(zh), n0 < save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize, btree-sub-clean(r, m0, zh), inv(gstore2 \ ginval2), inv(gstore1), inv(istore3), inv(istore2), inv(istore3[n, indexblock([], [], 0)]), inv(istore3[n, indexblock(save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', 0)]), refsize-cons(istore3, as0 ∪ as), r ∈ zh, m ∈ istore3, n0 ≤ LEB_SIZE, as0 ⊆ dom nodes(istore3), alladrs ⊆ dom nodes(istore3), as ⊆ alladrs, as ⊆ dom nodes(istore3), istore2 ⊑ istore3, istore2 ⊑ istore3[n, indexblock([], [], 0)], istore2 ⊑ istore3[n, indexblock(save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', 0)], ¬ dups(nx), ¬ adr1 ∈ as, ¬ n ∈ istore3, height = 0 → as = ∅ ⊦ ⟪apersistence_get_iblock_refsize# (index(n).lnum, adr0, istore3[n, indexblock([], [], 0)] [index(n).lnum, istore3[n, indexblock([], [], 0)] [index(n).lnum, istore3[n, indexblock([], [], 0)][index(n).lnum] .indlist:= (istore3[n, indexblock([], [], 0)][index(n).lnum].indlist + save(mkznode(r0, zbrar, boolvar, true, m0)) ') ] [index(n).lnum ] .ladrlist:= ( istore3[n, indexblock([], [], 0)] [index(n).lnum, istore3[n, indexblock([], [], 0)][index(n).lnum] .indlist:= (istore3[n, indexblock([], [], 0)][index(n).lnum].indlist + save(mkznode(r0, zbrar, boolvar, true, m0)) ') ] [index(n).lnum ] .ladrlist + @ (@(index(n).lnum, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize).pos, @(index(n).lnum, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize).size) ') ], istore2, ginval2, gstore2, gstore1, nx, maxino0, ginval, index(n), syn ; ; maxino); istore := istore3[n, indexblock([], [], 0)] [index(n).lnum, istore3[n, indexblock([], [], 0)] [index(n).lnum, istore3[n, indexblock([], [], 0)][index(n).lnum] .indlist:= (istore3[n, indexblock([], [], 0)][index(n).lnum].indlist + save(mkznode(r0, zbrar, boolvar, true, m0)) ') ] [index(n).lnum ] .ladrlist:= ( istore3[n, indexblock([], [], 0)] [index(n).lnum, istore3[n, indexblock([], [], 0)][index(n).lnum] .indlist:= (istore3[n, indexblock([], [], 0)][index(n).lnum].indlist + save(mkznode(r0, zbrar, boolvar, true, m0)) ') ] [index(n).lnum ] .ladrlist + @ (@(index(n).lnum, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize).pos, @(index(n).lnum, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize).size) ') ]; apersistence_set_iblock_refsize# (index(n).lnum, maxino + @(index(n).lnum, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize).size, adr0, istore2, ginval2, gstore2, gstore1, nx, maxino0, ginval, index(n), syn ; istore); err0 := ESUCCESS; if err0 = ESUCCESS then zh[r].dirty := false⟫ ( refsize-cons(istore, as0 ∪ (err0 = ESUCCESS ⊃ as ++ @(n, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);as)) ∧ inv(istore) ∧ istore2 ⊑ istore ∧ n ∈ istore ∧ istore3 ⊑ istore ∧ r ∈ zh ∧ (err0 = ESUCCESS → ¬ @(n, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ∈ as) ∧ dom nodes(istore) = dom nodes(istore3) ∪ (err0 = ESUCCESS ⊃ ∅ ++ @(n, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);∅) ∧ (( btree (rp, r, (err0 = ESUCCESS ⊃ @(n, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);adr1), height, err0 ≠ ESUCCESS, ri, nodes(istore), (err0 = ESUCCESS ⊃ as ++ @(n, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);as), (err0 = ESUCCESS ⊃ (alladrs -- adr1) ++ @(n, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);alladrs), ok) * P) )(zh) ∧ (err0 = ESUCCESS ∨ ⌊err0⌋ ) ∧ (err0 = ESUCCESS → ¬ zh[r].dirty))
Used simplifier rules: ⊦ ¬ n ∈ istore → ¬ @(n, n0, n1) ∈ istore; (s)% ⊦ @(m, m0, m1).lnum = m; (s)% ⊦ ¬ index(m).journal?; (s)% ⊦ unbuffered ≠ index(m); (s)% ⊦ index(m).index?; (s)% ⊦ ¬ ladr ∈ []; (s)% ⊦ @(n, n0, n1) ∈ istore[n, iblock] ↔ @(n0, n1) ∈ iblock.ladrlist; (s)% ⊦ n ∈ istore[n0, iblock] ↔ n = n0 ∨ n ∈ istore; (ws)%⊦ indexblock(indx, lax, m).ladrlist:= lax0 = indexblock(indx, lax0, m); (s)%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ [] + lax = lax; (s)% ⊦ lax + ladr = lax + ladr '; (s)% ⊦ @(m, m0, m1).size = m1; (s)% ⊦ @(m, m0, m1).pos = m0; (s)% ⊦ indexblock(indx, lax, m).ladrlist = lax; (s)% ⊦ istore[n, iblock][n, iblock0] = istore[n, iblock0]; (s)%⊦ indexblock(indx, lax, m).indlist:= indx0 = indexblock(indx0, lax, m); (s)%a: ⊦ (indx + indx0) + indx1 = indx + indx0 + indx1; from specification list[index-store]% ⊦ [] + indx = indx; (s)% ⊦ indx + ind = indx + ind '; (s)% ⊦ indexblock(indx, lax, m).indlist = indx; (s)% ⊦ istore[n, iblock][n] = iblock; (s)% ⊦ index(m).lnum = m; (s)