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