private IEnumerable <ProgramState> TrySetConstraints(SymbolicValueConstraints constraints,
                                                             ProgramState programState, bool isOppositeConstraints)
        {
            IEnumerable <ProgramState> programStates = new [] { programState };

            if (constraints == null)
            {
                return(programStates);
            }

            foreach (var constraint in constraints.GetConstraints())
            {
                programStates = programStates.SelectMany(ps =>
                                                         isOppositeConstraints
                    ? TrySetOppositeConstraint(constraint, ps)
                    : TrySetConstraint(constraint, ps));
            }

            return(programStates);
        }