| zh[r] = mkznode(r0, zbrar, boolvar, true, m0), adr2 = adr0, ginval1 = ginval2, ginval3 = ginval, gstore3 = gstore2, gstore4 = gstore1, istore4 = istore3, istore5 = istore2, maxino1 = maxino0, nx0 = nx, pstate = index(m), 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), n < save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize, btree-sub-clean(r, m0, zh), inv(gstore2 \ ginval2), inv(gstore1), inv(istore3), inv(istore2), inv-index(istore3, istore2), inv-journal(nx, gstore2, gstore1, ginval2), inv-state(pstate, nx, gstore2, istore3, syn), refsize-cons(istore3, as0 ∪ as), r ∈ zh, m ∈ istore3, n ≤ LEB_SIZE, as0 ⊆ dom nodes(istore3), alladrs ⊆ dom nodes(istore3), as ⊆ alladrs, as ⊆ dom nodes(istore3), istore2 ⊑ istore3, height = 0 → as = ∅ ⊦ [apersistence_sync#(adr0, istore3, istore2, ginval2, gstore2, gstore1, nx, maxino0, ginval; pstate, syn; err)] ( inv-state(pstate, nx0, gstore3, istore4, syn) → ⟪istore1 := istore3; gstore0 := gstore2; if err = ESUCCESS then apersistence_allocate_ind#(adr0, istore2, ginval2, gstore0, gstore1, nx, maxino0, ginval, syn; istore3, pstate; err); adr := adr1; if err = ESUCCESS then {apersistence_add_ind# (save(mkznode(r0, zbrar, boolvar, true, m0)), adr0, istore2, ginval2, gstore0, gstore1, nx, maxino0, ginval ; adr, istore3, pstate, syn ; err); if err = ESUCCESS then let maxino = 0 in {apersistence_get_iblock_refsize# (adr.lnum, adr0, istore3, istore2, ginval2, gstore0, gstore1, nx, maxino0, ginval, pstate, syn; ; maxino); apersistence_set_iblock_refsize# (adr.lnum, maxino + adr.size, adr0, istore2, ginval2, gstore0, gstore1, nx, maxino0, ginval, pstate, syn; istore3)}}; if err = ESUCCESS then zh[r].dirty := false⟫ ( refsize-cons(istore3, as0 ∪ (err = ESUCCESS ⊃ as ++ adr;as)) ∧ inv(istore3) ∧ istore2 ⊑ istore3 ∧ (pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore2) ∧ (pstate.index? → pstate.lnum ∈ istore3) ∧ (pstate = unbuffered → syn) ∧ istore1 ⊑ istore3 ∧ r ∈ zh ∧ (err = ESUCCESS → ¬ adr ∈ as) ∧ dom nodes(istore3) = dom nodes(istore1) ∪ (err = ESUCCESS ⊃ ∅ ++ adr;∅) ∧ (err = ESUCCESS → ¬ adr ∈ istore1) ∧ (( btree (rp, r, (err = ESUCCESS ⊃ adr;adr1), height, err ≠ ESUCCESS, ri, nodes(istore3), (err = ESUCCESS ⊃ as ++ adr;as), (err = ESUCCESS ⊃ (alladrs -- adr1) ++ adr;alladrs), ok) * P) )(zh) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → pstate.index? ∧ ¬ zh[r].dirty))), dups(nx), adr1 ∈ as |
zh[r] = mkznode(r0, zbrar, boolvar, true, m0), pstate = index(m), 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), n < save(mkznode(r0, zbrar, boolvar, true, m0)).flashsize, btree-sub-clean(r, m0, zh), inv(istore2), inv(istore3), inv(gstore1), inv(gstore2 \ ginval2), refsize-cons(istore3, as0 ∪ as), m ∈ istore3, r ∈ zh, n ≤ LEB_SIZE, as ⊆ dom nodes(istore3), as ⊆ alladrs, alladrs ⊆ dom nodes(istore3), as0 ⊆ dom nodes(istore3), istore2 ⊑ istore3, ¬ dups(nx), ¬ adr1 ∈ as, height = 0 → as = ∅ ⊦ [apersistence_sync#(adr0, istore3, istore2, ginval2, gstore2, gstore1, nx, maxino0, ginval; pstate, syn; err)] ( (pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore2) ∧ (pstate.index? → pstate.lnum ∈ istore3) ∧ (pstate = unbuffered → syn) → ⟪istore1 := istore3; gstore0 := gstore2; if err = ESUCCESS then apersistence_allocate_ind#(adr0, istore2, ginval2, gstore0, gstore1, nx, maxino0, ginval, syn; istore3, pstate; err); adr := adr1; if err = ESUCCESS then {apersistence_add_ind# (save(mkznode(r0, zbrar, boolvar, true, m0)), adr0, istore2, ginval2, gstore0, gstore1, nx, maxino0, ginval ; adr, istore3, pstate, syn ; err); if err = ESUCCESS then let maxino = 0 in {apersistence_get_iblock_refsize# (adr.lnum, adr0, istore3, istore2, ginval2, gstore0, gstore1, nx, maxino0, ginval, pstate, syn; ; maxino); apersistence_set_iblock_refsize# (adr.lnum, maxino + adr.size, adr0, istore2, ginval2, gstore0, gstore1, nx, maxino0, ginval, pstate, syn; istore3)}}; if err = ESUCCESS then zh[r].dirty := false⟫ ( refsize-cons(istore3, as0 ∪ (err = ESUCCESS ⊃ as ++ adr;as)) ∧ inv(istore3) ∧ istore2 ⊑ istore3 ∧ (pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore2) ∧ (pstate.index? → pstate.lnum ∈ istore3) ∧ (pstate = unbuffered → syn) ∧ istore1 ⊑ istore3 ∧ r ∈ zh ∧ (err = ESUCCESS → ¬ adr ∈ as) ∧ dom nodes(istore3) = dom nodes(istore1) ∪ (err = ESUCCESS ⊃ ∅ ++ adr;∅) ∧ (err = ESUCCESS → ¬ adr ∈ istore1) ∧ (( btree (rp, r, (err = ESUCCESS ⊃ adr;adr1), height, err ≠ ESUCCESS, ri, nodes(istore3), (err = ESUCCESS ⊃ as ++ adr;as), (err = ESUCCESS ⊃ (alladrs -- adr1) ++ adr;alladrs), ok) * P) )(zh) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → pstate.index? ∧ ¬ zh[r].dirty)))
Used simplifier rules: ⊦ inv-index(istore, istore0) ↔ inv(istore) ∧ inv(istore0) ∧ istore0 ⊑ istore ∧ remove-refsize0(istore0) = istore0; (s)%⊦ inv-journal(nx, gstore, gstore0, ginval) ↔ inv(gstore \ ginval) ∧ inv(gstore0) ∧ elems nx ∩ ginval = ∅ ∧ ¬ dups(nx) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ ginval ∧ remove-refsize0(gstore0) = gstore0; (s)% ⊦ unbuffered ≠ index(m); (s)% ⊦ index(m).lnum = m; (s)% ⊦ index(m).index?; (s)% ⊦ ¬ index(m).journal?; (s)%⊦ inv-state(pstate, nx, gstore, istore, syn) ↔ ( pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore) ∧ (pstate.index? → pstate.lnum ∈ istore) ∧ (pstate = unbuffered → syn); (s)