| # avol0 = # avol2, # avol1 = # avol2, # lpt1 = # avol2, # buf = EB_PAGE_SIZE, avol2[n] = mapped(buf2), avol1[n] = mapped(buf1), buf2 = buf1, mapped(buf1) = avol0[n], subarray(buf, 0, m3) = subarray(buf1, m2, m3), m3 < EB_PAGE_SIZE, n < # avol2, m2 < # buf1, m2 + m3 < # buf1, ebm-vol-inv(avol0), is-aligned(m2, EB_PAGE_SIZE), m2 ≤ # buf1, # buf2 ≤ LEB_SIZE, ¬ rofs0 → # buf1 = m2, ¬ rofs0 → buf2 = buf1 + subarray(buf, 0, m3) ⊦ buf1 = buf2.align↓ |
# buf = EB_PAGE_SIZE, # lpt1 = # avol2, # avol1 = # avol2, # avol0 = # avol2, avol1[n] = mapped(buf1), avol2[n] = mapped(buf1), mapped(buf1) = avol0[n], subarray(buf, 0, m3) = subarray(buf1, m2, m3), m2 + m3 < # buf1, m2 < # buf1, n < # avol2, m3 < EB_PAGE_SIZE, m2 + m3 < LEB_SIZE, m2 < LEB_SIZE, ebm-vol-inv(avol0), is-aligned(m2, EB_PAGE_SIZE), # buf1 ≤ LEB_SIZE ⊦ is-aligned(# buf1, EB_PAGE_SIZE)
Used simplifier rules: ⊦ LEB_SIZE ≠ 0; (s)% ⊦ m < n → n ≠ 0; (s)%fle: ⊦ m < n ∧ n ≤ n0 → m < n0; (forward) from specification nat%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]% ⊦ # subarray(buf, m, n) = n; (s)% ⊦ buf + buf0 = buf ↔ # buf0 = 0; (s)% ⊦ m < n → m ≤ n; (s)% ⊦ buf.align↓ = buf ↔ is-aligned(# buf, EB_PAGE_SIZE); (s)