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