Инвариант цикла может быть выведен из пост-условия, немного интуиции и некоторых алгебраических рассуждений.
Вам известна одна часть условия записи: x == Y!
, где Y
- начальное значение, заданное в качестве аргумента. y
- это переменная, значение которой изменяется. И это остальная часть почтового условия, кстати: y == 1
.
Что правда на каждом проходе? Причина в обратном направлении.
На последнем проходе x == Y*Y-1*...*2 and y == 2
.
До этого? x == Y*Y-1*...*3 and y == 3
.
До этого?
Что изначально верно, когда y == Y
?
Наконец-то. Учитывая постусловие и инвариант, какое предварительное условие является самым слабым набором утверждений, необходимых для приведения вещей в движение? Код подсказывает, x=1 and y=Y
.
Вы знаете, что каждый раз, когда проходит цикл, что-то должно меняться, и программа должна продвигать состояние до пост-условия. Это правда? Существует ли естественная функция состояния цикла, которая доказуемо уменьшается к нулю? (Это кажется хитрым вопросом, потому что переменная y
, кажется, делает это тривиально. Во многих реальных циклах это неочевидно, поэтому вам нужно задать вопрос о дизайне вашего цикла.)