Power function
Here is a static method for computing xn for x real (double in
Java) and n non-negative integer.
0pt
class Power {
static double power(double x, int n) {
double r = 1.0;
double t = x;
while (n > 0) {
if (n % 2 == 1) r = r * t;
t = t * t;
n = n / 2;
}
return r;
}
}
-
Run the tool without any annotations. What are you asked to
prove? Use the krakatoa pragma for removing arithmetic overflow
checks. Comment about interpretation of floating-point numbers.
- Add annotations for proving termination. Hint: you might add a
lemma about division by 2.
- Add an assertion in the code to show that n is zero just
before the return statement and prove it. Hint: add also a loop
invariant.
- Introduce an axiomatic block for declaring the mathematical
function lpower over reals, with integer exponents, and use
this function to specify the expected behavior of method
power. Check the syntax of your annotations using krakatoa.
- Add a loop invariant suitable for proving the behavior. Hints:
you have to add the necessary axioms in the axiomatic block for
lpower. Try to prove the post-condition first. Depending on
the back-end prover, you might need to add extras lemmas about
integer multiplication.
This document was translated from LATEX by
HEVEA.