| ebm-cons(avols0), ebm-cons(avols1), ebm-vol-inv(abs(avols1[default-volid])), default-volid ∈ avols1, ∀ v. (v ∈ avols1 ↔ v ∈ avols0) ∧ ( v ∈ avols1 → # avols1[v] = # avols0[v] ∧ (∀ m. m < # avols1[v] ∧ avols1[v][m] ≠ unmapped → (avols1[v][m] = erased → avols0[v][m] = erased) ∧ (avols1[v][m].mapped? → avols0[v][m] = avols1[v][m]))) ⊦ # avols1[default-volid] = # avols0[default-volid] ∧ ( m < # avols1[default-volid] → (avols1[default-volid][m] = mapped(buf, n) → abs(avols0[default-volid])[m] = abs(avols1[default-volid][m])) ∧ ( abs(avols1[default-volid][m]) = unmapped ∧ abs(avols0[default-volid])[m].mapped? → # abs(avols0[default-volid])[m].data ≤ LEB_SIZE ∧ is-aligned(# abs(avols0[default-volid])[m].data, EB_PAGE_SIZE))) |
ebm-cons(avols1), ebm-cons(avols0), ebm-vol-inv(abs(avols1[default-volid])), default-volid ∈ avols1, ∀ v. (v ∈ avols1 ↔ v ∈ avols0) ∧ ( v ∈ avols1 → # avols1[v] = # avols0[v] ∧ (∀ m0. m0 < # avols1[v] ∧ avols1[v][m0] ≠ unmapped → (avols1[v][m0] = erased → avols0[v][m0] = erased) ∧ ((∃ buf, m. avols1[v][m0] = mapped(buf, m)) → avols0[v][m0] = avols1[v][m0]))) ⊦ # avols1[default-volid] = # avols0[default-volid] ∧ ( m < # avols1[default-volid] → (avols1[default-volid][m] = mapped(buf, n) → abs(avols0[default-volid])[m] = abs(avols1[default-volid][m])) ∧ ( abs(avols1[default-volid][m]) = unmapped ∧ abs(avols0[default-volid])[m].mapped? → # abs(avols0[default-volid])[m].data ≤ LEB_SIZE ∧ is-aligned(# abs(avols0[default-volid])[m].data, EB_PAGE_SIZE)))
Used simplifier rules: elim-mapped: ⊦ leb.mapped? ↔ (∃ buf, m. leb = mapped(buf, m));