| # apebs = # wlar, # wlar0 = # apebs, apebs[n] = mkpeb(aehdr, avhdr, buf, m, boolvar), n0 = recs[ladr].pnum, q0 = q1, recs = recs1, recs2 = recs0 -- (VTBL_VOLID × VTBL_LNUM), vtblpnum = n, n0 < # wlar, bflipset-cons(bflipset, wlar), bflipset-cons(bflipset0, wlar0), unique-sqns(apebs), unmapped-vols(vols0), valid-eraseq(wlar, q), valid-eraseq(wlar0, q1), valid-eraseq-stronger(apebs, q1), valid-recs(apebs, wlar0, recs0), valid-vtbl(apebs, vols, wlar, vtblpnum), valid-vtbl(apebs, vols0, wlar0, n), valid-wl(apebs, wlar), valid-wl(apebs, wlar0), ladr ∈ recs, q1 ⊆ q, recs ⊥ vols, ladr.vol ∈ vols → ladr.vol ∈ vols, ∀ v, m, n. v × m ∈ recs ∧ recs[v × m].pnum = n ∨ v ∈ vols ∧ m < # vols[v] ∧ vols[v][m] = ⌜n⌝ ↔ wlar[n].status = used ∧ n < # apebs ∧ apebs[n].vidhdr.valid? ∧ apebs[n].vidhdr.vol = v ∧ apebs[n].vidhdr.leb = m ∧ n ≠ vtblpnum, ∃ vtbl. is-encoded(vtbl, apebs[vtblpnum].data) ∧ valid-eraseq-strong(apebs, vtbl, q) ⊦ recs = ∅, VTBL_VOLID ∈ vols, VTBL_VOLID × VTBL_LNUM ∈ recs, VTBL_VOLID ∈ vols0, n ∈ q1, ladr.vol ∈ vols ∧ ladr.leb < # vols[ladr.vol], ( unique-sqns(apebs) ∧ valid-vtbl(apebs, vols, wlar[n0, wlar[n0].status:= erasing], vtblpnum) ∧ ¬ VTBL_VOLID ∈ vols ∧ ¬ VTBL_VOLID × VTBL_LNUM ∈ recs -- ladr ∧ # apebs = # wlar[n0, wlar[n0].status:= erasing] ∧ valid-wl(apebs, wlar[n0, wlar[n0].status:= erasing]) ∧ valid-eraseq(wlar[n0, wlar[n0].status:= erasing], q + eq-entry(n0, ladr.vol × ladr.leb)) ∧ (∃ vtbl. is-encoded(vtbl, apebs[vtblpnum].data) ∧ valid-eraseq-strong(apebs, vtbl, q + eq-entry(n0, ladr.vol × ladr.leb))) ∧ bflipset-cons(bflipset -- n0, wlar[n0, wlar[n0].status:= erasing]) ∧ recs -- ladr ⊥ vols ∧ q1 ⊆ q + eq-entry(n0, ladr.vol × ladr.leb) ∧ (∀ v, m, n. v × m ∈ recs -- ladr ∧ (recs -- ladr)[v × m].pnum = n ∨ v ∈ vols ∧ m < # vols[v] ∧ vols[v][m] = ⌜n⌝ ↔ wlar[n0, wlar[n0].status:= erasing][n].status = used ∧ n < # apebs ∧ apebs[n].vidhdr.valid? ∧ apebs[n].vidhdr.vol = v ∧ apebs[n].vidhdr.leb = m ∧ n ≠ vtblpnum)) ∧ #(recs -- ladr) < # recs1 |
# apebs = # wlar, # wlar0 = # wlar, apebs[n] = mkpeb(aehdr, avhdr, buf, m, boolvar), recs1[ladr].pnum < # wlar, bflipset-cons(bflipset, wlar), bflipset-cons(bflipset0, wlar0), is-encoded(vtbl, buf), unique-sqns(apebs), unmapped-vols(vols0), valid-eraseq(wlar, q), valid-eraseq(wlar0, q1), valid-eraseq-strong(apebs, vtbl, q), valid-eraseq-stronger(apebs, q1), valid-recs(apebs, wlar0, recs0), valid-vtbl(apebs, vols, wlar, n), valid-vtbl(apebs, vols0, wlar0, n), valid-wl(apebs, wlar), valid-wl(apebs, wlar0), ladr ∈ recs1, q1 ⊆ q, q1 ⊆ q + eq-entry(recs1[ladr].pnum, ladr.vol × ladr.leb) ', recs1 ⊥ vols, ∀ v, m, n0. v × m ∈ recs1 ∧ recs1[v × m].pnum = n0 ∨ v ∈ vols ∧ m < # vols[v] ∧ vols[v][m] = ⌜n0⌝ ↔ wlar[n0].status = used ∧ n0 < # wlar ∧ apebs[n0].vidhdr.valid? ∧ apebs[n0].vidhdr.vol = v ∧ apebs[n0].vidhdr.leb = m ∧ n0 ≠ n ⊦ recs1 = ∅, n ∈ q1, VTBL_VOLID ∈ vols, VTBL_VOLID × VTBL_LNUM ∈ recs1, VTBL_VOLID ∈ vols0, ladr.vol ∈ vols ∧ ladr.leb < # vols[ladr.vol], ( v × m0 ≠ ladr ∧ v × m0 ∈ recs1 ∧ recs1[v × m0].pnum = n0 ∨ v ∈ vols ∧ m0 < # vols[v] ∧ vols[v][m0] = ⌜n0⌝ ↔ wlar[recs1[ladr].pnum, wl-entry(wlar[recs1[ladr].pnum].ec, erasing)][n0].status = used ∧ n0 < # wlar ∧ apebs[n0].vidhdr.valid? ∧ apebs[n0].vidhdr.vol = v ∧ apebs[n0].vidhdr.leb = m0 ∧ n0 ≠ n) ∧ recs1 -- ladr ⊥ vols ∧ valid-eraseq-strong(apebs, vtbl, q + eq-entry(recs1[ladr].pnum, ladr.vol × ladr.leb) ') ∧ valid-eraseq(wlar[recs1[ladr].pnum, wl-entry(wlar[recs1[ladr].pnum].ec, erasing)], q + eq-entry(recs1[ladr].pnum, ladr.vol × ladr.leb) ') ∧ valid-wl(apebs, wlar[recs1[ladr].pnum, wl-entry(wlar[recs1[ladr].pnum].ec, erasing)]) ∧ valid-vtbl(apebs, vols, wlar[recs1[ladr].pnum, wl-entry(wlar[recs1[ladr].pnum].ec, erasing)], n)
Used simplifier rules: lf-vtbl-info: ⊦ valid-vtbl(apebs, vols, wlar, n) ∧ valid-eraseq(wlar, q) → ¬ n ∈ q;% ⊦ ¬ q ⊆ q0 + q1 → ¬ q ⊆ q0; (s)%a: ⊦ (q + q0) + q1 = q + q0 + q1; from specification list[erasequeue-base]% ⊦ mkpeb(aehdr, avhdr, buf, m, boolvar).data = buf; (s)% ⊦ 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%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ ¬ n < n; (s)% ⊦ m < n + 1 ↔ ¬ n < m; (s)%n0 ≤ n ⊦ n - n0 < m ↔ n < m + n0; (s)% ⊦ # recs = 0 ↔ recs = ∅; (s)% ⊦ m < 1 ↔ m = 0; (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)% ⊦ n -1 = n - 1; (s)% ⊦ ladr ∈ recs → #(recs -- ladr) = (# recs)-1; (s)% ⊦ ladr ≠ ladr0 → (recs -- ladr0)[ladr] = recs[ladr]; (s)% ⊦ 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)% ⊦ used ≠ erasing; (s)% ⊦ wl-entry(m, stat).status = stat; (s)% ⊦ is-encoded(vtbl0, buf) → (is-encoded(vtbl1, buf) ↔ vtbl0 = vtbl1); (s)% ⊦ q + eqent = q + eqent '; (s)% ⊦ # wlar[n, wle] = # wlar; (s)% ⊦ ladr ∈ recs -- ladr0 ↔ ladr ≠ ladr0 ∧ ladr ∈ recs; (s)% ⊦ wle.status:= stat = wl-entry(wle.ec, stat); (s)