| ⊦ #r mx1 = #r mx2 ∧ #c mx1 = #c mx2 ∧ #c mx1 = # vec → (mx1 + mx2) * vec = mx1 * vec + mx2 * vec |
#c mx1 = #c mx2, #c mx1 = # vec, #r mx1 = #r mx2, (mx1 + mx2) * vec ≠ mx1 * vec + mx2 * vec ⊦
| #c mx1 = #c mx2, #c mx1 = # vec, #r mx1 = #r mx2, (mx1 + mx2) * vec ≠ mx1 * vec + mx2 * vec ⊦ |
#c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, (mx1 + mx2) * vec ≠ mx1 * vec + mx2 * vec ⊦
| #c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, (mx1 + mx2) * vec ≠ mx1 * vec + mx2 * vec ⊦ |
⊦ ar1 = ar2 ↔ # ar1 = # ar2 ∧ (∀ n. n < # ar1 → ar1[n] = ar2[n])
#c mx1 = # vec, #c mx2 = # vec, #r mx1 = #r mx2, #((mx1 + mx2) * vec) ≠ #(mx1 * vec + mx2 * vec) ∨ (∃ n. ¬(n < #((mx1 + mx2) * vec) → ((mx1 + mx2) * vec)[n] = (mx1 * vec + mx2 * vec)[n])) ⊦
Used terms: (mx1 + mx2) * vec, mx1 * vec + mx2 * vec
| ⊦ ar1 = ar2 ↔ # ar1 = # ar2 ∧ (∀ n. n < # ar1 → ar1[n] = ar2[n]) |
| #c mx1 = # vec, #c mx2 = # vec, #r mx1 = #r mx2, #((mx1 + mx2) * vec) ≠ #(mx1 * vec + mx2 * vec) ∨ (∃ n. ¬(n < #((mx1 + mx2) * vec) → ((mx1 + mx2) * vec)[n] = (mx1 * vec + mx2 * vec)[n])) ⊦ |
#c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, #((mx1 + mx2) * vec) ≠ #r mx2 ∨ ¬(n < #((mx1 + mx2) * vec) → ((mx1 + mx2) * vec)[n] = (mx1 * vec + mx2 * vec)[n]) ⊦
Used simplifier rules: addvec-size: ⊦ #(vec1 + vec2) = # vec1; multmxvec-size: ⊦ #c mx = # vec → #(mx * vec) = #r mx;
| #c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, #((mx1 + mx2) * vec) ≠ #r mx2 ∨ ¬(n < #((mx1 + mx2) * vec) → ((mx1 + mx2) * vec)[n] = (mx1 * vec + mx2 * vec)[n]) ⊦ |
⊦ #c mx = # vec → #(mx * vec) = #r mx
#c mx1 = # vec, #c mx2 = # vec, #c(mx1 + mx2) = # vec, #r mx1 = #r mx2, #r(mx1 + mx2) ≠ #r mx2 ∨ ¬(n < #r(mx1 + mx2) → ((mx1 + mx2) * vec)[n] = (mx1 * vec + mx2 * vec)[n]) ⊦
Used simplifier rules: addmx-colno: ⊦ #c(mx1 + mx2) = #c mx1; Used terms: mx1 + mx2, vec
| ⊦ #c mx = # vec → #(mx * vec) = #r mx |
| #c mx1 = # vec, #c mx2 = # vec, #c(mx1 + mx2) = # vec, #r mx1 = #r mx2, #r(mx1 + mx2) ≠ #r mx2 ∨ ¬(n < #r(mx1 + mx2) → ((mx1 + mx2) * vec)[n] = (mx1 * vec + mx2 * vec)[n]) ⊦ |
#c mx1 = # vec, #c mx2 = # vec, #r mx1 = #r mx2, ((mx1 + mx2) * vec)[n] ≠ (mx1 * vec + mx2 * vec)[n], n < #r mx2 ⊦
Used simplifier rules: addmx-colno: ⊦ #c(mx1 + mx2) = #c mx1; addmx-rowno: ⊦ #r(mx1 + mx2) = #r mx1; ⊦ 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
| #c mx1 = # vec, #c mx2 = # vec, #r mx1 = #r mx2, ((mx1 + mx2) * vec)[n] ≠ (mx1 * vec + mx2 * vec)[n], n < #r mx2 ⊦ |
⊦ #c mx = # vec ∧ r < #r mx → (mx * vec)[r] = Σ(0 to # vec, λ n. mx[r, n] * vec[n])
#c mx2 = # vec, #c mx1 = # vec, #c(mx1 + mx2) = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ (mx1 * vec + mx2 * vec)[n], n < #r mx2, n < #r(mx1 + mx2) ⊦
Used simplifier rules: addmx-colno: ⊦ #c(mx1 + mx2) = #c mx1; addmx-rowno: ⊦ #r(mx1 + mx2) = #r mx1; ⊦ m < n ↔ ¬ n ≤ m; (ss) fle-01: ⊦ m ≤ n ∧ n < n0 → m < n0; (forward) from specification nat fle: ⊦ m < n ∧ n ≤ n0 → m < n0; (forward) from specification nat ⊦ ¬ n < n; (s) Used terms: mx1 + mx2, vec, n
| ⊦ #c mx = # vec ∧ r < #r mx → (mx * vec)[r] = Σ(0 to # vec, λ n. mx[r, n] * vec[n]) |
| #c mx2 = # vec, #c mx1 = # vec, #c(mx1 + mx2) = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ (mx1 * vec + mx2 * vec)[n], n < #r mx2, n < #r(mx1 + mx2) ⊦ |
#c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ (mx1 * vec + mx2 * vec)[n], n < #r mx2 ⊦
Used simplifier rules: addmx-colno: ⊦ #c(mx1 + mx2) = #c mx1; addmx-rowno: ⊦ #r(mx1 + mx2) = #r mx1;
| #c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ (mx1 * vec + mx2 * vec)[n], n < #r mx2 ⊦ |
⊦ n < # vec1 → (vec1 + vec2)[n] = vec1[n] + vec2[n]
#c mx1 = # vec, #c mx2 = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ (mx1 * vec)[n] + (mx2 * vec)[n], n < #r mx2, n < #(mx1 * vec) ⊦
Used simplifier rules: multmxvec-size: ⊦ #c mx = # vec → #(mx * vec) = #r mx; ⊦ m < n ↔ ¬ n ≤ m; (ss) fle-01: ⊦ m ≤ n ∧ n < n0 → m < n0; (forward) from specification nat fle: ⊦ m < n ∧ n ≤ n0 → m < n0; (forward) from specification nat ⊦ ¬ n < n; (s) Used terms: mx1 * vec, mx2 * vec, n
| ⊦ n < # vec1 → (vec1 + vec2)[n] = vec1[n] + vec2[n] |
| #c mx1 = # vec, #c mx2 = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ (mx1 * vec)[n] + (mx2 * vec)[n], n < #r mx2, n < #(mx1 * vec) ⊦ |
#c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0]) + Σ(0 to # vec, λ n0. mx2[n, n0] * vec[n0]), n < #r mx2 ⊦
Used simplifier rules: multmxvec-size: ⊦ #c mx = # vec → #(mx * vec) = #r mx; multmxvec-get: ⊦ #c mx = # vec ∧ r < #r mx → (mx * vec)[r] = Σ(0 to # vec, λ n. mx[r, n] * vec[n]);
| #c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0]) + Σ(0 to # vec, λ n0. mx2[n, n0] * vec[n0]), n < #r mx2 ⊦ |
⊦ Σ(ns, f1) + Σ(ns, f2) = Σ(ns, λ n. f1(n) + f2(n))
#c mx1 = # vec, #c mx2 = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]), n < #r mx2 ⊦
Used terms: 0 to # vec, λ n0. mx1[n, n0] * vec[n0], λ n0. mx2[n, n0] * vec[n0]
| ⊦ Σ(ns, f1) + Σ(ns, f2) = Σ(ns, λ n. f1(n) + f2(n)) |
| #c mx1 = # vec, #c mx2 = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]), n < #r mx2 ⊦ |
⊦ (∀ n. n ∈ ns → f1(n) = f2(n)) → Σ(ns, f1) = Σ(ns, f2)
#c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]), n < #r mx2, (∀ n0. n0 ∈ 0 to # vec → (mx1 + mx2)[n, n0] * vec[n0] = mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]) → Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) = Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]) ⊦
Used terms: 0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0], λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]
| ⊦ (∀ n. n ∈ ns → f1(n) = f2(n)) → Σ(ns, f1) = Σ(ns, f2) |
| #c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]), n < #r mx2, (∀ n0. n0 ∈ 0 to # vec → (mx1 + mx2)[n, n0] * vec[n0] = mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]) → Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) = Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]) ⊦ |
#c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, (mx1 + mx2)[n, n0] * vec[n0] ≠ mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0], Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]), n0 < # vec, n < #r mx2 ⊦
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 ⊦ 0 ≤ m; (s) ⊦ n0 ∈ m to n ↔ m ≤ n0 ∧ n0 < n; (s)
| #c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, (mx1 + mx2)[n, n0] * vec[n0] ≠ mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0], Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]), n0 < # vec, n < #r mx2 ⊦ |
⊦ r < #r mx1 ∧ c < #c mx1 → (mx1 + mx2)[r, c] = mx1[r, c] + mx2[r, c]
#c mx1 = # vec, #c mx2 = # vec, #r mx1 = #r mx2, (mx1[n, n0] + mx2[n, n0]) * vec[n0] ≠ mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0], Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]), n < #r mx2, n0 < # vec, n < #r mx1, n0 < #c mx1 ⊦
Used terms: mx1, mx2, n, n0
| ⊦ r < #r mx1 ∧ c < #c mx1 → (mx1 + mx2)[r, c] = mx1[r, c] + mx2[r, c] |
| #c mx1 = # vec, #c mx2 = # vec, #r mx1 = #r mx2, (mx1[n, n0] + mx2[n, n0]) * vec[n0] ≠ mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0], Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]), n < #r mx2, n0 < # vec, n < #r mx1, n0 < #c mx1 ⊦ |
#c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, (mx1[n, n0] + mx2[n, n0]) * vec[n0] ≠ mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0], Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]), n0 < # vec, n < #r mx2 ⊦
| #c mx2 = # vec, #c mx1 = # vec, #r mx1 = #r mx2, (mx1[n, n0] + mx2[n, n0]) * vec[n0] ≠ mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0], Σ(0 to # vec, λ n0. (mx1 + mx2)[n, n0] * vec[n0]) ≠ Σ(0 to # vec, λ n0. mx1[n, n0] * vec[n0] + mx2[n, n0] * vec[n0]), n0 < # vec, n < #r mx2 ⊦ |
⊦ (b + c) * a = b * a + c * a
Used terms: mx1[n, n0], mx2[n, n0], vec[n0]
| ⊦ (b + c) * a = b * a + c * a |
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.