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)))));
        }
Beispiel #3
0
        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))));
        }