| ∀ t0, r5, r, r0, r3, a, r6, t2, r1, t1, a0, P, H. # t0 < # leaf → ( 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[r] = mknode(r0, a0, r1), r0 ≠ null, r ∈ H, (r0 => mknode(null, a, r6) * tr(r1, t1) * tr(r6, t2) * r => mknode(H[r0] .right, a0, r1) * P)(H1), H1 ≡ H[r, mknode(H[r0] .right, a0, r1)], ¬ (tr(r, branch(t2, a0, t1)) * P * true)(H1) ∨ H[r0] .val ≠ a ⊦ |
∀ t0, r5, r, r0, r3, a, r6, t2, r1, t1, a0, P, H. # t0 < # leaf → ( 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[r] = mknode(r0, a0, r1), r0 ≠ null, r ∈ H, (r0 => mknode(null, a, r6) * tr(r1, t1) * tr(r6, t2) * r => mknode(r4, a0, r1) * P)(H1), H1 ≡ H[r, mknode(r4, a0, r1)], ¬ (tr(r, branch(t2, a0, t1)) * P * true)(H1) ∨ a2 ≠ a, H[r0] = mknode(r2, a2, r4) ⊦
[[CONCRETESIMPRULES : ([CSIMPELIM : ⊦ r = nd .left ∧ a = nd .val ∧ r0 = nd .right ↔ nd = mknode(r, a, r0)])], [EXTRATERMS : (H[r0], r2, a2, r4)]]