| ⊦ #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.