| 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, rys = null, 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(to_delete0, n)))(H0) ∧ n ≤ # xs + # ys ∧ n + # xs ≤ h0 ∧ 0 = xs_len0, r = null, r ∈ H1 |
xs_len = # xs, ys = [], r ≠ null, ((ls(rxs, xs) * del-list(to_delete, n)))(H), ((del-list(to_delete, n) * ls(rxs, xs)))(H), n < 2, ls(rxs, xs)(H1), n ≤ 1, n ≤ # xs, ¬ r ∈ H1 ⊦ ⟨caterpillar_add#(a, # xs + 1; xs, xs_len, ys)⟩ (xs = [] ∧ ls(r, ys)((H1 ++ r)[r, a × rxs]) ∧ 0 = xs_len)
Used simplifier rules: ⊦ 0 ≤ m; (s)% ⊦ del-list([], n) = (emp ∧ ⌜n = 0⌝ ); (s)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ 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)% ⊦ 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)% ⊦ (true ∧ P) = P; (s)% ⊦ ⌜true⌝ = true; (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)% ⊦ ls(null, x) = (emp ∧ ⌜x = []⌝ ); (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)