| (a0[_∃(λ o. r => o)] * R)[rs, f, g] ⊦ (a1[_∃(λ o. r => o)] * R)[rs, f, g(r; a1)] ∧ g(r) = a0 |
(a0[r => o] * R)[rs, f, g] ⊦ ∃ o. (a1[r => o] * R)[rs, f, g(r; a1)]
Used simplifier rules: lift-ex-o: ⊦ a[_∃ oP] = _∃(λ o, a0. a[oP(o)]);%get-known: ⊦ (a[r => o] * R)[rs, f, g] → (g(r) = a ↔ true);%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)