constraint-based reasoning