| ⊦ reachable(r, r0, h) ∧ reachable(r0, r1, h) ∧ ¬ reachable(r1, r0, h) → (reachable(r, r0, h[r1 := ce]) ↔ true) |
¬(reachable(r, r0, h[r1 := ce]) ↔ true), reachable(r, r0, h), reachable(r0, r1, h), ¬ reachable(r1, r0, h) ⊦
| ¬(reachable(r, r0, h[r1 := ce]) ↔ true), reachable(r, r0, h), reachable(r0, r1, h), ¬ reachable(r1, r0, h) ⊦ |
reachable(r0, r1, h), reachable(r, r0, h), ¬ reachable(r1, r0, h), ¬ reachable(r, r0, h[r1 := ce]) ⊦
| reachable(r0, r1, h), reachable(r, r0, h), ¬ reachable(r1, r0, h), ¬ reachable(r, r0, h[r1 := ce]) ⊦ |
⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0)
reachable(r0, r1, h), ¬ reachable(r1, r0, h), ¬ reachable(r, r0, h[r1 := ce]), ∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0 ⊦
Used terms: h, r0, r
| ⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0) |
| reachable(r0, r1, h), ¬ reachable(r1, r0, h), ¬ reachable(r, r0, h[r1 := ce]), ∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0 ⊦ |
path(r ' + x, h), reachable((r ' + x).last, r1, h), ¬ reachable(r1, (r ' + x).last, h), ¬ reachable(r, (r ' + x).last, h[r1 := ce]) ⊦
| path(r ' + x, h), reachable((r ' + x).last, r1, h), ¬ reachable(r1, (r ' + x).last, h), ¬ reachable(r, (r ' + x).last, h[r1 := ce]) ⊦ |
⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0)
path(r ' + x, h), reachable((r ' + x).last, r1, h), ¬ reachable(r1, (r ' + x).last, h), ∀ x0. ¬(path(r ' + x0, h[r1 := ce]) ∧ (r ' + x0).last = (r ' + x).last) ⊦
Used terms: h[r1 := ce], (r ' + x).last, r
| ⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0) |
| path(r ' + x, h), reachable((r ' + x).last, r1, h), ¬ reachable(r1, (r ' + x).last, h), ∀ x0. ¬(path(r ' + x0, h[r1 := ce]) ∧ (r ' + x0).last = (r ' + x).last) ⊦ |
path(r ' + x, h), reachable((r ' + x).last, r1, h), ¬ reachable(r1, (r ' + x).last, h) ⊦ path(r ' + x, h[r1 := ce]) ∧ (r ' + x).last = (r ' + x).last
Used terms: x
| path(r ' + x, h), reachable((r ' + x).last, r1, h), ¬ reachable(r1, (r ' + x).last, h) ⊦ path(r ' + x, h[r1 := ce]) ∧ (r ' + x).last = (r ' + x).last |
path(r ' + x, h), reachable((r ' + x).last, r1, h), ¬ path(r ' + x, h[r1 := ce]), ¬ reachable(r1, (r ' + x).last, h) ⊦
| path(r ' + x, h), reachable((r ' + x).last, r1, h), ¬ path(r ' + x, h[r1 := ce]), ¬ reachable(r1, (r ' + x).last, h) ⊦ |
path(r ' + (r0 + x0), h), reachable((r ' + (r0 + x0)).last, r1, h), ¬ path(r ' + (r0 + x0), h[r1 := ce]), ¬ reachable(r1, (r ' + (r0 + x0)).last, h), ∀ r, h, r1, ce. ¬(path(r ' + x0, h) ∧ reachable((r ' + x0).last, r1, h) ∧ ¬ path(r ' + x0, h[r1 := ce]) ∧ ¬ reachable(r1, (r ' + x0).last, h)) ⊦
Used simplifier rules: path-one: ⊦ path(r ', h) ↔ r ∈ h ∧ r ≠ null; list('a) freely generated by [], +;; ⊦ x + [] = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification polylist ⊦ a '.last = a; (s) ⊦ a ∈ st[b := d] ↔ a = b ∨ a ∈ st; (ws)
| path(r ' + (r0 + x0), h), reachable((r ' + (r0 + x0)).last, r1, h), ¬ path(r ' + (r0 + x0), h[r1 := ce]), ¬ reachable(r1, (r ' + (r0 + x0)).last, h), ∀ r, h, r1, ce. ¬(path(r ' + x0, h) ∧ reachable((r ' + x0).last, r1, h) ∧ ¬ path(r ' + x0, h[r1 := ce]) ∧ ¬ reachable(r1, (r ' + x0).last, h)) ⊦ |
r ≠ null, path(h[r].nxt ' + x0, h), reachable((h[r].nxt ' + x0).last, r1, h), r ∈ h, r ∈ h[r1 := ce], ¬ reachable(r1, (h[r].nxt ' + x0).last, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0) ⊦ path((h[r1 := ce])[r].nxt ' + x0, h[r1 := ce]) ∧ (h[r1 := ce])[r].nxt = h[r].nxt
Used simplifier rules: path-cons: ⊦ path(r ' + r0 ' + x, h) ↔ r ∈ h ∧ r ≠ null ∧ h[r].nxt = r0 ∧ path(r0 ' + x, h); ⊦ a ∈ st[b := d] ↔ a = b ∨ a ∈ st; (ws) a: ⊦ (x + y) + z = x + y + z; from specification polylist ⊦ (b ' + a ' + x).last = (a ' + x).last; (s) ⊦ a + x = a ' + x; (s)
| r ≠ null, path(h[r].nxt ' + x0, h), reachable((h[r].nxt ' + x0).last, r1, h), r ∈ h, r ∈ h[r1 := ce], ¬ reachable(r1, (h[r].nxt ' + x0).last, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0) ⊦ path((h[r1 := ce])[r].nxt ' + x0, h[r1 := ce]) ∧ (h[r1 := ce])[r].nxt = h[r].nxt |
⊦ a ≠ b → (st[b := d])[a] = st[a]
r = r1, r ≠ null, path(h[r].nxt ' + x0, h), reachable((h[r].nxt ' + x0).last, r1, h), r ∈ h[r1 := ce], r ∈ h, ¬ reachable(r1, (h[r].nxt ' + x0).last, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0) ⊦ path((h[r1 := ce])[r].nxt ' + x0, h[r1 := ce]) ∧ (h[r1 := ce])[r].nxt = h[r].nxt
r ≠ r1, r ≠ null, path(h[r].nxt ' + x0, h), reachable((h[r].nxt ' + x0).last, r1, h), r ∈ h[r1 := ce], r ∈ h, ¬ reachable(r1, (h[r].nxt ' + x0).last, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0) ⊦ path(h[r].nxt ' + x0, h[r1 := ce]) ∧ h[r].nxt = h[r].nxt
Used terms: r, ce, r1, h
| ⊦ a ≠ b → (st[b := d])[a] = st[a] |
| r = r1, r ≠ null, path(h[r].nxt ' + x0, h), reachable((h[r].nxt ' + x0).last, r1, h), r ∈ h[r1 := ce], r ∈ h, ¬ reachable(r1, (h[r].nxt ' + x0).last, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0) ⊦ path((h[r1 := ce])[r].nxt ' + x0, h[r1 := ce]) ∧ (h[r1 := ce])[r].nxt = h[r].nxt |
r1 ≠ null, path(h[r1].nxt ' + x0, h), reachable((h[r1].nxt ' + x0).last, r1, h), r1 ∈ h, ¬ reachable(r1, (h[r1].nxt ' + x0).last, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0) ⊦ path(ce.nxt ' + x0, h[r1 := ce]) ∧ ce.nxt = h[r1].nxt
Used simplifier rules: ⊦ (st[a := d])[a] = d; (s) ⊦ a ∈ st[a := d]; (s)
| r1 ≠ null, path(h[r1].nxt ' + x0, h), reachable((h[r1].nxt ' + x0).last, r1, h), r1 ∈ h, ¬ reachable(r1, (h[r1].nxt ' + x0).last, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0) ⊦ path(ce.nxt ' + x0, h[r1 := ce]) ∧ ce.nxt = h[r1].nxt |
⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0)
r1 ≠ null, path(h[r1].nxt ' + x0, h), reachable((h[r1].nxt ' + x0).last, r1, h), r1 ∈ h, ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0), ∀ x. ¬(path(r1 ' + x, h) ∧ (r1 ' + x).last = (h[r1].nxt ' + x0).last) ⊦ path(ce.nxt ' + x0, h[r1 := ce]) ∧ ce.nxt = h[r1].nxt
Used terms: r1, (h[r1].nxt ' + x0).last, h
| ⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0) |
| r1 ≠ null, path(h[r1].nxt ' + x0, h), reachable((h[r1].nxt ' + x0).last, r1, h), r1 ∈ h, ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0), ∀ x. ¬(path(r1 ' + x, h) ∧ (r1 ' + x).last = (h[r1].nxt ' + x0).last) ⊦ path(ce.nxt ' + x0, h[r1 := ce]) ∧ ce.nxt = h[r1].nxt |
r1 ≠ null, path(h[r1].nxt ' + x0, h), reachable((h[r1].nxt ' + x0).last, r1, h), r1 ∈ h, ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0), ∀ x. ¬ path(r1 ' + x, h) ∨ (r1 ' + x).last ≠ (h[r1].nxt ' + x0).last ⊦ path(ce.nxt ' + x0, h[r1 := ce]) ∧ ce.nxt = h[r1].nxt
| r1 ≠ null, path(h[r1].nxt ' + x0, h), reachable((h[r1].nxt ' + x0).last, r1, h), r1 ∈ h, ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0), ∀ x. ¬ path(r1 ' + x, h) ∨ (r1 ' + x).last ≠ (h[r1].nxt ' + x0).last ⊦ path(ce.nxt ' + x0, h[r1 := ce]) ∧ ce.nxt = h[r1].nxt |
Used simplifier rules: path-cons: ⊦ path(r ' + r0 ' + x, h) ↔ r ∈ h ∧ r ≠ null ∧ h[r].nxt = r0 ∧ path(r0 ' + x, h); ⊦ a + x = a ' + x; (s) ⊦ (b ' + a ' + x).last = (a ' + x).last; (s) a: ⊦ (x + y) + z = x + y + z; from specification polylist Used terms: h[r1].nxt + x0
| r ≠ r1, r ≠ null, path(h[r].nxt ' + x0, h), reachable((h[r].nxt ' + x0).last, r1, h), r ∈ h[r1 := ce], r ∈ h, ¬ reachable(r1, (h[r].nxt ' + x0).last, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0) ⊦ path(h[r].nxt ' + x0, h[r1 := ce]) ∧ h[r].nxt = h[r].nxt |
r ≠ r1, r ≠ null, path(h[r].nxt ' + x0, h), reachable((h[r].nxt ' + x0).last, r1, h), r ∈ h, ¬ path(h[r].nxt ' + x0, h[r1 := ce]), ¬ reachable(r1, (h[r].nxt ' + x0).last, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0) ⊦
Used simplifier rules: ⊦ a ≠ b → (a ∈ st[b := d] ↔ a ∈ st); (s)
| r ≠ r1, r ≠ null, path(h[r].nxt ' + x0, h), reachable((h[r].nxt ' + x0).last, r1, h), r ∈ h, ¬ path(h[r].nxt ' + x0, h[r1 := ce]), ¬ reachable(r1, (h[r].nxt ' + x0).last, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0) ∨ ¬ reachable((r2 ' + x0).last, r3, h0) ∨ path(r2 ' + x0, h0[r3 := ce0]) ∨ reachable(r3, (r2 ' + x0).last, h0) ⊦ |
Used terms: h[r].nxt, h, r1, ce
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.