[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)); }
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)); } }