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