| ⊦ ¬ reachable(r, r0, h) ∧ ¬ reachable(r, r1, h) ∧ r0 ∈ h → (reachable(r, r1, h(r0 := ce)) ↔ false) |
¬(reachable(r, r1, h(r0 := ce)) ↔ false), r0 ∈ h, ¬ reachable(r, r1, h), ¬ reachable(r, r0, h) ⊦
| ¬(reachable(r, r1, h(r0 := ce)) ↔ false), r0 ∈ h, ¬ reachable(r, r1, h), ¬ reachable(r, r0, h) ⊦ |
reachable(r, r1, h(r0 := ce)), r0 ∈ h, ¬ reachable(r, r1, h), ¬ reachable(r, r0, h) ⊦
| reachable(r, r1, h(r0 := ce)), r0 ∈ h, ¬ reachable(r, r1, h), ¬ reachable(r, r0, h) ⊦ |
⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0)
r0 ∈ h, ¬ reachable(r, r1, h), ¬ reachable(r, r0, h), ∃ x. path(r ' + x, h(r0 := ce)) ∧ (r ' + x).last = r1 ⊦
Used terms: h(r0 := ce), r1, r
| ⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0) |
| r0 ∈ h, ¬ reachable(r, r1, h), ¬ reachable(r, r0, h), ∃ x. path(r ' + x, h(r0 := ce)) ∧ (r ' + x).last = r1 ⊦ |
path(r ' + x, h(r0 := ce)), r0 ∈ h, ¬ reachable(r, (r ' + x).last, h), ¬ reachable(r, r0, h) ⊦
| path(r ' + x, h(r0 := ce)), r0 ∈ h, ¬ reachable(r, (r ' + x).last, h), ¬ reachable(r, r0, h) ⊦ |
path(r ' + (r1 + x0), h(r0 := ce)), r0 ∈ h, ¬ reachable(r, (r ' + (r1 + x0)).last, h), ¬ reachable(r, r0, h), ∀ r, h, r0, ce. ¬(path(r ' + x0, h(r0 := ce)) ∧ r0 ∈ h ∧ ¬ reachable(r, (r ' + x0).last, h) ∧ ¬ reachable(r, r0, h)) ⊦
Used simplifier rules: path-one: ⊦ path(r ', h) ↔ r ∈ h ∧ r ≠ null; self-reachable: ⊦ reachable(r, r, h) ↔ r ≠ null ∧ r ∈ h; Reflist freely generated by [], +; ⊦ x + [] = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list[reflist] ⊦ a '.last = a; (s) ⊦ a ∈ st(b := d) ↔ a = b ∨ a ∈ st; (ws)
| path(r ' + (r1 + x0), h(r0 := ce)), r0 ∈ h, ¬ reachable(r, (r ' + (r1 + x0)).last, h), ¬ reachable(r, r0, h), ∀ r, h, r0, ce. ¬(path(r ' + x0, h(r0 := ce)) ∧ r0 ∈ h ∧ ¬ reachable(r, (r ' + x0).last, h) ∧ ¬ reachable(r, r0, h)) ⊦ |
r ≠ null, path((h(r0 := ce)(r)).nxt ' + x0, h(r0 := ce)), r ∈ h(r0 := ce), r0 ∈ h, ¬ reachable(r, ((h(r0 := ce)(r)).nxt ' + x0).last, h), ¬ reachable(r, r0, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0(r3 := ce0)) ∨ ¬ r3 ∈ h0 ∨ reachable(r2, (r2 ' + x0).last, h0) ∨ reachable(r2, r3, h0) ⊦
Used simplifier rules: path-cons: ⊦ path(r ' + r0 ' + x, h) ↔ r ∈ h ∧ r ≠ null ∧ (h(r)).nxt = r0 ∧ path(r0 ' + x, h); a: ⊦ (x + y) + z = x + y + z; from specification list[reflist] ⊦ (b ' + a ' + x).last = (a ' + x).last; (s) ⊦ a + x = a ' + x; (s)
| r ≠ null, path((h(r0 := ce)(r)).nxt ' + x0, h(r0 := ce)), r ∈ h(r0 := ce), r0 ∈ h, ¬ reachable(r, ((h(r0 := ce)(r)).nxt ' + x0).last, h), ¬ reachable(r, r0, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0(r3 := ce0)) ∨ ¬ r3 ∈ h0 ∨ reachable(r2, (r2 ' + x0).last, h0) ∨ reachable(r2, r3, h0) ⊦ |
⊦ a ≠ b → st(b := d)(a) = st(a)
r ≠ r0, r ≠ null, path((h(r)).nxt ' + x0, h(r0 := ce)), r0 ∈ h, r ∈ h(r0 := ce), ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable(r, r0, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0(r3 := ce0)) ∨ ¬ r3 ∈ h0 ∨ reachable(r2, (r2 ' + x0).last, h0) ∨ reachable(r2, r3, h0) ⊦
Used simplifier rules: self-reachable: ⊦ reachable(r, r, h) ↔ r ≠ null ∧ r ∈ h; ⊦ a ∈ st(a := d); (s) ⊦ st(a := d)(a) = d; (s) Used terms: r, ce, r0, h
| ⊦ a ≠ b → st(b := d)(a) = st(a) |
| r ≠ r0, r ≠ null, path((h(r)).nxt ' + x0, h(r0 := ce)), r0 ∈ h, r ∈ h(r0 := ce), ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable(r, r0, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0(r3 := ce0)) ∨ ¬ r3 ∈ h0 ∨ reachable(r2, (r2 ' + x0).last, h0) ∨ reachable(r2, r3, h0) ⊦ |
r ≠ r0, r ≠ null, path((h(r)).nxt ' + x0, h(r0 := ce)), r0 ∈ h, r ∈ h, ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable(r, r0, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0(r3 := ce0)) ∨ ¬ r3 ∈ h0 ∨ reachable(r2, (r2 ' + x0).last, h0) ∨ reachable(r2, r3, h0) ⊦
Used simplifier rules: ⊦ a ≠ b → (a ∈ st(b := d) ↔ a ∈ st); (s)
| r ≠ r0, r ≠ null, path((h(r)).nxt ' + x0, h(r0 := ce)), r0 ∈ h, r ∈ h, ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable(r, r0, h), ∀ r2, h0, r3, ce0. ¬ path(r2 ' + x0, h0(r3 := ce0)) ∨ ¬ r3 ∈ h0 ∨ reachable(r2, (r2 ' + x0).last, h0) ∨ reachable(r2, r3, h0) ⊦ |
r ≠ r0, r ≠ null, path((h(r)).nxt ' + x0, h(r0 := ce)), r ∈ h, r0 ∈ h, ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable(r, r0, h), ¬ path((h(r)).nxt ' + x0, h(r0 := ce)) ∨ ¬ r0 ∈ h ∨ reachable((h(r)).nxt, ((h(r)).nxt ' + x0).last, h) ∨ reachable((h(r)).nxt, r0, h) ⊦
Used terms: (h(r)).nxt, h, r0, ce
| r ≠ r0, r ≠ null, path((h(r)).nxt ' + x0, h(r0 := ce)), r ∈ h, r0 ∈ h, ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable(r, r0, h), ¬ path((h(r)).nxt ' + x0, h(r0 := ce)) ∨ ¬ r0 ∈ h ∨ reachable((h(r)).nxt, ((h(r)).nxt ' + x0).last, h) ∨ reachable((h(r)).nxt, r0, h) ⊦ |
r ≠ null, r ≠ r0, path((h(r)).nxt ' + x0, h(r0 := ce)), reachable((h(r)).nxt, ((h(r)).nxt ' + x0).last, h), r ∈ h, r0 ∈ h, ¬ reachable(r, r0, h), ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable((h(r)).nxt, r0, h) ⊦
Used simplifier rules: fromnext-reachable-rev: ⊦ reachable((h(r)).nxt, r0, h) ∧ r ≠ r0 ∧ r ≠ null ∧ r ∈ h → (reachable(r, r0, h) ↔ true);
| r ≠ null, r ≠ r0, path((h(r)).nxt ' + x0, h(r0 := ce)), reachable((h(r)).nxt, ((h(r)).nxt ' + x0).last, h), r ∈ h, r0 ∈ h, ¬ reachable(r, r0, h), ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable((h(r)).nxt, r0, h) ⊦ |
⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0)
r ≠ null, r ≠ r0, path((h(r)).nxt ' + x0, h(r0 := ce)), r0 ∈ h, r ∈ h, ¬ reachable(r, r0, h), ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable((h(r)).nxt, r0, h), ∃ x. path((h(r)).nxt ' + x, h) ∧ ((h(r)).nxt ' + x).last = ((h(r)).nxt ' + x0).last ⊦
Used terms: h, ((h(r)).nxt ' + x0).last, (h(r)).nxt
| ⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0) |
| r ≠ null, r ≠ r0, path((h(r)).nxt ' + x0, h(r0 := ce)), r0 ∈ h, r ∈ h, ¬ reachable(r, r0, h), ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable((h(r)).nxt, r0, h), ∃ x. path((h(r)).nxt ' + x, h) ∧ ((h(r)).nxt ' + x).last = ((h(r)).nxt ' + x0).last ⊦ |
((h(r)).nxt ' + x).last = ((h(r)).nxt ' + x0).last, r ≠ null, r ≠ r0, path((h(r)).nxt ' + x, h), path((h(r)).nxt ' + x0, h(r0 := ce)), r ∈ h, r0 ∈ h, ¬ reachable(r, r0, h), ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable((h(r)).nxt, r0, h) ⊦
| ((h(r)).nxt ' + x).last = ((h(r)).nxt ' + x0).last, r ≠ null, r ≠ r0, path((h(r)).nxt ' + x, h), path((h(r)).nxt ' + x0, h(r0 := ce)), r ∈ h, r0 ∈ h, ¬ reachable(r, r0, h), ¬ reachable(r, ((h(r)).nxt ' + x0).last, h), ¬ reachable((h(r)).nxt, r0, h) ⊦ |
⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0)
((h(r)).nxt ' + x).last = ((h(r)).nxt ' + x0).last, r ≠ null, r ≠ r0, path((h(r)).nxt ' + x0, h(r0 := ce)), path((h(r)).nxt ' + x, h), r0 ∈ h, r ∈ h, ¬ reachable(r, r0, h), ¬ reachable((h(r)).nxt, r0, h), ∀ x. ¬(path(r ' + x, h) ∧ (r ' + x).last = ((h(r)).nxt ' + x0).last) ⊦
Used terms: h, ((h(r)).nxt ' + x0).last, r
| ⊦ reachable(r, r0, h) ↔ (∃ x. path(r ' + x, h) ∧ (r ' + x).last = r0) |
| ((h(r)).nxt ' + x).last = ((h(r)).nxt ' + x0).last, r ≠ null, r ≠ r0, path((h(r)).nxt ' + x0, h(r0 := ce)), path((h(r)).nxt ' + x, h), r0 ∈ h, r ∈ h, ¬ reachable(r, r0, h), ¬ reachable((h(r)).nxt, r0, h), ∀ x. ¬(path(r ' + x, h) ∧ (r ' + x).last = ((h(r)).nxt ' + x0).last) ⊦ |
Used simplifier rules: path-cons: ⊦ path(r ' + r0 ' + x, h) ↔ r ∈ h ∧ r ≠ null ∧ (h(r)).nxt = r0 ∧ path(r0 ' + x, h); ⊦ (b ' + a ' + x).last = (a ' + x).last; (s) a: ⊦ (x + y) + z = x + y + z; from specification list[reflist] Used terms: (h(r)).nxt ' + x
The following image shows the proof tree of sequent calculus. The proved goal is at the bottom. You can click on the nodes to view additional rules. See here for details on colors in a proof tree.