source: CIVL/examples/loop_invariants/Jans_example/fixed_block/invariant.cvl@ 65582ca

1.23 2.0 main test-branch
Last change on this file since 65582ca was 05e541a, checked in by Ziqing Luo <ziqing@…>, 8 years ago

cleaned this directory, add new examples

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@4992 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 3.5 KB
Line 
1#include <stdio.h>
2#include <string.h>
3#ifdef _CIVL
4#include <civlc.cvh>
5#pragma CIVL ACSL
6#endif
7
8#ifdef _CIVL
9$input int ni,nj;
10$assume(ni > 1);
11$assume(nj > 1);
12$input double uin[ni][nj];
13#endif
14
15int main(int argc, char** argv) {
16 int i,j,ir,jr;
17 double u1[ni][nj];
18 double u2[ni][nj];
19
20 /*@ loop invariant 0 <= i <= ni;
21 @ loop invariant \forall int t; 0 <= t < i ==>
22 @ (\forall int k; 0 <= k < nj ==> u1[t][k]==0 && u2[t][k]==0);
23 @ loop invariant i > 0 ==> j == nj;
24 @ loop assigns u1[0 .. ni-1][0 .. nj-1], u2[0 .. ni-1][0 .. nj-1], i, j;
25 @*/
26 for(i=0;i<ni;i++) {
27 /*@ loop invariant 0 <= j <= nj;
28 @ loop invariant \forall int k; 0 <= k < j ==> u1[i][k]==0 && u2[i][k]==0;
29 @ loop assigns u1[i][0 .. nj-1], u2[i][0 .. nj-1], j;
30 @*/
31 for(j=0;j<nj;j++) {
32 u1[i][j] = 0;
33 u2[i][j] = 0;
34 }
35 }
36
37 // straightforward loop nest
38 /*@ loop invariant 1 <= i <= ni-1;
39 @ loop invariant \forall int t; 1 <= t < i ==>
40 @ (\forall int k; 1 <= k < nj-1 ==> u1[t][k] == uin[t][k] * uin[t][k]);
41 @ loop invariant i > 1 ==> j == nj - 1;
42 @ loop assigns u1[1 .. ni-2][1 .. nj-2], u2[1 .. ni-2][1 .. nj-2], i, j;
43 @*/
44 for(i=1;i<ni-1;i++) {
45 /*@ loop invariant 1 <= j <= nj-1;
46 @ loop invariant \forall int k; 1 <= k < j ==> u1[i][k] == uin[i][k] * uin[i][k];
47 @ loop assigns u1[i][1 .. nj-2], u2[i][1 .. nj-2], j;
48 @*/
49 for(j=1;j<nj-1;j++) {
50 u1[i][j] = uin[i][j]*uin[i][j];
51 }
52 }
53
54 if (ni > 2) {
55 $assert(i == ni - 1);
56 if (nj > 2)
57 $assert(j == nj - 1);
58 else
59 $assert(j == 1);
60 } else {
61 $assert(i == 1);
62 $assert(j == nj);
63 }
64 /*
65 if (ni > 2) {
66 i = ni - 1;
67 if (nj > 2)
68 j = nj - 1;
69 else
70 j = 1;
71 } else {
72 i = 1;
73 j = nj;
74 }
75 */
76
77 /*@ loop invariant 1 <= i <= ni-1;
78 @ loop invariant 1 < i ==> (nj - 2 <= j <= nj - 1 && j % 2 != 0); // needed for the rest of the code
79 @ loop invariant \forall int t, k; 1 <= t < i && 1 <= k < nj - 2 && k % 2 != 0
80 @ ==> u2[t][k] == uin[t][k]*uin[t][k] && u2[t][k+1] == uin[t][k+1]*uin[t][k+1];
81 @ loop invariant i % 2 != 0;
82 @ loop assigns u2[1 .. ni-2][1 .. nj-2], i, j;
83 @*/
84 for(i=1;i<ni-2;i=i+2) {
85 /*@ loop invariant 1 <= i < ni-2;
86 @ loop invariant 1 <= j <= nj-1;
87 @ loop invariant \forall int k; 1 <= k < j
88 @ ==> u2[i][k] == uin[i][k]*uin[i][k] && u2[i+1][k] == uin[i+1][k]*uin[i+1][k] ;
89 @ loop invariant i % 2 != 0 && j % 2 != 0;
90 @ loop assigns u2[i][1 .. nj-2], u2[i+1][1 .. nj-2], j;
91 @*/
92 for(j=1;j<nj-2;j=j+2) {
93 u2[i][j] = uin[i][j]*uin[i][j];
94 u2[i+1][j] = uin[i+1][j]*uin[i+1][j];
95 u2[i][j+1] = uin[i][j+1]*uin[i][j+1];
96 u2[i+1][j+1] = uin[i+1][j+1]*uin[i+1][j+1];
97 }
98 }
99 // remainder
100 if(i==ni-2) {
101 /*@ loop invariant 1 <= jr <= nj-1;
102 @ loop invariant \forall int t; 1 <= t < jr ==>
103 @ u2[i][t] == uin[i][t]*uin[i][t];
104 @ loop assigns jr, u2[i][1 .. nj-2];
105 @*/
106 for(jr=1;jr<nj-1;jr++) {
107 u2[i][jr] = uin[i][jr]*uin[i][jr];
108 }
109 }
110 if(j==nj-2) {
111 /*@ loop invariant 1 <= ir <= ni-1;
112 @ loop invariant \forall int t; 1 <= t < ir ==>
113 @ u2[t][j] == uin[t][j]*uin[t][j];
114 @ loop assigns ir, u2[1 .. ni-2][j];
115 @*/
116 for(ir=1;ir<ni-1;ir++) {
117 u2[ir][j] = uin[ir][j]*uin[ir][j];
118 }
119 }
120 if(i==ni-2 && j==nj-2) u2[i][j] = uin[i][j]*uin[i][j];
121
122 $assert($forall (int i: 0 .. ni-1)
123 ($forall (int j: 0 .. nj-1) u1[i][j] == u2[i][j])
124 );
125}
Note: See TracBrowser for help on using the repository browser.