Уже указывалось, что один и тот же цикл может иметь несколько инвариантов, и что вычислимость против вас. Это не значит, что вы не можете попробовать.
На самом деле вы ищете индуктивный инвариант : слово-инвариант может также использоваться для свойства, которое истинно на каждой итерации, но для которого недостаточно знать, что оно выполняется в одна итерация, чтобы вывести, что она имеет место на следующей. Если I является индуктивным инвариантом, то любое последствие I является инвариантом, но не может быть индуктивным инвариантом.
Вы, вероятно, пытаетесь получить индуктивный инвариант для доказательства определенного свойства (постусловия) цикла в некоторых определенных обстоятельствах (предварительных условиях).
Есть две эвристики, которые работают довольно хорошо:
начните с того, что у вас есть (предварительные условия), и ослабляйте, пока у вас не будет индуктивного инварианта. Чтобы понять, как ослабить, примените одну или несколько итераций прямого цикла и посмотрите, что перестает быть верным в вашей формуле.
начните с того, что вы хотите (постусловия) и укрепляйте, пока у вас не будет индуктивного инварианта. Чтобы понять, как укрепить, примените одну или несколько итераций цикла в обратном направлении и посмотрите, что нужно добавить, чтобы можно было вывести постусловие.
Если вы хотите, чтобы компьютер помог вам в вашей практике, я могу порекомендовать плагин дедуктивной верификации Jessie для C-программ Frama-C . Есть и другие, особенно для аннотаций Java и JML, но я менее знаком с ними. Испытывать инварианты, о которых вы думаете, гораздо быстрее, чем работать, если они работают на бумаге. Я должен отметить, что проверка того, что свойство является индуктивным инвариантом, также неразрешима, но современные автоматические средства проверки хороши на многих простых примерах. Если вы решите пойти по этому пути, возьмите из списка как можно больше: Alt-ergo, Simplify, Z3.
С опциональной (и немного сложной для установки) библиотекой Apron Джесси также может автоматически выводить некоторые простые инварианты .