| ⊦ ((r => mknode(null, a, null)))(H) ↔ tr(r, branch(leaf, a, leaf))(H) |
⊦ tr(r, branch(t0, a, t1)) = _∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t0) * tr(r1, t1))
Used simplifier rules: tr-base: ⊦ tr(r, leaf) = (emp ∧ ⌜r = null⌝ );% ⊦ (⌜bv⌝ ∧ P0) * P1 = (⌜bv⌝ ∧ P0 * P1); (s)% ⊦ emp * P = P; (s)%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep%and-ass: ⊦ ((P0 ∧ P1) ∧ P2) = (P0 ∧ P1 ∧ P2); from specification heap-sep%and-com: ⊦ (P0 ∧ P1) = (P1 ∧ P0); from specification heap-sep% ⊦ (_∃ rrP)(H) ↔ (∃ r0, r1. rrP(r0, r1)(H)); (s)% ⊦ ((P0 ∧ P1))(H) ↔ P0(H) ∧ P1(H); (s)% ⊦ ⌜bv⌝ (H) ↔ bv; (s)% ⊦ ⌜false⌝ = false; (s)% ⊦ ¬ false(H); (s) Used terms: leaf, a, leaf, r