Abstraction-Driven Verification of Array Programs