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