Verifying Finite-State Properties Of Large-Scale Programs