| # avol0 = # avol1, # lpt0 = # avol1, # buf2 = EB_PAGE_SIZE, n1 + n5 = n4 + min(n1, n2), n0 + n5 + n1 = # buf3, LEB_SIZE = n3 + n2 + m0 + n0, avol0[m2] = mapped(buf4), avol1[m2] = mapped(buf4 + subarray(buf2, 0, n2)), m2 < # avol1, n2 < EB_PAGE_SIZE, awbuf-inv(avol1, buffered(m2)), ebm-vol-inv(avol0), is-aligned(m0 + n0, EB_PAGE_SIZE), n0 ≤ # buf3, min(n1, n2) ≤ n1 + n5, m0 ≤ LEB_SIZE, n1 ≤ n2 + n3, min(n1, n2) ≤ EB_PAGE_SIZE, ∃ buf0, buf1. buf4 = buf0 + buf1 ∧ # buf0 = m0 ∧ # buf1 = n0 ⊦ subarray(buf4, m0, n0) + subarray(buf2, 0, min(n1, n2)) + subarray(subarray(buf4 + mkempbuf(n3 + n2), m0, n1 + n0) + subarray(buf3, n1 + n0, n5), n0 + min(n1, n2), n4) = subarray(buf4 + subarray(buf2, 0, n2) + mkempbuf(n3), m0, n1 + n0) + subarray(buf3, n1 + n0, n5) |
# buf2 = EB_PAGE_SIZE, # lpt0 = # avol1, # avol0 = # avol1, # buf + n5 + n1 = # buf3, n1 + n5 = n4 + min(n1, n2), LEB_SIZE = n3 + n2 + # buf0 + # buf, avol1[m2] = mapped((buf0 + buf) + subarray(buf2, 0, n2)), avol0[m2] = mapped(buf0 + buf), n2 < EB_PAGE_SIZE, m2 < # avol1, awbuf-inv(avol1, buffered(m2)), ebm-vol-inv(avol0), is-aligned(# buf0 + # buf, EB_PAGE_SIZE), min(n1, n2) ≤ EB_PAGE_SIZE, n1 ≤ n2 + n3, # buf0 ≤ LEB_SIZE, min(n1, n2) ≤ n1 + n5, # buf ≤ # buf3 ⊦ subarray(buf2, 0, min(n1, n2)) + subarray(mkempbuf(n1) + subarray(buf3, n1 + # buf, n5), min(n1, n2), n4) = subarray(subarray(buf2, 0, n2) + mkempbuf(n3), 0, n1) + subarray(buf3, n1 + # buf, n5)
Used simplifier rules: nat0: ⊦ n0 = n1 + n → (n1 + m ≤ n0 ↔ m ≤ n);% ⊦ buf + buf0 = buf + buf1 ↔ buf0 = buf1; (s)% ⊦ m + n - m = n; (s)%# buf ≤ n0, n0 + m ≤ # buf + # buf0 ⊦ subarray(buf + buf0, n0, m) = subarray(buf0, n0 - # buf, m); (s)% ⊦ m ≤ m; (s)% ⊦ # subarray(buf, m, n) = n; (s)% ⊦ m ≤ m + n; (s)% ⊦ n1 ≤ n0 → subarray(mkempbuf(n0), 0, n1) = mkempbuf(n1); (s)%m ≤ # buf ⊦ subarray(buf0 + buf, 0, # buf0 + m) = buf0 + subarray(buf, 0, m); (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m ≤ n → (n < m ↔ false); (s)%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ m + n ≤ m + n0 ↔ n ≤ n0; (s)% ⊦ # mkempbuf(n) = n; (s)% ⊦ #(buf + buf0) = # buf + # buf0; (s)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]%# buf = n ⊦ subarray(buf, 0, n) = buf; (s)%m ≤ # buf ⊦ subarray(buf0 + buf, # buf0, m) = subarray(buf, 0, m); (s)% ⊦ ¬ n < n; (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)