| ⊦ r ≠ r0 → (reachable(r, r0, h) ↔ (∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ r0 ∈ h ∧ r0 ≠ null)) |
r ≠ r0 ⊦ reachable(r, r0, h) ↔ (∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ r0 ∈ h ∧ r0 ≠ null)
| r ≠ r0 ⊦ reachable(r, r0, h) ↔ (∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ r0 ∈ h ∧ r0 ≠ null) |
r ≠ r0 ⊦ reachable(r, r0, h) ↔ (∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null)
| r ≠ r0 ⊦ reachable(r, r0, h) ↔ (∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null) |
r ≠ r0, reachable(r, r0, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null
Used simplifier rules: reach-reachnext: ⊦ reachable(r, r1, h) → (reachable(r, h[r1].nxt, h) ↔ ¬(h[r1].nxt = null ∨ ¬ h[r1].nxt ∈ h));
| r ≠ r0, reachable(r, r0, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null |
r ≠ r0, reachable(r, r0, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null
| r ≠ r0, reachable(r, r0, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null |
⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0)
r ≠ r0, ∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0 ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null
Used terms: h, r0, r
| ⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0) |
| r ≠ r0, ∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0 ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null |
r ≠ (r ' + x).last, path(r ' + x, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = (r ' + x).last ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null
| r ≠ (r ' + x).last, path(r ' + x, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = (r ' + x).last ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null |
⊦ y ≠ [] → (x + y).last = y.last
r ≠ x.last, x ≠ [], path(r ' + x, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = x.last ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null
Used simplifier rules: ⊦ x + [] = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification polylist ⊦ a '.last = a; (s) Used terms: x, r '
| ⊦ y ≠ [] → (x + y).last = y.last |
| r ≠ x.last, x ≠ [], path(r ' + x, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = x.last ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null |
r ≠ x.last, x ≠ [], path(r ' + x, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = x.last ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null
| r ≠ x.last, x ≠ [], path(r ' + x, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = x.last ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null |
x = y + r0 ', r ≠ r0, x ≠ [], path(r ' + x, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null
Used simplifier rules: x ≠ [] ⊦ a = x.last ∧ y = x.butlast ↔ x = y + a '; (elim) Used terms: x, a, y
| x = y + r0 ', r ≠ r0, x ≠ [], path(r ' + x, h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null |
r ≠ r0, path(r ' + y + r0 ', h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification polylist ⊦ x + a ' ≠ []; (s)
| r ≠ r0, path(r ' + y + r0 ', h) ⊦ ∃ r1. reachable(r, r1, h) ∧ h[r1].nxt = r0 ∧ h[r1].nxt ∈ h ∧ h[r1].nxt ≠ null |
r ≠ r0, path(r ' + y + r0 ', h) ⊦ reachable(r, (r ' + y).last, h) ∧ h[(r ' + y).last].nxt = r0 ∧ h[(r ' + y).last].nxt ∈ h ∧ h[(r ' + y).last].nxt ≠ null
Used terms: (r ' + y).last
| r ≠ r0, path(r ' + y + r0 ', h) ⊦ reachable(r, (r ' + y).last, h) ∧ h[(r ' + y).last].nxt = r0 ∧ h[(r ' + y).last].nxt ∈ h ∧ h[(r ' + y).last].nxt ≠ null |
r ≠ r0, path(r ' + y + r0 ', h) ⊦ reachable(r, (r ' + y).last, h) ∧ h[(r ' + y).last].nxt ∈ h ∧ h[(r ' + y).last].nxt ≠ null
Used simplifier rules: path-last-nxt: ⊦ path(r ' + x + r0 ', h) → (h[(r ' + x).last].nxt = r0 ↔ true); a: ⊦ (x + y) + z = x + y + z; from specification polylist
| r ≠ r0, path(r ' + y + r0 ', h) ⊦ reachable(r, (r ' + y).last, h) ∧ h[(r ' + y).last].nxt ∈ h ∧ h[(r ' + y).last].nxt ≠ null |
⊦ path(r ' + x + r0 ', h) ↔ path(r ' + x, h) ∧ h[(r ' + x).last].nxt = r0 ∧ r0 ∈ h ∧ r0 ≠ null
h[(r ' + y).last].nxt = r0, r ≠ r0, r0 ≠ null, path(r ' + y, h), r0 ∈ h ⊦ reachable(r, (r ' + y).last, h) ∧ h[(r ' + y).last].nxt ∈ h ∧ h[(r ' + y).last].nxt ≠ null
Used terms: h, r0, y, r
| ⊦ path(r ' + x + r0 ', h) ↔ path(r ' + x, h) ∧ h[(r ' + x).last].nxt = r0 ∧ r0 ∈ h ∧ r0 ≠ null |
| h[(r ' + y).last].nxt = r0, r ≠ r0, r0 ≠ null, path(r ' + y, h), r0 ∈ h ⊦ reachable(r, (r ' + y).last, h) ∧ h[(r ' + y).last].nxt ∈ h ∧ h[(r ' + y).last].nxt ≠ null |
h[(r ' + y).last].nxt ≠ null, r ≠ h[(r ' + y).last].nxt, path(r ' + y, h), h[(r ' + y).last].nxt ∈ h, ¬ reachable(r, (r ' + y).last, h) ⊦
| h[(r ' + y).last].nxt ≠ null, r ≠ h[(r ' + y).last].nxt, path(r ' + y, h), h[(r ' + y).last].nxt ∈ h, ¬ reachable(r, (r ' + y).last, h) ⊦ |
⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0)
h[(r ' + y).last].nxt ≠ null, r ≠ h[(r ' + y).last].nxt, path(r ' + y, h), h[(r ' + y).last].nxt ∈ h, ∀ x. ¬(path(r ' + x, h) ∧ (r ' + x).last = (r ' + y).last) ⊦
Used terms: h, (r ' + y).last, r
| ⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0) |
| h[(r ' + y).last].nxt ≠ null, r ≠ h[(r ' + y).last].nxt, path(r ' + y, h), h[(r ' + y).last].nxt ∈ h, ∀ x. ¬(path(r ' + x, h) ∧ (r ' + x).last = (r ' + y).last) ⊦ |
h[(r ' + y).last].nxt ≠ null, r ≠ h[(r ' + y).last].nxt, path(r ' + y, h), h[(r ' + y).last].nxt ∈ h, ∀ x. ¬ path(r ' + x, h) ∨ (r ' + x).last ≠ (r ' + y).last ⊦
| h[(r ' + y).last].nxt ≠ null, r ≠ h[(r ' + y).last].nxt, path(r ' + y, h), h[(r ' + y).last].nxt ∈ h, ∀ x. ¬ path(r ' + x, h) ∨ (r ' + x).last ≠ (r ' + y).last ⊦ |
Used terms: y
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.