Как найти самый сильный инвариант цикла для этого кода?

Я пытаюсь придумать инвариант цикла для следующего цикла 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) )
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Валидация полей ввода для базовой формы React
Валидация полей ввода для базовой формы React
В одном из моих проектов MERN Stack есть форма с именем, фамилией, контактным номером, адресом, электронной почтой, датой рождения, номером NIC, весом...
Пользовательские правила валидации в Laravel
Пользовательские правила валидации в Laravel
Если вы хотите создать свое собственное правило валидации, Laravel предоставляет возможность сделать это. Создайте правило с помощью следующей...
1
0
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
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}

Другие вопросы по теме