| # avol1 = # lpt, # lpt0 = # lpt, # avol0 = # lpt, (n ∈ nx ⊃ mklp(m13, LEB_SIZE, LP_GROUP_NODES, m15);mklp(m13, m14, lpf2, m15)) = mklp(m17, m18, lpf3, m19), (n ∈ nx ∨ ¬ n ∈ ginval ⊃ groupblock(gndx0, lax0, (n ∈ gstore0 ⊃ m11;0));groupblock(gndx1, lax2, m11)) = groupblock(gndx, lax, m), (n ∈ nx ⊃ mklp(m17, m18, lpf3, m19);(m17 = 0 ⊃ mklp(0, 0, LP_FREE, m19);mklp(m17, m18, lpf3, m19))) = mklp(m0, m1, lpf, m2), lpf1 = LP_GROUP_NODES ↔ n ∈ gstore, lpf1 = LP_INDEX_NODES ↔ n ∈ istore, n ∈ istore0 ↔ lpf2 = LP_INDEX_NODES ∧ m13 ≠ 0, n ∈ gstore0 ↔ lpf2 = LP_GROUP_NODES ∧ m13 ≠ 0, lpt0[n] = mklp(m13, m14, lpf2, m15), istore[n] = indexblock(indx, lax1, m10), lpt[bleb.leb] = mklp(m3, m4, lpf0, m5), gstore[n] = groupblock(gndx0, lax0, m6), lpt[n] = mklp(m7, m8, lpf1, m9), gstore0[n] = groupblock(gndx1, lax2, m11), istore0[n] = indexblock(indx0, lax3, m12), crash(gstore, gstore0, ginval, nx)[n] = groupblock(gndx2, lax4, m16), dom istore ∩ elems nx = ∅, n < # lpt, ginval < # lpt, awbuf-inv(avol0, bleb), synced(avol0), istore0 ⊑ istore, ¬ avol0[n].mapped? ∧ avol1[n].mapped? → # avol1[n].data ≤ LEB_SIZE ∧ is-aligned(# avol1[n].data, EB_PAGE_SIZE), avol0[n].mapped? → avol1[n] = mapped(avol0[n].data.align↓), n ∈ gstore → m7 = m6, n ∈ gstore ∧ ¬ n ∈ ginval → avol0[n].mapped? ∧ abs-nodes(avol0[n].data, gndx0, lax0, m8 = LEB_SIZE) ∧ (m8 ≠ LEB_SIZE → m8 = # avol0[n].data), n ∈ istore → avol0[n].mapped? ∧ abs-nodes(avol0[n].data, indx, lax1, m8 = LEB_SIZE) ∧ (m8 ≠ LEB_SIZE → m8 = # avol0[n].data) ∧ m7 = m10, n ∈ istore0 → m13 = m12, n ∈ gstore0 → m13 = m11, lpf2 = LP_FREE → m13 = 0, ∀ n. n < # lpt ∧ lpt0[n].flags = LP_GROUP_NODES ∧ lpt[n].flags = LP_GROUP_NODES ∧ ¬ n ∈ nx → lpt[n].size = lpt0[n].size, ∀ n. n < # lpt ∧ lpt0[n].flags = LP_FREE → lpt0[n].ref-size = 0, bleb = nobuffer ∨ bleb.leb < # lpt ∧ (nx ≠ [] ∧ bleb.leb = nx.last ∧ lpf0 = LP_GROUP_NODES ∨ lpf0 = LP_INDEX_NODES), n ∈ gstore ∨ n ∈ ginval, n ∈ gstore0 ∨ n ∈ nx ⊦ lpf3 = LP_INDEX_NODES, lpf3 = LP_FREE, lpf = LP_GROUP_NODES ∧ (n ∈ gstore ∧ ¬ n ∈ ginval → avol1[n].mapped? ∧ abs-nodes(avol1[n].data, gndx2, lax4, m1 = LEB_SIZE) ∧ (m1 ≠ LEB_SIZE → m1 = # avol1[n].data)) ∧ m0 = m |
# avol0 = # lpt, # lpt0 = # lpt, # avol1 = # lpt, (n ∈ nx ⊃ mklp(m17, m18, lpf3, m19);(m17 = 0 ⊃ mklp(0, 0, LP_FREE, m19);mklp(m17, m18, lpf3, m19))) = mklp(m0, m1, lpf, m2), (n ∈ nx ∨ ¬ n ∈ ginval ⊃ groupblock(gndx0, lax0, (n ∈ gstore0 ⊃ m11;0));groupblock(gndx1, lax2, m11)) = groupblock(gndx, lax, m), (n ∈ nx ⊃ mklp(m13, LEB_SIZE, LP_GROUP_NODES, m15);mklp(m13, m14, lpf2, m15)) = mklp(m17, m18, lpf3, m19), n ∈ gstore0 ↔ lpf2 = LP_GROUP_NODES ∧ m13 ≠ 0, n ∈ istore0 ↔ lpf2 = LP_INDEX_NODES ∧ m13 ≠ 0, lpf1 = LP_INDEX_NODES ↔ n ∈ istore, lpf1 = LP_GROUP_NODES ↔ n ∈ gstore, crash(gstore, gstore0, ginval, nx)[n] = groupblock(gndx2, lax4, m16), istore0[n] = indexblock(indx0, lax3, m12), gstore0[n] = groupblock(gndx1, lax2, m11), lpt[n] = mklp(m7, m8, lpf1, m9), gstore[n] = groupblock(gndx0, lax0, m6), lpt[bleb.leb] = mklp(m3, m4, lpf0, m5), istore[n] = indexblock(indx, lax1, m10), lpt0[n] = mklp(m13, m14, lpf2, m15), dom istore ∩ elems nx = ∅, ginval < # lpt, n < # lpt, awbuf-inv(avol0, bleb), synced(avol0), istore0 ⊑ istore, lpf2 = LP_FREE → m13 = 0, n ∈ gstore0 → m13 = m11, n ∈ istore0 → m13 = m12, n ∈ istore → avol0[n].mapped? ∧ abs-nodes(avol0[n].data, indx, lax1, m8 = LEB_SIZE) ∧ (m8 ≠ LEB_SIZE → m8 = # avol0[n].data) ∧ m7 = m10, n ∈ gstore ∧ ¬ n ∈ ginval → avol0[n].mapped? ∧ abs-nodes(avol0[n].data, gndx0, lax0, m8 = LEB_SIZE) ∧ (m8 ≠ LEB_SIZE → m8 = # avol0[n].data), n ∈ gstore → m7 = m6, avol0[n].mapped? → avol1[n] = mapped(avol0[n].data.align↓), ¬ avol0[n].mapped? ∧ avol1[n].mapped? → # avol1[n].data ≤ LEB_SIZE ∧ is-aligned(# avol1[n].data, EB_PAGE_SIZE), ∀ n. n < # lpt ∧ lpt0[n].flags = LP_FREE → lpt0[n].ref-size = 0, ∀ n. n < # lpt ∧ lpt0[n].flags = LP_GROUP_NODES ∧ lpt[n].flags = LP_GROUP_NODES ∧ ¬ n ∈ nx → lpt[n].size = lpt0[n].size, n ∈ gstore0 ∨ n ∈ nx, n ∈ gstore ∨ n ∈ ginval, bleb = nobuffer ∨ bleb.leb < # lpt ∧ (nx ≠ [] ∧ bleb.leb = nx.last ∧ lpf0 = LP_GROUP_NODES ∨ lpf0 = LP_INDEX_NODES) ⊦ lpf1 = LP_INDEX_NODES, lpf3 = LP_FREE, lpf3 = LP_INDEX_NODES, lpf = LP_GROUP_NODES ∧ (n ∈ gstore ∧ ¬ n ∈ ginval → avol1[n].mapped? ∧ abs-nodes(avol1[n].data, gndx2, lax4, m1 = LEB_SIZE) ∧ (m1 ≠ LEB_SIZE → m1 = # avol1[n].data)) ∧ m0 = m
Used simplifier rules: ⊦ LP_GROUP_NODES ≠ LP_INDEX_NODES; (s)% ⊦ ¬ n ∈ gstore → gstore[n] = (∅)[n]; (s)% ⊦ aleb.mapped? ↔ (∃ buf. aleb = mapped(buf)); (as)%ne-01: ⊦ n ∈ ns → ns ≠ ∅; (forward) from specification set-basic[nat-set]%abs-nodes-elems-adr-length: ⊦ abs-nodes(buf, indx, lax, weak) → # indx = # lax; (forward) from specification abs-list[encoding-index-node]%⊦ mklp(m, m0, lpf, m1) = mklp(m2, m3, lpf0, m4) ↔ m = m2 ∧ m0 = m3 ∧ lpf = lpf0 ∧ m1 = m4; (ws)% ⊦ mapped(buf).data = buf; (s)%int-a: ⊦ (ns ∩ ns0) ∩ ns1 = ns ∩ ns0 ∩ ns1; from specification set-union[nat-set]%int-c: ⊦ ns ∩ ns0 = ns0 ∩ ns; from specification set-union[nat-set]%elems-in-notin-ginval: ⊦ n ∈ nx ∧ elems nx ∩ ns = ∅ → ¬ n ∈ ns; (forward) from specification apersistence-base%size-zero-01: ⊦ ns ≠ ∅ → # ns ≠ 0; (forward) from specification set-basic[nat-set]% ⊦ n ∈ dom istore ↔ n ∈ istore; (s)% ⊦ ¬ n ∈ istore → istore[n] = (∅)[n]; (s)%⊦ groupblock(gndx, lax, m) = groupblock(gndx0, lax0, m0) ↔ gndx = gndx0 ∧ lax = lax0 ∧ m = m0; (ws)% ⊦ mapped(buf).mapped?; (s)% ⊦ LP_FREE ≠ LP_GROUP_NODES; (s) Used formulas: lpf1 = LP_INDEX_NODES