| ((tr(r, t) * P))(H) ⊦ r = null, ∃ t0, t1, a, r0, r1. t = branch(t0, a, t1) ∧ ((r => mknode(r0, a, r1) * tr(r0, t0) * tr(r1, t1) * P))(H) |
t = branch(t2, a0, t3), ((tr(r, t) * P))(H) ⊦ r = null, ∃ t0, t1, a, r0, r1. t = branch(t0, a, t1) ∧ ((r => mknode(r0, a, r1) * tr(r0, t0) * tr(r1, t1) * P))(H)
Used simplifier rules: tr-base: ⊦ tr(r, leaf) = (emp ∧ ⌜r = null⌝ );%tree freely generated by leaf, branch;;% ⊦ ⌜false⌝ = false; (s)% ⊦ (false ∧ P) = false; (s)%and-ass: ⊦ ((P0 ∧ P1) ∧ P2) = (P0 ∧ P1 ∧ P2); from specification heap-sep%and-com: ⊦ (P0 ∧ P1) = (P1 ∧ P0); from specification heap-sep% ⊦ false * P = false; (s)%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep% ⊦ ¬ false(H); (s)