/*++ Copyright () 2012 Microsoft Corporation Module Name: ArithExpr.cs Abstract: Z3 Managed API: Arith Expressions Author: Christoph Wintersteiger (cwinter) 2012-11-23 Notes: --*/ using System.Diagnostics; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Microsoft.Z3 { /// /// Arithmetic expressions (int/real) /// public class ArithExpr : Expr { #region Internal /// Constructor for ArithExpr internal ArithExpr(Context ctx, IntPtr obj) : base(ctx, obj) { Debug.Assert(ctx != null); } #endregion #region Operators private static ArithExpr MkNum(ArithExpr e, int i) { using var sort = e.Context.MkIntSort(); return (ArithExpr)e.Context.MkNumeral(i, sort); } private static ArithExpr MkNum(ArithExpr e, double d) { using var sort = e.Context.MkRealSort(); return (ArithExpr)e.Context.MkNumeral(d.ToString(), sort); } /// Operator overloading for arithmetical division operator (over reals) public static ArithExpr operator /(ArithExpr a, ArithExpr b) { return a.Context.MkDiv(a, b); } /// Operator overloading for arithmetical operator public static ArithExpr operator /(ArithExpr a, int b) { using var denominator = MkNum(a, b); return a / denominator; } /// Operator overloading for arithmetical operator public static ArithExpr operator /(ArithExpr a, double b) { using var denominator = MkNum(a, b); return a / denominator; } /// Operator overloading for arithmetical operator public static ArithExpr operator /(int a, ArithExpr b) { using var numerator = MkNum(b, a); return numerator / b; } /// Operator overloading for arithmetical operator public static ArithExpr operator /(double a, ArithExpr b) { using var numerator = MkNum(b, a); return numerator / b; } /// Operator overloading for arithmetical operator public static ArithExpr operator -(ArithExpr a) { return a.Context.MkUnaryMinus(a); } /// Operator overloading for arithmetical operator public static ArithExpr operator -(ArithExpr a, ArithExpr b) { return a.Context.MkSub(a, b); } /// Operator overloading for arithmetical operator public static ArithExpr operator -(ArithExpr a, int b) { using var rhs = MkNum(a, b); return a - rhs; } /// Operator overloading for arithmetical operator public static ArithExpr operator -(ArithExpr a, double b) { using var rhs = MkNum(a, b); return a - rhs; } /// Operator overloading for arithmetical operator public static ArithExpr operator -(int a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs - b; } /// Operator overloading for arithmetical operator public static ArithExpr operator -(double a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs - b; } /// Operator overloading for arithmetical operator public static ArithExpr operator +(ArithExpr a, ArithExpr b) { return a.Context.MkAdd(a, b); } /// Operator overloading for arithmetical operator public static ArithExpr operator +(ArithExpr a, int b) { using var rhs = MkNum(a, b); return a + rhs; } /// Operator overloading for arithmetical operator public static ArithExpr operator +(ArithExpr a, double b) { using var rhs = MkNum(a, b); return a + rhs; } /// Operator overloading for arithmetical operator public static ArithExpr operator +(int a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs + b; } /// Operator overloading for arithmetical operator public static ArithExpr operator +(double a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs + b; } /// Operator overloading for arithmetical operator public static ArithExpr operator *(ArithExpr a, ArithExpr b) { return a.Context.MkMul(a, b); } /// Operator overloading for arithmetical operator public static ArithExpr operator *(ArithExpr a, int b) { using var rhs = MkNum(a, b); return a * rhs; } /// Operator overloading for arithmetical operator public static ArithExpr operator *(ArithExpr a, double b) { using var rhs = MkNum(a, b); return a * rhs; } /// Operator overloading for arithmetical operator public static ArithExpr operator *(int a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs * b; } /// Operator overloading for arithmetical operator public static ArithExpr operator *(double a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs * b; } /// Operator overloading for arithmetical operator public static BoolExpr operator <=(ArithExpr a, ArithExpr b) { return a.Context.MkLe(a, b); } /// Operator overloading for arithmetical operator public static BoolExpr operator <=(ArithExpr a, int b) { using var rhs = MkNum(a, b); return a <= rhs; } /// Operator overloading for arithmetical operator public static BoolExpr operator <=(ArithExpr a, double b) { using var rhs = MkNum(a, b); return a <= rhs; } /// Operator overloading for arithmetical operator public static BoolExpr operator <=(int a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs <= b; } /// Operator overloading for arithmetical operator public static BoolExpr operator <=(double a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs <= b; } /// Operator overloading for arithmetical operator public static BoolExpr operator <(ArithExpr a, ArithExpr b) { return a.Context.MkLt(a, b); } /// Operator overloading for arithmetical operator public static BoolExpr operator <(ArithExpr a, int b) { using var rhs = MkNum(a, b); return a < rhs; } /// Operator overloading for arithmetical operator public static BoolExpr operator <(ArithExpr a, double b) { using var rhs = MkNum(a, b); return a < rhs; } /// Operator overloading for arithmetical operator public static BoolExpr operator <(int a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs < b; } /// Operator overloading for arithmetical operator public static BoolExpr operator <(double a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs < b; } /// Operator overloading for arithmetical operator public static BoolExpr operator >(ArithExpr a, ArithExpr b) { return a.Context.MkGt(a, b); } /// Operator overloading for arithmetical operator public static BoolExpr operator >(ArithExpr a, int b) { using var rhs = MkNum(a, b); return a > rhs; } /// Operator overloading for arithmetical operator public static BoolExpr operator >(ArithExpr a, double b) { using var rhs = MkNum(a, b); return a > rhs; } /// Operator overloading for arithmetical operator public static BoolExpr operator >(int a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs > b; } /// Operator overloading for arithmetical operator public static BoolExpr operator >(double a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs > b; } /// Operator overloading for arithmetical operator public static BoolExpr operator >=(ArithExpr a, ArithExpr b) { return a.Context.MkGe(a, b); } /// Operator overloading for arithmetical operator public static BoolExpr operator >=(ArithExpr a, int b) { using var rhs = MkNum(a, b); return a >= rhs; } /// Operator overloading for arithmetical operator public static BoolExpr operator >=(ArithExpr a, double b) { using var rhs = MkNum(a, b); return a >= rhs; } /// Operator overloading for arithmetical operator public static BoolExpr operator >=(int a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs >= b; } /// Operator overloading for arithmetical operator public static BoolExpr operator >=(double a, ArithExpr b) { using var lhs = MkNum(b, a); return lhs >= b; } #endregion } }