| # wlar = # apebs0, # wlar1 = # apebs0, apebs0[m1] = mkpeb(aehdr, avhdr, buf1, m0, false), recs0[VTBL_VOLID × VTBL_LNUM] = recovery-entry(m1, avhdr.sqn), q2 = q, nx < # apebs0, m1 < # apebs0, bflipset-cons(bflipset0, wlar), bflipset-cons(bflipset, wlar), bflipset-cons(bflipset1, wlar1), indices-erasing(wlar, nx), ubi-io-inv(apebs0), ubi-io-peb-inv(mkpeb(aehdr, avhdr, buf1, m0, false)), unique-sqns(apebs0), unmapped-vols(vols0), valid-ebatbl(apebs0, wlar1, vols1, m1), valid-eraseq(wlar, q), valid-eraseq(apebs0, q1), valid-eraseq(wlar1, q1), valid-eraseq(q1), valid-eraseq-stronger(apebs0, q), valid-global-sqn(apebs0, sqnum), valid-global-sqn(apebs0, vtblpnum5), valid-recs(apebs0, wlar, recs0), valid-recs-sqns(apebs0, recs0), valid-vtbl(apebs0, vols0, wlar, m1), valid-vtbl(apebs0, vols1, wlar1, m1), valid-vtbl-weak(apebs0, m1), valid-wl(apebs0, wlar), valid-wl(apebs0, wlar1), VTBL_VOLID × VTBL_LNUM ∈ recs0 ⊦ ∀ recs0, vols0, wlar, q, bflipset0. valid-ebatbl(apebs0, wlar, vols0, m1) ∧ valid-vtbl(apebs0, vols0, wlar, m1) ∧ ¬ VTBL_VOLID ∈ vols0 ∧ # apebs0 = # wlar ∧ bflipset-cons(bflipset0, wlar) ∧ valid-wl(apebs0, wlar) ∧ valid-eraseq(wlar, q) ∧ q2 ⊆ q ∧ (∃ vtbl. is-encoded(vtbl, apebs0[m1].data) ∧ valid-eraseq-strong(apebs0, vtbl, q)) → ⟪let n = 0 in ubi_fix_ecs#(n; nx, wlar)⟫ ( # wlar1 = # wlar ∧ valid-wl(apebs0, wlar) ∧ valid-eraseq(q) ∧ valid-eraseq(wlar, q) ∧ valid-eraseq(apebs0, q) ∧ bflipset-cons(bflipset0, wlar) ∧ valid-ebatbl(apebs0, wlar, vols0, m1) ∧ valid-vtbl(apebs0, vols0, wlar, m1) ∧ is-max(apebs0, vols0, wlar, q, bflipset0, m1, sqnum) ∧ q.lebrefs ⊆ q1.lebrefs ∧ vols1 ⊆ vols0 ∧ vols0⌈vols1, q1⌉), dups(nx), m1 ∈ q1, VTBL_VOLID ∈ vols0, m1 ∈ q, VTBL_VOLID ∈ vols1 |
# wlar = # wlar0, # wlar1 = # wlar0, # apebs0 = # wlar0, apebs0[m1] = mkpeb(aehdr, avhdr, buf1, m0, false), recs0[VTBL_VOLID × VTBL_LNUM] = recovery-entry(m1, avhdr.sqn), nx < # wlar0, m1 < # wlar0, bflipset-cons(bflipset2, wlar0), bflipset-cons(bflipset0, wlar), bflipset-cons(bflipset, wlar), bflipset-cons(bflipset1, wlar1), indices-erasing(wlar, nx), is-encoded(vtbl, buf1), ubi-io-inv(apebs0), ubi-io-peb-inv(mkpeb(aehdr, avhdr, buf1, m0, false)), unique-sqns(apebs0), unmapped-vols(vols0), valid-ebatbl(apebs0, wlar0, vols, m1), valid-ebatbl(apebs0, wlar1, vols1, m1), valid-eraseq(wlar0, q0), valid-eraseq(wlar, q), valid-eraseq(apebs0, q1), valid-eraseq(wlar1, q1), valid-eraseq(q1), valid-eraseq-strong(apebs0, vtbl, q0), valid-eraseq-stronger(apebs0, q), valid-global-sqn(apebs0, sqnum), valid-global-sqn(apebs0, vtblpnum5), valid-recs(apebs0, wlar, recs0), valid-recs-sqns(apebs0, recs0), valid-vtbl(apebs0, vols, wlar0, m1), valid-vtbl(apebs0, vols0, wlar, m1), valid-vtbl(apebs0, vols1, wlar1, m1), valid-vtbl-weak(apebs0, m1), valid-wl(apebs0, wlar0), valid-wl(apebs0, wlar), valid-wl(apebs0, wlar1), VTBL_VOLID × VTBL_LNUM ∈ recs0, q ⊆ q0, ¬ dups(nx), ¬ m1 ∈ q0, ¬ VTBL_VOLID ∈ vols, ¬ m1 ∈ q1, ¬ VTBL_VOLID ∈ vols0, ¬ m1 ∈ q, ¬ VTBL_VOLID ∈ vols1 ⊦ ⟪let n = 0 in ubi_fix_ecs#(n; nx, wlar0)⟫ ( # apebs0 = # wlar0 ∧ valid-wl(apebs0, wlar0) ∧ valid-eraseq(wlar0, q0) ∧ bflipset-cons(bflipset2, wlar0) ∧ valid-ebatbl(apebs0, wlar0, vols, m1) ∧ valid-vtbl(apebs0, vols, wlar0, m1) ∧ is-max(apebs0, vols, wlar0, q0, bflipset2, m1, sqnum) ∧ q0.lebrefs ⊆ q1.lebrefs ∧ vols1 ⊆ vols ∧ vols⌈vols1, q1⌉)
Used simplifier rules: lf-vtbl-info: ⊦ valid-vtbl(apebs, vols, wlar, n) ∧ valid-eraseq(wlar, q) → ¬ n ∈ q;% ⊦ mkpeb(aehdr, avhdr, buf, m, boolvar).data = buf; (s)% ⊦ m < n → n ≠ 0; (s)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ valid-eraseq-strong(apebs, vtbl, q) → valid-eraseq(apebs, q); (ss)% ⊦ valid-eraseq-strong(apebs, vtbl, q) → valid-eraseq(q); (ss)