abstraction-based approach