| r ≠ null, (r => mknode(r0, a0, r1) * tr(r0, t0) * tr(r1, t1) * P)(H), r2 = H[r] .left, H1 = H ∧ r3 = r, r2 ≠ null, r4 = H1[r2] .left, r5 = r3 ⊦ 〈while r4 ≠ null do { r5 := r2 ; r2 := r4 ; r4 := H1[r2] .left }〉 〈a1 := H1[r2] .val ; r4 := H1[r2] .right ; H1[r5] .left := r4〉 ((tr(r3, (t0 = leaf ⊃ t1; branch(t0 .butleftmost, a0, t1))) * P * true)(H1) ∧ a1 = ((t0 = leaf ⊃ a0; t0 .leftmost))) |
⊦ branch(t0, a, t1) .butleftmost = ((t0 = leaf ⊃ t1; branch(t0 .butleftmost, a, t1)))
⊦ branch(t0, a, t1) .leftmost = ((t0 = leaf ⊃ a; t0 .leftmost))
r5 = r, r0 ≠ null, r ≠ null, (r0 => mknode(r3, a, r6) * tr(r3, t) * tr(r6, t2) * tr(r1, t1) * r => mknode(r0, a0, r1) * P)(H) ⊦ 〈while r3 ≠ null do { r5 := r0 ; r0 := r3 ; r3 := H[r0] .left }〉 〈a1 := H[r0] .val ; r3 := H[r0] .right ; H[r5] .left := r3〉 ((tr(r, branch((t = leaf ⊃ t2; branch(t .butleftmost, a, t2)), a0, t1)) * P * true)(H) ∧ a1 = ((t = leaf ⊃ a; t .leftmost)))
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ leaf ≠ branch(t, a, t0)], [CSIMPSEQ : ⊦ r ≠ null → ( ¬ ¬ (tr(r, t) * P)(H) ↔ (∃ t0, t1, a, r0, r1. t = branch(t0, a, t1) ∧ ( r => mknode(r0, a, r1) * tr(r0, t0) * tr(r1, t1) * P )(H)))], [CSIMPSEQ : ⊦ mknode(r, a, r0) .left = r], [CSIMPSEQ : ⊦ (r => nd * P)(H) → H[r] = nd], [CSIMPSEQ : ⊦ P0 * P1 = P1 * P0], [CSIMPSEQ : ⊦ (P0 * P1) * P2 = P0 * P1 * P2])]]