| valid-eraseq-strong(apebs, to-vtbl(vols), eqent + q0), eq-entry(n, v × m) ∈ eqent + q0, ∀ apebs, vols, n, v, m. valid-eraseq-strong(apebs, to-vtbl(vols), q0) ∧ eq-entry(n, v × m) ∈ q0 → valid-peb(v, m, apebs[n]) ∧ (v ∈ vols ∧ m < # vols[v] → apebs[n].vidhdr.sqn ≠ valid-sqns(v, m, apebs).max) ⊦ valid-peb(v, m, apebs[n]) ∧ (v ∈ vols ∧ m < # vols[v] → apebs[n].vidhdr.sqn ≠ valid-sqns(v, m, apebs).max) |
eqent.pnum < # apebs, valid-eraseq-strong(apebs, to-vtbl(vols), q0), ∀ v0, m0. (valid-peb(v0, m0, apebs[eqent.pnum]) ↔ eqent.lebref = v0 × m0) ∧ (eqent.lebref = v0 × m0 ∧ v0 ∈ vols ∧ m0 < # vols[v0] → apebs[eqent.pnum].vidhdr.sqn ≠ valid-sqns(v0, m0, apebs).max), ∀ apebs, vols, n, v, m. valid-eraseq-strong(apebs, to-vtbl(vols), q0) ∧ eq-entry(n, v × m) ∈ q0 → valid-peb(v, m, apebs[n]) ∧ (v ∈ vols ∧ m < # vols[v] → apebs[n].vidhdr.sqn ≠ valid-sqns(v, m, apebs).max), eq-entry(n, v × m) = eqent ∨ eq-entry(n, v × m) ∈ q0 ⊦ eqent.pnum ∈ q0, valid-peb(v, m, apebs[n]) ∧ (v ∈ vols ∧ m < # vols[v] → apebs[n].vidhdr.sqn ≠ valid-sqns(v, m, apebs).max)
Used simplifier rules: valid-eraseq-strong-rec: ⊦ valid-eraseq-strong(apebs, vtbl, eqent ' + q) ↔ eqent.pnum < # apebs ∧ ¬ eqent.pnum ∈ q ∧ (∀ v, m. (valid-peb(v, m, apebs[eqent.pnum]) ↔ eqent.lebref = v × m) ∧ ( eqent.lebref = v × m ∧ v ∈ vtbl ∧ m < vtbl[v] → apebs[eqent.pnum].vidhdr.sqn ≠ valid-sqns(v, m, apebs).max)) ∧ valid-eraseq-strong(apebs, vtbl, q);% ⊦ m < n → n ≠ 0; (s)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ v ∈ vols → to-vtbl(vols)[v] = # vols[v]; (s)% ⊦ v ∈ to-vtbl(vols) ↔ v ∈ vols; (s)%a: ⊦ (q + q0) + q1 = q + q0 + q1; from specification list[erasequeue-base]% ⊦ eqent ∈ eqent0 ' + q ↔ eqent = eqent0 ∨ eqent ∈ q; (s)% ⊦ eqent + q = eqent ' + q; (s)