| ⊦ ((lls(r0, r2, x) * P))(H) ↔ (∃ a, y, r1. ((r0 => a × r1 * lls(r1, r2, y) * P))(H) ∧ x = a ' + y), r0 = r2 |
x ≠ [] ⊦ ((lls(r0, r2, x) * P))(H) ↔ (∃ a, y, r1. ((r0 => a × r1 * lls(r1, r2, y) * P))(H) ∧ x = a ' + y)
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)% ⊦ a ' + x ≠ []; (s)%a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: x, r0, r2, P, H