| H[r0] = a × r, ((lls(r0, null, x) * P))(H) ⊦ r0 = null, x = x.head ' + x.tail ∧ ((r0 => x.head × r * lls(r, null, x.tail) * P))(H) |
Used simplifier rules: lls-base: ⊦ lls(r0, r1, []) = (emp ∧ ⌜r0 = r1⌝ );%lls-rec: ⊦ lls(r, r1, a ' + x) = _∃(λ r0. r => a × r0 * lls(r0, r1, x));% ⊦ a + x = a ' + x; (s)% ⊦ a ' + x ≠ []; (s)%a: ⊦ (x + y) + z = x + y + z; from specification list% ⊦ ((_∃ rP * P))(H) ↔ (∃ r. ((rP(r) * P))(H)); (s)%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep% ⊦ ((r => ce * P))(H) → (H[r] = ce0 ↔ ce = ce0); (s)% ⊦ a × r = a0 × r0 ↔ a = a0 ∧ r = r0; (ws)% ⊦ a ' + x = a ' + y ↔ x = y; (s)% ⊦ ⌜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)% ⊦ ¬ false(H); (s)%x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: x, a0, y