| freelist = [], n = 0 ⊦ ⟪while n < # lpt do {/* (prepost-create-freelist: invariant n ≤ # lpt ∧ freelist-cons(subarray(lpt, 0, n), freelist) wfbound # lpt - n) */; if lpt[n].flags = LP_FREE then freelist := freelist + n; n := n + 1}⟫ freelist-cons(lpt, freelist) |
freelist = [], n = 0 ⊦ n ≤ # lpt ∧ freelist-cons(subarray(lpt, 0, n), freelist)
freelist0 = [], n = n0, n1 = 0, n < # lpt, freelist-cons(subarray(lpt, 0, n), freelist), n ≤ # lpt ⊦ ⟪if lpt[n].flags = LP_FREE then freelist := freelist + n; n := n + 1⟫ ((n ≤ # lpt ∧ freelist-cons(subarray(lpt, 0, n), freelist)) ∧ # lpt - n < # lpt - n0)
Used simplifier rules: ⊦ m ≠ n → (m ≤ n ↔ m < n); (s)% ⊦ n ≠ n0 → (n < n0 ↔ ¬ n0 < n); (ss)% ⊦ m < n → ¬ n < m; (s)%# lpt = n ⊦ subarray(lpt, 0, n) = lpt; (s)% ⊦ m < n ↔ ¬ n ≤ m; (ss)% ⊦ m ≤ n → (n ≤ m ↔ m = n); (s) Used formulas: n ≤ # lpt ∧ freelist-cons(subarray(lpt, 0, n), freelist), # lpt - n = # lpt - n