Предположим, что инвариант цикла выполняется в начале итерации, когда pos
равно 100
.Тогда вы знаете
forall i :: 100 < i <= size+1 ==> heap[i] < heap[i/2]
в начале итерации цикла.То есть вы знаете что-то о heap[i]
для всех i
больше, чем 100
(до size+1
).Итерация цикла теперь устанавливает heap[100]
в значение heap[50]
и pos
в 50
.Чтобы доказать, что инвариант цикла поддерживается, вам нужно будет показать:
forall i :: 50 < i <= size+1 ==> heap[i] < heap[i/2]
Но это условие определенно не выполняется.Одна из проблем заключается в том, что оно не выполняется для i == 100
, поскольку heap[100]
равно равно heap[50]
, не менее строго heap[50]
в качестве состояний инварианта вашего цикла.Другая проблема состоит в том, что у вас нет информации о значениях heap[51], ..., heap[99]
, и ваш инвариант цикла говорит, что вы намерены также удовлетворить каждое из них heap[i] < heap[i/2]
.
Итак, вам нужно переосмыслитьпрограмма или инвариант, или оба.