main
| Line | |
|---|
| 1 | #pragma CIVL ACSL
|
|---|
| 2 | typedef double T;
|
|---|
| 3 | $input int B1, B2, B3, N1, N2, N3;
|
|---|
| 4 | $assume(1<=N1 && N1<=B1 && 1<=N2 && N2<=B2 && 1<=N3 && N3<=B3);
|
|---|
| 5 | $input T A[N1][N2], B[N2][N3];
|
|---|
| 6 | T C[N1][N3];
|
|---|
| 7 |
|
|---|
| 8 | void mul(T a[][], T b[][], T c[][], int n1, int n2, int n3) {
|
|---|
| 9 | /*@ loop assigns c[0..n1-1][0..n3-1];
|
|---|
| 10 | @ focus I | c[I][0..n3-1];
|
|---|
| 11 | @*/
|
|---|
| 12 | for (int i=0; i<n1; i++) {
|
|---|
| 13 | /*@ loop assigns c[i][0..n3-1];
|
|---|
| 14 | @ focus J | c[i][J];
|
|---|
| 15 | @*/
|
|---|
| 16 | for (int j=0; j<n3; j++) {
|
|---|
| 17 | T sum = (T)0;
|
|---|
| 18 | /*@ loop invariant 0 <= k <= n2;
|
|---|
| 19 | @ loop invariant sum == \sum(0, k-1, \lambda int t; a[i][t]*b[t][j]);
|
|---|
| 20 | @*/
|
|---|
| 21 | for (int k=0; k<n2; k++) {
|
|---|
| 22 | sum += a[i][k]*b[k][j];
|
|---|
| 23 | }
|
|---|
| 24 | c[i][j] = sum;
|
|---|
| 25 | }
|
|---|
| 26 | }
|
|---|
| 27 | }
|
|---|
| 28 |
|
|---|
| 29 | int main(void) {
|
|---|
| 30 | mul(A, B, C, N1, N2, N3);
|
|---|
| 31 | //@ focus I J;
|
|---|
| 32 | $assert($forall(int i : 0 .. N1-1; int j : 0 .. N3-1) C[i][j] == $sum(int k: 0..N2-1) A[i][k]*B[k][j]);
|
|---|
| 33 | }
|
|---|
Note:
See
TracBrowser
for help on using the repository browser.