source: CIVL/examples/loop_invariants/Jans_example/fixed_block/invariant_replace_nonlinear.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: 2.9 KB
Line 
1/* A variant of the verification attemptation of the 'invariant.cvl'
2 * example under this directory: the point is replace all non-linear
3 * term uin[i][j] * uin[i][j] to a function call in annotations.
4 */
5#include <stdio.h>
6#include <string.h>
7#ifdef _CIVL
8#include <civlc.cvh>
9#pragma CIVL ACSL
10#endif
11
12#ifdef _CIVL
13$input int ni,nj;
14$assume(ni > 1);
15$assume(nj > 1);
16$input double uin[ni][nj];
17#endif
18
19int main(int argc, char** argv) {
20 int i,j,ir,jr;
21 double u1[ni][nj];
22 double u2[ni][nj];
23
24 $abstract double square(double x);
25 $assume($forall (double x) square(x) == x * x);
26
27 $assume($forall (int i : 0 .. ni-1)
28 ($forall (int j : 0 .. nj-1) u1[i][j] == 0 && u2[i][j] == 0)
29 );
30
31 double tmp1[ni][nj];
32
33 $assume($forall (int i : 1 .. ni-2)
34 ($forall (int j : 1 .. nj-2) tmp1[i][j] == square(uin[i][j]))
35 );
36 $assume($forall (int j : 0 .. nj-1) tmp1[0][j] == 0 && tmp1[ni-1][j] == 0);
37 $assume($forall (int i : 0 .. ni - 1) tmp1[i][0] == 0 && tmp1[i][nj-1] == 0);
38 memcpy(u1, tmp1, sizeof(double) * ni * nj);
39
40 if (ni > 2) {
41 i = ni - 1;
42 if (nj > 2)
43 j = nj - 1;
44 else
45 j = 1;
46 } else {
47 i = 1;
48 j = nj;
49 }
50
51 /*@ loop invariant 1 <= i <= ni-1;
52 @ loop invariant 1 < i ==> (nj - 2 <= j <= nj - 1 && j % 2 != 0); // needed for the rest of the code
53 @ loop invariant \forall int t, k; 1 <= t < i && 1 <= k < nj - 2 && k % 2 != 0
54 @ ==> u2[t][k] == square(uin[t][k]) && u2[t][k+1] == square(uin[t][k+1]);
55 @ loop invariant i % 2 != 0;
56 @ loop assigns u2[1 .. ni-2][1 .. nj-2], i, j;
57 @*/
58 for(i=1;i<ni-2;i=i+2) {
59 /*@ loop invariant 1 <= i < ni-2;
60 @ loop invariant 1 <= j <= nj-1;
61 @ loop invariant \forall int k; 1 <= k < j
62 @ ==> u2[i][k] == square(uin[i][k]) && u2[i+1][k] == square(uin[i+1][k]) ;
63 @ loop invariant i % 2 != 0 && j % 2 != 0;
64 @ loop assigns u2[i][1 .. nj-2], u2[i+1][1 .. nj-2], j;
65 @*/
66 for(j=1;j<nj-2;j=j+2) {
67 u2[i][j] = uin[i][j]*uin[i][j];
68 u2[i+1][j] = uin[i+1][j]*uin[i+1][j];
69 u2[i][j+1] = uin[i][j+1]*uin[i][j+1];
70 u2[i+1][j+1] = uin[i+1][j+1]*uin[i+1][j+1];
71 }
72 }
73 // remainder
74 if(i==ni-2) {
75 /*@ loop invariant 1 <= jr <= nj-1;
76 @ loop invariant \forall int t; 1 <= t < jr ==>
77 @ u2[i][t] == square(uin[i][t]);
78 @ loop assigns jr, u2[i][1 .. nj-2];
79 @*/
80 for(jr=1;jr<nj-1;jr++) {
81 u2[i][jr] = uin[i][jr]*uin[i][jr];
82 }
83 }
84 if(j==nj-2) {
85 /*@ loop invariant 1 <= ir <= ni-1;
86 @ loop invariant \forall int t; 1 <= t < ir ==>
87 @ u2[t][j] == square(uin[t][j]);
88 @ loop assigns ir, u2[1 .. ni-2][j];
89 @*/
90 for(ir=1;ir<ni-1;ir++) {
91 u2[ir][j] = uin[ir][j]*uin[ir][j];
92 }
93 }
94 if(i==ni-2 && j==nj-2) u2[i][j] = uin[i][j]*uin[i][j];
95
96 $assert($forall (int i: 0 .. ni-1)
97 ($forall (int j: 0 .. nj-1) u1[i][j] == u2[i][j])
98 );
99}
Note: See TracBrowser for help on using the repository browser.