Non-linear Interpolant Generation and Its Applications to Program Verification