| r ∈ rx, r ≠ head, r ≠ tail, ((dls(head, prev, x, rx, next, tail) * P))(H) ⊦ ⟪remove(r; H)⟫ ∃ x0, rx0, x1, rx1, a. x0 ≠ [] ∧ x1 ≠ [] ∧ # x0 = # rx0 ∧ x = x0 + a ' + x1 ∧ rx = rx0 + r ' + rx1 ∧ ((r => mkcell(rx0.last, rx1.first, a) * dls(head, prev, x0 + x1, rx0 + rx1, next, tail) * P))(H) |
# x = # rx, r ≠ head, r ≠ tail, r ∈ rx, ((dls(head, prev, x, rx, next, tail) * P))(H) ⊦ ⟪remove(r; H)⟫ ∃ x0, rx0, x1, rx1, a. x0 ≠ [] ∧ x1 ≠ [] ∧ # x0 = # rx0 ∧ x = x0 + a ' + x1 ∧ rx = rx0 + r ' + rx1 ∧ ((r => mkcell(rx0.last, rx1.first, a) * dls(head, prev, x0 + x1, rx0 + rx1, next, tail) * P))(H)
[Concretesimprules((Csimpnamedseq(heap-sep,cell-heap,sep-com, ⊦ P0 * P1 = P1 * P0) Csimpnamedseq(heap-sep,cell-heap,sep-ass, ⊦ (P0 * P1) * P2 = P0 * P1 * P2) Csimpnamedforward(dllist,,dls-length, ⊦ (( dls (head, prev, x, rx, next, tail) * P) )(H) → # x = # rx)))]