File tree Expand file tree Collapse file tree 1 file changed +51
-0
lines changed Expand file tree Collapse file tree 1 file changed +51
-0
lines changed Original file line number Diff line number Diff line change
1
+ // uninterpreted function (do not change)
2
+ function F(x: Int): Int
3
+
4
+ // TODO: implement
5
+ function sumUp(n: Int, m: Int): Int
6
+ {
7
+ n >= m ? 0 : (F(n) + sumUp(n + 1 , m))
8
+ }
9
+
10
+ // TODO: implement
11
+ function sumDown(n: Int, m: Int): Int
12
+ {
13
+ n >= m ? 0 : (F(m - 1 ) + sumUp(n, m - 1 ))
14
+ }
15
+
16
+ // TODO: implement
17
+ method lemmaSameSum(n: Int, m: Int)
18
+ requires n <= m
19
+ ensures sumUp(n,m) == sumDown(n,m)
20
+ decreases m - n
21
+ {
22
+ match {
23
+ m == n = > assert true ,
24
+ m == n + 1 = > assert true ,
25
+ true = >
26
+ lemmaSameSum(n, m - 1 );
27
+ lemmaSameSum(n + 1 , m - 1 );
28
+ lemmaSameSum(n + 1 , m)
29
+ }
30
+ }
31
+
32
+ // TODO: verify this
33
+ method client(n: Int, m: Int) : Int
34
+ ensures result == sumUp(n, m)
35
+ {
36
+ // you can assert n <= m here although you shouldn't
37
+ var sum: Int := 0 ;
38
+ var i: Int := m;
39
+ loop
40
+ invariant i <= m
41
+ // @CheckError
42
+ invariant i >= n
43
+ invariant sum == sumDown(i, m)
44
+ {
45
+ i != n = >
46
+ i := i - 1 ;
47
+ sum := sum + F(i)
48
+ };
49
+ lemmaSameSum(n, m);
50
+ return sum
51
+ }
You can’t perform that action at this time.
0 commit comments