нахождение инварианта цикла для алгоритма

У меня возникли проблемы с поиском инварианта для приведенного ниже алгоритма. Кроме того, мне нужно выполнить все шаги, чтобы доказать, как я нахожу конкретный инвариант, и я не знаю, как я могу это продемонстрировать. Я видел, что этот алгоритм представляет собой умножение сложением.

Алгоритм:

alg1(integer a,b)
 x<-a
 y<-b
 z<-0
 while y>0 do
   z<-z+x
   y<-y-1
 end while
 return z

Я надеюсь, что кто-то может помочь мне пролить свет на это, поскольку подобных случаев, которые я нашел здесь, было недостаточно.

Большое спасибо заранее за ваше время.


person Bianca Popescu    schedule 17.11.2020    source источник
comment
Пожалуйста, хотя бы отформатируйте код   -  person MrSmith42    schedule 17.11.2020
comment
Инварианта цикла не существует. Есть много. Но лишь немногие (а может быть, даже только один) полезны для доказательства правильности.   -  person MrSmith42    schedule 17.11.2020


Ответы (2)


Подсказка:

Тело цикла показывает, что z увеличивается от нуля на шаг x, а y уменьшается до нуля на единицу. Следовательно, z + x y, вероятно, постоянно...

person Yves Daoust    schedule 17.11.2020

Инвариант цикла: в начале k-й итерации value of z is k-1 multiplied by x.

Подтверждение правильности:
Инициализация
В начале k=1, поэтому

z= (1-1) * x
z= 0 *z=0

Обслуживание
Если в начале k-й итерации z = (k-1)x, где k-1‹ n, то внутри цикла z умножается на z, а в конце итерации z =kx. Это показывает, что инвариант цикла верен для k+1-й итерации.

Прекращение действия:
При прекращении действия

k=y+1: 
z=(y+1)-1 * x
z=yx

z становится произведением y и x

person amol goel    schedule 20.12.2020
comment
нужно небольшое описание, я не понял - person Abilogos; 20.12.2020