A general purpose reasoner for abstraction