| ⊦ p ∈ t → tr(r, t) = _∃(λ r0. trp(r, t, p, r0) * tr(r0, t(p))) |
tr(r, t) ≠ _∃(λ r0. trp(r, t, p, r0) * tr(r0, t(p))), p ∈ t ⊦
| tr(r, t) ≠ _∃(λ r0. trp(r, t, p, r0) * tr(r0, t(p))), p ∈ t ⊦ |
tr(r, t) ≠ _∃(λ r0. trp(r, t, [], r0) * tr(r0, t([]))), [] ∈ t ⊦
tr(r, t) ≠ _∃(λ r0. trp(r, t, b + p0, r0) * tr(r0, t(b + p0))), b + p0 ∈ t, ∀ r, t. ¬(tr(r, t) ≠ _∃(λ r0. trp(r, t, p0, r0) * tr(r0, t(p0))) ∧ p0 ∈ t) ⊦
Used simplifier rules: List[A] freely generated by [], +;
| tr(r, t) ≠ _∃(λ r0. trp(r, t, [], r0) * tr(r0, t([]))), [] ∈ t ⊦ |
tr(r, t) ≠ _∃(λ r0. ⌜r = r0⌝ ∧ tr(r0, t)) ⊦
Used simplifier rules: trp-base: ⊦ trp(r, t, [], r0) = (⌜r = r0⌝ ∧ emp); ⊦ [] ∈ t; (s) sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep and-com: ⊦ (hP0 ∧ hP1) = (hP1 ∧ hP0); from specification heap-sep and-ass: ⊦ ((hP0 ∧ hP1) ∧ hP2) = (hP0 ∧ hP1 ∧ hP2); from specification heap-sep ⊦ emp * hP = hP; (s) ⊦ (⌜bv⌝ ∧ hP0) * hP1 = (⌜bv⌝ ∧ hP0 * hP1); (s) ⊦ t([]) = t; (s)
| tr(r, t) ≠ _∃(λ r0. ⌜r = r0⌝ ∧ tr(r0, t)) ⊦ |
Used simplifier rules: ⊦ ⌜bv⌝ (h) ↔ bv; (s) ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s) ⊦ (hP0 ∧ hP1)(h) ↔ hP0(h) ∧ hP1(h); (s) ⊦ ⌜false⌝ = false; (s) ⊦ ¬ false(h); (s) and-ass: ⊦ ((hP0 ∧ hP1) ∧ hP2) = (hP0 ∧ hP1 ∧ hP2); from specification heap-sep and-com: ⊦ (hP0 ∧ hP1) = (hP1 ∧ hP0); from specification heap-sep
| tr(r, t) ≠ _∃(λ r0. trp(r, t, b + p0, r0) * tr(r0, t(b + p0))), b + p0 ∈ t, ∀ r, t. ¬(tr(r, t) ≠ _∃(λ r0. trp(r, t, p0, r0) * tr(r0, t(p0))) ∧ p0 ∈ t) ⊦ |
tr(r, t) ≠ _∃(λ r0. trp(r, t, b ' + p0, r0) * tr(r0, t(b ' + p0))), b ' + p0 ∈ t, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦
Used simplifier rules: ⊦ a + x = a ' + x; (s)
| tr(r, t) ≠ _∃(λ r0. trp(r, t, b ' + p0, r0) * tr(r0, t(b ' + p0))), b ' + p0 ∈ t, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ |
t = branch(t1, a, t2), tr(r, t) ≠ _∃(λ r0. trp(r, t, b ' + p0, r0) * tr(r0, t(b ' + p0))), b ' + p0 ∈ t, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦
Used simplifier rules: trp-leaf: ⊦ trp(r, leaf, b ' + p, r0) = false; Tree[A] freely generated by leaf, branch; ⊦ tr(r, leaf) = (emp ∧ ⌜r = null⌝ ); (s) ⊦ false * hP = false; (s) sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep ⊦ p ∈ leaf ↔ p = []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list
| t = branch(t1, a, t2), tr(r, t) ≠ _∃(λ r0. trp(r, t, b ' + p0, r0) * tr(r0, t(b ' + p0))), b ' + p0 ∈ t, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ |
tr(r, branch(t1, a, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), b ' + p0, r0) * tr(r0, (b ⊃ t2(p0);t1(p0)))), p0 ∈ (b ⊃ t2;t1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ b ' + p ∈ branch(t1, a, t2) ↔ p ∈ (b ⊃ t2;t1); (s) ⊦ branch(t1, a, t2)(b ' + p) = (b ⊃ t2(p);t1(p)); (s)
| tr(r, branch(t1, a, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), b ' + p0, r0) * tr(r0, (b ⊃ t2(p0);t1(p0)))), p0 ∈ (b ⊃ t2;t1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ |
⊦ tr(r, branch(t0, a, t1)) = _∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t0) * tr(r1, t1))
_∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), b ' + p0, r0) * tr(r0, (b ⊃ t2(p0);t1(p0)))), p0 ∈ (b ⊃ t2;t1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦
Used terms: r, t1, a, t2
| ⊦ tr(r, branch(t0, a, t1)) = _∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t0) * tr(r1, t1)) |
| _∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), b ' + p0, r0) * tr(r0, (b ⊃ t2(p0);t1(p0)))), p0 ∈ (b ⊃ t2;t1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ |
b, _∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), b ' + p0, r0) * tr(r0, (b ⊃ t2(p0);t1(p0)))), p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦
¬ b, _∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), b ' + p0, r0) * tr(r0, (b ⊃ t2(p0);t1(p0)))), p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦
| b, _∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), b ' + p0, r0) * tr(r0, (b ⊃ t2(p0);t1(p0)))), p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ |
_∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0))), p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦
| _∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0))), p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ |
¬((_∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)))(h) ↔ (_∃(λ r0. trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0))))(h)), p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦
| ¬((_∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)))(h) ↔ (_∃(λ r0. trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0))))(h)), p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ |
p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ (∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)) ↔ (∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h))
Used simplifier rules: ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s) ⊦ (_∃ bcP)(h) ↔ (∃ b, c. bcP(b, c)(h)); (s)
| p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ (∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)) ↔ (∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h)) |
p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0, ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h)
p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0, ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)
| p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0, ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h) |
p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h)
| p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h) |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
p0 ∈ t2, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ (r => mknode(r0, a, r1) * tr(r0, t1))(h0) ∧ tr(r1, t2)(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h)
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep Used terms: h, r => mknode(r0, a, r1) * tr(r0, t1), tr(r1, t2)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| p0 ∈ t2, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ (r => mknode(r0, a, r1) * tr(r0, t1))(h0) ∧ tr(r1, t2)(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h) |
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h0 ∪ h1)
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h0 ∪ h1) |
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), tr(r1, t2) = _∃(λ r. trp(r1, t2, p0, r) * tr(r, t2(p0))) ∨ ¬ p0 ∈ t2 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h0 ∪ h1)
Used terms: r1, t2
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), tr(r1, t2) = _∃(λ r. trp(r1, t2, p0, r) * tr(r, t2(p0))) ∨ ¬ p0 ∈ t2 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h0 ∪ h1) |
tr(r1, t2) = _∃(λ r. trp(r1, t2, p0, r) * tr(r, t2(p0))), h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h0 ∪ h1)
| tr(r1, t2) = _∃(λ r. trp(r1, t2, p0, r) * tr(r, t2(p0))), h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h0 ∪ h1) |
tr(r1, t2)(h1) ↔ (_∃(λ r. trp(r1, t2, p0, r) * tr(r, t2(p0))))(h1), h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h0 ∪ h1)
Used terms: h1
| tr(r1, t2)(h1) ↔ (_∃(λ r. trp(r1, t2, p0, r) * tr(r, t2(p0))))(h1), h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h0 ∪ h1) |
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), (trp(r1, t2, p0, r2) * tr(r2, t2(p0)))(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h0 ∪ h1)
Used simplifier rules: ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s)
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), (trp(r1, t2, p0, r2) * tr(r2, t2(p0)))(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h0 ∪ h1) |
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), (trp(r1, t2, p0, r2) * tr(r2, t2(p0)))(h1), ¬ (trp(r, branch(t1, a, t2), true ' + p0, r2) * tr(r2, t2(p0)))(h0 ∪ h1) ⊦
Used terms: r2
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), (trp(r1, t2, p0, r2) * tr(r2, t2(p0)))(h1), ¬ (trp(r, branch(t1, a, t2), true ' + p0, r2) * tr(r2, t2(p0)))(h0 ∪ h1) ⊦ |
⊦ trp(r, branch(t1, a, t2), b ' + p, r0) = _∃(λ r1, r2. r => mknode(r1, a, r2) * (b ⊃ tr(r1, t1) * trp(r2, t2, p, r0);trp(r1, t1, p, r0) * tr(r2, t2)))
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), (trp(r1, t2, p0, r2) * tr(r2, t2(p0)))(h1), ¬ (_∃(λ r1, r3. r => mknode(r1, a, r3) * (true ⊃ tr(r1, t1) * trp(r3, t2, p0, r2);trp(r1, t1, p0, r2) * tr(r3, t2))) * tr(r2, t2(p0)))(h0 ∪ h1) ⊦
Used terms: r, p0, true, r2, t2, a, t1
| ⊦ trp(r, branch(t1, a, t2), b ' + p, r0) = _∃(λ r1, r2. r => mknode(r1, a, r2) * (b ⊃ tr(r1, t1) * trp(r2, t2, p, r0);trp(r1, t1, p, r0) * tr(r2, t2))) |
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), (trp(r1, t2, p0, r2) * tr(r2, t2(p0)))(h1), ¬ (_∃(λ r1, r3. r => mknode(r1, a, r3) * (true ⊃ tr(r1, t1) * trp(r3, t2, p0, r2);trp(r1, t1, p0, r2) * tr(r3, t2))) * tr(r2, t2(p0)))(h0 ∪ h1) ⊦ |
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), (trp(r1, t2, p0, r2) * tr(r2, t2(p0)))(h1) ⊦ ∃ r0, c. ((r => mknode(r0, a, c) * tr(r0, t1) * trp(c, t2, p0, r2)) * tr(r2, t2(p0)))(h0 ∪ h1)
Used simplifier rules: sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep ⊦ (_∃ bcP * hP)(h) ↔ (∃ b, c. (bcP(b, c) * hP)(h)); (s)
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r0, a, r1) * tr(r0, t1))(h0), tr(r1, t2)(h1), (trp(r1, t2, p0, r2) * tr(r2, t2(p0)))(h1) ⊦ ∃ r0, c. ((r => mknode(r0, a, c) * tr(r0, t1) * trp(c, t2, p0, r2)) * tr(r2, t2(p0)))(h0 ∪ h1) |
Used simplifier rules: ⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1); (ss) sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep Used terms: r0, r1
| p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0, ∃ r0. (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) |
p0 ∈ t2, (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)
| p0 ∈ t2, (trp(r, branch(t1, a, t2), true ' + p0, r0) * tr(r0, t2(p0)))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) |
⊦ trp(r, branch(t1, a, t2), b ' + p, r0) = _∃(λ r1, r2. r => mknode(r1, a, r2) * (b ⊃ tr(r1, t1) * trp(r2, t2, p, r0);trp(r1, t1, p, r0) * tr(r2, t2)))
(_∃(λ r1, r2. r => mknode(r1, a, r2) * (true ⊃ tr(r1, t1) * trp(r2, t2, p0, r0);trp(r1, t1, p0, r0) * tr(r2, t2))) * tr(r0, t2(p0)))(h), p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)
Used terms: r, p0, true, r0, t2, a, t1
| ⊦ trp(r, branch(t1, a, t2), b ' + p, r0) = _∃(λ r1, r2. r => mknode(r1, a, r2) * (b ⊃ tr(r1, t1) * trp(r2, t2, p, r0);trp(r1, t1, p, r0) * tr(r2, t2))) |
| (_∃(λ r1, r2. r => mknode(r1, a, r2) * (true ⊃ tr(r1, t1) * trp(r2, t2, p0, r0);trp(r1, t1, p0, r0) * tr(r2, t2))) * tr(r0, t2(p0)))(h), p0 ∈ t2, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) |
p0 ∈ t2, ((r => mknode(r1, a, r2) * tr(r1, t1) * trp(r2, t2, p0, r0)) * tr(r0, t2(p0)))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)
Used simplifier rules: sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep ⊦ (_∃ bcP * hP)(h) ↔ (∃ b, c. (bcP(b, c) * hP)(h)); (s)
| p0 ∈ t2, ((r => mknode(r1, a, r2) * tr(r1, t1) * trp(r2, t2, p0, r0)) * tr(r0, t2(p0)))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
p0 ∈ t2, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0) ∧ (r => mknode(r1, a, r2) * tr(r1, t1))(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep Used terms: h, trp(r2, t2, p0, r0) * tr(r0, t2(p0)), r => mknode(r1, a, r2) * tr(r1, t1)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| p0 ∈ t2, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0) ∧ (r => mknode(r1, a, r2) * tr(r1, t1))(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) |
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1)
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1) |
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0), tr(r2, t2) = _∃(λ r1. trp(r2, t2, p0, r1) * tr(r1, t2(p0))) ∨ ¬ p0 ∈ t2 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1)
Used terms: r2, t2
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0), tr(r2, t2) = _∃(λ r1. trp(r2, t2, p0, r1) * tr(r1, t2(p0))) ∨ ¬ p0 ∈ t2 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1) |
tr(r2, t2) = _∃(λ r1. trp(r2, t2, p0, r1) * tr(r1, t2(p0))), h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1)
| tr(r2, t2) = _∃(λ r1. trp(r2, t2, p0, r1) * tr(r1, t2(p0))), h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1) |
tr(r2, t2)(h0) ↔ (_∃(λ r1. trp(r2, t2, p0, r1) * tr(r1, t2(p0))))(h0), h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1)
Used terms: h0
| tr(r2, t2)(h0) ↔ (_∃(λ r1. trp(r2, t2, p0, r1) * tr(r1, t2(p0))))(h0), h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1) |
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0), tr(r2, t2)(h0) ↔ (∃ r. (trp(r2, t2, p0, r) * tr(r, t2(p0)))(h0)) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1)
Used simplifier rules: ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s)
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0), tr(r2, t2)(h0) ↔ (∃ r. (trp(r2, t2, p0, r) * tr(r, t2(p0)))(h0)) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1) |
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0), ¬ tr(r2, t2)(h0) ⊦ ∃ r. (trp(r2, t2, p0, r) * tr(r, t2(p0)))(h0), ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1)
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), tr(r2, t2)(h0), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0), ∃ r. (trp(r2, t2, p0, r) * tr(r, t2(p0)))(h0) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1)
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0), ¬ tr(r2, t2)(h0) ⊦ ∃ r. (trp(r2, t2, p0, r) * tr(r, t2(p0)))(h0), ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1) |
Used terms: r0
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), tr(r2, t2)(h0), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0), ∃ r. (trp(r2, t2, p0, r) * tr(r, t2(p0)))(h0) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1) |
h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), tr(r2, t2)(h0), (trp(r2, t2, p0, r3) * tr(r3, t2(p0)))(h0), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1)
| h0 ⊥ h1, p0 ∈ t2, (r => mknode(r1, a, r2) * tr(r1, t1))(h1), tr(r2, t2)(h0), (trp(r2, t2, p0, r3) * tr(r3, t2(p0)))(h0), (trp(r2, t2, p0, r0) * tr(r0, t2(p0)))(h0) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1) |
Used simplifier rules: ⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1); (ss) sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep Used terms: r1, r2
| ¬ b, _∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), b ' + p0, r0) * tr(r0, (b ⊃ t2(p0);t1(p0)))), p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ |
_∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0))), p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦
| _∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)) ≠ _∃(λ r0. trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0))), p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ |
¬ ((_∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)))(h) ↔ (_∃(λ r0. trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0))))(h)), p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦
| ¬ ((_∃(λ r0, r1. r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2)))(h) ↔ (_∃(λ r0. trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0))))(h)), p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ |
p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ (∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)) ↔ (∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h))
Used simplifier rules: ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s) ⊦ (_∃ bcP)(h) ↔ (∃ b, c. bcP(b, c)(h)); (s)
| p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ (∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)) ↔ (∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h)) |
p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0, ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h)
p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0, ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)
| p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0, ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h) |
p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h)
| p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r0, t1) * tr(r1, t2))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h) |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
p0 ∈ t1, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ (r => mknode(r0, a, r1) * tr(r1, t2))(h0) ∧ tr(r0, t1)(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h)
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep Used terms: h, r => mknode(r0, a, r1) * tr(r1, t2), tr(r0, t1)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| p0 ∈ t1, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ (r => mknode(r0, a, r1) * tr(r1, t2))(h0) ∧ tr(r0, t1)(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h) |
h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h0 ∪ h1)
| h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h0 ∪ h1) |
h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), tr(r0, t1) = _∃(λ r1. trp(r0, t1, p0, r1) * tr(r1, t1(p0))) ∨ ¬ p0 ∈ t1 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h0 ∪ h1)
Used terms: r0, t1
| h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), tr(r0, t1) = _∃(λ r1. trp(r0, t1, p0, r1) * tr(r1, t1(p0))) ∨ ¬ p0 ∈ t1 ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h0 ∪ h1) |
tr(r0, t1) = _∃(λ r1. trp(r0, t1, p0, r1) * tr(r1, t1(p0))), h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h0 ∪ h1)
| tr(r0, t1) = _∃(λ r1. trp(r0, t1, p0, r1) * tr(r1, t1(p0))), h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h0 ∪ h1) |
tr(r0, t1)(h1) ↔ (_∃(λ r1. trp(r0, t1, p0, r1) * tr(r1, t1(p0))))(h1), h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h0 ∪ h1)
Used terms: h1
| tr(r0, t1)(h1) ↔ (_∃(λ r1. trp(r0, t1, p0, r1) * tr(r1, t1(p0))))(h1), h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h0 ∪ h1) |
h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), (trp(r0, t1, p0, r2) * tr(r2, t1(p0)))(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h0 ∪ h1)
Used simplifier rules: ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s)
| h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), (trp(r0, t1, p0, r2) * tr(r2, t1(p0)))(h1) ⊦ ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h0 ∪ h1) |
h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), (trp(r0, t1, p0, r2) * tr(r2, t1(p0)))(h1), ¬ (trp(r, branch(t1, a, t2), false ' + p0, r2) * tr(r2, t1(p0)))(h0 ∪ h1) ⊦
Used terms: r2
| h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), (trp(r0, t1, p0, r2) * tr(r2, t1(p0)))(h1), ¬ (trp(r, branch(t1, a, t2), false ' + p0, r2) * tr(r2, t1(p0)))(h0 ∪ h1) ⊦ |
⊦ trp(r, branch(t1, a, t2), b ' + p, r0) = _∃(λ r1, r2. r => mknode(r1, a, r2) * (b ⊃ tr(r1, t1) * trp(r2, t2, p, r0);trp(r1, t1, p, r0) * tr(r2, t2)))
h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), (trp(r0, t1, p0, r2) * tr(r2, t1(p0)))(h1), ¬ (_∃(λ r1, r3. r => mknode(r1, a, r3) * (false ⊃ tr(r1, t1) * trp(r3, t2, p0, r2);trp(r1, t1, p0, r2) * tr(r3, t2))) * tr(r2, t1(p0)))(h0 ∪ h1) ⊦
Used terms: r, p0, false, r2, t2, a, t1
| ⊦ trp(r, branch(t1, a, t2), b ' + p, r0) = _∃(λ r1, r2. r => mknode(r1, a, r2) * (b ⊃ tr(r1, t1) * trp(r2, t2, p, r0);trp(r1, t1, p, r0) * tr(r2, t2))) |
| h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), (trp(r0, t1, p0, r2) * tr(r2, t1(p0)))(h1), ¬ (_∃(λ r1, r3. r => mknode(r1, a, r3) * (false ⊃ tr(r1, t1) * trp(r3, t2, p0, r2);trp(r1, t1, p0, r2) * tr(r3, t2))) * tr(r2, t1(p0)))(h0 ∪ h1) ⊦ |
h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), (trp(r0, t1, p0, r2) * tr(r2, t1(p0)))(h1) ⊦ ∃ r0, c. ((r => mknode(r0, a, c) * trp(r0, t1, p0, r2) * tr(c, t2)) * tr(r2, t1(p0)))(h0 ∪ h1)
Used simplifier rules: sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep ⊦ (_∃ bcP * hP)(h) ↔ (∃ b, c. (bcP(b, c) * hP)(h)); (s)
| h0 ⊥ h1, p0 ∈ t1, (r => mknode(r0, a, r1) * tr(r1, t2))(h0), tr(r0, t1)(h1), (trp(r0, t1, p0, r2) * tr(r2, t1(p0)))(h1) ⊦ ∃ r0, c. ((r => mknode(r0, a, c) * trp(r0, t1, p0, r2) * tr(c, t2)) * tr(r2, t1(p0)))(h0 ∪ h1) |
Used simplifier rules: ⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1); (ss) sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep Used terms: r0, r1
| p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0, ∃ r0. (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h) ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) |
p0 ∈ t1, (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)
| p0 ∈ t1, (trp(r, branch(t1, a, t2), false ' + p0, r0) * tr(r0, t1(p0)))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) |
⊦ trp(r, branch(t1, a, t2), b ' + p, r0) = _∃(λ r1, r2. r => mknode(r1, a, r2) * (b ⊃ tr(r1, t1) * trp(r2, t2, p, r0);trp(r1, t1, p, r0) * tr(r2, t2)))
(_∃(λ r1, r2. r => mknode(r1, a, r2) * (false ⊃ tr(r1, t1) * trp(r2, t2, p0, r0);trp(r1, t1, p0, r0) * tr(r2, t2))) * tr(r0, t1(p0)))(h), p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)
Used terms: r, p0, false, r0, t2, a, t1
| ⊦ trp(r, branch(t1, a, t2), b ' + p, r0) = _∃(λ r1, r2. r => mknode(r1, a, r2) * (b ⊃ tr(r1, t1) * trp(r2, t2, p, r0);trp(r1, t1, p, r0) * tr(r2, t2))) |
| (_∃(λ r1, r2. r => mknode(r1, a, r2) * (false ⊃ tr(r1, t1) * trp(r2, t2, p0, r0);trp(r1, t1, p0, r0) * tr(r2, t2))) * tr(r0, t1(p0)))(h), p0 ∈ t1, ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) |
p0 ∈ t1, ((r => mknode(r1, a, r2) * trp(r1, t1, p0, r0) * tr(r2, t2)) * tr(r0, t1(p0)))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)
Used simplifier rules: sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep ⊦ (_∃ bcP * hP)(h) ↔ (∃ b, c. (bcP(b, c) * hP)(h)); (s)
| p0 ∈ t1, ((r => mknode(r1, a, r2) * trp(r1, t1, p0, r0) * tr(r2, t2)) * tr(r0, t1(p0)))(h), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
p0 ∈ t1, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0) ∧ (r => mknode(r1, a, r2) * tr(r2, t2))(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h)
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep Used terms: h, trp(r1, t1, p0, r0) * tr(r0, t1(p0)), r => mknode(r1, a, r2) * tr(r2, t2)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| p0 ∈ t1, ∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0) ∧ (r => mknode(r1, a, r2) * tr(r2, t2))(h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h) |
h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1)
| h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ ∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t1) * tr(c, t2))(h0 ∪ h1) |
h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ¬ (r => mknode(r1, a, r2) * tr(r1, t1) * tr(r2, t2))(h0 ∪ h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦
Used terms: r1, r2
| h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ¬ (r => mknode(r1, a, r2) * tr(r1, t1) * tr(r2, t2))(h0 ∪ h1), ∀ r0, t0. tr(r0, t0) = _∃(λ r1. trp(r0, t0, p0, r1) * tr(r1, t0(p0))) ∨ ¬ p0 ∈ t0 ⊦ |
h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ¬ (r => mknode(r1, a, r2) * tr(r1, t1) * tr(r2, t2))(h0 ∪ h1), tr(r1, t1) = _∃(λ r. trp(r1, t1, p0, r) * tr(r, t1(p0))) ∨ ¬ p0 ∈ t1 ⊦
Used terms: r1, t1
| h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ¬ (r => mknode(r1, a, r2) * tr(r1, t1) * tr(r2, t2))(h0 ∪ h1), tr(r1, t1) = _∃(λ r. trp(r1, t1, p0, r) * tr(r, t1(p0))) ∨ ¬ p0 ∈ t1 ⊦ |
tr(r1, t1) = _∃(λ r. trp(r1, t1, p0, r) * tr(r, t1(p0))), h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ¬ (r => mknode(r1, a, r2) * tr(r1, t1) * tr(r2, t2))(h0 ∪ h1) ⊦
| tr(r1, t1) = _∃(λ r. trp(r1, t1, p0, r) * tr(r, t1(p0))), h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ¬ (r => mknode(r1, a, r2) * tr(r1, t1) * tr(r2, t2))(h0 ∪ h1) ⊦ |
tr(r1, t1)(h0) ↔ (_∃(λ r. trp(r1, t1, p0, r) * tr(r, t1(p0))))(h0), h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ¬ (r => mknode(r1, a, r2) * tr(r1, t1) * tr(r2, t2))(h0 ∪ h1) ⊦
Used terms: h0
| tr(r1, t1)(h0) ↔ (_∃(λ r. trp(r1, t1, p0, r) * tr(r, t1(p0))))(h0), h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ¬ (r => mknode(r1, a, r2) * tr(r1, t1) * tr(r2, t2))(h0 ∪ h1) ⊦ |
h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ¬ (r => mknode(r1, a, r2) * tr(r1, t1) * tr(r2, t2))(h0 ∪ h1), ¬ tr(r1, t1)(h0) ⊦ ∃ r. (trp(r1, t1, p0, r) * tr(r, t1(p0)))(h0)
Used simplifier rules: sep-com: ⊦ hP0 * hP1 = hP1 * hP0; from specification heap-sep sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep ⊦ hP0(h0) ∧ hP1(h1) ∧ h0 ⊥ h1 → (hP0 * hP1)(h0 ∪ h1); (ss) ⊦ (_∃ bP)(h) ↔ (∃ b. bP(b)(h)); (s)
| h0 ⊥ h1, p0 ∈ t1, (r => mknode(r1, a, r2) * tr(r2, t2))(h1), (trp(r1, t1, p0, r0) * tr(r0, t1(p0)))(h0), ¬ (r => mknode(r1, a, r2) * tr(r1, t1) * tr(r2, t2))(h0 ∪ h1), ¬ tr(r1, t1)(h0) ⊦ ∃ r. (trp(r1, t1, p0, r) * tr(r, t1(p0)))(h0) |
Used terms: r0
The following image shows the proof tree of sequent calculus. The proved goal is at the bottom. You can click on the nodes to view additional rules. See here for details on colors in a proof tree.