| zh[r] = mkznode(r0, zbrar, boolvar, true, m0), 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 [m1, indexblock (save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ]), inv(istore3[m1, indexblock(save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', 0)]), inv(istore3[m1, indexblock([], [], 0)]), inv(istore2), inv(istore3), inv(gstore1), inv(gstore2 \ ginval2), refsize-cons(istore3, as ∪ as0), 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[m1, indexblock(save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', 0)], istore2 ⊑ istore3[m1, indexblock([], [], 0)], istore2 ⊑ istore3, istore2 ⊑ istore3 [m1, indexblock (save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ], height = 0 → as = ∅ ⊦ (( btree (rp, r, @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize), height, false, ri, nodes(istore3)[@(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize), save(mkznode(r0, zbrar, boolvar, true, m0))], as ++ @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize), (alladrs -- adr1) ++ @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize), ok) * P) )(zh[r, mkznode(r0, zbrar, boolvar, false, m0)]), dups(nx), m1 ∈ istore3, adr1 ∈ as, @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ∈ as |
⊦ ¬ adr1 ∈ iast ∧ ¬ adr1 ∈ alladrs ∧ r ∈ zh ∧ zh[r] = mkznode(r0, zbrar, boolvar, true, m0) ∧ ((btree(rp, r, adr0, height, dirty, ri, iast, as, alladrs, nstat) * P))(zh) ∧ btree-sub-clean(r, m0, zh) → ((btree(rp, r, adr1, height, false, ri, iast[adr1, save(mkznode(r0, zbrar, boolvar, true, m0))], as ++ adr1, (alladrs -- adr0) ++ adr1, nstat) * P) )(zh[r, mkznode(r0, zbrar, boolvar, false, m0)])
Used simplifier rules: ⊦ adr ∈ nodes(istore) ↔ adr ∈ istore; (s)% ⊦ ¬ n ∈ istore → ¬ @(n, n0, n1) ∈ istore; (s)%sub-in: ⊦ adr ∈ as ∧ as ⊆ as0 → adr ∈ as0; (forward) from specification set-basic[node-store]%ne-01: ⊦ adr ∈ as → as ≠ ∅; (forward) from specification set-basic[node-store]% ⊦ adr ∈ dom iast ↔ adr ∈ iast; (s) Used terms: dirty, zh, P, ok, adr1, alladrs, as, m0, boolvar, zbrar, r0, nodes(istore3), ri, height, @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize), r, rp