| zh[r] = mkznode(r0, zbrar, boolvar, true, m0), adr = adr0, err0 = ESUCCESS, ginval0 = ginval2, gstore = gstore1, gstore0 = gstore2, istore = istore3[m1, indexblock(save(mkznode(r0, zbrar, boolvar, true, m0)) ', @(m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ', 0)], istore0 = istore2, maxino = maxino2, maxino0 = index(m1).lnum, n = save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize, pstate = index(m1), 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) ', 0)]), inv(istore3[m1, indexblock([], [], 0)]), inv(istore2), inv(istore3), inv(gstore1), inv(gstore2 \ ginval2), inv(istore[maxino0, istore[maxino0].ref-size:= n]), refsize-cons(istore3, as0 ∪ as), m ∈ istore3, r ∈ zh, maxino0 ∈ istore, m1 ∈ istore[maxino0, istore[maxino0].ref-size:= n], 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 ⊑ istore[maxino0, istore[maxino0].ref-size:= n], height = 0 → as = ∅, index(m1).index? ∨ index(m1).journal? ⊦ dups(nx), adr1 ∈ as, m1 ∈ istore3, refsize-cons (istore[maxino0, istore[maxino0].ref-size:= n], as0 ∪ (err0 = ESUCCESS ⊃ as ++ @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);as)) ∧ istore3 ⊑ istore[maxino0, istore[maxino0].ref-size:= n] ∧ r ∈ zh[r, zh[r].dirty:= false] ∧ (err0 = ESUCCESS → ¬ @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize) ∈ as) ∧ dom nodes(istore[maxino0, istore[maxino0].ref-size:= n]) = dom nodes(istore3) ∪ (err0 = ESUCCESS ⊃ ∅ ++ @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);∅) ∧ (( btree (rp, r, (err0 = ESUCCESS ⊃ @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);adr1), height, err0 ≠ ESUCCESS, ri, nodes(istore[maxino0, istore[maxino0].ref-size:= n]), (err0 = ESUCCESS ⊃ as ++ @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);as), (err0 = ESUCCESS ⊃ (alladrs -- adr1) ++ @(m1, m2, save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize);alladrs), ok) * P) )(zh[r, zh[r].dirty:= false]) ∧ (err0 = ESUCCESS ∨ ⌊err0⌋ ) ∧ (err0 = ESUCCESS → ¬ zh[r, zh[r].dirty:= false][r].dirty) |
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))
Used simplifier rules: ⊦ ¬ n ∈ istore → ¬ @(n, n0, n1) ∈ istore; (s)% ⊦ adr ∈ nodes(istore) ↔ adr ∈ istore; (s)% ⊦ adr ∈ dom iast ↔ adr ∈ iast; (s)%ne-01: ⊦ adr ∈ as → as ≠ ∅; (forward) from specification set-basic[node-store]%sub-in: ⊦ adr ∈ as ∧ as ⊆ as0 → adr ∈ as0; (forward) from specification set-basic[node-store]%⊦ mkznode(r, zbrar, boolvar, boolvar0, m).dirty:= boolvar2 = mkznode(r, zbrar, boolvar, boolvar2, m); (s)% ⊦ (znd.dirty:= boolvar0).dirty ↔ boolvar0; (s)% ⊦ zh[r0, znd][r] = (r = r0 ∧ r0 ∈ zh ⊃ znd;zh[r]); (s)% ⊦ as ∪ ∅ = as; (s)% ⊦ dom iast[adr, ind] = dom iast ++ adr; (s)% ⊦ @(m, m0).size = m0; (s)% ⊦ @(m, m0).off = m; (s)%⊦ ¬ n ∈ istore → nodes(istore[n, indexblock(ind ', ladr ', m1)]) = nodes(istore)[@(n, ladr.off, ladr.size), ind]; (s)% ⊦ r ∈ zh[r0, znd] ↔ r ∈ zh; (s)%⊦ ¬ n ∈ istore ∧ inv(istore) → istore ⊑ istore[n, indexblock(indx, lax, n0)]; (s)%unc: ⊦ as ∪ as0 = as0 ∪ as; from specification set-union[node-store]%una: ⊦ (as ∪ as0) ∪ as1 = as ∪ as0 ∪ as1; from specification set-union[node-store]% ⊦ (as ++ adr) ∪ as0 = (as ∪ as0) ++ adr; (s)% ⊦ index(m).index?; (s)% ⊦ n ∈ istore[n0, iblock] ↔ n = n0 ∨ n ∈ istore; (ws)% ⊦ istore[n, iblock][n, iblock0] = istore[n, iblock0]; (s)% ⊦ indexblock(indx, lax, m).ref-size:= m0 = indexblock(indx, lax, m0); (s)% ⊦ istore[n, iblock][n] = iblock; (s)% ⊦ index(m).lnum = m; (s)