| ((btree(rp, rp0, adr, height0 + 1, dirty, ri1, iast, as1, alladrs1, ok) * P1))(zh), rp0 ∈ zh, as0 ⊆ alladrs0, as0 ⊆ dom iast, as1 ⊆ alladrs1, as1 ⊆ dom iast, ∀ rp, rp0, adr, dirty, ri0, iast, as0, alladrs0, P0, zh, ri1, as1, alladrs1, P1. ((btree(rp, rp0, adr, height0, dirty, ri0, iast, as0, alladrs0, ok) * P0))(zh) ∧ ((btree(rp, rp0, adr, height0, dirty, ri1, iast, as1, alladrs1, ok) * P1))(zh) ∧ as0 ⊆ alladrs0 ∧ as0 ⊆ dom iast ∧ as1 ⊆ alladrs1 ∧ as1 ⊆ dom iast → ri0 = ri1 ∨ rp0 = null, ∃ r, zh1, zbrar, dirty1, nused. (rp0 = null ⊃ ¬ dirty1 ∧ P0(zh);r = rp0 ∧ zh1 = zh) ∧ (dirty1 → dirty) ∧ (adr ∈ as0 ↔ ¬ dirty1) ∧ adr ∈ alladrs0 ∧ nsize(nused, ok) ∧ unmodified(adr, mkznode(rp, zbrar, height0 + 1 = 0, dirty1, nused), iast) ∧ (( r => mkznode(rp, zbrar, height0 + 1 = 0, dirty1, nused) * bnode(r, zbrar, 0, nused, nused, height0 + 1, dirty1, ri0, iast, as0 -- adr, alladrs0 -- adr) * P0) )(zh1) ⊦ ri0 = ri1 |
adr ∈ as0 ↔ ¬ dirty0, (( rp0 => mkznode(rp, zbrar, false, dirty0, nused) * bnode(rp0, zbrar, 0, nused, nused, height0 + 1, dirty0, ri0, iast, as0 -- adr, alladrs0 -- adr) * P0) )(zh), ((btree(rp, rp0, adr, height0 + 1, dirty, ri1, iast, as1, alladrs1, ok) * P1))(zh), nused < BRANCH_SIZE, unmodified(adr, mkznode(rp, zbrar, false, dirty0, nused), iast), adr ∈ alladrs0, as0 ⊆ alladrs0, as0 ⊆ dom iast, as1 ⊆ alladrs1, as1 ⊆ dom iast, dirty0 → dirty, ∀ rp, rp0, adr, dirty, ri0, iast, as0, alladrs0, P0, zh, ri1, as1, alladrs1, P1. ((btree(rp, rp0, adr, height0, dirty, ri0, iast, as0, alladrs0, ok) * P0))(zh) ∧ ((btree(rp, rp0, adr, height0, dirty, ri1, iast, as1, alladrs1, ok) * P1))(zh) ∧ as0 ⊆ alladrs0 ∧ as0 ⊆ dom iast ∧ as1 ⊆ alladrs1 ∧ as1 ⊆ dom iast → ri0 = ri1 ∨ rp0 = null ⊦ # alladrs0 = 0, alladrs0 = ∅, ri0 = ri1
Used simplifier rules: size-zero-01: ⊦ as ≠ ∅ → # as ≠ 0; (forward) from specification set-basic[node-store]% ⊦ ((r => znd * P0))(zh) → r ∈ zh; (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]% ⊦ BRANCH_SIZE ≠ 0; (s)%ne-01: ⊦ adr ∈ as → as ≠ ∅; (forward) from specification set-basic[node-store]%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ r ∈ zh → r ≠ null; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + 1 ≠ 0; (s)% ⊦ nsize(nused, ok) ↔ nused < BRANCH_SIZE; (s)