| # avol0 = # avol1, # lpt0 = # avol1, # buf2 = EB_PAGE_SIZE, # buf3 = n5 + n1 + (m0 ≤ m6 ⊃ m6 - m0;0), n1 + n5 = n4 + min(n1, n2), LEB_SIZE = n0 + # buf4, LEB_SIZE = n3 + # buf1, avol0[m2] = mapped(buf4), avol1[m2] = mapped(buf1), (m0 ≤ m6 ⊃ 0;m0 - m6) < EB_PAGE_SIZE, m2 < # avol1, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6) < EB_PAGE_SIZE, awbuf-inv(avol1, buffered(m2)), ebm-vol-inv(avol0), is-aligned(m6, EB_PAGE_SIZE), m0 + n1 + (m0 ≤ m6 ⊃ m6 - m0;0) ≤ LEB_SIZE, (m0 ≤ m6 ⊃ 0;m0 - m6) + min(n1, n2) ≤ EB_PAGE_SIZE, (m0 ≤ m6 ⊃ m6 - m0;0) ≤ # buf3, m6 ≤ LEB_SIZE, # buf1 ≤ LEB_SIZE, # buf4 ≤ LEB_SIZE, m6 ≤ m0 + n1 + (m0 ≤ m6 ⊃ m6 - m0;0), m0 ≤ m6 + n2 + (m0 ≤ m6 ⊃ 0;m0 - m6), min(n1, n2) ≤ n1 + n5, ¬ rofs → # buf4 = m6, rofs → m6 ≤ # buf4, ¬ m0 ≤ m6 → m6 ≤ m0, ∀ n. n < # avol1 → (buffered(n) ≠ buffered(m2) → avol1[n] = avol0[n]) ∧ (¬ rofs ∧ buffered(n) = buffered(m2) → avol1[n] = abs⊕(avol0[n], mkwbuf(buf2, m6, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6)))) ∧ ( rofs ∧ buffered(n) = buffered(m2) → mkwbuf(buf2, m6, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6)).offset = # avol0[n].data ∧ avol1[n] = abs⊕(avol0[n], mkwbuf(buf2, m6, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6))) ∨ mkwbuf(buf2, m6, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6)).offset < # avol0[n].data ∧ mkwbuf(buf2, m6, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6)).offset + mkwbuf(buf2, m6, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6)).nbytes < # avol0[n].data ∧ avol1[n] = avol0[n] ∧ subarray(mkwbuf(buf2, m6, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6)).content, 0, mkwbuf(buf2, m6, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6)).nbytes) = subarray(avol0[n].data, mkwbuf(buf2, m6, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6)).offset, mkwbuf(buf2, m6, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6)).nbytes)) ⊦ subarray(buf4 + mkempbuf(n0), m0, (m0 ≤ m6 ⊃ m6 - m0;0)) + subarray(buf2, (m0 ≤ m6 ⊃ 0;m0 - m6), min(n1, n2)) + subarray (subarray(buf4 + mkempbuf(n0), m0, n1 + (m0 ≤ m6 ⊃ m6 - m0;0)) + subarray(buf3, n1 + (m0 ≤ m6 ⊃ m6 - m0;0), n5), (m0 ≤ m6 ⊃ m6 - m0;0) + min(n1, n2), n4) = subarray(buf1 + mkempbuf(n3), m0, n1 + (m0 ≤ m6 ⊃ m6 - m0;0)) + subarray(buf3, n1 + (m0 ≤ m6 ⊃ m6 - m0;0), n5) |
# avol0 = # avol1, # lpt0 = # avol1, # buf2 = EB_PAGE_SIZE, # buf3 = n5 + n1 + (m0 ≤ m6 ⊃ m6 - m0;0), n1 + n5 = n4 + min(n1, n2), LEB_SIZE = n0 + # buf4, LEB_SIZE = n3 + # buf1, avol0[m2] = mapped(buf4), avol1[m2] = mapped(buf1), (m0 ≤ m6 ⊃ 0;m0 - m6) < EB_PAGE_SIZE, m2 < # avol1, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6) < EB_PAGE_SIZE, awbuf-inv(avol1, buffered(m2)), ebm-vol-inv(avol0), is-aligned(m6, EB_PAGE_SIZE), m0 + n1 + (m0 ≤ m6 ⊃ m6 - m0;0) ≤ LEB_SIZE, (m0 ≤ m6 ⊃ 0;m0 - m6) + min(n1, n2) ≤ EB_PAGE_SIZE, (m0 ≤ m6 ⊃ m6 - m0;0) ≤ # buf3, m6 ≤ LEB_SIZE, # buf1 ≤ LEB_SIZE, # buf4 ≤ LEB_SIZE, m6 ≤ m0 + n1 + (m0 ≤ m6 ⊃ m6 - m0;0), m0 ≤ m6 + n2 + (m0 ≤ m6 ⊃ 0;m0 - m6), min(n1, n2) ≤ n1 + n5, ¬ rofs → # buf4 = m6, rofs → m6 ≤ # buf4, ¬ m0 ≤ m6 → m6 ≤ m0, ∀ n. n < # avol1 → (n ≠ m2 → avol1[n] = avol0[n]) ∧ (¬ rofs ∧ n = m2 → buf1 = buf4 + subarray(buf2, 0, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6))) ∧ ( rofs ∧ n = m2 → m6 = # buf4 ∧ buf1 = buf4 + subarray(buf2, 0, n2 + (m0 ≤ # buf4 ⊃ 0;m0 - # buf4)) ∨ m6 < # buf4 ∧ m6 + n2 + (m0 ≤ m6 ⊃ 0;m0 - m6) < # buf4 ∧ buf1 = buf4 ∧ subarray(buf2, 0, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6)) = subarray(buf4, m6, n2 + (m0 ≤ m6 ⊃ 0;m0 - m6))) ⊦ subarray(buf4 + mkempbuf(n0), m0, (m0 ≤ m6 ⊃ m6 - m0;0)) + subarray(buf2, (m0 ≤ m6 ⊃ 0;m0 - m6), min(n1, n2)) + subarray (subarray(buf4 + mkempbuf(n0), m0, n1 + (m0 ≤ m6 ⊃ m6 - m0;0)) + subarray(buf3, n1 + (m0 ≤ m6 ⊃ m6 - m0;0), n5), (m0 ≤ m6 ⊃ m6 - m0;0) + min(n1, n2), n4) = subarray(buf1 + mkempbuf(n3), m0, n1 + (m0 ≤ m6 ⊃ m6 - m0;0)) + subarray(buf3, n1 + (m0 ≤ m6 ⊃ m6 - m0;0), n5)
Used simplifier rules: ⊦ mapped(buf).data = buf; (s)% ⊦ mapped(buf) = mapped(buf0) ↔ buf = buf0; (s)%⊦ abs⊕(mapped(buf), wbuf) = mapped(buf + subarray(wbuf.content, 0, wbuf.nbytes)); (s)% ⊦ mkwbuf(buf, m, m0).content = buf; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ mkwbuf(buf, m, m0).nbytes = m0; (s)% ⊦ mkwbuf(buf, m, m0).offset = m; (s)% ⊦ buffered(m) = buffered(m0) ↔ m = m0; (s)