| avol[n, aleb][n0] = mapped(buf), n0 = n, n < # avol, n0 < # avol, (avol[n].mapped? → # avol[n].data ≤ LEB_SIZE ∧ is-aligned(# avol[n].data, EB_PAGE_SIZE)) → aleb.mapped? → # aleb.data ≤ LEB_SIZE ∧ is-aligned(# aleb.data, EB_PAGE_SIZE), ∀ n. n < # avol ∧ avol[n].mapped? → # avol[n].data ≤ LEB_SIZE ∧ is-aligned(# avol[n].data, EB_PAGE_SIZE) ⊦ # buf ≤ LEB_SIZE ∧ is-aligned(# buf, EB_PAGE_SIZE) |
avol[n] = mapped(buf0), n < # avol, ∀ n. n < # avol ∧ avol[n].mapped? → # avol[n].data ≤ LEB_SIZE ∧ is-aligned(# avol[n].data, EB_PAGE_SIZE) ⊦ # buf ≤ LEB_SIZE ∧ is-aligned(# buf, EB_PAGE_SIZE), # buf0 ≤ LEB_SIZE ∧ is-aligned(# buf0, EB_PAGE_SIZE)
Used simplifier rules: ⊦ aleb.mapped? ↔ (∃ buf. aleb = mapped(buf)); (as)% ⊦ mapped(buf).data = buf; (s)% ⊦ mapped(buf).mapped?; (s)% ⊦ m < # avol → avol[m, aleb][m] = aleb; (s)