| n2 = # x0, r0 = rys, xs = x0, (((lls(rxs, null, x0) * ls(rys, ys)) * del-list(to_delete, n0)))(H), ((ls(rxs, x0) * ls(rys, ys) * del-list(to_delete, n0)))(H), n < h0, # x0 < h0, n0 ≤ # x0 + # ys, n0 + # x0 ≤ h0, ∃ x1, y1. ( x = xs + x1 ∧ ys = x1 + y1 ∧ ((ls(rxs, xs) * lls(rys, r, x1) * ls(r, y1) * del-list(to_delete, n0)))(H) ∧ n0 ≤ # xs + # ys ∧ n0 + # xs ≤ h0 ∧ n ≤ h0 ∧ n = # x) ∧ n = n1, ys = [] ∨ # ys = h0 ⊦ r = null, ∃ x1, y1. ( x + H[r].val ' = xs + x1 ∧ ys = x1 + y1 ∧ ((ls(rxs, xs) * lls(rys, H[r].nxt, x1) * ls(H[r].nxt, y1) * del-list(to_delete, n0)))(H) ∧ n0 ≤ # xs + # ys ∧ n0 + # xs ≤ h0 ∧ n + 1 ≤ h0 ∧ n + 1 = #(x + H[r].val ')) ∧ h0 - n + 1 < h0 - n1 |
((ls(rxs, x0) * ls(rys, x1 + y) * del-list(to_delete, n0)))(H), (((lls(rxs, null, x0) * ls(rys, x1 + y)) * del-list(to_delete, n0)))(H), ((ls(rxs, x0) * lls(rys, r, x1) * ls(r, y) * del-list(to_delete, n0)))(H), # x0 < h0, # x0 + # x1 < h0, n0 + # x0 ≤ h0, n0 ≤ # x0 + # x1 + # y, x1 + y = [] ∨ # x1 + # y = h0 ⊦ r = null, ∃ y0. y = H[r].val ' + y0 ∧ (∃ r0. (((lls(rys, r0, x1) * r0 => H[r].val × H[r].nxt) * ls(rxs, x0) * ls(H[r].nxt, y0) * del-list(to_delete, n0)))(H)) ∧ n0 ≤ # x0 + # x1 + # y0 + 1
Used simplifier rules: ⊦ ¬ n < n; (s)% ⊦ m < n + 1 ↔ ¬ n < m; (s)% ⊦ n < m → (m - n) + n = m; (s)%n0 ≤ n ⊦ n - n0 < m ↔ n < m + n0; (s)% ⊦ m < n → (n ≤ m ↔ false); (s)% ⊦ m < n ↔ ¬ n ≤ m; (ss)% ⊦ m + n = m + n0 ↔ n = n0; (s)% ⊦ # a ' = 0 +1; (s)%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ m + 1 ≤ n ↔ m < n; (s)% ⊦ m +1 = m + 1; (s)% ⊦ #(a ' + x) = (# x)+1; (s)%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep% ⊦ ((_∃ rP * P))(H) ↔ (∃ r. ((rP(r) * P))(H)); (s)%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep% ⊦ lls(r0, r2, x + a ') = _∃(λ r1. lls(r0, r1, x) * r1 => a × r2); (s)% ⊦ x + y = x + z ↔ y = z; (s)% ⊦ m < n → m ≤ n; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%a: ⊦ (x + y) + z = x + y + z; from specification list% ⊦ #(x + y) = # x + # y; (s)