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