| (( r => mkznode(rp1, zbrar, height1 = 0, false, nused) * bnode(r, zbrar, 0, nused, nused, height1, false, ri1, iast, alladrs1 -- adr, alladrs1 -- adr) * P1) )(zh), nsize(nused, nstat), unmodified(adr, mkznode(rp1, zbrar, height1 = 0, false, nused), iast), adr ∈ iast, adr ∈ alladrs1, alladrs1 ⊆ dom iast, alladrs0 ⊆ dom iast, (r1 = null ⊃ P1(zh1);r = r1 ∧ zh = zh1), ∀ rp0, r0, adr, ri0, iast, as0, alladrs0, nstat, P0, zh0, rp1, r1, height1, ri1, as1, alladrs1, P1, zh1. ((btree(rp0, r0, adr, height, false, ri0, iast, as0, alladrs0, nstat) * P0))(zh0) ∧ ((btree(rp1, r1, adr, height1, false, ri1, iast, as1, alladrs1, nstat) * P1))(zh1) → height = height1 ∧ as0 = as1 ∧ ri0 = ri1 ∧ alladrs0 = alladrs1, ∃ r, zh, zbrar, dirty, nused. (r0 = null ⊃ ¬ dirty ∧ P0(zh0);r = r0 ∧ zh = zh0) ∧ (dirty → false) ∧ (adr ∈ alladrs0 ↔ ¬ dirty) ∧ adr ∈ alladrs0 ∧ nsize(nused, nstat) ∧ unmodified(adr, mkznode(rp0, zbrar, height + 1 = 0, dirty, nused), iast) ∧ (( r => mkznode(rp0, zbrar, height + 1 = 0, dirty, nused) * bnode(r, zbrar, 0, nused, nused, height + 1, dirty, ri0, iast, alladrs0 -- adr, alladrs0 -- adr) * P0) )(zh) ⊦ # alladrs1 = 0, alladrs1 = ∅, height + 1 = height1 ∧ ri0 = ri1 ∧ alladrs0 = alladrs1 |
(( r => mkznode(rp1, zbrar, false, false, nused) * bnode(r, zbrar, 0, nused, nused, height1, false, ri1, iast, alladrs1 -- adr, alladrs1 -- adr) * P1) )(zh), (( r2 => mkznode(rp0, zbrar0, false, false, nused) * bnode(r2, zbrar0, 0, nused, nused, height + 1, false, ri0, iast, alladrs0 -- adr, alladrs0 -- adr) * P0) )(zh2), nsize(nused, nstat), unmodified(adr, mkznode(rp1, zbrar, false, false, nused), iast), unmodified(adr, mkznode(rp0, zbrar0, false, false, nused), iast), adr ∈ iast, adr ∈ alladrs1, adr ∈ alladrs0, alladrs1 ⊆ dom iast, alladrs0 ⊆ dom iast, (r0 = null ⊃ P0(zh0);r2 = r0 ∧ zh2 = zh0), (r1 = null ⊃ P1(zh1);r = r1 ∧ zh = zh1), ∀ rp0, r0, adr, ri0, iast, as0, alladrs0, nstat, P0, zh0, rp1, r1, height1, ri1, as1, alladrs1, P1, zh1. ((btree(rp0, r0, adr, height, false, ri0, iast, as0, alladrs0, nstat) * P0))(zh0) ∧ ((btree(rp1, r1, adr, height1, false, ri1, iast, as1, alladrs1, nstat) * P1))(zh1) → height = height1 ∧ as0 = as1 ∧ ri0 = ri1 ∧ alladrs0 = alladrs1 ⊦ # alladrs1 = 0, # alladrs0 = 0, alladrs0 = ∅, alladrs1 = ∅, height1 = 0, height + 1 = height1 ∧ ri0 = ri1 ∧ alladrs0 = alladrs1
Used simplifier rules: size-zero-01: ⊦ as ≠ ∅ → # as ≠ 0; (forward) from specification set-basic[node-store]%unmodified-clean-leaf: ⊦ unmodified(adr, mkznode(rp0, zbrar0, bv0, false, nused0), iast) ∧ unmodified(adr, mkznode(rp1, zbrar1, bv1, false, nused1), iast) → (bv0 ↔ bv1) ∧ nused0 = nused1; (forward) from specification zbranch-array-ops%ne-01: ⊦ adr ∈ as → as ≠ ∅; (forward) from specification set-basic[node-store]%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + 1 ≠ 0; (s)