| nx0 = nx, nx1 = nx, wlar0 = wlar, valid-indices(wlar, nx) ⊦ ⟪while nx0 ≠ [] do {/* (prepost-fix-ecs : invariant ∃ nx. nx0` = nx + nx0 ∧ wlar = (wlar`).mapIndices(nx, λ wle. wle.ec:= n) ∧ valid-indices(wlar, nx) ∧ ¬ dups(nx0`) wfbound # nx0) */; wlar[nx0.head].ec := n; nx0 := nx0.tail}⟫ (wlar = wlar0.mapIndices(nx1, λ wle. wle.ec:= n)), dups(nx) |
nx0 = nx, nx1 = nx, wlar0 = wlar, valid-indices(wlar, nx) ⊦ dups(nx), ∃ nx. nx0 = nx + nx0 ∧ wlar = wlar.mapIndices(nx, λ wle. wle.ec:= n) ∧ valid-indices(wlar, nx) ∧ ¬ dups(nx0)
nx1 = nx, nx3 = nx, wlar0 = wlar1, valid-indices(wlar1, nx), ∃ nx. (nx3 = nx + nx0 ∧ wlar = wlar1.mapIndices(nx, λ wle. wle.ec:= n) ∧ valid-indices(wlar, nx) ∧ ¬ dups(nx3)) ∧ nx0 = nx2 ⊦ ⟪wlar[nx0.head].ec := n; nx0 := nx0.tail⟫ ∃ nx. (nx3 = nx + nx0 ∧ wlar = wlar1.mapIndices(nx, λ wle. wle.ec:= n) ∧ valid-indices(wlar, nx) ∧ ¬ dups(nx3)) ∧ # nx0 < # nx2, nx0 = [], dups(nx)
Used simplifier rules: ⊦ nx + [] = nx; (s)%a: ⊦ (nx + nx0) + nx1 = nx + nx0 + nx1; from specification list[nat-list-set] Used formulas: ∃ nx. nx0` = nx + nx0 ∧ wlar = (wlar`).mapIndices(nx, λ wle. wle.ec:= n) ∧ valid-indices(wlar, nx) ∧ ¬ dups(nx0`), # nx0 = # nx0