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