source: CIVL/examples/loop_invariants/Jans_example/arbitrary_block/arbitrary_block-bad_invariants1.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: 5.0 KB
Line 
1#pragma CIVL ACSL
2#include "loop_bounds.cvl"
3$input int ni,nj,bi,bj;
4$assume(0<bi && bi<ni && 0<bj && bj<nj);
5$input double uin[ni][nj];
6$input double u1[ni][nj];
7double u2[ni][nj];
8instantiate_theory_loop_bounds(ni,bi,1);
9instantiate_theory_loop_bounds(nj,bj,1);
10
11int main() {
12 int i=0,j=1,ir,jr,ib,jb;
13
14 $assume($forall (int i : 0 .. ni-1) u1[i][0] == 0 && u1[i][nj-1] == 0);
15 $assume($forall (int j : 0 .. nj-1) u1[0][j] == 0 && u1[ni-1][j] == 0);
16 $assume($forall (int i : 1 .. ni-2) ($forall (int j : 1 .. nj-2) u1[i][j] == uin[i][j] * uin[i][j]));
17
18 /*@ loop invariant in_range(i, 1, ni-bi, bi);
19 @ loop invariant 1 <= j <= loop_max(1, nj-bj, bj); // frame condition for j
20 @ loop invariant \forall int t; 1 <= t < i ==>
21 @ (\forall int j0; 1 <= j0 < loop_max(1, nj-bj, bj) ==>
22 @ u2[t][j0] == uin[t][j0]*uin[t][j0]);
23 @ loop assigns i, j, ib, jb, u2[1 .. ni - 2][1 .. nj - 2];
24 @*/
25 for(i=1;i<ni-bi;i=i+bi) {
26 /*@ loop invariant in_range(j, 1, nj-bj,bj);
27 @ loop invariant \forall int t; i <= t < i + bi ==>
28 @ (\forall int j0; 1 <= j0 < j ==>
29 @ u2[t][j0] != uin[t][j0]*uin[t][j0]);
30 @ loop assigns j, ib, jb, u2[i .. i + bi - 1][1 .. nj - 2];
31 @*/
32 for(j=1;j<nj-bj;j=j+bj) {
33 /*@ loop invariant 0 <= ib <= bi;
34 @ loop invariant \forall int t; i <= t < i + ib ==>
35 @ (\forall int k; j <= k < j + bj ==> u2[t][k] == uin[t][k]*uin[t][k]);
36 @ loop assigns ib, jb, u2[i .. (i + bi - 1)][j .. (j + bj - 1)];
37 @*/
38 for(ib=0;ib<bi;ib++) {
39 /*@ loop invariant 0 <= jb <= bj;
40 @ loop invariant \forall int k; j <= k < j + jb ==> u2[i+ib][k] == uin[i+ib][k]*uin[i+ib][k];
41 @ loop assigns jb, u2[i + ib][j .. (j + bj - 1)];
42 @*/
43 for(jb=0;jb<bj;jb++) {
44 u2[i+ib][j+jb] = uin[i+ib][j+jb]*uin[i+ib][j+jb];
45 }
46 }
47 }
48 }
49 $assert(i == loop_max(1,ni-bi,bi));
50 $assert($forall (int i0 | 1 <= i0 && i0 < loop_max(1,ni-bi, bi))
51 $forall (int j0 | 1 <= j0 && j0 < j) u2[i0][j0] == uin[i0][j0]*uin[i0][j0]);
52
53 // remainder i
54 /*@ loop invariant i <= ir <= ni-1;
55 @ loop invariant \forall int t; i <= t < ir ==>
56 @ (\forall int k; 1 <= k < loop_max(1, nj - bj, bj) ==>
57 @ u2[t][k] == uin[t][k]*uin[t][k]);
58 @ loop assigns ir, jr, jb, u2[i .. ni - 2][1 .. nj - 2];
59 @*/
60 for(ir=i;ir<ni-1;ir++) {
61 /*@ loop invariant in_range(jr, 1, nj-bj, bj);
62 @ loop invariant \forall int t; 1 <= t < jr ==>
63 @ u2[ir][t] == uin[ir][t]*uin[ir][t];
64 @ loop assigns jr, jb, u2[ir][1 .. nj - 2];
65 @*/
66 for(jr=1;jr<nj-bj;jr=jr + bj) {
67 /*@ loop invariant 0 <= jb <= bj;
68 @ loop invariant \forall int t; jr <= t < jr + jb ==>
69 @ u2[ir][t] == uin[ir][t]*uin[ir][t];
70 @ loop assigns jb, u2[ir][jr .. jr+bj-1];
71 @*/
72 for(jb=0;jb<bj;jb++) {
73 u2[ir][jr+jb] = uin[ir][jr+jb]*uin[ir][jr+jb];
74 }
75 }
76 }
77
78 $assert($forall (int i0 | loop_max(1,ni-bi,bi) <= i0 && i0 < ni - 1)
79 $forall (int j0 | 1 <= j0 && j0 < j) u2[i0][j0] == uin[i0][j0] * uin[i0][j0]);
80
81 // remainder j
82 /*@ loop invariant j <= jr <= nj-1;
83 @ loop invariant \forall int t; 1 <= t < loop_max(1, ni - bi, bi) ==>
84 @ (\forall int k; j <= k < jr ==>
85 @ u2[t][k] == uin[t][k]*uin[t][k]);
86 @ loop assigns jr, ir, ib, u2[1 .. ni - 2][j .. nj-2];
87 @*/
88 for(jr = j; jr < nj-1; jr++) {
89 /*@ loop invariant in_range(ir, 1, ni-bi, bi);
90 @ loop invariant \forall int t; 1 <= t < ir ==>
91 @ u2[t][jr] == uin[t][jr]*uin[t][jr];
92 @ loop assigns ir, ib, u2[1 .. ni - 2][jr];
93 @*/
94 for(ir = 1; ir < ni-bi; ir+=bi) {
95 /*@ loop invariant 0 <= ib <= bi;
96 @ loop invariant \forall int t; ir <= t < ir + ib ==>
97 @ u2[t][jr] == uin[t][jr]*uin[t][jr];
98 @ loop assigns ib, u2[ir .. ir + bi - 1][jr];
99 @*/
100 for(ib = 0; ib < bi; ib++) {
101 u2[ir+ib][jr] = uin[ir+ib][jr]*uin[ir+ib][jr];
102 }
103 }
104 }
105
106 $assert($forall (int i0 | 1 <= i0 && i0 < loop_max(1, ni-bi, bi))
107 $forall (int j0 | j <= j0 && j0 < nj - 1) u2[i0][j0] == uin[i0][j0] * uin[i0][j0]);
108
109 // remainder ij
110
111 /*@ loop invariant i <= ir <= ni-1;
112 @ loop invariant \forall int t; i <= t < ir ==>
113 @ (\forall int k; j <= k < nj-1 ==> u2[t][k] == uin[t][k]*uin[t][k]);
114 @ loop assigns ir, jr, u2[i .. ni-2][j .. nj-2];
115 @*/
116 for(ir = i;ir < ni-1;ir++) {
117 /*@ loop invariant j <= jr <= nj-1;
118 @ loop invariant \forall int t; j <= t < jr ==> u2[ir][t] == uin[ir][t]*uin[ir][t];
119 @ loop assigns jr, u2[ir][j .. nj-2];
120 @*/
121 for(jr = j;jr < nj-1;jr++) {
122 u2[ir][jr] = uin[ir][jr]*uin[ir][jr];
123 }
124 }
125
126 $assert($forall (int i0 | i <= i0 && i0 < ni-1)
127 $forall (int j0 | j <= j0 && j0 < nj-1) u2[i0][j0] == uin[i0][j0]*uin[i0][j0]);
128
129 // final assertion:
130 $assert($forall (int i : 0 .. ni-1) $forall (int j : 0 .. nj-1) u1[i][j] == u2[i][j]);
131}
Note: See TracBrowser for help on using the repository browser.