| H[r2] = a × r, ((lls(r0, r1, x0) * r1 => a0 × r2 * lls(r2, null, x1) * P))(H) ⊦ r1 = null, r2 = null, x1 = a ' + x1.tail ∧ ((lls(r0, r2, x0 + a0 ') * r2 => a × r * lls(r, null, x1.tail) * P))(H) |
H[r2] = a × r, x1 = a1 + y, ((lls(r0, r1, x0) * r1 => a0 × r2 * lls(r2, null, x1) * P))(H) ⊦ r1 = null, r2 = null, x1 = [], x1 = a ' + y ∧ ((lls(r0, r2, x0 + a0 ') * r2 => a × r * lls(r, null, y) * P))(H)
Used simplifier rules: lls-base: ⊦ lls(r0, r1, []) = (emp ∧ ⌜r0 = r1⌝ );% ⊦ ⌜false⌝ = false; (s)% ⊦ (false ∧ P) = false; (s)%and-ass: ⊦ ((P0 ∧ P1) ∧ P2) = (P0 ∧ P1 ∧ P2); from specification heap-sep%and-com: ⊦ (P0 ∧ P1) = (P1 ∧ P0); from specification heap-sep% ⊦ false * P = false; (s)%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep% ⊦ ¬ false(H); (s)%x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: x1, a1, y