| 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), nused < BRANCH_SIZE, unmodified(adr, mkznode(rp, zbrar, false, dirty0, nused), iast), adr ∈ alladrs0, as1 ⊆ dom iast, as1 ⊆ alladrs1, as0 ⊆ dom iast, as0 ⊆ alladrs0, 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, ∃ r, zh1, zbrar, dirty1, nused. (rp0 = null ⊃ ¬ dirty1 ∧ P1(zh);r = rp0 ∧ zh1 = zh) ∧ (dirty1 → dirty) ∧ (adr ∈ as1 ↔ ¬ dirty1) ∧ adr ∈ alladrs1 ∧ 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, ri1, iast, as1 -- adr, alladrs1 -- adr) * P1) )(zh1) ⊦ # alladrs0 = 0, alladrs0 = ∅, ri0 = ri1 |
adr ∈ as0 ↔ adr ∈ as1, adr ∈ as1 ↔ ¬ dirty1, (( rp0 => mkznode(rp, zbrar0, false, dirty1, nused0) * bnode(rp0, zbrar0, 0, nused0, nused0, height0 + 1, dirty1, ri1, iast, as1 -- adr, alladrs1 -- adr) * P1) )(zh), (( rp0 => mkznode(rp, zbrar0, false, dirty1, nused0) * bnode(rp0, zbrar0, 0, nused0, nused0, height0 + 1, dirty1, ri0, iast, as0 -- adr, alladrs0 -- adr) * P0) )(zh), nused0 < BRANCH_SIZE, unmodified(adr, mkznode(rp, zbrar0, false, dirty1, nused0), iast), adr ∈ alladrs1, adr ∈ alladrs0, as1 ⊆ dom iast, as1 ⊆ alladrs1, as0 ⊆ dom iast, as0 ⊆ alladrs0, dirty1 → 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, # alladrs1 = 0, alladrs0 = ∅, alladrs1 = ∅, ri0 = ri1
Used simplifier rules: maplet-null: ⊦ ((r => znd * P))(zh) → r ≠ null;%lf-02: ⊦ m < n ∧ m = n0 → n0 < n; (forward) from specification nat-basic%⊦ mkznode(r, zbrar, boolvar, boolvar0, m) = mkznode(r0, zbrar0, boolvar1, boolvar2, m0) ↔ r = r0 ∧ zbrar = zbrar0 ∧ (boolvar ↔ boolvar1) ∧ (boolvar0 ↔ boolvar2) ∧ m = m0; (ws)%size-zero-01: ⊦ as ≠ ∅ → # as ≠ 0; (forward) from specification set-basic[node-store]%eq-objs: ⊦ ((r => znd * P))(zh) ∧ ((r => znd0 * P2))(zh) → znd = znd0; (forward) from specification maplet[zheap]%ne-01: ⊦ adr ∈ as → as ≠ ∅; (forward) from specification set-basic[node-store]%sep-com: ⊦ P * P2 = P2 * P; from specification heap-sep[zheap]%sep-ass: ⊦ (P * P3) * P4 = P * P3 * P4; from specification heap-sep[zheap]%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)