| reachable(r, r0, h), reachable(r, r1, h) ⊦ reachable(r0, r1, h) ∨ reachable(r1, r0, h) |
reachable(r, r1, h), reachable(r, r0, h), ¬ reachable(r0, r1, h), ¬ reachable(r1, r0, h) ⊦
| reachable(r, r1, h), reachable(r, r0, h), ¬ reachable(r0, r1, h), ¬ reachable(r1, r0, h) ⊦ |
reachable(r, r0, h), reachable(r, r1, h), ¬ reachable(r0, r1, h), ¬ reachable(r1, r0, h) ⊦
| reachable(r, r0, h), reachable(r, r1, h), ¬ reachable(r0, r1, h), ¬ reachable(r1, r0, h) ⊦ |
⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0)
reachable(r, r1, h), ¬ reachable(r0, r1, h), ¬ reachable(r1, r0, h), ∃ 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(r, r1, h), ¬ reachable(r0, r1, h), ¬ reachable(r1, r0, h), ∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0 ⊦ |
path(r ' + x, h), reachable(r, r1, h), ¬ reachable((r ' + x).last, r1, h), ¬ reachable(r1, (r ' + x).last, h) ⊦
| path(r ' + x, h), reachable(r, r1, h), ¬ reachable((r ' + x).last, r1, h), ¬ reachable(r1, (r ' + x).last, h) ⊦ |
path(r ' + x, h), reachable(r, r1, h), ¬ reachable(r1, (r ' + x).last, h), ¬ reachable((r ' + x).last, r1, h), ∀ x0, r, h, r1. # x0 < # x → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦
Used simplifier rules: <; (wellfounded) Used terms: # x
| path(r ' + x, h), reachable(r, r1, h), ¬ reachable(r1, (r ' + x).last, h), ¬ reachable((r ' + x).last, r1, h), ∀ x0, r, h, r1. # x0 < # x → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦ |
path(r ' + x, h), reachable(r, r1, h), ¬ reachable(r1, (r ' + x).last, h), ¬ reachable((r ' + x).last, r1, h), ∀ x0, r, h, r1. # x0 < # x → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦
| path(r ' + x, h), reachable(r, r1, h), ¬ reachable(r1, (r ' + x).last, h), ¬ reachable((r ' + x).last, r1, h), ∀ x0, r, h, r1. # x0 < # x → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦ |
x ≠ [], path(r ' + x, h), reachable(r, r1, h), ¬ reachable(r1, (r ' + x).last, h), ¬ reachable((r ' + x).last, r1, h), ∀ x0, r, h, r1. # x0 < # x → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦
Used simplifier rules: path-one: ⊦ path(r ', h) ↔ r ∈ h ∧ r ≠ null; ⊦ x + [] = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list[reflist] ⊦ a '.last = a; (s) Used formulas: x = []
| x ≠ [], path(r ' + x, h), reachable(r, r1, h), ¬ reachable(r1, (r ' + x).last, h), ¬ reachable((r ' + x).last, r1, h), ∀ x0, r, h, r1. # x0 < # x → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦ |
x ≠ [], path(r ' + x, h), reachable(r, r1, h), ¬ reachable(r1, x.last, h), ¬ reachable(x.last, r1, h), ∀ x0, r, h, r1. # x0 < # x → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list[reflist] ⊦ x ≠ [] → (a ' + x).last = x.last; (s)
| x ≠ [], path(r ' + x, h), reachable(r, r1, h), ¬ reachable(r1, x.last, h), ¬ reachable(x.last, r1, h), ∀ x0, r, h, r1. # x0 < # x → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦ |
x = x1 + r0 ', x ≠ [], path(r ' + x, h), reachable(r, r1, h), ¬ reachable(r1, r0, h), ¬ reachable(r0, r1, h), ∀ x0, r, h, r1. # x0 < # x → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦
Used simplifier rules: x ≠ [] ⊦ a = x.last ∧ y = x.butlast ↔ x = y + a '; (elim) Used terms: x, a, y
| x = x1 + r0 ', x ≠ [], path(r ' + x, h), reachable(r, r1, h), ¬ reachable(r1, r0, h), ¬ reachable(r0, r1, h), ∀ x0, r, h, r1. # x0 < # x → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦ |
path(r ' + x1 + r0 ', h), reachable(r, r1, h), ¬ reachable(r1, r0, h), ¬ reachable(r0, r1, h), ∀ x0, r, h, r1. # x0 < #(x1 + r0 ') → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list[reflist] ⊦ x + a ' ≠ []; (s)
| path(r ' + x1 + r0 ', h), reachable(r, r1, h), ¬ reachable(r1, r0, h), ¬ reachable(r0, r1, h), ∀ x0, r, h, r1. # x0 < #(x1 + r0 ') → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦ |
⊦ path(r ' + x + r0 ', h) ↔ path(r ' + x, h) ∧ h[(r ' + x).last].nxt = r0 ∧ r0 ∈ h ∧ r0 ≠ null
path(r ' + x1 + r0 ', h) ↔ path(r ' + x1, h) ∧ h[(r ' + x1).last].nxt = r0 ∧ r0 ∈ h ∧ r0 ≠ null, path(r ' + x1 + r0 ', h), reachable(r, r1, h), ¬ reachable(r1, r0, h), ¬ reachable(r0, r1, h), ∀ x0, r, h, r1. # x0 < #(x1 + r0 ') → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦
Used terms: r, x1, r0, h
| ⊦ path(r ' + x + r0 ', h) ↔ path(r ' + x, h) ∧ h[(r ' + x).last].nxt = r0 ∧ r0 ∈ h ∧ r0 ≠ null |
| path(r ' + x1 + r0 ', h) ↔ path(r ' + x1, h) ∧ h[(r ' + x1).last].nxt = r0 ∧ r0 ∈ h ∧ r0 ≠ null, path(r ' + x1 + r0 ', h), reachable(r, r1, h), ¬ reachable(r1, r0, h), ¬ reachable(r0, r1, h), ∀ x0, r, h, r1. # x0 < #(x1 + r0 ') → path(r ' + x0, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x0).last, r1, h) ∧ ¬ reachable(r1, (r ' + x0).last, h) → false ⊦ |
h[(r ' + x1).last].nxt ≠ null, path(r ' + x1, h), path(r ' + x1 + h[(r ' + x1).last].nxt ', h), reachable(r, r1, h), h[(r ' + x1).last].nxt ∈ h, ¬ reachable(h[(r ' + x1).last].nxt, r1, h), ¬ reachable(r1, h[(r ' + x1).last].nxt, h), ∀ x0, r1, h0, r2. # x0 < #(x1 + h[(r ' + x1).last].nxt ') → path(r1 ' + x0, h0) ∧ reachable(r1, r2, h0) ∧ ¬ reachable((r1 ' + x0).last, r2, h0) ∧ ¬ reachable(r2, (r1 ' + x0).last, h0) → false ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list[reflist]
| h[(r ' + x1).last].nxt ≠ null, path(r ' + x1, h), path(r ' + x1 + h[(r ' + x1).last].nxt ', h), reachable(r, r1, h), h[(r ' + x1).last].nxt ∈ h, ¬ reachable(h[(r ' + x1).last].nxt, r1, h), ¬ reachable(r1, h[(r ' + x1).last].nxt, h), ∀ x0, r1, h0, r2. # x0 < #(x1 + h[(r ' + x1).last].nxt ') → path(r1 ' + x0, h0) ∧ reachable(r1, r2, h0) ∧ ¬ reachable((r1 ' + x0).last, r2, h0) ∧ ¬ reachable(r2, (r1 ' + x0).last, h0) → false ⊦ |
h[(r ' + x1).last].nxt ≠ null, path(r ' + x1 + h[(r ' + x1).last].nxt ', h), path(r ' + x1, h), reachable(r, r1, h), h[(r ' + x1).last].nxt ∈ h, ¬ reachable(h[(r ' + x1).last].nxt, r1, h), ¬ reachable(r1, h[(r ' + x1).last].nxt, h), ∀ x0, r1, h0, r2. # x0 < #(x1 + h[(r ' + x1).last].nxt ') → path(r1 ' + x0, h0) ∧ reachable(r1, r2, h0) ∧ ¬ reachable((r1 ' + x0).last, r2, h0) ∧ ¬ reachable(r2, (r1 ' + x0).last, h0) → false ⊦ path(r ' + x1, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x1).last, r1, h) ∧ ¬ reachable(r1, (r ' + x1).last, h)
Used simplifier rules: ⊦ #(x + y) = # x + # y; (s) ⊦ # a ' = 0 +1; (s) a: ⊦ (x + y) + z = x + y + z; from specification list[reflist] ⊦ m < n + 1 ↔ ¬ n < m; (s) ⊦ ¬ n < n; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: x1, r, h, r1
| h[(r ' + x1).last].nxt ≠ null, path(r ' + x1 + h[(r ' + x1).last].nxt ', h), path(r ' + x1, h), reachable(r, r1, h), h[(r ' + x1).last].nxt ∈ h, ¬ reachable(h[(r ' + x1).last].nxt, r1, h), ¬ reachable(r1, h[(r ' + x1).last].nxt, h), ∀ x0, r1, h0, r2. # x0 < #(x1 + h[(r ' + x1).last].nxt ') → path(r1 ' + x0, h0) ∧ reachable(r1, r2, h0) ∧ ¬ reachable((r1 ' + x0).last, r2, h0) ∧ ¬ reachable(r2, (r1 ' + x0).last, h0) → false ⊦ path(r ' + x1, h) ∧ reachable(r, r1, h) ∧ ¬ reachable((r ' + x1).last, r1, h) ∧ ¬ reachable(r1, (r ' + x1).last, h) |
h[(r ' + x1).last].nxt ≠ null, path(r ' + x1 + h[(r ' + x1).last].nxt ', h), path(r ' + x1, h), reachable(r, r1, h), reachable((r ' + x1).last, r1, h), h[(r ' + x1).last].nxt ∈ h, ¬ reachable(r1, h[(r ' + x1).last].nxt, h), ¬ reachable(h[(r ' + x1).last].nxt, r1, h), ¬ reachable(r1, (r ' + x1).last, h), ∀ x0, r1, h0, r2. # x0 < #(x1 + h[(r ' + x1).last].nxt ') → path(r1 ' + x0, h0) ∧ reachable(r1, r2, h0) ∧ ¬ reachable((r1 ' + x0).last, r2, h0) ∧ ¬ reachable(r2, (r1 ' + x0).last, h0) → false ⊦
Used simplifier rules: reach-reachnext: ⊦ reachable(r, r1, h) → (reachable(r, h[r1].nxt, h) ↔ ¬(h[r1].nxt = null ∨ ¬ h[r1].nxt ∈ h));
| h[(r ' + x1).last].nxt ≠ null, path(r ' + x1 + h[(r ' + x1).last].nxt ', h), path(r ' + x1, h), reachable(r, r1, h), reachable((r ' + x1).last, r1, h), h[(r ' + x1).last].nxt ∈ h, ¬ reachable(r1, h[(r ' + x1).last].nxt, h), ¬ reachable(h[(r ' + x1).last].nxt, r1, h), ¬ reachable(r1, (r ' + x1).last, h), ∀ x0, r1, h0, r2. # x0 < #(x1 + h[(r ' + x1).last].nxt ') → path(r1 ' + x0, h0) ∧ reachable(r1, r2, h0) ∧ ¬ reachable((r1 ' + x0).last, r2, h0) ∧ ¬ reachable(r2, (r1 ' + x0).last, h0) → false ⊦ |
⊦ reachable(r, r0, h) ∧ r ≠ r0 → (reachable(h[r].nxt, r0, h) ↔ true)
Used terms: (r ' + x1).last, r1, h
| ⊦ reachable(r, r0, h) ∧ r ≠ r0 → (reachable(h[r].nxt, r0, h) ↔ true) |
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.