| A.cols = B.rows, m2 = 0, C1 = A.rows × B.cols, m ≤ C.rows, C.rows = A.rows, C.cols = B.cols, ∀ m0, n0. m0 < C.rows ∧ n0 < C.cols → C[m0, n0] = C1[m0, n0] + (m0 < m ∧ n0 < C.cols ⊃ Σ(B.rows, λ k. A[m0, k] * B[k, n0]);0), ¬ m < C.rows, C ≠ A * B ⊦ |
C.cols = B.cols, C.rows = A.rows, A.cols = B.rows, n < B.cols, m0 < A.rows, ∀ m, n0. m < A.rows ∧ n0 < B.cols → C[m, n0] = Σ(B.rows, λ k. A[m, k] * B[k, n0]) ⊦ B.cols = 0, A.rows = 0, C[m0, n] = Σ(B.rows, λ k. A[m0, k] * B[k, n])
Used simplifier rules: prove-ext: ⊦ A ≠ B ↔ ¬ ( A.rows = B.rows ∧ A.cols = B.cols ∧ (∀ m, n. m < A.rows ∧ n < A.cols → A[m, n] = B[m, n]));%add-c: ⊦ i + j = j + i; from specification int-basic2%add-a: ⊦ i + j + i0 = (i + j) + i0; from specification int-basic2%add-zero-rev: ⊦ 0 + i = i; from specification int-basic2%at-base: ⊦ m0 < m ∧ n0 < n → (m × n)[m0, n0] = 0; from specification matrix%ler: ⊦ m ≤ m; from specification nat%lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic1%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic1%anti: ⊦ m ≤ n → (n ≤ m ↔ m = n); from specification nat%lels: ⊦ ¬ m < n ↔ n ≤ m; from specification nat%at-dot: ⊦ A.cols = B.rows → (A * B)[m, n] = Σ(A.cols, λ k. A[m, k] * B[k, n]); from specification matrix-dot%cols-dot: ⊦ A.cols = B.rows → (A * B).cols = B.cols; from specification matrix-dot%rows-dot: ⊦ A.cols = B.rows → (A * B).rows = A.rows; from specification matrix-dot