| h = h0, xs_len = # xs, ((del-list(to_delete, n) * ls(rys, ys) * ls(rxs, xs)))(H), ((ls(rxs, xs) * ls(rys, ys) * del-list(to_delete, n)))(H), # xs < h0, n + # xs ≤ h0, n ≤ # xs + # ys, 2 ≤ n → ((del-list(to_delete0, n - 2) * ls(rys, ys) * ls(rxs, xs)))(H0), n < 2 → to_delete0 = [] ∧ ((ls(rys, ys) * ls(rxs, xs)))(H0), ys = [] ∨ # ys = h0 ⊦ ⟪choose r with ¬ r ∈ H0 ∧ r ≠ null in {H0 := H0 ++ r; H0[r].val := a; H0[r].nxt := rxs; if xs_len + 1 = h then {if rys ≠ null then to_delete0 := rys + to_delete0; rys := r; xs_len := 0; rxs := null} else {rxs := r; xs_len := 1 + xs_len}}⟫ ⟨xs_len0 := # xs; caterpillar_add#(a, h0; xs, xs_len0, ys)⟩ ∃ n. ((ls(rxs, xs) * ls(rys, ys) * del-list(to_delete0, n)))(H0) ∧ n ≤ # xs + # ys ∧ n + # xs ≤ h0 ∧ xs_len = xs_len0 |
h = h0, xs_len = # 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)))(H0), 2 ≤ n → ((del-list(to_delete0, n - 2) * ls(rys, ys) * ls(rxs, xs)))(H0), ys = [] ∨ # ys = h0 ⊦ ⟪H0 := H0 ++ r; H0[r].val := a; H0[r].nxt := rxs; if xs_len + 1 = h then {if rys ≠ null then to_delete0 := rys + to_delete0; rys := r; xs_len := 0; rxs := null} else {rxs := r; xs_len := 1 + xs_len}⟫ ⟨xs_len0 := # xs; caterpillar_add#(a, h0; xs, xs_len0, ys)⟩ ∃ n. ((ls(rxs, xs) * ls(rys, ys) * del-list(to_delete0, n)))(H0) ∧ n ≤ # xs + # ys ∧ n + # xs ≤ h0 ∧ xs_len = xs_len0, r = null, r ∈ H0
h = h0, xs_len = # 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)))(H0), 2 ≤ n → ((del-list(to_delete0, n - 2) * ls(rys, ys) * ls(rxs, xs)))(H0), ys = [] ∨ # ys = h0 ⊦ ∃ r. ¬ r ∈ H0 ∧ r ≠ null