private IEnumerable <ProgramState> TrySetConstraint(ObjectConstraint objectConstraint,
                                                            SymbolicValueConstraints oldConstraints, ProgramState currentProgramState)
        {
            var oldBoolConstraint = oldConstraints.GetConstraintOrDefault <BoolConstraint>();

            if (oldBoolConstraint != null)
            {
                if (objectConstraint == ObjectConstraint.Null)
                {
                    return(Enumerable.Empty <ProgramState>());
                }

                return(new[] { currentProgramState });
            }

            var oldObjectConstraint = oldConstraints.GetConstraintOrDefault <ObjectConstraint>();

            if (oldObjectConstraint != null)
            {
                if (oldObjectConstraint != objectConstraint)
                {
                    return(Enumerable.Empty <ProgramState>());
                }

                return(new[] { SetConstraint(objectConstraint, currentProgramState) });
            }

            throw new NotSupportedException($"Neither {nameof(BoolConstraint)}, nor {nameof(ObjectConstraint)}");
        }
        private IEnumerable <ProgramState> TrySetConstraint(BoolConstraint boolConstraint,
                                                            SymbolicValueConstraints oldConstraints, ProgramState currentProgramState)
        {
            if (oldConstraints.HasConstraint(ObjectConstraint.Null))
            {
                // It was null, and now it should be true or false
                return(Enumerable.Empty <ProgramState>());
            }

            var oldBoolConstraint = oldConstraints.GetConstraintOrDefault <BoolConstraint>();

            if (oldBoolConstraint != null &&
                oldBoolConstraint != boolConstraint)
            {
                return(Enumerable.Empty <ProgramState>());
            }

            // Either same bool constraint, or previously not null, and now a bool constraint
            return(new[] { SetConstraint(boolConstraint, currentProgramState) });
        }