source: CIVL/examples/loop_invariants/Jans_example/arbitrary_block/lemmas.cvl@ b701056

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since b701056 was 8f19c31, checked in by Ziqing Luo <ziqing@…>, 8 years ago

added tests for the verified arbitrary block-size example

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

  • Property mode set to 100644
File size: 2.2 KB
Line 
1// #include <stdio.h>
2#pragma CIVL ACSL
3
4$input int ni,nj,bi,bj;
5
6int main(int argc, char** argv) {
7 /*@ logic int UP(int up, int step) = (up % step == 1 || step == 1) ? up : up % step == 0 ?
8 @ up + 1 : up - (up % step - 1) + step;
9 @
10 @ predicate moduloed(int i, int step, int offset) =
11 @ i > 0 && (i % step == offset || step == 1);
12 @
13 @*/
14 int prove_choice = $choose_int(3);
15
16 if (prove_choice == 0) {
17 /* Proving the lemmas that only involves nj and bj : */
18 $assume(ni > 1);
19 $assume(ni > bi && bi > 0);
20 $choose {
21 $when(1) $assume(bj > 1 && (nj - bj) % bj == 1);
22 $when(1) $assume(bj > 1 && (nj - bj) % bj == 0);
23 $when(1) $assume(bj > 1 && (nj - bj) % bj > 1);
24 $when(1) $assume(bj == 1);
25 }
26 // Lemmas:
27 $assert($forall (int x) (moduloed(x, bj, 1) && nj-bj > x => UP(nj-bj, bj) >= x + bj));
28 $assert($forall (int x) (moduloed(x, bj, 1) && x >= nj-bj => x >= UP(nj-bj, bj)));
29 $assert(nj-bj <= UP(nj-bj, bj) && UP(nj-bj, bj) < nj);
30 } else if (prove_choice == 1){
31 /* Proving the lemmas that only involves ni and bi : */
32 $assume(nj > 1);
33 $assume(nj > bj && bj > 0);
34 $choose {
35 $when(1) $assume(bi > 1 && (ni - bi) % bi == 1);
36 $when(1) $assume(bi > 1 && (ni - bi) % bi == 0);
37 $when(1) $assume(bi > 1 && (ni - bi) % bi > 1);
38 $when(1) $assume(bi == 1);
39 }
40 // Lemmas:
41 $assert($forall (int x) (moduloed(x, bi, 1) && ni-bi > x => UP(ni-bi, bi) >= x + bi));
42 $assert($forall (int x) (moduloed(x, bi, 1) && x >= ni-bi => x >= UP(ni-bi, bi)));
43 $assert(ni-bi <= UP(ni-bi, bi) && UP(ni-bi, bi) < ni);
44 } else {
45 /* Proving the lemmas that only involves predicate 'moduloed': */
46 $assume(nj > 1);
47 $assume(nj > bj && bj > 0);
48 $assume(ni > 1);
49 $assume(ni > bi && bi > 0);
50 $choose {
51 $when(1) $assume(bi == 1);
52 $when(1) $assume(bi > 1);
53 }
54 $choose {
55 $when(1) $assume(bj == 1);
56 $when(1) $assume(bj > 1);
57 }
58 // Lemmas:
59 $assert($forall (int x) moduloed(x, bi, 1) => moduloed(x+bi, bi, 1));
60 $assert($forall (int x) moduloed(x, bj, 1) => moduloed(x+bj, bj, 1));
61 $assert(moduloed(1, bj, 1));
62 $assert(moduloed(1, bi, 1));
63 }
64}
Note: See TracBrowser for help on using the repository browser.