| # lpt = # avol, adr = adr0, m = m2, m1 = m3, ns = ns0, nx = nx0, awbuf-inv(avol, bleb), synced(avol0), avol0 ↓ avol, bleb = buffered(m3) ∨ (bleb = nobuffer ∨ is-aligned(# avol[bleb.leb].data, EB_PAGE_SIZE)) ∧ m3 < # avol ∧ avol[m3].mapped? ∧ m0 = # avol[m3].data ⊦ bleb = buffered(m1), (bleb ≠ nobuffer → avol[bleb.leb].mapped? ∧ bleb.leb < # avol ∧ bleb.isbuf?) ∧ ( bleb = nobuffer ∨ is-aligned(# avol[bleb.leb].data, EB_PAGE_SIZE) → m1 < # avol → m1 < # avol ∧ (avol[m1].mapped? → avol[m1].mapped? ∧ m1 < # avol)) |
Used simplifier rules: fwd-buffered-mapped: ⊦ awbuf-inv(avol, buffered(n)) → n < # avol ∧ avol[n].mapped?;% ⊦ unmapped ≠ mapped(buf); (s)% ⊦ aleb.mapped? ↔ aleb ≠ unmapped; (ss)% ⊦ m ≤ n → (n < m ↔ false); (s)%inv-buf-in-vol: ⊦ awbuf-inv(avol, buffered(n)) → n < # avol; (forward) from specification awbuf-inv%fle: ⊦ m < n ∧ n ≤ n0 → m < n0; (forward) from specification nat% ⊦ m < n ↔ ¬ n ≤ m; (ss)% ⊦ buffered(m).leb = m; (s)% ⊦ nobuffer ≠ buffered(m); (s)% ⊦ buffered(m) = buffered(m0) ↔ m = m0; (s)% ⊦ bleb.isbuf? ↔ (∃ n. bleb = buffered(n)); (as)% ⊦ bleb.isbuf? ↔ bleb ≠ nobuffer; (ss)% ⊦ 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)