| rs1 ∩ rs0 = ∅, r ==>(o, a)[rs1, f, g], R[rs0, f, g] ⊦ (a[_∃(λ o. r => o)] * R)[rs1 ∪ rs0, f, g], (_∃(λ o. r => o))(mk(rs1, f)) ∧ (r0 ∈ rs1 → g(r0) = a) |
rs1 ∩ rs0 = ∅, R[rs0, f, g], r ==>(o, a)[rs1, f, g] ⊦ ∃ o. (a[r => o] * R)[rs1 ∪ rs0, f, g], (∃ o. ((r => o))(mk(rs1, f))) ∧ (r0 ∈ rs1 → g(r0) = a)
Used simplifier rules: lift-ex-o: ⊦ a[_∃ oP] = _∃(λ o, a0. a[oP(o)]);% ⊦ (_∃ oP)(H) ↔ (∃ o. oP(o)(H)); (s)%sep-com: ⊦ R0 * R1 = R1 * R0; from specification heap-sep[heap-aux]%sep-ass: ⊦ (R0 * R1) * R2 = R0 * R1 * R2; from specification heap-sep[heap-aux]% ⊦ (_∃ oR * R)[rs, f, g] ↔ (∃ o, a. (oR(o, a) * R)[rs, f, g]); (s)