| 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, 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 = ∅ ⊦ dups(nx), adr1 ∈ as, m1 ∈ istore3, @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ∈ 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)]) ∧ refsize-cons (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) ], (as ∪ as0) ++ @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize)) |
¬ n ∈ istore ⊦ refsize-cons(istore, as) ∧ as | n = ∅ → refsize-cons(istore[n, indexblock(ind ', @(m0, m1) ', m1)], as ++ @(n, m0, m1))
zh[r] = mkznode(r0, zbrar, boolvar, true, m0), remove-refsize0(gstore1) = gstore1, remove-refsize0(istore2) = istore2, (as ∪ as0) | m1 = ∅, 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[m1, indexblock([], [], 0)]), 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 (save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ]), refsize-cons(istore3, as0 ∪ as), refsize-cons(istore3, as ∪ as0), r ∈ zh, m ∈ istore3, n0 ≤ LEB_SIZE, as0 ⊆ dom nodes(istore3), alladrs ⊆ dom nodes(istore3), as ⊆ alladrs, as ⊆ dom nodes(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) ], istore2 ⊑ istore3, istore2 ⊑ istore3[m1, indexblock([], [], 0)], istore2 ⊑ istore3[m1, indexblock(save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', 0)], height = 0 → as = ∅ ⊦ dups(nx), @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ∈ as, adr1 ∈ as, m1 ∈ istore3, (( 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)]) ∧ true
Used simplifier rules: unc: ⊦ as ∪ as0 = as0 ∪ as; from specification set-union[node-store]% ⊦ (as0 ∪ as1) | n = (as0 | n) ∪ (as1 | n); (s)% ⊦ as ⊆ dom nodes(istore) ∧ ¬ n ∈ istore → as | n = ∅; (s)% ⊦ as ∪ ∅ = as; (s)%una: ⊦ (as ∪ as0) ∪ as1 = as ∪ as0 ∪ as1; from specification set-union[node-store] Used terms: as ∪ as0, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize, m2, save(mkznode(r0, zbrar, boolvar, true, m0)), m1, istore3