| EB_PAGE_SIZE = # buf1 + # buf0 % EB_PAGE_SIZE, avol[n] = mapped(buf0), LEB_SIZE < # buf0 + # buf1, n < # avol, bleb ≠ nobuffer → bleb.leb < # avol ∧ avol[bleb.leb].mapped?, n < # avol ∧ avol[n].mapped? → # avol[n].data ≤ LEB_SIZE ∧ (buffered(n) ≠ bleb → is-aligned(# avol[n].data, EB_PAGE_SIZE)) ⊦ is-aligned(# buf0, EB_PAGE_SIZE) |
EB_PAGE_SIZE = # buf1 + # buf0 % EB_PAGE_SIZE, avol[n] = mapped(buf0), LEB_SIZE < # buf0 + # buf1, n < # avol, # buf0 ≤ LEB_SIZE ⊦ buf1 = mkbuf(0), is-aligned(# buf0, EB_PAGE_SIZE)
Used simplifier rules: elim-mapped: ⊦ avol[n].mapped? ↔ (∃ buf. avol[n] = mapped(buf));% ⊦ mapped(buf) = mapped(buf0) ↔ buf = buf0; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ # buf = 0 ↔ buf = mkbuf(0); (s)% ⊦ m < m + n ↔ n ≠ 0; (s)% ⊦ buffered(m).leb = m; (s)%fle-01: ⊦ m ≤ n ∧ n < n0 → m < n0; (forward) from specification nat% ⊦ nobuffer ≠ buffered(m); (s)% ⊦ mapped(buf).data = buf; (s)% ⊦ mapped(buf).mapped?; (s)