Многие наверно слышали про инвариант цикла. Кое-кто может быть слышал про инвариант класса в языке Eiffel. Но также выделяют еще инвариант рекурсии, инвариант итератора и инвариант данных.

Кто как считает необходимы ли все эти инварианты?
Например, зачем нужен инвариант рекурсии, когда у рекурсивной функции может быть предусловие и постусловие? (В принципе для рекурсии была бы полезна ограничивающая функция, которая бы показывала, что рекурсия завершается, а не "зацикливается" и не вылетает при исчерпании стека.)

Нужно ли отдельно выделять инвариант данных или достаточно того, что описаны все постусловия всех функций, которые работают с данными и известно что может быть с данными?

И если кто-то знает где можно почитать не про инвариант цикла, а про другие инварианты, то был бы благодарен за ссылку.