more reduce abstraction