source: CIVL/examples/loop_invariants/Jans_example/fixed_block/invariant.cvl

main
Last change on this file was ea777aa, checked in by Alex Wilton <awilton@…>, 3 years ago

Moved examples, include, build_default.properties, common.xml, and README out from dev.civl.com into the root of the repo.

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

  • Property mode set to 100644
File size: 3.6 KB
RevLine 
[2fa0abd]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];
[7dad703]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 }
[2fa0abd]36
[7dad703]37 // straightforward loop nest
38 /*@ loop invariant 1 <= i <= ni-1;
[da65ee2]39 @ loop invariant i == 1 ==> j == nj;
40 @ loop invariant i > 1 ==> j == nj - 1;
[7dad703]41 @ loop invariant \forall int t; 1 <= t < i ==>
42 @ (\forall int k; 1 <= k < nj-1 ==> u1[t][k] == uin[t][k] * uin[t][k]);
43 @ loop assigns u1[1 .. ni-2][1 .. nj-2], u2[1 .. ni-2][1 .. nj-2], i, j;
44 @*/
45 for(i=1;i<ni-1;i++) {
46 /*@ loop invariant 1 <= j <= nj-1;
47 @ loop invariant \forall int k; 1 <= k < j ==> u1[i][k] == uin[i][k] * uin[i][k];
48 @ loop assigns u1[i][1 .. nj-2], u2[i][1 .. nj-2], j;
49 @*/
50 for(j=1;j<nj-1;j++) {
51 u1[i][j] = uin[i][j]*uin[i][j];
52 }
53 }
[2fa0abd]54
[7dad703]55 if (ni > 2) {
56 $assert(i == ni - 1);
57 if (nj > 2)
58 $assert(j == nj - 1);
59 else
60 $assert(j == 1);
61 } else {
62 $assert(i == 1);
63 $assert(j == nj);
64 }
[da65ee2]65
66 int old_j = j;
[2fa0abd]67
[97b16c8]68 /*@ loop invariant 1 <= i <= ni-1;
[da65ee2]69 @ loop invariant 1 < i ==> (nj - 2 <= j <= nj - 1 && j % 2 != 0); // continuous condition I
70 @ loop invariant i == 1 ==> j == old_j; // continuous condition II
[97b16c8]71 @ loop invariant \forall int t, k; 1 <= t < i && 1 <= k < nj - 2 && k % 2 != 0
[2fa0abd]72 @ ==> u2[t][k] == uin[t][k]*uin[t][k] && u2[t][k+1] == uin[t][k+1]*uin[t][k+1];
73 @ loop invariant i % 2 != 0;
74 @ loop assigns u2[1 .. ni-2][1 .. nj-2], i, j;
75 @*/
76 for(i=1;i<ni-2;i=i+2) {
[97b16c8]77 /*@ loop invariant 1 <= i < ni-2;
78 @ loop invariant 1 <= j <= nj-1;
79 @ loop invariant \forall int k; 1 <= k < j
[2fa0abd]80 @ ==> u2[i][k] == uin[i][k]*uin[i][k] && u2[i+1][k] == uin[i+1][k]*uin[i+1][k] ;
81 @ loop invariant i % 2 != 0 && j % 2 != 0;
82 @ loop assigns u2[i][1 .. nj-2], u2[i+1][1 .. nj-2], j;
83 @*/
84 for(j=1;j<nj-2;j=j+2) {
85 u2[i][j] = uin[i][j]*uin[i][j];
86 u2[i+1][j] = uin[i+1][j]*uin[i+1][j];
87 u2[i][j+1] = uin[i][j+1]*uin[i][j+1];
88 u2[i+1][j+1] = uin[i+1][j+1]*uin[i+1][j+1];
89 }
90 }
[da65ee2]91
92 //$assume(i == 1 => j == old_j);
93
[2fa0abd]94 // remainder
95 if(i==ni-2) {
[8609c53]96 /*@ loop invariant 1 <= jr <= nj-1;
97 @ loop invariant \forall int t; 1 <= t < jr ==>
[2fa0abd]98 @ u2[i][t] == uin[i][t]*uin[i][t];
99 @ loop assigns jr, u2[i][1 .. nj-2];
100 @*/
101 for(jr=1;jr<nj-1;jr++) {
102 u2[i][jr] = uin[i][jr]*uin[i][jr];
103 }
104 }
105 if(j==nj-2) {
[8609c53]106 /*@ loop invariant 1 <= ir <= ni-1;
107 @ loop invariant \forall int t; 1 <= t < ir ==>
[2fa0abd]108 @ u2[t][j] == uin[t][j]*uin[t][j];
109 @ loop assigns ir, u2[1 .. ni-2][j];
110 @*/
111 for(ir=1;ir<ni-1;ir++) {
112 u2[ir][j] = uin[ir][j]*uin[ir][j];
113 }
114 }
115 if(i==ni-2 && j==nj-2) u2[i][j] = uin[i][j]*uin[i][j];
[7dad703]116
[2fa0abd]117 $assert($forall (int i: 0 .. ni-1)
118 ($forall (int j: 0 .. nj-1) u1[i][j] == u2[i][j])
119 );
120}
Note: See TracBrowser for help on using the repository browser.