| # apebs = # wlar, vols[v][vtblpnum0] = ⌜m⌝ , wlar[m] = wl-entry(m0, used), lref = v × vtblpnum0, vtblpnum = m, m < # wlar, vtblpnum0 < # vols[v], vtblpnum < # wlar, bflipset-cons(bflipset, wlar), unique-sqns(apebs), valid-ebatbl(apebs, wlar, vols, vtblpnum1), valid-eraseq(q), valid-eraseq(wlar, q), valid-eraseq(apebs, q), valid-global-sqn(apebs, sqnum), valid-peb(v, vtblpnum0, apebs[m]), valid-vtbl(apebs, vols, wlar, vtblpnum1), valid-wl(apebs, wlar), v ∈ vols ⊦ m = vtblpnum1, VTBL_VOLID ∈ vols, vtblpnum1 ∈ q, m ∈ q, # apebs = # wlar[vtblpnum, wlar[vtblpnum].status:= erasing] ∧ valid-wl(apebs, wlar[vtblpnum, wlar[vtblpnum].status:= erasing]) ∧ valid-eraseq(q + eq-entry(vtblpnum, lref)) ∧ valid-eraseq(wlar[vtblpnum, wlar[vtblpnum].status:= erasing], q + eq-entry(vtblpnum, lref)) ∧ valid-eraseq(apebs, q + eq-entry(vtblpnum, lref)) ∧ bflipset-cons(bflipset -- m, wlar[vtblpnum, wlar[vtblpnum].status:= erasing]) ∧ valid-ebatbl(apebs, wlar[vtblpnum, wlar[vtblpnum].status:= erasing], vols[v, vols[v][vtblpnum0, unmapped]], vtblpnum1) ∧ valid-vtbl(apebs, vols, wlar[vtblpnum, wlar[vtblpnum].status:= erasing], vtblpnum1) |
# apebs = # wlar, wlar[m] = wl-entry(m0, used), vols[v][vtblpnum0] = ⌜m⌝ , vtblpnum0 < # vols[v], m < # wlar, bflipset-cons(bflipset, wlar), unique-sqns(apebs), valid-ebatbl(apebs, wlar, vols, vtblpnum1), valid-eraseq(q + eq-entry(m, v × vtblpnum0) '), valid-eraseq(apebs, q), valid-eraseq(wlar, q), valid-eraseq(q), valid-global-sqn(apebs, sqnum), valid-peb(v, vtblpnum0, apebs[m]), valid-peb(apebs[m]), valid-vtbl(apebs, vols, wlar, vtblpnum1), valid-wl(apebs, wlar), v ∈ vols ⊦ m = vtblpnum1, v × vtblpnum0 = apebs[m].vidhdr.vol × apebs[m].vidhdr.leb, m ∈ q, vtblpnum1 ∈ q, VTBL_VOLID ∈ vols
Used simplifier rules: ⊦ valid-eraseq(apebs, q) → ( valid-eraseq(apebs, q + eq-entry(n, lref) ') ↔ n < # apebs ∧ ( valid-peb(apebs[n]) → lref = apebs[n].vidhdr.vol × apebs[n].vidhdr.leb)); (ss)% ⊦ eq-entry(m, lref).pnum = m; (s)% ⊦ valid-eraseq(q + eqent ') ↔ ¬ eqent.pnum ∈ q ∧ valid-eraseq(q); (ss)%⊦ m ≠ n0 → ( valid-vtbl(apebs, vols, wlar[m, wle], n0) ↔ valid-vtbl(apebs, vols, wlar, n0)); (s)%⊦ v ∈ vols ∧ m < # vols[v] ∧ vols[v][m] = ⌜n⌝ ∧ valid-ebatbl(apebs, wlar, vols, n0) → valid-ebatbl (apebs, wlar[n, wl-entry(m0, erasing)], vols[v, vols[v][m, unmapped]], n0); (ss)% ⊦ n ∈ ns -- n0 ↔ n ≠ n0 ∧ n ∈ ns; (s)% ⊦ bflipset-cons(bflipset, wlar) → bflipset-cons(bflipset -- n, wlar); (ss)%wle.status ≠ used ⊦ bflipset-cons(bflipset, wlar[m, wle]) ↔ bflipset-cons(bflipset, wlar) ∧ ¬ m ∈ bflipset; (s)% ⊦ wl-entry(m, stat).status = stat; (s)% ⊦ wl-entry(m, stat).ec = m; (s)%a: ⊦ (q + q0) + q1 = q + q0 + q1; from specification list[erasequeue-base]%stat ≠ erasing ⊦ n < # wlar ∧ wlar[n] = wl-entry(m0, stat) ∧ valid-eraseq(wlar, q) → valid-eraseq (wlar[n, wl-entry(m1, erasing)], q + eq-entry(n, lref) '); (ss)% ⊦ used ≠ erasing; (s)% ⊦ q + eqent = q + eqent '; (s)%stat ≠ erroneous ⊦ wlar[m] = wl-entry(m0, stat) ∧ valid-wl(apebs, wlar) → valid-wl(apebs, wlar[m, wl-entry(m1, erasing)]); (ss)% ⊦ used ≠ erroneous; (s)% ⊦ # wlar[n, wle] = # wlar; (s)% ⊦ wle.status:= stat = wl-entry(wle.ec, stat); (s)