| # zbrar = BRANCH_SIZE, # asar = m + 1, # asar0 = m + 1, zh[r] = mkznode(r0, zbrar, false, true, m + 1), (( P * (λ n. ⌜zbrar[n].branch?⌝ ∧ btree(r, zbrar[n].child, zbrar[n].adr, height0, true, key-range(zbrar, n, m + 1, ri), iast, asar[n], asar0[n], ok) )⊗_ (0, m + 1 )) )(zh -- r), m < BRANCH_SIZE, btree-sub-clean(r, m + 1, zh), disj(asar, 0, m + 1), disj(asar0, 0, m + 1), nsize(m + 1, nstat), sorted(zbrar, 0, m), r ∈ zh, ∀ n. ¬ m < n → asar[n] ⊆ union(asar0, 0, m + 1) ++ adr0, ∀ n. ¬ m < n → asar[n] ⊆ dom iast ⊦ adr1 = adr0, (( P * (λ n. ⌜zbrar[n].branch?⌝ ∧ btree (r, zbrar[n].child, zbrar[n].adr, height0, false, key-range(zbrar, n, m + 1, ri), iast[adr1, save(mkznode(r0, zbrar, false, true, m + 1))], asar[n], asar0[n], ok) )⊗_ (0, m + 1 )) )(zh -- r), adr1 ∈ union(asar0, 0, m + 1), adr1 ∈ iast, adr0 ∈ union(asar0, 0, m + 1), adr0 ∈ union(asar, 0, m + 1) |
⊦ (∀ n0, P. n0 < m ∧ ((nP(n + n0) * P))(zh) → ((nP2(n + n0) * P))(zh)) ∧ ((nP ⊗_(n, m) * P0))(zh) → ((nP2 ⊗_(n, m) * P0))(zh)
# asar0 = m + 1, # asar = m + 1, # zbrar = BRANCH_SIZE, zh[r] = mkznode(r0, zbrar, false, true, m + 1), (( P * (λ n. ⌜zbrar[n].branch?⌝ ∧ btree(r, zbrar[n].child, zbrar[n].adr, height0, true, key-range(zbrar, n, m + 1, ri), iast, asar[n], asar0[n], ok) )⊗_ (0, m + 1 )) )(zh -- r), m < BRANCH_SIZE, btree-sub-clean(r, m + 1, zh), disj(asar0, 0, m + 1), disj(asar, 0, m + 1), nsize(m + 1, nstat), sorted(zbrar, 0, m), r ∈ zh, ∀ n. ¬ m < n → asar[n] ⊆ dom iast, ∀ n. ¬ m < n → asar[n] ⊆ union(asar0, 0, m + 1) ++ adr0 ⊦ adr1 = adr0, (( P * (λ n. ⌜zbrar[n].branch?⌝ ∧ btree (r, zbrar[n].child, zbrar[n].adr, height0, false, key-range(zbrar, n, m + 1, ri), iast[adr1, save(mkznode(r0, zbrar, false, true, m + 1))], asar[n], asar0[n], ok) )⊗_ (0, m + 1 )) )(zh -- r), adr0 ∈ union(asar, 0, m + 1), adr0 ∈ union(asar0, 0, m + 1), adr1 ∈ iast, adr1 ∈ union(asar0, 0, m + 1), (∀ n0, P. n0 < m + 1 ∧ (( ( ⌜zbrar[0 + n0].branch?⌝ ∧ btree (r, zbrar[0 + n0].child, zbrar[0 + n0].adr, height0, true, key-range(zbrar, 0 + n0, m + 1, ri), iast, asar[0 + n0], asar0[0 + n0], ok)) * P) )(zh -- r) → (( ( ⌜zbrar[0 + n0].branch?⌝ ∧ btree (r, zbrar[0 + n0].child, zbrar[0 + n0].adr, height0, false, key-range(zbrar, 0 + n0, m + 1, ri), iast[adr1, save(mkznode(r0, zbrar, false, true, m + 1))], asar[0 + n0], asar0[0 + n0], ok)) * P) )(zh -- r)) ∧ (( (λ n. ⌜zbrar[n].branch?⌝ ∧ btree(r, zbrar[n].child, zbrar[n].adr, height0, true, key-range(zbrar, n, m + 1, ri), iast, asar[n], asar0[n], ok) )⊗_ (0, m + 1 ) * P) )(zh -- r)
Used simplifier rules: sep-com: ⊦ P * P2 = P2 * P; from specification heap-sep[zheap] Used terms: λ n. ⌜zbrar[n].branch?⌝ ∧ btree (r, zbrar[n].child, zbrar[n].adr, height0, true, key-range(zbrar, n, m + 1, ri), iast, asar[n], asar0[n], ok), zh -- r, P, m + 1, 0, λ n. ⌜zbrar[n].branch?⌝ ∧ btree (r, zbrar[n].child, zbrar[n].adr, height0, false, key-range(zbrar, n, m + 1, ri), iast[adr1, save(mkznode(r0, zbrar, false, true, m + 1))], asar[n], asar0[n], ok)