| ⊦ p ∈ t → trp(r, t(p := t0), p, r1) = trp(r, t, p, r1) |
trp(r, t(p := t0), p, r1) ≠ trp(r, t, p, r1), p ∈ t ⊦
| trp(r, t(p := t0), p, r1) ≠ trp(r, t, p, r1), p ∈ t ⊦ |
trp(r, t(b + p0 := t0), b + p0, r1) ≠ trp(r, t, b + p0, r1), b + p0 ∈ t, ∀ r, t, t0, r1. ¬(trp(r, t(p0 := t0), p0, r1) ≠ trp(r, t, p0, r1) ∧ p0 ∈ t) ⊦
Used simplifier rules: trp-base: ⊦ trp(r, t, [], r0) = (⌜r = r0⌝ ∧ emp); List[A] freely generated by [], +; ⊦ t([] := t0) = t0; (s) ⊦ hP0 = hP1 → ((hP ∧ hP0) = (hP ∧ hP1) ↔ true); (ss) and-ass: ⊦ ((hP0 ∧ hP1) ∧ hP2) = (hP0 ∧ hP1 ∧ hP2); from specification heap-sep and-com: ⊦ (hP0 ∧ hP1) = (hP1 ∧ hP0); from specification heap-sep
| trp(r, t(b + p0 := t0), b + p0, r1) ≠ trp(r, t, b + p0, r1), b + p0 ∈ t, ∀ r, t, t0, r1. ¬(trp(r, t(p0 := t0), p0, r1) ≠ trp(r, t, p0, r1) ∧ p0 ∈ t) ⊦ |
trp(r, t(b ' + p0 := t0), b ' + p0, r1) ≠ trp(r, t, b ' + p0, r1), b ' + p0 ∈ t, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
Used simplifier rules: ⊦ a + x = a ' + x; (s)
| trp(r, t(b ' + p0 := t0), b ' + p0, r1) ≠ trp(r, t, b ' + p0, r1), b ' + p0 ∈ t, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
t = branch(t3, a, t4), trp(r, t(b ' + p0 := t0), b ' + p0, r1) ≠ trp(r, t, b ' + p0, r1), b ' + p0 ∈ t, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
Used simplifier rules: trp-leaf: ⊦ trp(r, leaf, b ' + p, r0) = false; Tree[A] freely generated by leaf, branch; ⊦ p ∈ leaf ↔ p = []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list
| t = branch(t3, a, t4), trp(r, t(b ' + p0 := t0), b ' + p0, r1) ≠ trp(r, t, b ' + p0, r1), b ' + p0 ∈ t, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
trp(r, (b ⊃ branch(t3, a, t4(p0 := t0));branch(t3(p0 := t0), a, t4)), b ' + p0, r1) ≠ trp(r, branch(t3, a, t4), b ' + p0, r1), p0 ∈ (b ⊃ t4;t3), ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
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 := t0) = (b ⊃ branch(t1, a, t2(p := t0));branch(t1(p := t0), a, t2)); (s)
| trp(r, (b ⊃ branch(t3, a, t4(p0 := t0));branch(t3(p0 := t0), a, t4)), b ' + p0, r1) ≠ trp(r, branch(t3, a, t4), b ' + p0, r1), p0 ∈ (b ⊃ t4;t3), ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
b, trp(r, branch(t3, a, t4(p0 := t0)), b ' + p0, r1) ≠ trp(r, branch(t3, a, t4), b ' + p0, r1), p0 ∈ (b ⊃ t4;t3), ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
¬ b, trp(r, branch(t3(p0 := t0), a, t4), b ' + p0, r1) ≠ trp(r, branch(t3, a, t4), b ' + p0, r1), p0 ∈ (b ⊃ t4;t3), ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
| b, trp(r, branch(t3, a, t4(p0 := t0)), b ' + p0, r1) ≠ trp(r, branch(t3, a, t4), b ' + p0, r1), p0 ∈ (b ⊃ t4;t3), ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
trp(r, branch(t3, a, t4(p0 := t0)), true ' + p0, r1) ≠ trp(r, branch(t3, a, t4), true ' + p0, r1), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
| trp(r, branch(t3, a, t4(p0 := t0)), true ' + p0, r1) ≠ trp(r, branch(t3, a, t4), true ' + p0, r1), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ 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)))
_∃(λ r2, r3. r => mknode(r2, a, r3) * (true ⊃ tr(r2, t3) * trp(r3, t4(p0 := t0), p0, r1);trp(r2, t3, p0, r1) * tr(r3, t4(p0 := t0)))) ≠ trp(r, branch(t3, a, t4), true ' + p0, r1), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: r, p0, true, r1, t4(p0 := t0), a, t3
| ⊦ 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))) |
| _∃(λ r2, r3. r => mknode(r2, a, r3) * (true ⊃ tr(r2, t3) * trp(r3, t4(p0 := t0), p0, r1);trp(r2, t3, p0, r1) * tr(r3, t4(p0 := t0)))) ≠ trp(r, branch(t3, a, t4), true ' + p0, r1), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
_∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4(p0 := t0), p0, r1)) ≠ trp(r, branch(t3, a, t4), true ' + p0, r1), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep
| _∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4(p0 := t0), p0, r1)) ≠ trp(r, branch(t3, a, t4), true ' + p0, r1), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ 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)))
_∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4(p0 := t0), p0, r1)) ≠ _∃(λ r2, r3. r => mknode(r2, a, r3) * (true ⊃ tr(r2, t3) * trp(r3, t4, p0, r1);trp(r2, t3, p0, r1) * tr(r3, t4))), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: r, p0, true, r1, t4, a, t3
| ⊦ 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))) |
| _∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4(p0 := t0), p0, r1)) ≠ _∃(λ r2, r3. r => mknode(r2, a, r3) * (true ⊃ tr(r2, t3) * trp(r3, t4, p0, r1);trp(r2, t3, p0, r1) * tr(r3, t4))), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
_∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4(p0 := t0), p0, r1)) ≠ _∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4, p0, r1)), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep
| _∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4(p0 := t0), p0, r1)) ≠ _∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4, p0, r1)), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
¬ ( (_∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4(p0 := t0), p0, r1)))(h) ↔ (_∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4, p0, r1)))(h)), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
| ¬ ( (_∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4(p0 := t0), p0, r1)))(h) ↔ (_∃(λ r2, r3. r => mknode(r2, a, r3) * tr(r2, t3) * trp(r3, t4, p0, r1)))(h)), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t3) * trp(c, t4(p0 := t0), p0, r1))(h)) ↔ (∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t3) * trp(c, t4, p0, r1))(h))
Used simplifier rules: ⊦ (_∃ bcP)(h) ↔ (∃ b, c. bcP(b, c)(h)); (s)
| p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t3) * trp(c, t4(p0 := t0), p0, r1))(h)) ↔ (∃ r0, c. (r => mknode(r0, a, c) * tr(r0, t3) * trp(c, t4, p0, r1))(h)) |
¬((r => mknode(r0, a, c) * tr(r0, t3) * trp(c, t4(p0 := t0), p0, r1))(h) ↔ (r => mknode(r0, a, c) * tr(r0, t3) * trp(c, t4, p0, r1))(h)), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
| ¬((r => mknode(r0, a, c) * tr(r0, t3) * trp(c, t4(p0 := t0), p0, r1))(h) ↔ (r => mknode(r0, a, c) * tr(r0, t3) * trp(c, t4, p0, r1))(h)), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (r => mknode(r0, a, c) * tr(r0, t3) * trp(c, t4(p0 := t0), p0, r1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(c, t4, p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(r0, t3))(h1))
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(c, t4, p0, r1), r => mknode(r0, a, c) * tr(r0, t3)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (r => mknode(r0, a, c) * tr(r0, t3) * trp(c, t4(p0 := t0), p0, r1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(c, t4, p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(r0, t3))(h1)) |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(c, t4(p0 := t0), p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(r0, t3))(h1)) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(c, t4, p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(r0, t3))(h1))
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(c, t4(p0 := t0), p0, r1), r => mknode(r0, a, c) * tr(r0, t3)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(c, t4(p0 := t0), p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(r0, t3))(h1)) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(c, t4, p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(r0, t3))(h1)) |
¬ ( h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(c, t4(p0 := t0), p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(r0, t3))(h1) ↔ h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(c, t4, p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(r0, t3))(h1)), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
| ¬ ( h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(c, t4(p0 := t0), p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(r0, t3))(h1) ↔ h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(c, t4, p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(r0, t3))(h1)), p0 ∈ t4, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
¬(trp(c, t4(p0 := t0), p0, r1)(h0) ↔ trp(c, t4, p0, r1)(h0)), h0 ⊥ h1, p0 ∈ t4, (r => mknode(r0, a, c) * tr(r0, t3))(h1), ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
| ¬(trp(c, t4(p0 := t0), p0, r1)(h0) ↔ trp(c, t4, p0, r1)(h0)), h0 ⊥ h1, p0 ∈ t4, (r => mknode(r0, a, c) * tr(r0, t3))(h1), ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
Used terms: c, t4, t0, r1
| ¬ b, trp(r, branch(t3(p0 := t0), a, t4), b ' + p0, r1) ≠ trp(r, branch(t3, a, t4), b ' + p0, r1), p0 ∈ (b ⊃ t4;t3), ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
trp(r, branch(t3(p0 := t0), a, t4), false ' + p0, r1) ≠ trp(r, branch(t3, a, t4), false ' + p0, r1), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
| trp(r, branch(t3(p0 := t0), a, t4), false ' + p0, r1) ≠ trp(r, branch(t3, a, t4), false ' + p0, r1), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ 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)))
_∃(λ r2, r3. r => mknode(r2, a, r3) * (false ⊃ tr(r2, t3(p0 := t0)) * trp(r3, t4, p0, r1);trp(r2, t3(p0 := t0), p0, r1) * tr(r3, t4))) ≠ trp(r, branch(t3, a, t4), false ' + p0, r1), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: r, p0, false, r1, t4, a, t3(p0 := t0)
| ⊦ 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))) |
| _∃(λ r2, r3. r => mknode(r2, a, r3) * (false ⊃ tr(r2, t3(p0 := t0)) * trp(r3, t4, p0, r1);trp(r2, t3(p0 := t0), p0, r1) * tr(r3, t4))) ≠ trp(r, branch(t3, a, t4), false ' + p0, r1), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
_∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3(p0 := t0), p0, r1) * tr(r3, t4)) ≠ trp(r, branch(t3, a, t4), false ' + p0, r1), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep
| _∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3(p0 := t0), p0, r1) * tr(r3, t4)) ≠ trp(r, branch(t3, a, t4), false ' + p0, r1), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ 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)))
_∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3(p0 := t0), p0, r1) * tr(r3, t4)) ≠ _∃(λ r2, r3. r => mknode(r2, a, r3) * (false ⊃ tr(r2, t3) * trp(r3, t4, p0, r1);trp(r2, t3, p0, r1) * tr(r3, t4))), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: r, p0, false, r1, t4, a, t3
| ⊦ 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))) |
| _∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3(p0 := t0), p0, r1) * tr(r3, t4)) ≠ _∃(λ r2, r3. r => mknode(r2, a, r3) * (false ⊃ tr(r2, t3) * trp(r3, t4, p0, r1);trp(r2, t3, p0, r1) * tr(r3, t4))), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
_∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3(p0 := t0), p0, r1) * tr(r3, t4)) ≠ _∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3, p0, r1) * tr(r3, t4)), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
Used simplifier rules: sep-ass: ⊦ (hP0 * hP1) * hP2 = hP0 * hP1 * hP2; from specification heap-sep
| _∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3(p0 := t0), p0, r1) * tr(r3, t4)) ≠ _∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3, p0, r1) * tr(r3, t4)), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
¬ ( (_∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3(p0 := t0), p0, r1) * tr(r3, t4)))(h) ↔ (_∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3, p0, r1) * tr(r3, t4)))(h)), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
| ¬ ( (_∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3(p0 := t0), p0, r1) * tr(r3, t4)))(h) ↔ (_∃(λ r2, r3. r => mknode(r2, a, r3) * trp(r2, t3, p0, r1) * tr(r3, t4)))(h)), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (∃ r0, c. (r => mknode(r0, a, c) * trp(r0, t3(p0 := t0), p0, r1) * tr(c, t4))(h)) ↔ (∃ r0, c. (r => mknode(r0, a, c) * trp(r0, t3, p0, r1) * tr(c, t4))(h))
Used simplifier rules: ⊦ (_∃ bcP)(h) ↔ (∃ b, c. bcP(b, c)(h)); (s)
| p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (∃ r0, c. (r => mknode(r0, a, c) * trp(r0, t3(p0 := t0), p0, r1) * tr(c, t4))(h)) ↔ (∃ r0, c. (r => mknode(r0, a, c) * trp(r0, t3, p0, r1) * tr(c, t4))(h)) |
¬((r => mknode(r0, a, c) * trp(r0, t3(p0 := t0), p0, r1) * tr(c, t4))(h) ↔ (r => mknode(r0, a, c) * trp(r0, t3, p0, r1) * tr(c, t4))(h)), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
| ¬((r => mknode(r0, a, c) * trp(r0, t3(p0 := t0), p0, r1) * tr(c, t4))(h) ↔ (r => mknode(r0, a, c) * trp(r0, t3, p0, r1) * tr(c, t4))(h)), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(r0, t3(p0 := t0), p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(c, t4))(h1)) ↔ (r => mknode(r0, a, c) * trp(r0, t3, p0, r1) * tr(c, t4))(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(r0, t3(p0 := t0), p0, r1), r => mknode(r0, a, c) * tr(c, t4)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(r0, t3(p0 := t0), p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(c, t4))(h1)) ↔ (r => mknode(r0, a, c) * trp(r0, t3, p0, r1) * tr(c, t4))(h) |
⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(r0, t3(p0 := t0), p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(c, t4))(h1)) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(r0, t3, p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(c, t4))(h1))
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(r0, t3, p0, r1), r => mknode(r0, a, c) * tr(c, t4)
| ⊦ (hP0 * hP1)(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(r0, t3(p0 := t0), p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(c, t4))(h1)) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(r0, t3, p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(c, t4))(h1)) |
¬ ( h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(r0, t3(p0 := t0), p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(c, t4))(h1) ↔ h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(r0, t3, p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(c, t4))(h1)), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
| ¬ ( h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(r0, t3(p0 := t0), p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(c, t4))(h1) ↔ h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ trp(r0, t3, p0, r1)(h0) ∧ (r => mknode(r0, a, c) * tr(c, t4))(h1)), p0 ∈ t3, ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
¬(trp(r0, t3(p0 := t0), p0, r1)(h0) ↔ trp(r0, t3, p0, r1)(h0)), h0 ⊥ h1, p0 ∈ t3, (r => mknode(r0, a, c) * tr(c, t4))(h1), ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦
| ¬(trp(r0, t3(p0 := t0), p0, r1)(h0) ↔ trp(r0, t3, p0, r1)(h0)), h0 ⊥ h1, p0 ∈ t3, (r => mknode(r0, a, c) * tr(c, t4))(h1), ∀ r0, t1, t2, r2. trp(r0, t1(p0 := t2), p0, r2) = trp(r0, t1, p0, r2) ∨ ¬ p0 ∈ t1 ⊦ |
Used terms: r0, t3, t0, r1
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.