| xs_len + 1 = h, H0 = (H1 ++ r)[r, (H1 ++ r)[r].val:= a][r, (H1 ++ r)[r, (H1 ++ r)[r].val:= a][r].nxt:= rxs], h = h0, xs_len = # xs, xs_len0 = # xs, ((ls(rxs, xs) * ls(rys, ys) * del-list(to_delete, n)))(H), ((del-list(to_delete, n) * ls(rys, ys) * ls(rxs, xs)))(H), # xs < h0, n ≤ # xs + # ys, n + # xs ≤ h0, n < 2 → to_delete0 = [] ∧ ((ls(rys, ys) * ls(rxs, xs)))(H1), 2 ≤ n → ((del-list(to_delete0, n - 2) * ls(rys, ys) * ls(rxs, xs)))(H1), ys = [] ∨ # ys = h0 ⊦ ⟨caterpillar_add#(a, h0; xs, xs_len0, ys)⟩ ∃ n. ((ls(null, xs) * ls(r, ys) * del-list(rys + to_delete0, n)))(H0) ∧ n ≤ # xs + # ys ∧ n + # xs ≤ h0 ∧ 0 = xs_len0, r = null, rys = null, r ∈ H1 |
# ys = # xs + 1, # ys = h0, xs_len = # xs, r ≠ null, rys ≠ null, ys ≠ [], ((ls(rys, ys) * ls(rxs, xs)))(H1), ((del-list(to_delete, n) * ls(rys, ys) * ls(rxs, xs)))(H), ((ls(rxs, xs) * ls(rys, ys) * del-list(to_delete, n)))(H), n < 2, n ≤ # xs + # ys, n ≤ 1, ¬ r ∈ H1 ⊦ ⟨caterpillar_add#(a, # xs + 1; xs, xs_len, ys)⟩ (xs = [] ∧ (∃ n0. (∃ x. n0 = # x ∧ ((ls(rys, x) * ls(r, ys)))((H1 ++ r)[r, a × rxs])) ∧ n0 ≤ # ys ∧ n0 ≤ h0 ∧ 0 = xs_len))
Used simplifier rules: ⊦ ((_∃ xP * P))(H) ↔ (∃ x. ((xP(x) * P))(H)); (s)%r ≠ null ⊦ del-list(r ', n) = _∃(λ x. ls(r, x) ∧ ⌜n = # x ∧ r ≠ null⌝ ); (s)%a: ⊦ (rx + rx0) + rx1 = rx + rx0 + rx1; from specification list[reflist]% ⊦ rx + [] = rx; (s)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ ¬ false(H); (s)% ⊦ false * P = false; (s)% ⊦ (false ∧ P) = false; (s)% ⊦ ⌜false⌝ = false; (s)% ⊦ ls(r, []) = (emp ∧ ⌜r = null⌝ ); (s)% ⊦ m < n → (n ≤ m ↔ false); (s)%let: ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat%not-zero: 0 < n ⊦ (* n) ≤ m → m ≠ 0; (forward) from specification nat% ⊦ m < n ↔ ¬ n ≤ m; (ss)% ⊦ n + 0 = n; (s)% ⊦ # [] = 0; (s)% ⊦ ⌜bv⌝ (H) ↔ bv; (s)% ⊦ ((P0 ∧ P1))(H) ↔ P0(H) ∧ P1(H); (s)%and-com: ⊦ (P0 ∧ P1) = (P1 ∧ P0); from specification heap-sep%and-ass: ⊦ ((P0 ∧ P1) ∧ P2) = (P0 ∧ P1 ∧ P2); from specification heap-sep%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep% ⊦ emp * P = P; (s)% ⊦ (⌜bv⌝ ∧ P0) * P1 = (⌜bv⌝ ∧ P0 * P1); (s)% ⊦ r + rx = r ' + rx; (s)% ⊦ ls(null, x) = (emp ∧ ⌜x = []⌝ ); (s)% ⊦ H[r, ce][r, ce0] = H[r, ce0]; (s)% ⊦ (ce.val:= a).nxt:= r = a × r; (s)%r0 ≠ null, ¬ r0 ∈ H ⊦ r ∈ H ++ r0 ↔ r = r0 ∨ r ∈ H; (s)% ⊦ H[r0, ce][r] = (r = r0 ∧ r0 ∈ H ⊃ ce;H[r]); (s)% ⊦ ¬ n < n; (s)% ⊦ m < n + 1 ↔ ¬ n < m; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + n ≤ m + n0 ↔ n ≤ n0; (s)