| 〈while r10 ≠ null do { r2 := r9 ; r9 := r10 ; r10 := H[r9] .left }〉 (r2 = r11 ∧ r9 = r12 ∧ r10 = r13), ∀ t0, r5, r, r0, r3, a, r6, t2, r1, t1, a0, P, H. # t0 < # branch(t3, a2, t4) → ( r5 = r ∧ r0 ≠ null ∧ r ≠ null ∧ (r0 => mknode(r3, a, r6) * tr(r3, t0) * 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((t0 = leaf ⊃ t2; branch(t0 .butleftmost, a, t2)), a0, t1)) * P * true)(H) ∧ a1 = ((t0 = leaf ⊃ a; t0 .leftmost)))), r ≠ null, r0 ≠ null, ((r3 => mknode(r8, a2, r4) * tr(r8, t3) * tr(r4, t4)) * r => mknode(r0, a0, r1) * tr(r1, t1) * tr(r6, t2) * r0 => mknode(r3, a, r6) * P)(H), r2 = r0 ∧ r7 = r0 ∧ r9 = r3 ∧ r10 = r8 ∧ P0 = P * r => mknode(r0, a0, r1) * tr(r1, t1), H1 ≡ H[r11, H[r11] .left:= H[r12] .right], (tr(r7, branch((t3 = leaf ⊃ t4; branch(t3 .butleftmost, a2, t4)), a, t2)) * P0 * true)(H1), H[r12] .val = ((t3 = leaf ⊃ a2; t3 .leftmost)) ⊦ 〈while r8 ≠ null do { r0 := r3 ; r3 := r8 ; r8 := H[r3] .left }〉 〈a1 := H[r3] .val ; r8 := H[r3] .right ; H[r0] .left := r8〉 ( (tr(r, branch(branch((t3 = leaf ⊃ t4; branch(t3 .butleftmost, a2, t4)), a, t2), a0, t1)) * P * true)(H) ∧ a1 = ((t3 = leaf ⊃ a2; t3 .leftmost))) |
〈while r8 ≠ null do { r0 := r3 ; r3 := r8 ; r8 := H[r3] .left }〉 (r0 = r11 ∧ r3 = r12 ∧ r8 = r13), ∀ t0, r5, r, r0, r3, a, r6, t2, r1, t1, a0, P, H. # t0 < # branch(t3, a2, t4) → ( r5 = r ∧ r0 ≠ null ∧ r ≠ null ∧ (r0 => mknode(r3, a, r6) * tr(r3, t0) * 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((t0 = leaf ⊃ t2; branch(t0 .butleftmost, a, t2)), a0, t1)) * P * true)(H) ∧ a1 = ((t0 = leaf ⊃ a; t0 .leftmost)))), H[r12] .val = ((t3 = leaf ⊃ a2; t3 .leftmost)), r0 ≠ null, r ≠ null, (r0 => mknode(r2, a1, r5) * tr(r2, (t3 = leaf ⊃ t4; branch(t3 .butleftmost, a2, t4))) * tr(r5, t0) * true * tr(r1, t1) * r => mknode(r0, a0, r1) * P )(H1), H1 ≡ H[r11, H[r11] .left:= H[r12] .right], ((r3 => mknode(r8, a2, r4) * tr(r8, t3) * tr(r4, t4)) * r => mknode(r0, a0, r1) * tr(r1, t1) * tr(r6, t0) * r0 => mknode(r3, a1, r6) * P)(H) ⊦ 〈while r8 ≠ null do { r0 := r3 ; r3 := r8 ; r8 := H[r3] .left }〉 〈a3 := H[r3] .val ; r8 := H[r3] .right ; H[r0] .left := r8〉 ( (tr(r, branch(branch((t3 = leaf ⊃ t4; branch(t3 .butleftmost, a2, t4)), a1, t0), a0, t1)) * P * true)(H) ∧ a3 = ((t3 = leaf ⊃ a2; t3 .leftmost)))
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ branch(t, a, t0) = branch(t1, a0, t2) ↔ t = t1 ∧ a = a0 ∧ t0 = t2], [CSIMPSEQ : ⊦ P0 * P1 = P1 * P0], [CSIMPSEQ : ⊦ (P0 * P1) * P2 = P0 * P1 * P2], [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)))])]]