| A.cols = B.rows, m = 0, C = A.rows × B.cols ⊦ ⟨while m < C.rows do {/* (correctness invariant: m ≤ C.rows ∧ C.rows = A.rows ∧ C.cols = B.cols ∧ (∀ m0, n0. m0 < C.rows ∧ n0 < C.cols → C[m0, n0] = (C`)[m0, n0] + (m0 < m ∧ n0 < C.cols ⊃ Σ(B.rows, λ k. A[m0, k] * B[k, n0]);0)) wfbound: C.rows - m) */; let k = 0 in while k < B.rows do {/* (correctness invariant: k ≤ B.rows ∧ C.rows = A.rows ∧ C.cols = B.cols ∧ (∀ m0, n0. m0 < C.rows ∧ n0 < C.cols → C[m0, n0] = (C`)[m0, n0] + (m0 = m ∧ n0 < C.cols ⊃ Σ(k, λ k. A[m0, k] * B[k, n0]);0)) wfbound: B.rows - k) */; let n = 0 in while n < C.cols do {/* (correctness invariant: n ≤ C.cols ∧ C.rows = A.rows ∧ C.cols = B.cols ∧ (∀ m0, n0. m0 < C.rows ∧ n0 < C.cols → C[m0, n0] = (C`)[m0, n0] + (m0 = m ∧ n0 < n ⊃ A[m0, k] * B[k, n0];0)) wfbound: C.cols - n) */; C[m, n] := C[m, n] + A[m, k] * B[k, n]; n := n + 1}; k := k + 1}; m := m + 1}⟩ (C = A * B) |
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), C = C0, m = m1, m < C.rows ⊦ ⟨let k = 0 in while k < B.rows do {/* (correctness invariant: k ≤ B.rows ∧ C.rows = A.rows ∧ C.cols = B.cols ∧ (∀ m0, n0. m0 < C.rows ∧ n0 < C.cols → C[m0, n0] = (C`)[m0, n0] + (m0 = m ∧ n0 < C.cols ⊃ Σ(k, λ k. A[m0, k] * B[k, n0]);0)) wfbound: B.rows - k) */; let n = 0 in while n < C.cols do {/* (correctness invariant: n ≤ C.cols ∧ C.rows = A.rows ∧ C.cols = B.cols ∧ (∀ m0, n0. m0 < C.rows ∧ n0 < C.cols → C[m0, n0] = (C`)[m0, n0] + (m0 = m ∧ n0 < n ⊃ A[m0, k] * B[k, n0];0)) wfbound: C.cols - n) */; C[m, n] := C[m, n] + A[m, k] * B[k, n]; n := n + 1}; k := k + 1}⟩ ⟨m := m + 1⟩ ( ( 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))) ∧ C.rows - m < C0.rows - m1)
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 ⊦
Used simplifier rules: rows-base: ⊦ (m × n).rows = m; from specification matrix%lez: ⊦ 0 ≤ m; from specification nat%cols-base: ⊦ (m × n).cols = n; from specification matrix%at-base: ⊦ m0 < m ∧ n0 < n → (m × n)[m0, n0] = 0; from specification matrix%zero-01: ⊦ ¬ m < 0; from specification nat-basic1%add-a: ⊦ i + j + i0 = (i + j) + i0; from specification int-basic2%add-c: ⊦ i + j = j + i; from specification int-basic2 Used formulas: m ≤ C.rows ∧ C.rows = A.rows ∧ C.cols = B.cols ∧ (∀ m0, n0. m0 < C.rows ∧ n0 < C.cols → C[m0, n0] = (C`)[m0, n0] + (m0 < m ∧ n0 < C.cols ⊃ Σ(B.rows, λ k. A[m0, k] * B[k, n0]) ;0 )), C.rows - m = C.rows - m