Object qualification algorithm
Sure.  Caching is a standard optimization that can be applied in many situations.  I'm not sure there's much more to say there.

The other optimization that might be useful here is to choose the order in which you test the predicates.  I would suggest using ID3 to construct a decision tree that identifies which predicates you test, and in what order.  This may reduce the number of predicate computations you need to do, to determine the type of an object.