A Formal Logic Approach to Constrained Combinatorial Testing