invariant generation