| zh0[r] = mkznode(r0, zbrar, boolvar, false, m), ∃ zbrar0, dirty0, nused. (dirty0 → dirty) ∧ (adr ∈ as ↔ ¬ dirty0) ∧ adr ∈ alladrs ∧ nsize(nused, nstat) ∧ unmodified(adr, mkznode(rp, zbrar0, height = 0, dirty0, nused), iast) ∧ (( r => mkznode(rp, zbrar0, height = 0, dirty0, nused) * bnode(r, zbrar0, 0, nused, nused, height, dirty0, ri, iast, as -- adr, alladrs -- adr) * P) )(zh0) ⊦ r = null, adr ∈ as ∧ adr ∈ alladrs ∧ (∃ zbrar0, nused. nsize(nused, nstat) ∧ unmodified(adr, mkznode(rp, zbrar0, height = 0, false, nused), iast) ∧ (( r => mkznode(rp, zbrar0, height = 0, false, nused) * bnode(r, zbrar0, 0, nused, nused, height, false, ri, iast, as -- adr, alladrs -- adr) * P) )(zh0)) |
((r => mkznode(rp, zbrar0, height = 0, false, nused) * bnode(r, zbrar0, 0, nused, nused, height, false, ri, iast, as -- adr, alladrs -- adr) * P) )(zh0), nsize(nused, nstat), unmodified(adr, mkznode(rp, zbrar0, height = 0, false, nused), iast), adr ∈ as, adr ∈ alladrs ⊦ # as = 0, # alladrs = 0, alladrs = ∅, as = ∅, ∃ zbrar0, nused. nsize(nused, nstat) ∧ unmodified(adr, mkznode(rp, zbrar0, height = 0, false, nused), iast) ∧ (( r => mkznode(rp, zbrar0, height = 0, false, nused) * bnode(r, zbrar0, 0, nused, nused, height, false, ri, iast, as -- adr, alladrs -- adr) * P) )(zh0)
Used simplifier rules: maplet-null: ⊦ ((r => znd * P))(zh) → r ≠ null;%size-zero-01: ⊦ as ≠ ∅ → # as ≠ 0; (forward) from specification set-basic[node-store]%ne-01: ⊦ adr ∈ as → as ≠ ∅; (forward) from specification set-basic[node-store]%⊦ mkznode(r, zbrar, boolvar, boolvar0, m) = mkznode(r0, zbrar0, boolvar1, boolvar2, m0) ↔ r = r0 ∧ zbrar = zbrar0 ∧ (boolvar ↔ boolvar1) ∧ (boolvar0 ↔ boolvar2) ∧ m = m0; (ws)% ⊦ ((r => znd * P0))(zh) → (zh[r] = znd0 ↔ znd = znd0); (s)%sep-com: ⊦ P * P2 = P2 * P; from specification heap-sep[zheap]%sep-ass: ⊦ (P * P3) * P4 = P * P3 * P4; from specification heap-sep[zheap]