Я пытаюсь придумать инвариант цикла для следующего цикла while, но у меня возникли проблемы.
После того, как будет определен инвариант цикла, я хотел бы составить таблицу доказательств и показать все промежуточные утверждения.
ASSERT(k >= 0)
{i = 1;
sum = 1;
while (i <= k) {
sum = sum + 2*i + 1;
i = i+1;
} //end-while
}
ASSERT( sum == (k+1)*(k+1) )
INV(1) = {sum == (n+1)*(n+1)}
INV(2) = {0<=n<=k}
сумма = 1 работает для n = 0
Теперь попробуйте доказать, что это работает для n+1 (если верно для n), пока n не достигнет k (в вашем случае мой n
— ваш i
)
Обратите внимание, что когда цикл существует, значение i
равно k+1
, то есть кажется хорошим инвариантом:
INV(1) = {1 <= i <= k+1}
INV(2) = {sum == i*i}