| ((lls(r0, r2, x + a ') * P))(H) ⊦ ∃ r. ((lls(r0, r, x) * r => a × r2 * P))(H) |
((lls(r0, r2, (a0 + x0) + a ') * P))(H), ∀ r0, r2, a, P, H. ((lls(r0, r2, x0 + a ') * P))(H) → (∃ r. ((lls(r0, r, x0) * r => a × r2 * P))(H)) ⊦ ∃ r. ((lls(r0, r, a0 + x0) * r => a × r2 * P))(H)
Used simplifier rules: lls-one: ⊦ lls(r0, r1, a ') = r0 => a × r1;%lls-base: ⊦ lls(r0, r1, []) = (emp ∧ ⌜r0 = r1⌝ );%list freely generated by [], +;;% ⊦ [] + x = x; (s)%a: ⊦ (x + y) + z = x + y + z; from specification list% ⊦ (⌜bv⌝ ∧ P0) * P1 = (⌜bv⌝ ∧ P0 * P1); (s)% ⊦ emp * P = P; (s)%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep%and-ass: ⊦ ((P0 ∧ P1) ∧ P2) = (P0 ∧ P1 ∧ P2); from specification heap-sep%and-com: ⊦ (P0 ∧ P1) = (P1 ∧ P0); from specification heap-sep% ⊦ ((P0 ∧ P1))(H) ↔ P0(H) ∧ P1(H); (s)% ⊦ ⌜bv⌝ (H) ↔ bv; (s)