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