| reachable-n(h, n, r, r0), m < n ⊦ ∃ r1. reachable-n(h, m, r, r1) ∧ reachable-n(h, n - m, r1, r0) |
m < n, reachable-n(h, n, r, r0) ⊦ ∃ r1. reachable-n(h, m, r, r1) ∧ reachable-n(h, n - m, r1, r0)
| m < n, reachable-n(h, n, r, r0) ⊦ ∃ r1. reachable-n(h, m, r, r1) ∧ reachable-n(h, n - m, r1, r0) |
n = n0 + m, m < n, reachable-n(h, n, r, r0), m ≤ n ⊦ ∃ r1. reachable-n(h, m, r, r1) ∧ reachable-n(h, n0, r1, r0)
Used simplifier rules: ⊦ m < n → m ≤ n; (s) n ≤ m ⊦ n0 = m - n ↔ m = n0 + n; (elim) Used terms: n, m, n0
| n = n0 + m, m < n, reachable-n(h, n, r, r0), m ≤ n ⊦ ∃ r1. reachable-n(h, m, r, r1) ∧ reachable-n(h, n0, r1, r0) |
n0 ≠ 0, reachable-n(h, n0 + m, r, r0) ⊦ ∃ r1. reachable-n(h, m, r, r1) ∧ reachable-n(h, n0, r1, r0)
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m < m + n ↔ n ≠ 0; (s) ⊦ m < n → m ≤ n; (s)
| n0 ≠ 0, reachable-n(h, n0 + m, r, r0) ⊦ ∃ r1. reachable-n(h, m, r, r1) ∧ reachable-n(h, n0, r1, r0) |
n0 ≠ 0, reachable-n(h, n0 + m0 +1, r, r0), ∀ n0, h, r, r0. n0 ≠ 0 ∧ reachable-n(h, n0 + m0, r, r0) → (∃ r1. reachable-n(h, m0, r, r1) ∧ reachable-n(h, n0, r1, r0)) ⊦ ∃ r1. reachable-n(h, m0 +1, r, r1) ∧ reachable-n(h, n0, r1, r0)
Used simplifier rules: reachable-n-base: ⊦ reachable-n(h, 0, r, r0) ↔ r = r0; nat freely generated by 0, +1;; ⊦ 0 + m = m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic
| n0 ≠ 0, reachable-n(h, n0 + m0 +1, r, r0), ∀ n0, h, r, r0. n0 ≠ 0 ∧ reachable-n(h, n0 + m0, r, r0) → (∃ r1. reachable-n(h, m0, r, r1) ∧ reachable-n(h, n0, r1, r0)) ⊦ ∃ r1. reachable-n(h, m0 +1, r, r1) ∧ reachable-n(h, n0, r1, r0) |
h[r].nxt ≠ null, n0 ≠ 0, r ≠ null, reachable-n(h, n0 + m0, h[r].nxt, r0), h[r].nxt ∈ h, r ∈ h, ∀ n0, h, r, r0. n0 ≠ 0 ∧ reachable-n(h, n0 + m0, r, r0) → (∃ r1. reachable-n(h, m0, r, r1) ∧ reachable-n(h, n0, r1, r0)) ⊦ ∃ r2. (∃ r1. reachable-1(h, r, r1) ∧ reachable-n(h, m0, r1, r2)) ∧ reachable-n(h, n0, r2, r0)
Used simplifier rules: reachable-1-def: ⊦ reachable-1(h, r, r0) ↔ r ≠ null ∧ r0 ≠ null ∧ r ∈ h ∧ r0 ∈ h ∧ h[r].nxt = r0; reachable-n-rec: ⊦ reachable-n(h, n + 1, r, r0) ↔ (∃ r1. reachable-1(h, r, r1) ∧ reachable-n(h, n, r1, r0)); c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m +1 = m + 1; (s)
| h[r].nxt ≠ null, n0 ≠ 0, r ≠ null, reachable-n(h, n0 + m0, h[r].nxt, r0), h[r].nxt ∈ h, r ∈ h, ∀ n0, h, r, r0. n0 ≠ 0 ∧ reachable-n(h, n0 + m0, r, r0) → (∃ r1. reachable-n(h, m0, r, r1) ∧ reachable-n(h, n0, r1, r0)) ⊦ ∃ r2. (∃ r1. reachable-1(h, r, r1) ∧ reachable-n(h, m0, r1, r2)) ∧ reachable-n(h, n0, r2, r0) |
h[r].nxt ≠ null, n0 ≠ 0, r ≠ null, reachable-n(h, n0 + m0, h[r].nxt, r0), r ∈ h, h[r].nxt ∈ h, n0 ≠ 0 ∧ reachable-n(h, n0 + m0, h[r].nxt, r0) → (∃ r1. reachable-n(h, m0, h[r].nxt, r1) ∧ reachable-n(h, n0, r1, r0)) ⊦ ∃ r2. (∃ r1. reachable-1(h, r, r1) ∧ reachable-n(h, m0, r1, r2)) ∧ reachable-n(h, n0, r2, r0)
Used terms: n0, h, h[r].nxt, r0
| h[r].nxt ≠ null, n0 ≠ 0, r ≠ null, reachable-n(h, n0 + m0, h[r].nxt, r0), r ∈ h, h[r].nxt ∈ h, n0 ≠ 0 ∧ reachable-n(h, n0 + m0, h[r].nxt, r0) → (∃ r1. reachable-n(h, m0, h[r].nxt, r1) ∧ reachable-n(h, n0, r1, r0)) ⊦ ∃ r2. (∃ r1. reachable-1(h, r, r1) ∧ reachable-n(h, m0, r1, r2)) ∧ reachable-n(h, n0, r2, r0) |
h[r].nxt ≠ null, n0 ≠ 0, r ≠ null, reachable-n(h, n0 + m0, h[r].nxt, r0), reachable-n(h, m0, h[r].nxt, r1), reachable-n(h, n0, r1, r0), h[r].nxt ∈ h, r ∈ h ⊦ ∃ r2. (∃ r1. reachable-1(h, r, r1) ∧ reachable-n(h, m0, r1, r2)) ∧ reachable-n(h, n0, r2, r0)
| h[r].nxt ≠ null, n0 ≠ 0, r ≠ null, reachable-n(h, n0 + m0, h[r].nxt, r0), reachable-n(h, m0, h[r].nxt, r1), reachable-n(h, n0, r1, r0), h[r].nxt ∈ h, r ∈ h ⊦ ∃ r2. (∃ r1. reachable-1(h, r, r1) ∧ reachable-n(h, m0, r1, r2)) ∧ reachable-n(h, n0, r2, r0) |
h[r].nxt ≠ null, n0 ≠ 0, r ≠ null, reachable-n(h, n0, r1, r0), reachable-n(h, m0, h[r].nxt, r1), reachable-n(h, n0 + m0, h[r].nxt, r0), r ∈ h, h[r].nxt ∈ h ⊦ (∃ r0. reachable-1(h, r, r0) ∧ reachable-n(h, m0, r0, r1)) ∧ reachable-n(h, n0, r1, r0)
Used terms: r1
| h[r].nxt ≠ null, n0 ≠ 0, r ≠ null, reachable-n(h, n0, r1, r0), reachable-n(h, m0, h[r].nxt, r1), reachable-n(h, n0 + m0, h[r].nxt, r0), r ∈ h, h[r].nxt ∈ h ⊦ (∃ r0. reachable-1(h, r, r0) ∧ reachable-n(h, m0, r0, r1)) ∧ reachable-n(h, n0, r1, r0) |
h[r].nxt ≠ null, n0 ≠ 0, r ≠ null, reachable-n(h, n0 + m0, h[r].nxt, r0), reachable-n(h, m0, h[r].nxt, r1), reachable-n(h, n0, r1, r0), h[r].nxt ∈ h, r ∈ h ⊦ ∃ r0. reachable-1(h, r, r0) ∧ reachable-n(h, m0, r0, r1)
| h[r].nxt ≠ null, n0 ≠ 0, r ≠ null, reachable-n(h, n0 + m0, h[r].nxt, r0), reachable-n(h, m0, h[r].nxt, r1), reachable-n(h, n0, r1, r0), h[r].nxt ∈ h, r ∈ h ⊦ ∃ r0. reachable-1(h, r, r0) ∧ reachable-n(h, m0, r0, r1) |
Used simplifier rules: reachable-1-def: ⊦ reachable-1(h, r, r0) ↔ r ≠ null ∧ r0 ≠ null ∧ r ∈ h ∧ r0 ∈ h ∧ h[r].nxt = r0; Used terms: h[r].nxt
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.