Engineering Design through Constraint-Based Reasoning