public override IEnumerable <ProgramState> TrySetConstraint(SymbolicValueConstraint constraint, ProgramState currentProgramState) { var boolConstraint = constraint as BoolConstraint; if (boolConstraint == null) { return(new[] { currentProgramState }); } SymbolicValueConstraint oldConstraint; if (TryGetConstraint(currentProgramState, out oldConstraint) && oldConstraint is BoolConstraint /* could also be ObjectConstraint.NotNull, which can be overridden */ && oldConstraint != constraint) { return(Enumerable.Empty <ProgramState>()); } SymbolicValueConstraint leftConstraint; var leftHasConstraint = LeftOperand.TryGetConstraint(currentProgramState, out leftConstraint); SymbolicValueConstraint rightConstraint; var rightHasConstraint = RightOperand.TryGetConstraint(currentProgramState, out rightConstraint); var relationship = GetRelationship(boolConstraint); var newProgramState = currentProgramState.TrySetRelationship(relationship); if (newProgramState == null) { return(Enumerable.Empty <ProgramState>()); } if (!rightHasConstraint && !leftHasConstraint) { return(new[] { newProgramState }); } return(SetConstraint(boolConstraint, leftConstraint, rightConstraint, newProgramState)); }