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