| r ≠ null, (tr(r, t) * P)(H) ⊦ 〈search_tree_delete_min(; a, r, H)〉 ((tr(r, t .butleftmost) * P * true)(H) ∧ a = t .leftmost) |
⊦ branch(t0, a, t1) .butleftmost = ((t0 = leaf ⊃ t1; branch(t0 .butleftmost, a, t1)))
⊦ branch(t0, a, t1) .leftmost = ((t0 = leaf ⊃ a; t0 .leftmost))
r ≠ null, (r => mknode(r0, a0, r1) * tr(r0, t0) * tr(r1, t1) * P)(H) ⊦ 〈search_tree_delete_min(; a, r, H)〉 ((tr(r, (t0 = leaf ⊃ t1; branch(t0 .butleftmost, a0, t1))) * P * true)(H) ∧ a = ((t0 = leaf ⊃ a0; t0 .leftmost)))
[[CONCRETESIMPRULES : ([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)))])]]