Как всегда при использовании WP, важно, чтобы все функции, вызываемые проверяемой функцией, были снабжены контрактом с предложениями assigns
. Кроме того, все циклы указанной функции при проверке должны иметь предложение loop assigns
. Если это не так, WP придет к выводу, что любая часть состояния памяти может быть изменена вызовом (или, соответственно, циклом), так что он не сможет сказать что-либо значимое после соответствующей инструкции.
Таким образом, как минимум, вы должны добавить / заменить существующее предложение на:
- в договоре
swap
, пункт assigns t[i], t[j];
- в аннотации цикла внешнего цикла, пункт
loop assigns i, t[0 .. l-1];
- в аннотации цикла внутреннего цикла, пункт
loop assigns j, t[i .. l-1];
Как примечание относительно loop assigns
:
- они должны описывать все потенциальные модификации от первого входа в цикл до текущего шага (следовательно,
t[i], t[j]
недостаточно, поскольку, возможно, произошли другие перестановки до текущего j
).
- индекс цикла (здесь
i
и j
) должен быть частью присваивания цикла, хотя его очень легко пропустить и удивляться, почему WP не устраивает.
Обратите внимание, что могут быть другие проблемы с вашими аннотациями, но они являются наиболее очевидными, и наличие соответствующих предложений assigns
, вероятно, является единственной наиболее важной вещью, которую нужно иметь, прежде чем пытаться доказать более глубокие функциональные свойства.