| ebm-vol-inv(avol1), avol1 ⊆ avol0 ⊦ ebm-vol-inv(avol0) |
# avol1 = # avol0, avol0[n] = mapped(buf), n < # avol0, ∀ n. n < # avol0 ∧ avol1[n].mapped? → # avol1[n].data ≤ LEB_SIZE ∧ is-aligned(# avol1[n].data, EB_PAGE_SIZE), ∀ m. m < # avol0 → (avol1[m].mapped? → avol0[m] = avol1[m]) ∧ (avol1[m] = unmapped ∧ avol0[m].mapped? → # avol0[m].data ≤ LEB_SIZE ∧ is-aligned(# avol0[m].data, EB_PAGE_SIZE)) ⊦ # buf ≤ LEB_SIZE ∧ is-aligned(# buf, EB_PAGE_SIZE)
Used simplifier rules: ebm-vol-le: ⊦ avol0 ⊆ avol1 ↔ # avol0 = # avol1 ∧ (∀ m. m < # avol0 → (avol0[m].mapped? → avol1[m] = avol0[m]) ∧ ( avol0[m] = unmapped ∧ avol1[m].mapped? → # avol1[m].data ≤ LEB_SIZE ∧ is-aligned(# avol1[m].data, EB_PAGE_SIZE)));%ebm-vol-inv: ⊦ ebm-vol-inv(avol) ↔ (∀ n. n < # avol ∧ avol[n].mapped? → # avol[n].data ≤ LEB_SIZE ∧ is-aligned(# avol[n].data, EB_PAGE_SIZE));% ⊦ mapped(buf).data = buf; (s)% ⊦ m < n → n ≠ 0; (s)%lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ aleb.mapped? ↔ (∃ buf. aleb = mapped(buf)); (as)