public void Run() { Dictionary<string, string> cfg = new Dictionary<string, string>() { { "AUTO_CONFIG", "true" } }; using (Context ctx = new Context(cfg)) { IntExpr[] X = new IntExpr[5]; for (uint i = 0; i < 5; i++) X[i] = ctx.MkIntConst(string.Format("x_{0}", i)); RealExpr[] Y = new RealExpr[5]; for (uint i = 0; i < 5; i++) Y[i] = ctx.MkRealConst(string.Format("y_{0}", i)); BoolExpr[] P = new BoolExpr[5]; for (uint i = 0; i < 5; i++) P[i] = ctx.MkBoolConst(string.Format("p_{0}", i)); foreach (Expr x in X) Console.WriteLine(x); foreach (Expr x in Y) Console.WriteLine(x); foreach (Expr x in P) Console.WriteLine(x); foreach (ArithExpr y in Y) Console.WriteLine(ctx.MkPower(y, ctx.MkReal(2))); ArithExpr[] Yp = new ArithExpr[Y.Length]; for (uint i = 0; i < Y.Length; i++) Yp[i] = ctx.MkPower(Y[i], ctx.MkReal(2)); Console.WriteLine(ctx.MkAdd(Yp)); } }
public BoolExpr DependsOn(Context ctx, BoolExpr pack, BoolExpr[] deps) { BoolExpr[] q = new BoolExpr[deps.Length]; for (uint i = 0; i < deps.Length; i++) q[i] = ctx.MkImplies(pack, deps[i]); return ctx.MkAnd(q); }
/// <summary> /// Create an expression that marks a formula position for interpolation. /// </summary> public BoolExpr MkInterpolant(BoolExpr a) { Contract.Requires(a != null); Contract.Ensures(Contract.Result<BoolExpr>() != null); CheckContextMatch(a); return new BoolExpr(this, Native.Z3_mk_interpolant(nCtx, a.NativeObject)); }
public void Run() { Dictionary<string, string> cfg = new Dictionary<string, string>() { { "AUTO_CONFIG", "true" } }; using (Context ctx = new Context(cfg)) { ArithExpr[] a = new ArithExpr[5]; for (uint x = 0; x < 5; x++) a[x] = ctx.MkInt(x+1); foreach (Expr e in a) Console.WriteLine(e); ArithExpr[] X = new ArithExpr[5]; for (uint i = 0; i < 5; i++) X[i] = ctx.MkIntConst(string.Format("x{0}", i)); ArithExpr[] Y = new ArithExpr[5]; for (uint i = 0; i < 5; i++) Y[i] = ctx.MkIntConst(string.Format("y{0}", i)); foreach (Expr e in X) Console.WriteLine(e); ArithExpr[] X_plus_Y = new ArithExpr[5]; for (uint i = 0; i < 5; i++) X_plus_Y[i] = ctx.MkAdd(X[i], Y[i]); foreach (Expr e in X_plus_Y) Console.WriteLine(e); BoolExpr[] X_gt_Y = new BoolExpr[5]; for (uint i = 0; i < 5; i++) X_gt_Y[i] = ctx.MkGt(X[i], Y[i]); foreach (Expr e in X_gt_Y) Console.WriteLine(e); Console.WriteLine(ctx.MkAnd(X_gt_Y)); Expr[][] matrix = new Expr[3][]; for (uint i = 0; i < 3; i++) { matrix[i] = new Expr[3]; for (uint j = 0; j < 3; j++) matrix[i][j] = ctx.MkIntConst(string.Format("x_{0}_{1}", i + 1, j + 1)); } foreach(Expr[] row in matrix) { foreach(Expr e in row) Console.Write(" " + e); Console.WriteLine(); } } }
BoolExpr[] ToBoolExprs(ASTVector v) { uint n = v.Size; BoolExpr[] res = new BoolExpr[n]; for (uint i = 0; i < n; i++) { res[i] = new BoolExpr(Context, v[i].NativeObject); } return(res); }
/// <summary> /// Translates an ASTVector into a BoolExpr[] /// </summary> public BoolExpr[] ToBoolExprArray() { uint n = Size; BoolExpr[] res = new BoolExpr[n]; for (uint i = 0; i < n; i++) { res[i] = (BoolExpr)Expr.Create(this.Context, this[i].NativeObject); } return(res); }
public void Run() { Dictionary<string, string> cfg = new Dictionary<string, string>() { { "AUTO_CONFIG", "true" } }; using (Context ctx = new Context(cfg)) { RealExpr d = ctx.MkRealConst("d"); RealExpr a = ctx.MkRealConst("a"); RealExpr t = ctx.MkRealConst("t"); RealExpr v_i = ctx.MkRealConst("v_i"); RealExpr v_f = ctx.MkRealConst("v_f"); BoolExpr[] equations = new BoolExpr[] { ctx.MkEq(d, ctx.MkAdd(ctx.MkMul(v_i, t), ctx.MkDiv(ctx.MkMul(a, ctx.MkPower(t, ctx.MkReal(2))), ctx.MkReal(2)))), ctx.MkEq(v_f, ctx.MkAdd(v_i, ctx.MkMul(a, t))) }; Console.WriteLine("Kinematic equations: "); foreach (BoolExpr e in equations) Console.WriteLine(e); BoolExpr[] problem = new BoolExpr[] { ctx.MkEq(v_i, ctx.MkReal(0)), ctx.MkEq(t, ctx.MkReal("4.10")), ctx.MkEq(a, ctx.MkReal(6)) }; Console.WriteLine("Problem: "); foreach (BoolExpr p in problem) Console.WriteLine(p); Solver s = ctx.MkSolver(); s.Assert(equations); s.Assert(problem); if (s.Check() != Status.SATISFIABLE) throw new Exception("BUG"); Console.WriteLine("Solution: "); Console.WriteLine(s.Model); Console.WriteLine("Decimal Solution: "); foreach (FuncDecl f in s.Model.ConstDecls) Console.WriteLine(f.Name + " = " + ((RatNum)s.Model.ConstInterp(f)).ToDecimalString(10)); } }
/// <summary> /// Checks the correctness of an interpolant. /// </summary> /// <remarks>For more information on interpolation please refer /// too the function Z3_check_interpolant in the C/C++ API, which is /// well documented.</remarks> public int CheckInterpolant(Expr[] cnsts, uint[] parents, BoolExpr[] interps, out string error, Expr[] theory) { Contract.Requires(cnsts.Length == parents.Length); Contract.Requires(cnsts.Length == interps.Length + 1); IntPtr n_err_str; int r = Native.Z3_check_interpolant(nCtx, (uint)cnsts.Length, Expr.ArrayToNative(cnsts), parents, Expr.ArrayToNative(interps), out n_err_str, (uint)theory.Length, Expr.ArrayToNative(theory)); error = Marshal.PtrToStringAnsi(n_err_str); return r; }
static Model Check(Context ctx, BoolExpr f, Status sat) { Solver s = ctx.MkSolver(); s.Assert(f); if (s.Check() != sat) { return null; }; if (sat == Status.SATISFIABLE) { Console.WriteLine("Data:" + s.Model); return s.Model; } else return null; }
/// <summary> /// Computes an interpolant. /// </summary> /// <remarks>For more information on interpolation please refer /// too the function Z3_compute_interpolant in the C/C++ API, which is /// well documented.</remarks> public Z3_lbool ComputeInterpolant(Expr pat, Params p, out BoolExpr[] interp, out Model model) { Contract.Requires(pat != null); Contract.Requires(p != null); Contract.Ensures(Contract.ValueAtReturn(out interp) != null); Contract.Ensures(Contract.ValueAtReturn(out model) != null); CheckContextMatch(pat); CheckContextMatch(p); IntPtr i = IntPtr.Zero, m = IntPtr.Zero; int r = Native.Z3_compute_interpolant(nCtx, pat.NativeObject, p.NativeObject, ref i, ref m); interp = new ASTVector(this, i).ToBoolExprArray(); model = new Model(this, m); return (Z3_lbool)r; }
/// <summary> /// Query the fixedpoint solver. /// A query is a conjunction of constraints. The constraints may include the recursively defined relations. /// The query is satisfiable if there is an instance of the query variables and a derivation for it. /// The query is unsatisfiable if there are no derivations satisfying the query variables. /// </summary> public Status Query(BoolExpr query) { Contract.Requires(query != null); Context.CheckContextMatch(query); Z3_lbool r = (Z3_lbool)Native.Z3_fixedpoint_query(Context.nCtx, NativeObject, query.NativeObject); switch (r) { case Z3_lbool.Z3_L_TRUE: return(Status.SATISFIABLE); case Z3_lbool.Z3_L_FALSE: return(Status.UNSATISFIABLE); default: return(Status.UNKNOWN); } }
public void InstallCheck(Context ctx, BoolExpr[] p) { Solver s = ctx.MkSolver(); s.Assert(p); if (s.Check() == Status.SATISFIABLE) { Model m = s.Model; foreach (FuncDecl f in m.ConstDecls) { if (m.ConstInterp(f).IsTrue) Console.WriteLine(f.Name); } } else Console.WriteLine("invalid installation profile"); }
public void Run() { Dictionary<string, string> cfg = new Dictionary<string, string>() { { "AUTO_CONFIG", "true" } }; using (Context ctx = new Context(cfg)) { ArithExpr[] Q = new ArithExpr[8]; for (uint i = 0; i < 8; i++) Q[i] = ctx.MkIntConst(string.Format("Q_{0}", i + 1)); BoolExpr[] val_c = new BoolExpr[8]; for (uint i = 0; i < 8; i++) val_c[i] = ctx.MkAnd(ctx.MkLe(ctx.MkInt(1), Q[i]), ctx.MkLe(Q[i], ctx.MkInt(8))); BoolExpr col_c = ctx.MkDistinct(Q); BoolExpr[][] diag_c = new BoolExpr[8][]; for (uint i = 0; i < 8; i++) { diag_c[i] = new BoolExpr[i]; for (uint j = 0; j < i; j++) diag_c[i][j] = (BoolExpr)ctx.MkITE(ctx.MkEq(ctx.MkInt(i), ctx.MkInt(j)), ctx.MkTrue(), ctx.MkAnd(ctx.MkNot(ctx.MkEq(ctx.MkSub(Q[i], Q[j]), ctx.MkSub(ctx.MkInt(i), ctx.MkInt(j)))), ctx.MkNot(ctx.MkEq(ctx.MkSub(Q[i], Q[j]), ctx.MkSub(ctx.MkInt(j), ctx.MkInt(i)))))); } Solver s = ctx.MkSolver(); s.Assert(val_c); s.Assert(col_c); foreach (var c in diag_c) s.Assert(c); Console.WriteLine(s.Check()); Console.WriteLine(s.Model); } }
public void Run() { Dictionary<string, string> cfg = new Dictionary<string, string>() { { "AUTO_CONFIG", "true" } }; using (Context ctx = new Context(cfg)) { Sort T = ctx.MkUninterpretedSort("Type"); FuncDecl subtype = ctx.MkFuncDecl("subtype", new Sort[] { T, T }, ctx.BoolSort); FuncDecl array_of = ctx.MkFuncDecl("array_of", T, T); Expr root = ctx.MkConst("root", T); Expr x = ctx.MkConst("x", T); Expr y = ctx.MkConst("y", T); Expr z = ctx.MkConst("z", T); BoolExpr[] axioms = new BoolExpr[] { ctx.MkForall(new Expr[] { x }, subtype[x, x]), ctx.MkForall(new Expr[] { x, y , z }, ctx.MkImplies(ctx.MkAnd((BoolExpr)subtype[x,y], (BoolExpr)subtype[y,z]), (BoolExpr)subtype[x,z])), ctx.MkForall(new Expr[] { x, y }, ctx.MkImplies(ctx.MkAnd((BoolExpr)subtype[x, y], (BoolExpr)subtype[y,x]), ctx.MkEq(x, y))), ctx.MkForall(new Expr[] { x, y, z }, ctx.MkImplies(ctx.MkAnd((BoolExpr)subtype[x,y],(BoolExpr)subtype[x,z]), ctx.MkOr((BoolExpr)subtype[y,z], (BoolExpr)subtype[z,y]))), ctx.MkForall(new Expr[] { x, y }, ctx.MkImplies((BoolExpr)subtype[x,y], (BoolExpr)subtype[array_of[x], array_of[y]])), ctx.MkForall(new Expr[] { x }, (BoolExpr) subtype[root, x]) }; Solver s = ctx.MkSolver(); s.Assert(axioms); Console.WriteLine(s); Console.WriteLine(s.Check()); Expr[] universe = s.Model.SortUniverse(T); foreach (var e in universe) Console.WriteLine(e); Console.WriteLine(s.Model); } }
/// <summary> /// Create an at-most-k constraint. /// </summary> public BoolExpr MkAtMost(BoolExpr[] args, uint k) { Contract.Requires(args != null); Contract.Requires(Contract.Result<BoolExpr[]>() != null); CheckContextMatch(args); return new BoolExpr(this, Native.Z3_mk_atmost(nCtx, (uint) args.Length, AST.ArrayToNative(args), k)); }
/// <summary> /// Create an expression representing an if-then-else: <c>ite(t1, t2, t3)</c>. /// </summary> /// <param name="t1">An expression with Boolean sort</param> /// <param name="t2">An expression </param> /// <param name="t3">An expression with the same sort as <paramref name="t2"/></param> public Expr MkITE(BoolExpr t1, Expr t2, Expr t3) { Contract.Requires(t1 != null); Contract.Requires(t2 != null); Contract.Requires(t3 != null); Contract.Ensures(Contract.Result<Expr>() != null); CheckContextMatch(t1); CheckContextMatch(t2); CheckContextMatch(t3); return Expr.Create(this, Native.Z3_mk_ite(nCtx, t1.NativeObject, t2.NativeObject, t3.NativeObject)); }
/// <summary> /// Update named rule into in the fixedpoint solver. /// </summary> public void UpdateRule(BoolExpr rule, Symbol name) { Contract.Requires(rule != null); Context.CheckContextMatch(rule); Native.Z3_fixedpoint_update_rule(Context.nCtx, NativeObject, rule.NativeObject, AST.GetNativeObject(name)); }
/// <summary> /// Create a pseudo-Boolean less-or-equal constraint. /// </summary> public BoolExpr MkPBLe(int[] coeffs, BoolExpr[] args, int k) { Contract.Requires(args != null); Contract.Requires(coeffs != null); Contract.Requires(args.Length == coeffs.Length); Contract.Requires(Contract.Result<BoolExpr[]>() != null); CheckContextMatch(args); return new BoolExpr(this, Native.Z3_mk_pble(nCtx, (uint) args.Length, AST.ArrayToNative(args), coeffs, k)); }
/// <summary> /// Query the fixedpoint solver. /// A query is a conjunction of constraints. The constraints may include the recursively defined relations. /// The query is satisfiable if there is an instance of the query variables and a derivation for it. /// The query is unsatisfiable if there are no derivations satisfying the query variables. /// </summary> public Status Query(BoolExpr query) { Contract.Requires(query != null); Context.CheckContextMatch(query); Z3_lbool r = (Z3_lbool)Native.Z3_fixedpoint_query(Context.nCtx, NativeObject, query.NativeObject); switch (r) { case Z3_lbool.Z3_L_TRUE: return Status.SATISFIABLE; case Z3_lbool.Z3_L_FALSE: return Status.UNSATISFIABLE; default: return Status.UNKNOWN; } }
/// <summary> /// Convert benchmark given as set of axioms, rules and queries to a string. /// </summary> public string ToString(BoolExpr[] queries) { return Native.Z3_fixedpoint_to_string(Context.nCtx, NativeObject, AST.ArrayLength(queries), AST.ArrayToNative(queries)); }
public static void WriteExprToDisk(BoolExpr expr, string exprName, string path) { // Convert the expr to a SMT-LIB formatted string var exprArray = new BoolExpr[0]; var output = Z3.Context.BenchmarkToSMTString(exprName, "QF_AUFLIRA", "unknown", "", exprArray, expr); if (File.Exists(path)) { // // Note that no lock is put on the // // file and the possibility exists // // that another process could do // // something with it between // // the calls to Exists and Delete. File.Delete(path); } //// Create the file. using (FileStream fs = File.Create(path)) { Byte[] info = new UTF8Encoding(true).GetBytes(output); // Write the SMT string to the file fs.Write(info, 0, info.Length); } }
public BoolExpr(Microsoft.Z3.BoolExpr s) { expr = s; }
/// <summary> /// Assert a constraint into the solver, and track it (in the unsat) core /// using the Boolean constant p. /// </summary> /// <remarks> /// This API is an alternative to <see cref="Check"/> with assumptions for extracting unsat cores. /// Both APIs can be used in the same solver. The unsat core will contain a combination /// of the Boolean variables provided using <see cref="AssertAndTrack(BoolExpr[],BoolExpr[])"/> /// and the Boolean literals /// provided using <see cref="Check"/> with assumptions. /// </remarks> public void AssertAndTrack(BoolExpr constraint, BoolExpr p) { Contract.Requires(constraint != null); Contract.Requires(p != null); Context.CheckContextMatch(constraint); Context.CheckContextMatch(p); Native.Z3_solver_assert_and_track(Context.nCtx, NativeObject, constraint.NativeObject, p.NativeObject); }
BoolExpr[] ToBoolExprs(ASTVector v) { uint n = v.Size; BoolExpr[] res = new BoolExpr[n]; for (uint i = 0; i < n; i++) res[i] = new BoolExpr(Context, v[i].NativeObject); return res; }
static Model Check(Context ctx, BoolExpr f, Status sat) { Solver s = ctx.MkSolver(); s.Assert(f); if (s.Check() != sat) throw new TestFailedException(); if (sat == Status.SATISFIABLE) return s.Model; else return null; }
/// <summary> /// Create an expression representing <c>t1 xor t2</c>. /// </summary> public BoolExpr MkXor(BoolExpr t1, BoolExpr t2) { Contract.Requires(t1 != null); Contract.Requires(t2 != null); Contract.Ensures(Contract.Result<BoolExpr>() != null); CheckContextMatch(t1); CheckContextMatch(t2); return new BoolExpr(this, Native.Z3_mk_xor(nCtx, t1.NativeObject, t2.NativeObject)); }
/// <summary> /// Sudoku solving example. /// </summary> static void SudokuExample(Context ctx) { Console.WriteLine("SudokuExample"); // 9x9 matrix of integer variables IntExpr[][] X = new IntExpr[9][]; for (uint i = 0; i < 9; i++) { X[i] = new IntExpr[9]; for (uint j = 0; j < 9; j++) X[i][j] = (IntExpr)ctx.MkConst(ctx.MkSymbol("x_" + (i + 1) + "_" + (j + 1)), ctx.IntSort); } // each cell contains a value in {1, ..., 9} Expr[][] cells_c = new Expr[9][]; for (uint i = 0; i < 9; i++) { cells_c[i] = new BoolExpr[9]; for (uint j = 0; j < 9; j++) cells_c[i][j] = ctx.MkAnd(ctx.MkLe(ctx.MkInt(1), X[i][j]), ctx.MkLe(X[i][j], ctx.MkInt(9))); } // each row contains a digit at most once BoolExpr[] rows_c = new BoolExpr[9]; for (uint i = 0; i < 9; i++) rows_c[i] = ctx.MkDistinct(X[i]); // each column contains a digit at most once BoolExpr[] cols_c = new BoolExpr[9]; for (uint j = 0; j < 9; j++) { IntExpr[] column = new IntExpr[9]; for (uint i = 0; i < 9; i++) column[i] = X[i][j]; cols_c[j] = ctx.MkDistinct(column); } // each 3x3 square contains a digit at most once BoolExpr[][] sq_c = new BoolExpr[3][]; for (uint i0 = 0; i0 < 3; i0++) { sq_c[i0] = new BoolExpr[3]; for (uint j0 = 0; j0 < 3; j0++) { IntExpr[] square = new IntExpr[9]; for (uint i = 0; i < 3; i++) for (uint j = 0; j < 3; j++) square[3 * i + j] = X[3 * i0 + i][3 * j0 + j]; sq_c[i0][j0] = ctx.MkDistinct(square); } } BoolExpr sudoku_c = ctx.MkTrue(); foreach (BoolExpr[] t in cells_c) sudoku_c = ctx.MkAnd(ctx.MkAnd(t), sudoku_c); sudoku_c = ctx.MkAnd(ctx.MkAnd(rows_c), sudoku_c); sudoku_c = ctx.MkAnd(ctx.MkAnd(cols_c), sudoku_c); foreach (BoolExpr[] t in sq_c) sudoku_c = ctx.MkAnd(ctx.MkAnd(t), sudoku_c); // sudoku instance, we use '0' for empty cells int[,] instance = {{0,0,0,0,9,4,0,3,0}, {0,0,0,5,1,0,0,0,7}, {0,8,9,0,0,0,0,4,0}, {0,0,0,0,0,0,2,0,8}, {0,6,0,2,0,1,0,5,0}, {1,0,2,0,0,0,0,0,0}, {0,7,0,0,0,0,5,2,0}, {9,0,0,0,6,5,0,0,0}, {0,4,0,9,7,0,0,0,0}}; BoolExpr instance_c = ctx.MkTrue(); for (uint i = 0; i < 9; i++) for (uint j = 0; j < 9; j++) instance_c = ctx.MkAnd(instance_c, (BoolExpr) ctx.MkITE(ctx.MkEq(ctx.MkInt(instance[i, j]), ctx.MkInt(0)), ctx.MkTrue(), ctx.MkEq(X[i][j], ctx.MkInt(instance[i, j])))); Solver s = ctx.MkSolver(); s.Assert(sudoku_c); s.Assert(instance_c); if (s.Check() == Status.SATISFIABLE) { Model m = s.Model; Expr[,] R = new Expr[9, 9]; for (uint i = 0; i < 9; i++) for (uint j = 0; j < 9; j++) R[i, j] = m.Evaluate(X[i][j]); Console.WriteLine("Sudoku solution:"); for (uint i = 0; i < 9; i++) { for (uint j = 0; j < 9; j++) Console.Write(" " + R[i, j]); Console.WriteLine(); } } else { Console.WriteLine("Failed to solve sudoku"); throw new TestFailedException(); } }
static void Disprove(Context ctx, BoolExpr f, bool useMBQI = false, params BoolExpr[] assumptions) { Console.WriteLine("Disproving: " + f); Solver s = ctx.MkSolver(); Params p = ctx.MkParams(); p.Add("mbqi", useMBQI); s.Parameters = p; foreach (BoolExpr a in assumptions) s.Assert(a); s.Assert(ctx.MkNot(f)); Status q = s.Check(); switch (q) { case Status.UNKNOWN: Console.WriteLine("Unknown because: " + s.ReasonUnknown); break; case Status.SATISFIABLE: Console.WriteLine("OK, model: " + s.Model); break; case Status.UNSATISFIABLE: throw new TestFailedException(); } }
/// <summary> /// Extract unsatisfiable core example /// </summary> public static void UnsatCoreAndProofExample(Context ctx) { Console.WriteLine("UnsatCoreAndProofExample"); Solver solver = ctx.MkSolver(); BoolExpr pa = ctx.MkBoolConst("PredA"); BoolExpr pb = ctx.MkBoolConst("PredB"); BoolExpr pc = ctx.MkBoolConst("PredC"); BoolExpr pd = ctx.MkBoolConst("PredD"); BoolExpr p1 = ctx.MkBoolConst("P1"); BoolExpr p2 = ctx.MkBoolConst("P2"); BoolExpr p3 = ctx.MkBoolConst("P3"); BoolExpr p4 = ctx.MkBoolConst("P4"); BoolExpr[] assumptions = new BoolExpr[] { ctx.MkNot(p1), ctx.MkNot(p2), ctx.MkNot(p3), ctx.MkNot(p4) }; BoolExpr f1 = ctx.MkAnd(new BoolExpr[] { pa, pb, pc }); BoolExpr f2 = ctx.MkAnd(new BoolExpr[] { pa, ctx.MkNot(pb), pc }); BoolExpr f3 = ctx.MkOr(ctx.MkNot(pa), ctx.MkNot(pc)); BoolExpr f4 = pd; solver.Assert(ctx.MkOr(f1, p1)); solver.Assert(ctx.MkOr(f2, p2)); solver.Assert(ctx.MkOr(f3, p3)); solver.Assert(ctx.MkOr(f4, p4)); Status result = solver.Check(assumptions); if (result == Status.UNSATISFIABLE) { Console.WriteLine("unsat"); Console.WriteLine("proof: {0}", solver.Proof); Console.WriteLine("core: "); foreach (Expr c in solver.UnsatCore) { Console.WriteLine("{0}", c); } } }
/// <summary> /// Convert a benchmark into an SMT-LIB formatted string. /// </summary> /// <param name="name">Name of the benchmark. The argument is optional.</param> /// <param name="logic">The benchmark logic. </param> /// <param name="status">The status string (sat, unsat, or unknown)</param> /// <param name="attributes">Other attributes, such as source, difficulty or category.</param> /// <param name="assumptions">Auxiliary assumptions.</param> /// <param name="formula">Formula to be checked for consistency in conjunction with assumptions.</param> /// <returns>A string representation of the benchmark.</returns> public string BenchmarkToSMTString(string name, string logic, string status, string attributes, BoolExpr[] assumptions, BoolExpr formula) { Contract.Requires(assumptions != null); Contract.Requires(formula != null); Contract.Ensures(Contract.Result<string>() != null); return Native.Z3_benchmark_to_smtlib_string(nCtx, name, logic, status, attributes, (uint)assumptions.Length, AST.ArrayToNative(assumptions), formula.NativeObject); }
/// <summary> /// Assert soft constraint /// </summary> /// <remarks> /// Return an objective which associates with the group of constraints. /// </remarks> public Handle AssertSoft(BoolExpr constraint, uint weight, string group) { Context.CheckContextMatch(constraint); Symbol s = Context.MkSymbol(group); return new Handle(this, Native.Z3_optimize_assert_soft(Context.nCtx, NativeObject, constraint.NativeObject, weight.ToString(), s.NativeObject)); }
/// <summary> /// Assert multiple constraints into the solver, and track them (in the unsat) core /// using the Boolean constants in ps. /// </summary> /// <remarks> /// This API is an alternative to <see cref="Check"/> with assumptions for extracting unsat cores. /// Both APIs can be used in the same solver. The unsat core will contain a combination /// of the Boolean variables provided using <see cref="AssertAndTrack(BoolExpr[],BoolExpr[])"/> /// and the Boolean literals /// provided using <see cref="Check"/> with assumptions. /// </remarks> public void AssertAndTrack(BoolExpr[] constraints, BoolExpr[] ps) { Contract.Requires(constraints != null); Contract.Requires(Contract.ForAll(constraints, c => c != null)); Contract.Requires(Contract.ForAll(ps, c => c != null)); Context.CheckContextMatch(constraints); Context.CheckContextMatch(ps); if (constraints.Length != ps.Length) throw new Z3Exception("Argument size mismatch"); for (int i = 0 ; i < constraints.Length; i++) Native.Z3_solver_assert_and_track(Context.nCtx, NativeObject, constraints[i].NativeObject, ps[i].NativeObject); }
internal void AssertBool(BoolExpr row) { _optSolver.Assert(row); }
/// <summary> /// Retrieve fixed assignments to the set of variables in the form of consequences. /// Each consequence is an implication of the form /// /// relevant-assumptions Implies variable = value /// /// where the relevant assumptions is a subset of the assumptions that are passed in /// and the equality on the right side of the implication indicates how a variable /// is fixed. /// </summary> /// <remarks> /// <seealso cref="Model"/> /// <seealso cref="UnsatCore"/> /// <seealso cref="Proof"/> /// </remarks> public Status Consequences(IEnumerable<BoolExpr> assumptions, IEnumerable<Expr> variables, out BoolExpr[] consequences) { ASTVector result = new ASTVector(Context); ASTVector asms = new ASTVector(Context); ASTVector vars = new ASTVector(Context); foreach (var asm in assumptions) asms.Push(asm); foreach (var v in variables) vars.Push(v); Z3_lbool r = (Z3_lbool)Native.Z3_solver_get_consequences(Context.nCtx, NativeObject, asms.NativeObject, vars.NativeObject, result.NativeObject); consequences = result.ToBoolExprArray(); return lboolToStatus(r); }
/// <summary> /// Assert soft constraint /// </summary> /// <remarks> /// Return an objective which associates with the group of constraints. /// </remarks> public Handle AssertSoft(BoolExpr constraint, uint weight, string group) { Context.CheckContextMatch(constraint); using Symbol s = Context.MkSymbol(group); return(new Handle(this, Native.Z3_optimize_assert_soft(Context.nCtx, NativeObject, constraint.NativeObject, weight.ToString(), s.NativeObject))); }