function method abs(m: int): nat
{ if m>0 then m else -m }
method CalcTerm(m: int, n: nat) returns (res: int)
ensures res == 5*m-3*n;
{
var m1: nat := abs(m);
var n1: nat := n;
res := 0;
while (m1!=0)
invariant m1>=0
invariant 0<=res
invariant res <=5*abs(m)
decreases m1
{
res := res+5;
m1 := m1-1;
}
if (m<0) { res := -res; }
while (n1!=0)
invariant n1>=0
decreases n1
{
res := res-3;
n1 := n1-1;
}
}
Я попытался увеличить инвариантность в петлях. К первому циклу я добавил условие res‹=5*abs(m), но Дафни жалуется, что «этот инвариант цикла может не поддерживаться циклом». Я не понимаю, как это не так.
Что я могу делать неправильно?