| A.cols = (B * C).rows, A.cols = B.rows, B.cols = C.rows, m < A.rows, n < C.cols ⊦ A.rows = 0, C.cols = 0, Σ(C.rows, λ k. Σ(B.rows, λ k0. C[k, n] * A[m, k0] * B[k0, k])) = Σ(A.cols, λ k. A[m, k] * (B * C)[k, n]) |
A.cols = B.rows, B.cols = C.rows, m < A.rows, n < C.cols ⊦ A.rows = 0, C.cols = 0, Σ(C.rows, λ k. Σ(B.rows, λ k0. C[k, n] * A[m, k0] * B[k0, k])) = Σ(B.rows, λ k. Σ(C.rows, λ k0. A[m, k] * B[k, k0] * C[k0, n]))
Used simplifier rules: rows-dot: ⊦ A.cols = B.rows → (A * B).rows = A.rows;%at-dot: ⊦ A.cols = B.rows → (A * B)[m, n] = Σ(A.cols, λ k. A[m, k] * B[k, n]);%dist: ⊦ i * Σ(n, nf) = Σ(n, λ k. i * nf(k));%commutativity: ⊦ i * j = j * i; from specification int-mult%associativity: ⊦ i * j * j0 = (i * j) * j0; from specification int-mult