constraint satisfaction problems in ai