| A.cols = B.rows, m2 = 0, C1 = A.rows × B.cols, m ≤ C2.rows, C2.rows = A.rows, C2.cols = B.cols, ∀ m0, n0. m0 < C2.rows ∧ n0 < C2.cols → C2[m0, n0] = C1[m0, n0] + (m0 < m ∧ n0 < C2.cols ⊃ Σ(B.rows, λ k. A[m0, k] * B[k, n0]);0), C2 = C0, m = m1, m < C2.rows, k1 = 0, k ≤ B.rows, C4.rows = A.rows, C4.cols = B.cols, ∀ m0, n0. m0 < C4.rows ∧ n0 < C4.cols → C4[m0, n0] = C2[m0, n0] + (m0 = m ∧ n0 < C4.cols ⊃ Σ(k, λ k. A[m0, k] * B[k, n0]);0), k = k0, k < B.rows, n2 = 0, n ≤ C.cols, C.rows = A.rows, C.cols = B.cols, ∀ m0, n0. m0 < C.rows ∧ n0 < C.cols → C[m0, n0] = C4[m0, n0] + (m0 = m ∧ n0 < n ⊃ A[m0, k] * B[k, n0];0), C = C3, n = n1, n < C.cols, ( ¬ n + 1 ≤ C[m, n, C[m, n] + A[m, k] * B[k, n]].cols ∨ C[m, n, C[m, n] + A[m, k] * B[k, n]].rows ≠ A.rows ∨ C[m, n, C[m, n] + A[m, k] * B[k, n]].cols ≠ B.cols ∨ (∃ m0, n1. ¬ ( m0 < C[m, n, C[m, n] + A[m, k] * B[k, n]].rows ∧ n1 < C[m, n, C[m, n] + A[m, k] * B[k, n]].cols → C[m, n, C[m, n] + A[m, k] * B[k, n]][m0, n1] = C4[m0, n1] + (m0 = m ∧ n1 < n + 1 ⊃ A[m0, k] * B[k, n1];0)))) ∨ ¬ C[m, n, C[m, n] + A[m, k] * B[k, n]].cols - n + 1 < C3.cols - n1 ⊦ |
C3.cols = B.cols, C3.rows = A.rows, C4.cols = B.cols, C4.rows = A.rows, C2.cols = B.cols, C2.rows = A.rows, A.cols = B.rows, n < B.cols, m0 < A.rows, n1 < B.cols, k < B.rows, m < A.rows, ∀ m0, n. m0 < A.rows ∧ n < B.cols → C3[m0, n] = C4[m0, n] + (m0 = m ∧ n < n1 ⊃ A[m, k] * B[k, n];0), ∀ m0, n. m0 < A.rows ∧ n < B.cols → C4[m0, n] = C2[m0, n] + (m0 = m ⊃ Σ(k, λ k. A[m, k] * B[k, n]);0), ∀ m1, n0. m1 < A.rows ∧ n0 < B.cols → C2[m1, n0] = (m1 < m ⊃ Σ(B.rows, λ k. A[m1, k] * B[k, n0]);0) ⊦ B.cols = 0, A.rows = 0, B.rows = 0, (m0 = m ∧ n = n1 ⊃ C3[m, n1] + A[m, k] * B[k, n1];C3[m0, n]) = C4[m0, n] + (m0 = m ∧ ¬ n1 < n ⊃ A[m, k] * B[k, n];0)
Used simplifier rules: 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%ref-1: ⊦ ¬ n < n; from specification nat-basic1%prop-07: ⊦ n < m → (m - n) + n = m; from specification nat%ls-01: n0 ≤ n ⊦ n - n0 < m ↔ n < m + n0; from specification nat%le-ls-simp: ⊦ m ≤ n → (n < m ↔ false); from specification nat%fle-01: ⊦ m ≤ n ∧ n < n0 → m < n0; (forward) 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%lels: ⊦ ¬ m < n ↔ n ≤ m; from specification nat%s: ⊦ m < n + 1 ↔ ¬ n < m; from specification nat-basic2%at-rec: ⊦ A[m, n, i][m0, n0] = (m0 = m ∧ n0 = n ⊃ i;A[m0, n0]); from specification matrix%rows-rec: ⊦ A[m, n, i].rows = A.rows; from specification matrix%c: ⊦ m + n = n + m; from specification nat-basic2%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic2%succ-01: ⊦ m + 1 ≤ n ↔ m < n; from specification nat%cols-rec: ⊦ A[m, n, i].cols = A.cols; from specification matrix%lels-03: ⊦ m < n → m ≤ n; from specification nat