| H[r2] = a × null, x = y + b ' + a ', ((lls(r0, r1, y) * r1 => b × r2 * r2 => a × null * P))(H) ⊦ r1 = null, r2 = null, x = [], ((ll-trav(r0, r1, r2, x) * P))(H) |
((lls(r0, r1, y) * r1 => b × r2 * r2 => a × null * P))(H) ⊦ r1 = null, r2 = null, ∃ x, x0, a0. y + b ' + a ' = x + a0 ' + x0 ∧ ((lls(r0, r1, x) * r1 => a0 × r2 * lls(r2, null, x0) * P))(H)
Used simplifier rules: ll-trav2-nonnull-def: ⊦ r1 ≠ null → ( ((ll-trav(r0, r1, r2, x) * P))(H) ↔ (∃ x0, x1, a. x = x0 + (a + x1) ∧ ((lls(r0, r1, x0) * r1 => a × r2 * lls(r2, null, x1) * P) )(H)));% ⊦ a + x = a ' + x; (s)%a: ⊦ (x + y) + z = x + y + z; from specification list% ⊦ x + a ' ≠ []; (s)% ⊦ ((r => ce * P))(H) → (H[r] = ce0 ↔ ce = ce0); (s)%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep