[NotNull] public static BoolExpr MkConstraint([NotNull] this Context ctx, [NotNull] Booly p0, [NotNull] Booly p1, [NotNull] Booly p2, [NotNull] Booly p3, [NotNull] Expression <Func <bool, bool, bool, bool, bool> > expression)
 {
     if (ctx == null)
     {
         throw new ArgumentNullException(nameof(ctx));
     }
     if (p0 == null)
     {
         throw new ArgumentNullException(nameof(p0));
     }
     if (p1 == null)
     {
         throw new ArgumentNullException(nameof(p1));
     }
     if (p2 == null)
     {
         throw new ArgumentNullException(nameof(p2));
     }
     if (p3 == null)
     {
         throw new ArgumentNullException(nameof(p3));
     }
     if (expression == null)
     {
         throw new ArgumentNullException(nameof(expression));
     }
     return(MkExpressionConstraint.CreateBoolExpression(ctx, MkExpressionConstraint.ExtractParameters(ctx, expression.Parameters, p0, p1, p2, p3), expression.Body));
 }
 [NotNull] public static BoolExpr MkConstraint([NotNull] this Context ctx, [NotNull] Inty p0, [NotNull] Expression <Func <long, bool> > expression)
 {
     if (ctx == null)
     {
         throw new ArgumentNullException(nameof(ctx));
     }
     if (p0 == null)
     {
         throw new ArgumentNullException(nameof(p0));
     }
     if (expression == null)
     {
         throw new ArgumentNullException(nameof(expression));
     }
     return(MkExpressionConstraint.CreateBoolExpression(ctx, MkExpressionConstraint.ExtractParameters(ctx, expression.Parameters, p0), expression.Body));
 }
예제 #3
0
        private static IntExpr CreateIntExpression(Context ctx, [NotNull] IReadOnlyDictionary <string, Expr> variables, [NotNull] Expression expression)
        {
            switch (expression.NodeType)
            {
            case ExpressionType.Add:
            {
                var b = (BinaryExpression)expression;
                return((IntExpr)ctx.MkAdd(CreateIntExpression(ctx, variables, b.Left), CreateIntExpression(ctx, variables, b.Right)));
            }

            case ExpressionType.Subtract:
            {
                var b = (BinaryExpression)expression;
                return((IntExpr)ctx.MkSub(CreateIntExpression(ctx, variables, b.Left), CreateIntExpression(ctx, variables, b.Right)));
            }

            case ExpressionType.Multiply:
            {
                var b = (BinaryExpression)expression;
                return((IntExpr)ctx.MkMul(CreateIntExpression(ctx, variables, b.Left), CreateIntExpression(ctx, variables, b.Right)));
            }

            case ExpressionType.Divide:
            {
                var b = (BinaryExpression)expression;
                return((IntExpr)ctx.MkDiv(CreateIntExpression(ctx, variables, b.Left), CreateIntExpression(ctx, variables, b.Right)));
            }

            case ExpressionType.Negate:
            {
                var u = (UnaryExpression)expression;
                return((IntExpr)ctx.MkUnaryMinus(CreateIntExpression(ctx, variables, u.Operand)));
            }

            case ExpressionType.Modulo:
            {
                var b = (BinaryExpression)expression;
                return(ctx.MkMod(CreateIntExpression(ctx, variables, b.Left), CreateIntExpression(ctx, variables, b.Right)));
            }

            case ExpressionType.Parameter:
                return((IntExpr)variables[((ParameterExpression)expression).Name]);

            case ExpressionType.Constant:
                return(ctx.MkInt(Convert.ToInt64(((ConstantExpression)expression).Value)));

            case ExpressionType.Convert:
                return(CreateIntExpression(ctx, variables, ((UnaryExpression)expression).Operand));

            case ExpressionType.Conditional:
            {
                var c = (ConditionalExpression)expression;
                return((IntExpr)ctx.MkITE(
                           MkExpressionConstraint.CreateBoolExpression(ctx, variables, c.Test),
                           CreateIntExpression(ctx, variables, c.IfTrue),
                           CreateIntExpression(ctx, variables, c.IfFalse)
                           ));
            }

            default:
                throw new ArgumentException($"Invalid node type {expression.NodeType}", nameof(expression));
            }
        }