| zh[r] = mkznode(r0, zbrar, boolvar, boolvar0, m), zh[zbrar[n].child] = mkznode(r1, zbrar0, boolvar1, false, m0), n < # zbrar, r ∈ zh, ¬ boolvar → (∀ n0. n0 < m ∧ n0 < n ∧ zbrar[n0].branch? ∧ zbrar[n0].child ∈ zh → ¬ zh[zbrar[n0].child].dirty) ⊦ btree-sub-clean(r, n + 1, zh[r, mkznode(r0, zbrar[n, mkzbranch(key, adr, zbrar[n].child)], boolvar, boolvar0, m)]) |
⊦ btree-sub-clean(r, n, zh) ↔ r ∈ zh ∧ ( ¬ zh[r].leaf → (∀ n0. n0 < zh[r].usedsize ∧ n0 < n ∧ zh[r].zbranches[n0].branch? ∧ zh[r].zbranches[n0].child ∈ zh → ¬ zh[zh[r].zbranches[n0].child].dirty))
zh[zbrar[n].child] = mkznode(r1, zbrar0, boolvar1, false, m0), zh[r] = mkznode(r0, zbrar, boolvar, boolvar0, m), n < # zbrar, r ∈ zh, ¬ boolvar → (∀ n0. n0 < m ∧ n0 < n ∧ zbrar[n0].branch? ∧ zbrar[n0].child ∈ zh → ¬ zh[zbrar[n0].child].dirty) ⊦ r ∈ zh[r, mkznode(r0, zbrar[n, mkzbranch(key, adr, zbrar[n].child)], boolvar, boolvar0, m)] ∧ ( ¬ zh[r, mkznode(r0, zbrar[n, mkzbranch(key, adr, zbrar[n].child)], boolvar, boolvar0, m)][r].leaf → (∀ n0. n0 < zh[r, mkznode(r0, zbrar[n, mkzbranch(key, adr, zbrar[n].child)], boolvar, boolvar0, m)][r].usedsize ∧ n0 < n + 1 ∧ zh[r, mkznode(r0, zbrar[n, mkzbranch(key, adr, zbrar[n].child)], boolvar, boolvar0, m)][r].zbranches[n0].branch? ∧ zh[r, mkznode(r0, zbrar[n, mkzbranch(key, adr, zbrar[n].child)], boolvar, boolvar0, m)][r].zbranches[n0].child ∈ zh[r, mkznode(r0, zbrar[n, mkzbranch(key, adr, zbrar[n].child)], boolvar, boolvar0, m)] → ¬ zh[r, mkznode(r0, zbrar[n, mkzbranch(key, adr, zbrar[n].child)], boolvar, boolvar0, m)] [zh[r, mkznode(r0, zbrar[n, mkzbranch(key, adr, zbrar[n].child)], boolvar, boolvar0, m)][r].zbranches[n0].child ] .dirty))
Used terms: zh [r, mkznode (r0, zbrar[n, mkzbranch(key, adr, zbrar[n].child)], boolvar, boolvar0, m) ], n + 1, r