Programming with Constraints: An Introduction