| # lpt = # avol, # buf0 + n0 = align↓(# buf0 + n, EB_PAGE_SIZE), avol[m1] = mapped(buf0), buffered(m1).isbuf?, avol[buffered(m1).leb].mapped?, m1 < # avol, buffered(m1).leb < # avol, awbuf-inv(avol, buffered(m1)), avol0 ↓ avol[m1, mapped(buf0 + subarray(buf, 0, n))], n ≤ # buf, # buf0 + n ≤ LEB_SIZE, EB_PAGE_SIZE ≤ # buf0 % EB_PAGE_SIZE + n, 0 + n0 ≤ # buf ⊦ is-aligned(# buf0 + n, EB_PAGE_SIZE), synced(avol[buffered(m1).leb, mapped(avol[buffered(m1).leb].data + subarray(buf, 0, n0))]) ∧ avol0 ↓ avol[buffered(m1).leb, mapped(avol[buffered(m1).leb].data + subarray(buf, 0, n0))] |
# lpt = # avol, # buf0 + n0 = align↓(# buf0 + n, EB_PAGE_SIZE), avol[m1] = mapped(buf0), m1 < # avol, awbuf-inv(avol, buffered(m1)), avol0 ↓ avol[m1, mapped(buf0 + subarray(buf, 0, n))], n0 ≤ # buf, EB_PAGE_SIZE ≤ # buf0 % EB_PAGE_SIZE + n, # buf0 + n ≤ LEB_SIZE, n ≤ # buf ⊦ (buf0 + subarray(buf, 0, n)).align↓ = (buf0 + subarray(buf, 0, n0)).align↓, is-aligned(# buf0 + n, EB_PAGE_SIZE)
Used simplifier rules: ⊦ mapped(buf0) ↓ mapped(buf1) ↔ buf0 = buf1.align↓; (s)%n < # avol0 ⊦ avol1 ↓ avol0[n, mapped(buf)] → avol1[n] = mapped(buf.align↓); (s)%n < # avol0 ⊦ avol1 ↓ avol0[n, aleb0] → (avol1 ↓ avol0[n, aleb1] ↔ avol1[n] ↓ aleb1); (ss)% ⊦ m < n → (n ≤ m ↔ false); (s)% ⊦ m < n ↔ ¬ n ≤ m; (ss)%m ≠ 0 ⊦ n = align↓(n0, m) → is-aligned(n, m); (ss)% ⊦ EB_PAGE_SIZE ≠ 0; (s)% ⊦ mapped(buf).data = buf; (s)% ⊦ mapped(buf) = mapped(buf0) ↔ buf = buf0; (s)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]% ⊦ # subarray(buf, m, n) = n; (s)% ⊦ #(buf + buf0) = # buf + # buf0; (s)%⊦ awbuf-inv(avol, buffered(n)) → (synced(avol[n, mapped(buf)]) ↔ is-aligned(# buf, EB_PAGE_SIZE)); (s)% ⊦ buffered(m).isbuf?; (s)% ⊦ aleb.mapped? ↔ (∃ buf. aleb = mapped(buf)); (as)% ⊦ buffered(m).leb = m; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ n + 0 = n; (s)