| # buf = m2 * LEB_SIZE, subarray(buf, 0, n1 * LEB_SIZE) = lebs(avol, n0, n1), n1 < m2, ebm-vol-inv(avol), mapped-full?(avol, n0, m2), n0 + m2 ≤ # avol ⊦ ⟪ebm_avol_read#(n0 + n1, 0, n1 * LEB_SIZE, LEB_SIZE, avol; buf; err); n := n1 + 1⟫ ( n ≤ m2 ∧ # buf = m2 * LEB_SIZE ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → subarray(buf, 0, n * LEB_SIZE) = lebs(avol, n0, n)) ∧ m2 < (m2 - n1) + n) |
# buf = m2 * LEB_SIZE, m2 = n2 + n1, subarray(buf, 0, n1 * LEB_SIZE) = lebs(avol, n0, n1), n1 < m2, ebm-vol-inv(avol), mapped-full?(avol, n0, m2), n0 + m2 ≤ # avol, n1 ≤ m2 ⊦ ⟪ebm_avol_read#(n0 + n1, 0, n1 * LEB_SIZE, LEB_SIZE, avol; buf; err); n := n1 + 1⟫ ( n ≤ m2 ∧ # buf = m2 * LEB_SIZE ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → subarray(buf, 0, n * LEB_SIZE) = lebs(avol, n0, n)) ∧ m2 < n2 + n)
Used simplifier rules: ⊦ m * n = m * n0 ↔ m = 0 ∨ n = n0; (ws)% ⊦ LEB_SIZE ≠ 0; (s)%mult-a: ⊦ m0 * m * n = (m0 * m) * n; from specification nat-mult%mult-c: ⊦ m * n = n * m; from specification nat-mult% ⊦ m < n → m ≤ n; (s)%# buf = n ⊦ subarray(buf, 0, n) = buf; (s)%n ≤ m ⊦ n0 = m - n ↔ m = n0 + n; (elim) Used terms: m2, n1, n2