| path(r ' + x, h), path(r ' + y, h) ⊦ x = y ∨ (∃ r0, y0. x = y + r0 ' + y0) ∨ (∃ r0, x0. y = x + r0 ' + x0) |
x ≠ y, path(r ' + y, h), path(r ' + x, h) ⊦ ∃ r0, y0. x = y + r0 ' + y0, ∃ r0, x0. y = x + r0 ' + x0
| x ≠ y, path(r ' + y, h), path(r ' + x, h) ⊦ ∃ r0, y0. x = y + r0 ' + y0, ∃ r0, x0. y = x + r0 ' + x0 |
x ≠ y, path(r ' + x, h), path(r ' + y, h) ⊦ ∃ r0, x0. y = x + r0 ' + x0, ∃ r0, y0. x = y + r0 ' + y0
| x ≠ y, path(r ' + x, h), path(r ' + y, h) ⊦ ∃ r0, x0. y = x + r0 ' + x0, ∃ r0, y0. x = y + r0 ' + y0 |
[] ≠ y, path(r ' + y, h), path(r ' + [], h) ⊦ ∃ r0, y0. [] = y + r0 ' + y0, ∃ r0, x0. y = [] + r0 ' + x0
r0 + x0 ≠ y, path(r ' + y, h), path(r ' + (r0 + x0), h), ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r, y0. r0 + x0 = y + r ' + y0, ∃ r, x1. y = (r0 + x0) + r ' + x1
Used simplifier rules: list('a) freely generated by [], +;;
| [] ≠ y, path(r ' + y, h), path(r ' + [], h) ⊦ ∃ r0, y0. [] = y + r0 ' + y0, ∃ r0, x0. y = [] + r0 ' + x0 |
[] ≠ y, r ≠ null, path(r ' + y, h), r ∈ h ⊦ ∃ r0, x0. y = r0 ' + x0
Used simplifier rules: path-one: ⊦ path(r ', h) ↔ r ∈ h ∧ r ≠ null; a: ⊦ (x + y) + z = x + y + z; from specification polylist ⊦ x + a ' + y ≠ []; (s) ⊦ [] + x = x; (s) ⊦ x + [] = x; (s)
| [] ≠ y, r ≠ null, path(r ' + y, h), r ∈ h ⊦ ∃ r0, x0. y = r0 ' + x0 |
y = r1 + y0, [] ≠ y, r ≠ null, path(r ' + y, h), r ∈ h ⊦ ∃ r0, x0. y = r0 ' + x0
Used simplifier rules: list('a) freely generated by [], +;;
| y = r1 + y0, [] ≠ y, r ≠ null, path(r ' + y, h), r ∈ h ⊦ ∃ r0, x0. y = r0 ' + x0 |
r ≠ null, path(h[r].nxt ' + y0, h), r ∈ h ⊦ ∃ r0, x0. h[r].nxt ' + y0 = r0 ' + x0
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) a: ⊦ (x + y) + z = x + y + z; from specification polylist ⊦ a ' + x ≠ []; (s)
| r ≠ null, path(h[r].nxt ' + y0, h), r ∈ h ⊦ ∃ r0, x0. h[r].nxt ' + y0 = r0 ' + x0 |
Used terms: h[r].nxt, y0
| r0 + x0 ≠ y, path(r ' + y, h), path(r ' + (r0 + x0), h), ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r, y0. r0 + x0 = y + r ' + y0, ∃ r, x1. y = (r0 + x0) + r ' + x1 |
h[r].nxt ' + x0 ≠ y, r ≠ null, path(h[r].nxt ' + x0, h), path(r ' + y, h), r ∈ h, ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r1, y0. h[r].nxt ' + x0 = y + r1 ' + y0, ∃ r1, x1. y = (h[r].nxt ' + x0) + r1 ' + x1
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) a: ⊦ (x + y) + z = x + y + z; from specification polylist
| h[r].nxt ' + x0 ≠ y, r ≠ null, path(h[r].nxt ' + x0, h), path(r ' + y, h), r ∈ h, ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r1, y0. h[r].nxt ' + x0 = y + r1 ' + y0, ∃ r1, x1. y = (h[r].nxt ' + x0) + r1 ' + x1 |
y = [], h[r].nxt ' + x0 ≠ y, r ≠ null, path(r ' + y, h), path(h[r].nxt ' + x0, h), r ∈ h, ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r1, x1. y = (h[r].nxt ' + x0) + r1 ' + x1, ∃ r1, y0. h[r].nxt ' + x0 = y + r1 ' + y0
y = r2 + y1, h[r].nxt ' + x0 ≠ y, r ≠ null, path(r ' + y, h), path(h[r].nxt ' + x0, h), r ∈ h, ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r1, x1. y = (h[r].nxt ' + x0) + r1 ' + x1, ∃ r1, y0. h[r].nxt ' + x0 = y + r1 ' + y0
Used simplifier rules: list('a) freely generated by [], +;;
| y = [], h[r].nxt ' + x0 ≠ y, r ≠ null, path(r ' + y, h), path(h[r].nxt ' + x0, h), r ∈ h, ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r1, x1. y = (h[r].nxt ' + x0) + r1 ' + x1, ∃ r1, y0. h[r].nxt ' + x0 = y + r1 ' + y0 |
r ≠ null, path(h[r].nxt ' + x0, h), r ∈ h, ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r1, y0. h[r].nxt ' + x0 = r1 ' + y0
Used simplifier rules: path-one: ⊦ path(r ', h) ↔ r ∈ h ∧ r ≠ null; a: ⊦ (x + y) + z = x + y + z; from specification polylist ⊦ a ' + x ≠ []; (s) ⊦ [] + x = x; (s) ⊦ x + [] = x; (s)
| r ≠ null, path(h[r].nxt ' + x0, h), r ∈ h, ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r1, y0. h[r].nxt ' + x0 = r1 ' + y0 |
Used terms: h[r].nxt, x0
| y = r2 + y1, h[r].nxt ' + x0 ≠ y, r ≠ null, path(r ' + y, h), path(h[r].nxt ' + x0, h), r ∈ h, ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r1, x1. y = (h[r].nxt ' + x0) + r1 ' + x1, ∃ r1, y0. h[r].nxt ' + x0 = y + r1 ' + y0 |
r ≠ null, x0 ≠ y1, path(h[r].nxt ' + y1, h), path(h[r].nxt ' + x0, h), r ∈ h, ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r1, x1. y1 = x0 + r1 ' + x1, ∃ r1, y0. x0 = y1 + r1 ' + y0
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 polylist ⊦ a ' + x = a0 ' + y ↔ a = a0 ∧ x = y; (ws) ⊦ a + x = a ' + x; (s)
| r ≠ null, x0 ≠ y1, path(h[r].nxt ' + y1, h), path(h[r].nxt ' + x0, h), r ∈ h, ∀ y, r, h. x0 ≠ y ∧ path(r ' + x0, h) ∧ path(r ' + y, h) → (∃ r0, x1. y = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y + r0 ' + y0) ⊦ ∃ r1, x1. y1 = x0 + r1 ' + x1, ∃ r1, y0. x0 = y1 + r1 ' + y0 |
r ≠ null, x0 ≠ y1, path(h[r].nxt ' + x0, h), path(h[r].nxt ' + y1, h), r ∈ h, x0 ≠ y1 ∧ path(h[r].nxt ' + x0, h) ∧ path(h[r].nxt ' + y1, h) → (∃ r0, x1. y1 = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y1 + r0 ' + y0) ⊦ ∃ r1, y0. x0 = y1 + r1 ' + y0, ∃ r1, x1. y1 = x0 + r1 ' + x1
Used terms: y1, h[r].nxt, h
| r ≠ null, x0 ≠ y1, path(h[r].nxt ' + x0, h), path(h[r].nxt ' + y1, h), r ∈ h, x0 ≠ y1 ∧ path(h[r].nxt ' + x0, h) ∧ path(h[r].nxt ' + y1, h) → (∃ r0, x1. y1 = x0 + r0 ' + x1) ∨ (∃ r0, y0. x0 = y1 + r0 ' + y0) ⊦ ∃ r1, y0. x0 = y1 + r1 ' + y0, ∃ r1, x1. y1 = x0 + r1 ' + x1 |
r ≠ null, x0 ≠ y1, path(h[r].nxt ' + y1, h), path(h[r].nxt ' + x0, h), r ∈ h, y1 = x0 + r0 ' + x1 ∨ x0 = y1 + r1 ' + y0 ⊦ ∃ r1, x1. y1 = x0 + r1 ' + x1, ∃ r1, y0. x0 = y1 + r1 ' + y0
| r ≠ null, x0 ≠ y1, path(h[r].nxt ' + y1, h), path(h[r].nxt ' + x0, h), r ∈ h, y1 = x0 + r0 ' + x1 ∨ x0 = y1 + r1 ' + y0 ⊦ ∃ r1, x1. y1 = x0 + r1 ' + x1, ∃ r1, y0. x0 = y1 + r1 ' + y0 |
r ≠ null, x0 ≠ y1, y1 ≠ x0 + r0 ' + x1, path(h[r].nxt ' + x0, h), path(h[r].nxt ' + y1, h), r ∈ h, y1 = x0 + r0 ' + x1 ∨ x0 = y1 + r1 ' + y0 ⊦ ∃ r1, y0. x0 = y1 + r1 ' + y0
Used terms: r0, x1
| r ≠ null, x0 ≠ y1, y1 ≠ x0 + r0 ' + x1, path(h[r].nxt ' + x0, h), path(h[r].nxt ' + y1, h), r ∈ h, y1 = x0 + r0 ' + x1 ∨ x0 = y1 + r1 ' + y0 ⊦ ∃ r1, y0. x0 = y1 + r1 ' + y0 |
r ≠ null, path(h[r].nxt ' + y1 + r1 ' + y0, h), path(h[r].nxt ' + y1, h), r ∈ h ⊦ ∃ r0, y. r1 ' + y0 = r0 ' + y
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification polylist ⊦ # x = # z → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws) ⊦ a ' + x ≠ []; (s) ⊦ x = x + y ↔ y = []; (s)
| r ≠ null, path(h[r].nxt ' + y1 + r1 ' + y0, h), path(h[r].nxt ' + y1, h), r ∈ h ⊦ ∃ r0, y. r1 ' + y0 = r0 ' + y |
Used terms: r1, y0
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.