При входе в ваш метод предусловие сообщает вам
forall i :: 0 <= i < arr.Length ==> arr[i] == 0 || arr[i] == 1
Итак, в то время известно, что все элементы массива либо 0
, либо 1
. Однако, поскольку массив изменяется с помощью l oop, вы должны упомянуть в инвариантах all то, что вы все еще хотите запомнить о содержимом массива.
Другими словами, чтобы убедиться, что тело l oop поддерживает инвариант, представьте, что тело l oop начинается с произвольного состояния, удовлетворяющего инварианту. Вы можете иметь в виду, что элементы массива остаются 0
или 1
, но ваш инвариант этого не говорит. Вот почему вы не можете доказать, что инвариант l oop поддерживается.
Чтобы решить эту проблему, добавьте
forall i :: 0 <= i < arr.Length ==> arr[i] == 0 || arr[i] == 1
как инвариант al oop.
Rustan