| zh[r] = mkznode(r0, zbrar, boolvar, true, m0), istore = istore3[n1, indexblock(save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', 0)], remove-refsize0(istore2) = istore2, remove-refsize0(gstore1) = gstore1, 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(istore3[n1, indexblock(save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', 0)]), inv(istore3[n1, indexblock([], [], 0)]), inv(istore2), inv(istore3), inv(gstore1), inv(gstore2 \ ginval2), refsize-cons(istore3, as0 ∪ as), m ∈ istore3, r ∈ zh, n0 ≤ LEB_SIZE, as ⊆ dom nodes(istore3), as ⊆ alladrs, alladrs ⊆ dom nodes(istore3), as0 ⊆ dom nodes(istore3), istore2 ⊑ istore3[n1, indexblock(save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', 0)], istore2 ⊑ istore3[n1, indexblock([], [], 0)], istore2 ⊑ istore3, ¬ dups(nx), ¬ adr1 ∈ as, ¬ n1 ∈ istore3, height = 0 → as = ∅ ⊦ ⟪apersistence_set_iblock_refsize# (index(n1).lnum, istore3[n1, indexblock([], [], 0)] [index(n1).lnum, istore3[n1, indexblock([], [], 0)] [index(n1).lnum, istore3[n1, indexblock([], [], 0)][index(n1).lnum] .indlist:= (istore3[n1, indexblock([], [], 0)][index(n1).lnum].indlist + save(mkznode(r0, zbrar, boolvar, true, m0)) ') ] [index(n1).lnum ] .ladrlist:= ( istore3[n1, indexblock([], [], 0)] [index(n1).lnum, istore3[n1, indexblock([], [], 0)][index(n1).lnum] .indlist:= (istore3[n1, indexblock([], [], 0)][index(n1).lnum].indlist + save(mkznode(r0, zbrar, boolvar, true, m0)) ') ] [index(n1).lnum ] .ladrlist + @ (@(index(n1).lnum, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize).pos, @(index(n1).lnum, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize).size) ') ] [index(n1).lnum ] .ref-size + @(index(n1).lnum, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize).size, adr0, istore2, ginval2, gstore2, gstore1, nx, maxino2, ginval, index(n1), syn ; istore); err0 := ESUCCESS; if err0 = ESUCCESS then zh[r].dirty := false⟫ ( refsize-cons(istore, as0 ∪ (err0 = ESUCCESS ⊃ as ++ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);as)) ∧ inv(istore) ∧ istore2 ⊑ istore ∧ n1 ∈ istore ∧ istore3 ⊑ istore ∧ r ∈ zh ∧ (err0 = ESUCCESS → ¬ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ∈ as) ∧ dom nodes(istore) = dom nodes(istore3) ∪ (err0 = ESUCCESS ⊃ ∅ ++ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);∅) ∧ (( btree (rp, r, (err0 = ESUCCESS ⊃ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);adr1), height, err0 ≠ ESUCCESS, ri, nodes(istore), (err0 = ESUCCESS ⊃ as ++ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);as), (err0 = ESUCCESS ⊃ (alladrs -- adr1) ++ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);alladrs), ok) * P) )(zh) ∧ (err0 = ESUCCESS ∨ ⌊err0⌋ ) ∧ (err0 = ESUCCESS → ¬ zh[r].dirty)) |
@(index(n1).lnum, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) = @(m1, m2, m3), zh[r] = mkznode(r0, zbrar, boolvar, true, m0), istore = istore3[n1, indexblock(save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', 0)], 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[n1, indexblock([], [], 0)]), inv(istore3[n1, 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[n1, indexblock([], [], 0)], istore2 ⊑ istore3[n1, indexblock(save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', 0)], height = 0 → as = ∅ ⊦ ⟪apersistence_set_iblock_refsize# (index(n1).lnum, istore3[n1, indexblock([], [], 0)] [index(n1).lnum, istore3[n1, indexblock([], [], 0)] [index(n1).lnum, istore3[n1, indexblock([], [], 0)][index(n1).lnum] .indlist:= (istore3[n1, indexblock([], [], 0)][index(n1).lnum].indlist + save(mkznode(r0, zbrar, boolvar, true, m0)) ') ] [index(n1).lnum ] .ladrlist:= ( istore3[n1, indexblock([], [], 0)] [index(n1).lnum, istore3[n1, indexblock([], [], 0)][index(n1).lnum] .indlist:= (istore3[n1, indexblock([], [], 0)][index(n1).lnum].indlist + save(mkznode(r0, zbrar, boolvar, true, m0)) ') ] [index(n1).lnum ] .ladrlist + @(m2, m3) ') ] [index(n1).lnum ] .ref-size + m3, adr0, istore2, ginval2, gstore2, gstore1, nx, maxino2, ginval, index(n1), syn ; istore); err0 := ESUCCESS; if err0 = ESUCCESS then zh[r].dirty := false⟫ ( refsize-cons(istore, as0 ∪ (err0 = ESUCCESS ⊃ as ++ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);as)) ∧ inv(istore) ∧ istore2 ⊑ istore ∧ n1 ∈ istore ∧ istore3 ⊑ istore ∧ r ∈ zh ∧ (err0 = ESUCCESS → ¬ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ∈ as) ∧ dom nodes(istore) = dom nodes(istore3) ∪ (err0 = ESUCCESS ⊃ ∅ ++ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);∅) ∧ (( btree (rp, r, (err0 = ESUCCESS ⊃ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);adr1), height, err0 ≠ ESUCCESS, ri, nodes(istore), (err0 = ESUCCESS ⊃ as ++ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);as), (err0 = ESUCCESS ⊃ (alladrs -- adr1) ++ @(n1, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);alladrs), ok) * P) )(zh) ∧ (err0 = ESUCCESS ∨ ⌊err0⌋ ) ∧ (err0 = ESUCCESS → ¬ zh[r].dirty)), dups(nx), adr1 ∈ as, n1 ∈ istore3
Used simplifier rules: ⊦ (m = adr.lnum ∧ m0 = adr.pos) ∧ m1 = adr.size ↔ adr = @(m, m0, m1); (elim) Used terms: @ (index(n1).lnum, maxino1, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize), m1, m2, m3