| ⊦ ar1 ≤ ar2 ∧ ar2 ≤ ar3 ∧ subarray(ar1, 0, m) = subarray(ar3, 0, m) ∧ m < # ar1 ∧ m < # ar2 ∧ m < # ar3 → subarray(ar1, 0, m) = subarray(ar2, 0, m) |
subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar1, 0, m) ≠ subarray(ar2, 0, m), m < # ar1, m < # ar2, m < # ar3, ar1 ≤ ar2, ar2 ≤ ar3 ⊦
| subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar1, 0, m) ≠ subarray(ar2, 0, m), m < # ar1, m < # ar2, m < # ar3, ar1 ≤ ar2, ar2 ≤ ar3 ⊦ |
m < # ar ⊦ ar = subarray(ar, 0, m) + subarray(ar, m, # ar - m)
ar3 = subarray(ar3, 0, m) + subarray(ar3, m, # ar3 - m), subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar1, 0, m) ≠ subarray(ar2, 0, m), m < # ar3, m < # ar2, m < # ar1, ar2 ≤ ar3, ar1 ≤ ar2 ⊦
Used terms: m, ar3
| m < # ar ⊦ ar = subarray(ar, 0, m) + subarray(ar, m, # ar - m) |
| ar3 = subarray(ar3, 0, m) + subarray(ar3, m, # ar3 - m), subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar1, 0, m) ≠ subarray(ar2, 0, m), m < # ar3, m < # ar2, m < # ar1, ar2 ≤ ar3, ar1 ≤ ar2 ⊦ |
m < # ar ⊦ ar = subarray(ar, 0, m) + subarray(ar, m, # ar - m)
ar1 = subarray(ar1, 0, m) + subarray(ar1, m, # ar1 - m), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, # ar3 - m), subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar1, 0, m) ≠ subarray(ar2, 0, m), m < # ar1, m < # ar2, m < # ar3, ar1 ≤ ar2, ar2 ≤ ar3 ⊦
Used terms: m, ar1
| m < # ar ⊦ ar = subarray(ar, 0, m) + subarray(ar, m, # ar - m) |
| ar1 = subarray(ar1, 0, m) + subarray(ar1, m, # ar1 - m), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, # ar3 - m), subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar1, 0, m) ≠ subarray(ar2, 0, m), m < # ar1, m < # ar2, m < # ar3, ar1 ≤ ar2, ar2 ≤ ar3 ⊦ |
ar1 = subarray(ar3, 0, m) + subarray(ar1, m, # ar1 - m), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, # ar3 - m), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar1, m < # ar2, m < # ar3, ar1 ≤ ar3, ar1 ≤ ar2, ar2 ≤ ar3 ⊦
Used simplifier rules: array-le-trans: ⊦ ar0 ≤ ar1 ∧ ar1 ≤ ar2 → ar0 ≤ ar2; ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic
| ar1 = subarray(ar3, 0, m) + subarray(ar1, m, # ar1 - m), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, # ar3 - m), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar1, m < # ar2, m < # ar3, ar1 ≤ ar3, ar1 ≤ ar2, ar2 ≤ ar3 ⊦ |
# ar1 = n0 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, # ar3 - m), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar3, m < # ar2, m < # ar1, ar2 ≤ ar3, ar1 ≤ ar2, ar1 ≤ ar3, m ≤ # ar1 ⊦
Used simplifier rules: ⊦ m < n → m ≤ n; (s) n ≤ m ⊦ n0 = m - n ↔ m = n0 + n; (elim) Used terms: # ar1, m, n0
| # ar1 = n0 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, # ar3 - m), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar3, m < # ar2, m < # ar1, ar2 ≤ ar3, ar1 ≤ ar2, ar1 ≤ ar3, m ≤ # ar1 ⊦ |
# ar1 = n0 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, # ar3 - m), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], n0 ≠ 0, subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar2, m < # ar3, ar1 ≤ ar3, ar1 ≤ ar2, ar2 ≤ ar3 ⊦
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 → 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 ⊦ m < n → m ≤ n; (s)
| # ar1 = n0 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, # ar3 - m), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], n0 ≠ 0, subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar2, m < # ar3, ar1 ≤ ar3, ar1 ≤ ar2, ar2 ≤ ar3 ⊦ |
# ar1 = n0 + m, # ar3 = n1 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], n0 ≠ 0, subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar3, m < # ar2, ar2 ≤ ar3, ar1 ≤ ar2, ar1 ≤ ar3, m ≤ # ar3 ⊦
Used simplifier rules: ⊦ m < n → m ≤ n; (s) n ≤ m ⊦ n0 = m - n ↔ m = n0 + n; (elim) Used terms: # ar3, m, n
| # ar1 = n0 + m, # ar3 = n1 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], n0 ≠ 0, subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar3, m < # ar2, ar2 ≤ ar3, ar1 ≤ ar2, ar1 ≤ ar3, m ≤ # ar3 ⊦ |
# ar3 = n1 + m, # ar1 = n0 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], n0 ≠ 0, n1 ≠ 0, subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar2, ar1 ≤ ar3, ar1 ≤ ar2, ar2 ≤ ar3 ⊦
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 → 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 ⊦ m < n → m ≤ n; (s)
| # ar3 = n1 + m, # ar1 = n0 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], n0 ≠ 0, n1 ≠ 0, subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar2, ar1 ≤ ar3, ar1 ≤ ar2, ar2 ≤ ar3 ⊦ |
⊦ x + y1 ≤ ar2 ∧ ar2 ≤ x + y3 → (∃ y2. ar2 = x + y2)
# ar1 = n0 + m, # ar3 = n1 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], n0 ≠ 0, n1 ≠ 0, subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar2, ar2 ≤ ar3, ar1 ≤ ar2, ar1 ≤ ar3, subarray(ar3, 0, m) + subarray(ar1, m, n0) ≤ ar2 ∧ ar2 ≤ subarray(ar3, 0, m) + subarray(ar3, m, n1) → (∃ y2. ar2 = subarray(ar3, 0, m) + y2) ⊦
Used terms: subarray(ar3, 0, m), subarray(ar1, m, n0), ar2, subarray(ar3, m, n1)
| ⊦ x + y1 ≤ ar2 ∧ ar2 ≤ x + y3 → (∃ y2. ar2 = x + y2) |
| # ar1 = n0 + m, # ar3 = n1 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), ar1 ≠ [], ar2 ≠ [], ar3 ≠ [], n0 ≠ 0, n1 ≠ 0, subarray(ar3, 0, m) ≠ subarray(ar2, 0, m), m < # ar2, ar2 ≤ ar3, ar1 ≤ ar2, ar1 ≤ ar3, subarray(ar3, 0, m) + subarray(ar1, m, n0) ≤ ar2 ∧ ar2 ≤ subarray(ar3, 0, m) + subarray(ar3, m, n1) → (∃ y2. ar2 = subarray(ar3, 0, m) + y2) ⊦ |
# ar3 = n1 + m, # ar1 = n0 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar3, 0, m) + ar ≠ [], ar ≠ [], ar1 ≠ [], ar3 ≠ [], n0 ≠ 0, n1 ≠ 0, subarray(ar3, 0, m) ≠ subarray(subarray(ar3, 0, m) + ar, 0, m), ar1 ≤ ar3, ar1 ≤ subarray(ar3, 0, m) + ar, subarray(ar3, 0, m) + ar ≤ ar3 ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ # x = 0 ↔ x = []; (s) ⊦ m < m + n ↔ n ≠ 0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list[natarray-oarray-sort] ⊦ # subarray(ar, m, n) = n; (s) ⊦ #(x + y) = # x + # y; (s)
| # ar3 = n1 + m, # ar1 = n0 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar3, 0, m) + ar ≠ [], ar ≠ [], ar1 ≠ [], ar3 ≠ [], n0 ≠ 0, n1 ≠ 0, subarray(ar3, 0, m) ≠ subarray(subarray(ar3, 0, m) + ar, 0, m), ar1 ≤ ar3, ar1 ≤ subarray(ar3, 0, m) + ar, subarray(ar3, 0, m) + ar ≤ ar3 ⊦ |
⊦ ar1 = ar2 ↔ # ar1 = # ar2 ∧ (∀ n. n < # ar1 → ar1[n] = ar2[n])
# ar1 = n0 + m, # ar3 = n1 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar3, 0, m) + ar ≠ [], ar ≠ [], ar1 ≠ [], ar3 ≠ [], n0 ≠ 0, n1 ≠ 0, subarray(ar3, 0, m) + ar ≤ ar3, ar1 ≤ subarray(ar3, 0, m) + ar, ar1 ≤ ar3, # subarray(ar3, 0, m) ≠ # subarray(subarray(ar3, 0, m) + ar, 0, m) ∨ (∃ n. ¬(n < # subarray(ar3, 0, m) → subarray(ar3, 0, m)[n] = subarray(subarray(ar3, 0, m) + ar, 0, m)[n])) ⊦
Used terms: subarray(ar3, 0, m), subarray(subarray(ar3, 0, m) + ar, 0, m)
| ⊦ ar1 = ar2 ↔ # ar1 = # ar2 ∧ (∀ n. n < # ar1 → ar1[n] = ar2[n]) |
| # ar1 = n0 + m, # ar3 = n1 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar3, 0, m) + ar ≠ [], ar ≠ [], ar1 ≠ [], ar3 ≠ [], n0 ≠ 0, n1 ≠ 0, subarray(ar3, 0, m) + ar ≤ ar3, ar1 ≤ subarray(ar3, 0, m) + ar, ar1 ≤ ar3, # subarray(ar3, 0, m) ≠ # subarray(subarray(ar3, 0, m) + ar, 0, m) ∨ (∃ n. ¬(n < # subarray(ar3, 0, m) → subarray(ar3, 0, m)[n] = subarray(subarray(ar3, 0, m) + ar, 0, m)[n])) ⊦ |
# ar1 = n0 + m, # ar3 = n1 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar3, 0, m) + ar ≠ [], ar3[n] ≠ (subarray(ar3, 0, m) + ar)[n], ar ≠ [], ar1 ≠ [], ar3 ≠ [], n0 ≠ 0, n1 ≠ 0, n < m, subarray(ar3, 0, m) + ar ≤ ar3, ar1 ≤ subarray(ar3, 0, m) + ar, ar1 ≤ ar3 ⊦
Used simplifier rules: ⊦ m < n → n ≠ 0; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ n + 0 = n; (s) ⊦ n0 < n → subarray(ar, m, n)[n0] = ar[m + n0]; (s) ⊦ # subarray(ar, m, n) = n; (s)
| # ar1 = n0 + m, # ar3 = n1 + m, ar1 = subarray(ar3, 0, m) + subarray(ar1, m, n0), ar3 = subarray(ar3, 0, m) + subarray(ar3, m, n1), subarray(ar1, 0, m) = subarray(ar3, 0, m), subarray(ar3, 0, m) + ar ≠ [], ar3[n] ≠ (subarray(ar3, 0, m) + ar)[n], ar ≠ [], ar1 ≠ [], ar3 ≠ [], n0 ≠ 0, n1 ≠ 0, n < m, subarray(ar3, 0, m) + ar ≤ ar3, ar1 ≤ subarray(ar3, 0, m) + ar, ar1 ≤ ar3 ⊦ |
⊦ n < # x → (x + y)[n] = x[n]
Used simplifier rules: ⊦ n0 < n → subarray(ar, m, n)[n0] = ar[m + 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 ⊦ ¬ n < # x → (x + y)[n] = y[n - # x]; (s) a: ⊦ (x + y) + z = x + y + z; from specification list[natarray-oarray-sort] ⊦ # subarray(ar, m, n) = n; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ m < n → (n ≤ m ↔ false); (s) Used terms: subarray(ar3, 0, m), ar, n
| ⊦ n < # x → (x + y)[n] = x[n] |
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.