| ⊦ a + x = a0 + x0 ↔ a = a0 ∧ x = x0 |
¬(a + x = a0 + x0 ↔ a = a0 ∧ x = x0) ⊦
| ¬(a + x = a0 + x0 ↔ a = a0 ∧ x = x0) ⊦ |
a + x = a0 + x0 ⊦ a = a0 ∧ x = x0
| a + x = a0 + x0 ⊦ a = a0 ∧ x = x0 |
⊦ a + ar = copy(ar, 0, mkarray(# ar + 1), 1, # ar)[0 := a]
a + x = copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0] ⊦ a = a0 ∧ x = x0
Used terms: a0, x0
| ⊦ a + ar = copy(ar, 0, mkarray(# ar + 1), 1, # ar)[0 := a] |
| a + x = copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0] ⊦ a = a0 ∧ x = x0 |
⊦ a + ar = copy(ar, 0, mkarray(# ar + 1), 1, # ar)[0 := a]
copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a] = copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0] ⊦ a = a0 ∧ x = x0
Used terms: a, x
| ⊦ a + ar = copy(ar, 0, mkarray(# ar + 1), 1, # ar)[0 := a] |
| copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a] = copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0] ⊦ a = a0 ∧ x = x0 |
copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a] = copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0], x ≠ x0 ⊦ a = a0 ∧ x = x0
Used simplifier rules: ⊦ ar[n := a] = ar[n := b] ↔ n < # ar → a = b; (s) ⊦ # copy(ar, m, ar0, m0, n) = # ar0; (s) ⊦ # mkarray(n) = n; (s) ⊦ 0 < m ↔ m ≠ 0; (s) ⊦ m + 1 ≠ 0; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used formulas: x = x0
| copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a] = copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0], x ≠ x0 ⊦ a = a0 ∧ x = x0 |
copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a] = copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0], x ≠ x0 ⊦
| copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a] = copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0], x ≠ x0 ⊦ |
⊦ ar1 = ar2 ↔ # ar1 = # ar2 ∧ (∀ n. n < # ar1 → ar1[n] = ar2[n])
# copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a] = # copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0], x ≠ x0, ∀ n. n < # copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a] → (copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦
Used terms: copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a], copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0]
| ⊦ ar1 = ar2 ↔ # ar1 = # ar2 ∧ (∀ n. n < # ar1 → ar1[n] = ar2[n]) |
| # copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a] = # copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0], x ≠ x0, ∀ n. n < # copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a] → (copy(x, 0, mkarray(# x + 1), 1, # x)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦ |
# x = # x0, x ≠ x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m < n + 1 ↔ ¬ n < m; (s) ⊦ # mkarray(n) = n; (s) ⊦ # copy(ar, m, ar0, m0, n) = # ar0; (s) ⊦ # ar[n := a] = # ar; (s) ⊦ m + n = m + n0 ↔ n = n0; (s)
| # x = # x0, x ≠ x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦ |
⊦ ar1 = ar2 ↔ # ar1 = # ar2 ∧ (∀ n. n < # ar1 → ar1[n] = ar2[n])
# x = # x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n], # x ≠ # x0 ∨ (∃ n. ¬(n < # x → x[n] = x0[n])) ⊦
Used terms: x, x0
| ⊦ ar1 = ar2 ↔ # ar1 = # ar2 ∧ (∀ n. n < # ar1 → ar1[n] = ar2[n]) |
| # x = # x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n], # x ≠ # x0 ∨ (∃ n. ¬(n < # x → x[n] = x0[n])) ⊦ |
# x = # x0, x[n] ≠ x0[n], n < # x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦
Used simplifier rules: ⊦ m < n → n ≠ 0; (s) lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic
| # x = # x0, x[n] ≠ x0[n], n < # x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦ |
# x = # x0, x[n] ≠ x0[n], n < # x0, ¬ # x0 < n + 1 → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n + 1] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n + 1], ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦
Used terms: n + 1
| # x = # x0, x[n] ≠ x0[n], n < # x0, ¬ # x0 < n + 1 → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n + 1] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n + 1], ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦ |
# x = # x0, (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n + 1] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n + 1], x[n] ≠ x0[n], n < # x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m < n + 1 ↔ ¬ n < m; (s)
| # x = # x0, (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n + 1] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n + 1], x[n] ≠ x0[n], n < # x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦ |
# x = # x0, (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n + 1] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n + 1], n + 1 ≠ 0, x[n] ≠ x0[n], n < # x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦
Used simplifier rules: ⊦ m + n = 0 ↔ m = 0 ∧ n = 0; (ws) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used formulas: n + 1 = 0
| # x = # x0, (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n + 1] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n + 1], n + 1 ≠ 0, x[n] ≠ x0[n], n < # x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦ |
# x = # x0, copy(x, 0, mkarray(# x0 + 1), 1, # x0)[n + 1] = copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[n + 1], x[n] ≠ x0[n], n < # x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + 1 ≠ 0; (s) ⊦ m ≠ n → (ar[n := a])[m] = ar[m]; (s)
| # x = # x0, copy(x, 0, mkarray(# x0 + 1), 1, # x0)[n + 1] = copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[n + 1], x[n] ≠ x0[n], n < # x0, ∀ n. ¬ # x0 < n → (copy(x, 0, mkarray(# x0 + 1), 1, # x0)[0 := a])[n] = (copy(x0, 0, mkarray(# x0 + 1), 1, # x0)[0 := a0])[n] ⊦ |
⊦ m0 < # ar1 → copy(ar0, n, ar1, n0, m)[m0] = (m0 < n0 ∨ n0 + m ≤ m0 ⊃ ar1[m0];ar0[m0 + n - n0])
Used simplifier rules: ⊦ m0 < # ar1 → copy(ar0, n, ar1, n0, m)[m0] = (m0 < n0 ∨ n0 + m ≤ m0 ⊃ ar1[m0];ar0[m0 + n - n0]); (s) ⊦ ¬ m < n → ¬ m + m0 < n; (s) ⊦ m + n ≤ m + n0 ↔ n ≤ n0; (s) ⊦ m < n → (n ≤ m ↔ false); (s) ⊦ n ≤ m → m + n0 - n = (m - n) + n0; (s) ⊦ n + 0 = n; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic ⊦ # mkarray(n) = n; (s) ⊦ m + n < m + n0 ↔ n < n0; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) Used terms: 1, 0, mkarray(# x0 + 1), # x0, n + 1, x
| ⊦ m0 < # ar1 → copy(ar0, n, ar1, n0, m)[m0] = (m0 < n0 ∨ n0 + m ≤ m0 ⊃ ar1[m0];ar0[m0 + n - n0]) |
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.