| avols[default-volid][m2] = mapped(buf0, n1), buf1 = buf2, err = ESUCCESS, abs(avols[default-volid])[m2].mapped?, m2 < # abs(avols[default-volid]), m2 < # avols[default-volid], ebm-cons(avols), ebm-vol-inv(abs(avols[default-volid])), default-volid ∈ avols, m1 + n2 ≤ #(abs(avols[default-volid])[m2].data + mkempbuf(LEB_SIZE - # abs(avols[default-volid])[m2].data)), m1 + n2 ≤ LEB_SIZE, n3 + n2 ≤ # buf2, LEB_SIZE ≥ # abs(avols[default-volid])[m2].data ⊦ copy(avols[default-volid][m2].data, m1, buf1, n3, n2) = copy(abs(avols[default-volid])[m2].data + mkempbuf(LEB_SIZE - # abs(avols[default-volid])[m2].data), m1, buf2, n3, n2) ∧ ESUCCESS = err |
avols[default-volid][m2] = mapped(buf0, n1), m2 < # avols[default-volid], ebm-cons(avols), ebm-vol-inv(abs(avols[default-volid])), default-volid ∈ avols, n1 ≤ LEB_SIZE, n3 + n2 ≤ # buf2, m1 + n2 ≤ LEB_SIZE, m1 + n2 ≤ n1 + (LEB_SIZE - n1) ⊦ copy(buf0, m1, buf2, n3, n2) = copy(subarray(buf0, 0, n1) + mkempbuf(LEB_SIZE - n1), m1, buf2, n3, n2)
Used simplifier rules: ⊦ # subarray(buf, m, n) = n; (s)% ⊦ mapped(buf).data = buf; (s)% ⊦ abs(mapped(buf, n)) = mapped(subarray(buf, 0, n)); (s)% ⊦ mapped(buf, m).data = buf; (s)% ⊦ mapped(buf, m) = mapped(buf0, m0) ↔ buf = buf0 ∧ m = m0; (ws)% ⊦ abs(leb).mapped? ↔ (∃ buf, n. leb = mapped(buf, n)); (s)% ⊦ # abs(evol) = # evol; (s)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]% ⊦ # mkempbuf(n) = n; (s)% ⊦ #(buf + buf0) = # buf + # buf0; (s)% ⊦ n ≥ m ↔ m ≤ n; (s)% ⊦ n < # evol → abs(evol)[n] = abs(evol[n]); (s)