Upper-division textbook covering foundations of constraint programming and applications to scheduling, optimisation etc.