| zh[r] = mkznode(r0, zbrar, boolvar, true, m0), adr2 = adr1, adr3 = @(pstate0.lnum, maxino, ind.flashsize), err0 = err, ginval0 = ginval2, gstore = gstore1, gstore0 = gstore2, ind = save(mkznode(r0, zbrar, boolvar, true, m0)), istore = istore3[n, indexblock([], [], 0)], istore0 = istore2, pstate = readonly, pstate0 = 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(istore3[n, indexblock([], [], 0)]), inv(istore2), inv(istore3), inv(gstore1), inv(gstore2 \ ginval2), inv(istore), 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[n, indexblock([], [], 0)], istore2 ⊑ istore3, istore2 ⊑ istore, height = 0 → as = ∅, pstate = unbuffered → syn, pstate.index? → pstate.lnum ∈ istore, pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore2, ¬ @(pstate0.lnum, maxino, ind.flashsize) ∈ istore ∧ err = ESUCCESS ∨ ⌊err⌋ , pstate0.index? ∨ pstate0.journal? ⊦ ⟪skip⟫ ( 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)), err0 = ESUCCESS, dups(nx), n ∈ istore3, adr1 ∈ as |
Used simplifier rules: ⊦ index(m).lnum = m; (s)% ⊦ @(n, n0, n1) ∈ istore[n, iblock] ↔ @(n0, n1) ∈ iblock.ladrlist; (s)% ⊦ indexblock(indx, lax, m).ladrlist = lax; (s)% ⊦ ¬ ladr ∈ []; (s)% ⊦ ⌊err⌋ → err ≠ ESUCCESS; (s)% ⊦ index(m).index?; (s)% ⊦ unbuffered ≠ readonly; (s)% ⊦ ¬ readonly.index?; (s)% ⊦ ¬ readonly.journal?; (s)% ⊦ istore ⊑ istore0 ∧ ¬ n ∈ istore0 → istore ⊑ istore0[n, iblock]; (ss)%⊦ ¬ n ∈ istore ∧ inv(istore) → istore ⊑ istore[n, indexblock(indx, lax, n0)]; (s)%¬ n ∈ istore ⊦ nodes(istore[n, indexblock([], [], m)]) = nodes(istore); (s)% ⊦ as ∪ ∅ = as; (s)%una: ⊦ (as ∪ as0) ∪ as1 = as ∪ as0 ∪ as1; from specification set-union[node-store]%unc: ⊦ as ∪ as0 = as0 ∪ as; from specification set-union[node-store]%sep-ass: ⊦ (P * P3) * P4 = P * P3 * P4; from specification heap-sep[zheap]%sep-com: ⊦ P * P2 = P2 * P; from specification heap-sep[zheap]%⊦ (( btree(rp, r, adr, height, dirty, fi, iast, as, alladrs, nstat) * P) )(zh) → (( btree(rp, r, adr, height, true, fi, iast, as, alladrs, nstat) * P) )(zh); (s)%⊦ refsize-cons(istore, as) → ( refsize-cons(istore[n, iblock], as) ↔ ¬ n ∈ istore ∨ istore[n].ref-size = (as | n).size → iblock.ref-size = (as | n).size); (ss)% ⊦ indexblock(indx, lax, m).ref-size = m; (s)% ⊦ (as0 ∪ as1) | n = (as0 | n) ∪ (as1 | n); (s)% ⊦ as ⊆ dom nodes(istore) ∧ ¬ n ∈ istore → as | n = ∅; (s)% ⊦ ∅.size = 0; (s)