| mk(rs1, f) = (∅ ++ r)[r, o], rs1 ∩ rs0 = ∅, R[rs0, f, g], ∀ r. r ∈ rs1 → g(r) = a ⊦ r = null, (_∃(λ o, a. r ==>(o, a)) * R)[rs1 ∪ rs0, f, g], (_∃(λ o, a. r ==>(o, a)))(mk(rs1, f, g)) |
mk(rs1, f) = (∅ ++ r)[r, o], rs1 ∩ rs0 = ∅, R[rs0, f, g], ∀ r. r ∈ rs1 → g(r) = a ⊦ r = null, ∃ o, a. r ==>(o, a)(mk(rs1, f, g)), ∃ o, a. (r ==>(o, a) * R)[rs1 ∪ rs0, f, g]
Used simplifier rules: 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)% ⊦ (_∃ oR)(Ha) ↔ (∃ o, a. oR(o, a)(Ha)); (s)