| r ∈ rs ⊦ (r =>_ * P)[rs, f(r; o)] ↔ (r => o * P)[rs, f(r; o)] |
((r =>_ * P))(mk(rs, f)[r, o]), r ∈ rs ⊦ # rs = 0, rs = ∅, ((r =>_ * P))(mk(rs, f))
Used simplifier rules: apply: ⊦ P[rs, f] ↔ P(mk(rs, f));%write: ⊦ r ∈ rs → mk(rs, f(r; o)) = mk(rs, f)[r, o];%in-mk: ⊦ r ∈ mk(rs, f) ↔ r ∈ rs;%size-zero-01: ⊦ rs ≠ ∅ → # rs ≠ 0; (forward) from specification set-basic[refset]%ne-01: ⊦ r ∈ rs → rs ≠ ∅; (forward) from specification set-basic[refset]%r ∈ H ⊦ ((r => o0 * P))(H[r, o1]) ↔ o0 = o1 ∧ ((r =>_ * P))(H); (ss)% ⊦ ((r => o * P))(H) → ((r =>_ * P))(H); (s)%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep