4 Reasoning with Constraints