Примерно так, может быть, хотя это немного педантично.
Инвариант: когда index = n, для n> = 1 (в верхней части цикла, где проверяется условие), array [i] = i для 0 <= i <n. </p>
Доказательство: доказательство по индукции.В базовом случае n = 1, цикл проверяет условие в первый раз, тело не выполнено, и у нас есть внешняя гарантия, что array [0] = 0, ранее в коде.Предположим, что инвариант выполняется для всех n с точностью до k.Для k + 1 мы присваиваем массив [k] = массив [k-1] + 1. Из предположения индукции массив [k-1] = k-1, поэтому значение, присвоенное массиву [k], равно (k-1) +1 = к.Таким образом, инвариант выполняется для следующего и по индукции каждого значения n (в верхней части цикла).
РЕДАКТИРОВАТЬ:
function add_numbers($max) {
//assume max >= 2
$index=1;
$array=array(63);
while ($index != $max) {
//invariant: ∀ k:1 .. index-1, array[k]=array[k-1]+1
$array[$index] = $array[$index-1]+1;
$index += 1;
}
}
Инвариант: когда индекс = n, дляn> = 1 (в верхней части цикла, где проверяется условие), массив [i] = i + 63 для 0 <= i <n. </p>
Доказательство: доказательство проводится по индукции.В базовом случае n = 1, цикл проверяет условие в первый раз, тело не выполнено, и у нас есть внешняя гарантия, что array [0] = 63, ранее в коде.Предположим, что инвариант выполняется для всех n с точностью до k.Для k + 1 мы присваиваем массив [k] = массив [k-1] + 1. Из предположения индукции массив [k-1] = (k-1) + 63 = k + 62, поэтому значение присвоено массиву[k] равно (k + 62) +1 = k + 63.Таким образом, инвариант выполняется для следующего и по индукции каждого значения n (в верхней части цикла).