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