internal override IEnumerable <ProgramState> SetConstraint(BoolConstraint boolConstraint, SymbolicValueConstraint leftConstraint, SymbolicValueConstraint rightConstraint, ProgramState programState) { if (boolConstraint == BoolConstraint.True) { return(RightOperand.TrySetConstraint(leftConstraint, programState) .SelectMany(ps => LeftOperand.TrySetConstraint(rightConstraint, ps))); } return(RightOperand.TrySetConstraint(leftConstraint?.OppositeForLogicalNot, programState) .SelectMany(ps => LeftOperand.TrySetConstraint(rightConstraint?.OppositeForLogicalNot, ps))); }
public override IEnumerable <ProgramState> TrySetConstraint(SymbolicValueConstraint constraint, ProgramState programState) { if (!(constraint is BoolConstraint boolConstraint)) { return(new[] { programState }); } if (boolConstraint == BoolConstraint.True) { return(ThrowIfTooMany( LeftOperand.TrySetConstraint(BoolConstraint.True, programState) .SelectMany(ps => RightOperand.TrySetConstraint(BoolConstraint.True, ps)))); } return(ThrowIfTooMany( LeftOperand.TrySetConstraint(BoolConstraint.True, programState) .SelectMany(ps => RightOperand.TrySetConstraint(BoolConstraint.False, ps)) .Union(LeftOperand.TrySetConstraint(BoolConstraint.False, programState) .SelectMany(ps => RightOperand.TrySetConstraint(BoolConstraint.True, ps))) .Union(LeftOperand.TrySetConstraint(BoolConstraint.False, programState) .SelectMany(ps => RightOperand.TrySetConstraint(BoolConstraint.False, ps))))); }
public override IEnumerable <ProgramState> TrySetConstraint(SymbolicValueConstraint constraint, ProgramState currentProgramState) { var boolConstraint = constraint as BoolConstraint; if (boolConstraint == null) { return(new[] { currentProgramState }); } if (boolConstraint == BoolConstraint.False) { return(LeftOperand.TrySetConstraint(BoolConstraint.False, currentProgramState) .SelectMany(ps => RightOperand.TrySetConstraint(BoolConstraint.False, ps))); } return(LeftOperand.TrySetConstraint(BoolConstraint.True, currentProgramState) .SelectMany(ps => RightOperand.TrySetConstraint(BoolConstraint.False, ps)) .Union(LeftOperand.TrySetConstraint(BoolConstraint.False, currentProgramState) .SelectMany(ps => RightOperand.TrySetConstraint(BoolConstraint.True, ps))) .Union(LeftOperand.TrySetConstraint(BoolConstraint.True, currentProgramState) .SelectMany(ps => RightOperand.TrySetConstraint(BoolConstraint.True, ps)))); }