Finite Model Reasoning on UML Class Diagrams Via Constraint Programming