21using System.Collections.Generic;
22using System.Diagnostics;
24using System.Runtime.InteropServices;
44 m_ctx = Native.Z3_mk_context_rc(IntPtr.Zero);
45 Native.Z3_enable_concurrent_dec_ref(m_ctx);
68 public Context(Dictionary<string, string> settings)
71 Debug.Assert(settings !=
null);
75 IntPtr cfg = Native.Z3_mk_config();
76 foreach (KeyValuePair<string, string> kv
in settings)
77 Native.Z3_set_param_value(cfg, kv.Key, kv.Value);
78 m_ctx = Native.Z3_mk_context_rc(cfg);
79 Native.Z3_enable_concurrent_dec_ref(m_ctx);
80 Native.Z3_del_config(cfg);
99 bool is_external =
false;
127 internal Symbol[] MkSymbols(
string[] names)
129 if (names ==
null)
return new Symbol[0];
131 for (
int i = 0; i < names.Length; ++i) result[i] =
MkSymbol(names[i]);
138 private IntSort m_intSort =
null;
140 private SeqSort m_stringSort =
null;
150 if (m_boolSort ==
null) m_boolSort =
new BoolSort(
this);
return m_boolSort;
161 if (m_intSort ==
null) m_intSort =
new IntSort(
this);
return m_intSort;
173 if (m_realSort ==
null) m_realSort =
new RealSort(
this);
return m_realSort;
184 if (m_charSort ==
null) m_charSort =
new CharSort(
this);
return m_charSort;
196 if (m_stringSort ==
null) m_stringSort =
new SeqSort(
this, Native.Z3_mk_string_sort(nCtx));
215 Debug.Assert(s !=
null);
217 CheckContextMatch(s);
252 return new BitVecSort(
this, Native.Z3_mk_bv_sort(nCtx, size));
260 Debug.Assert(s !=
null);
261 return new SeqSort(
this, Native.Z3_mk_seq_sort(nCtx, s.NativeObject));
269 Debug.Assert(s !=
null);
270 return new ReSort(
this, Native.Z3_mk_re_sort(nCtx, s.NativeObject));
278 Debug.Assert(domain !=
null);
279 Debug.Assert(range !=
null);
281 CheckContextMatch(domain);
282 CheckContextMatch(range);
283 return new ArraySort(
this, domain, range);
291 Debug.Assert(domain !=
null);
292 Debug.Assert(range !=
null);
294 CheckContextMatch<Sort>(domain);
295 CheckContextMatch(range);
296 return new ArraySort(
this, domain, range);
304 Debug.Assert(name !=
null);
305 Debug.Assert(fieldNames !=
null);
306 Debug.Assert(fieldNames.All(fn => fn !=
null));
307 Debug.Assert(fieldSorts ==
null || fieldSorts.All(fs => fs !=
null));
309 CheckContextMatch(name);
310 CheckContextMatch<Symbol>(fieldNames);
311 CheckContextMatch<Sort>(fieldSorts);
312 return new TupleSort(
this, name, (uint)fieldNames.Length, fieldNames, fieldSorts);
320 Debug.Assert(name !=
null);
321 Debug.Assert(enumNames !=
null);
322 Debug.Assert(enumNames.All(f => f !=
null));
325 CheckContextMatch(name);
326 CheckContextMatch<Symbol>(enumNames);
327 return new EnumSort(
this, name, enumNames);
335 Debug.Assert(enumNames !=
null);
337 var enumSymbols = MkSymbols(enumNames);
341 return new EnumSort(
this, symbol, enumSymbols);
345 foreach (var enumSymbol
in enumSymbols)
346 enumSymbol.Dispose();
355 Debug.Assert(name !=
null);
356 Debug.Assert(elemSort !=
null);
358 CheckContextMatch(name);
359 CheckContextMatch(elemSort);
360 return new ListSort(
this, name, elemSort);
368 Debug.Assert(elemSort !=
null);
370 CheckContextMatch(elemSort);
372 return new ListSort(
this, symbol, elemSort);
383 Debug.Assert(name !=
null);
385 CheckContextMatch(name);
417 Debug.Assert(name !=
null);
418 Debug.Assert(recognizer !=
null);
420 return new Constructor(
this, name, recognizer, fieldNames, sorts, sortRefs);
435 using var nameSymbol =
MkSymbol(name);
436 using var recognizerSymbol =
MkSymbol(recognizer);
437 var fieldSymbols = MkSymbols(fieldNames);
440 return new Constructor(
this, nameSymbol, recognizerSymbol, fieldSymbols, sorts, sortRefs);
444 foreach (var fieldSymbol
in fieldSymbols)
445 fieldSymbol.Dispose();
454 Debug.Assert(name !=
null);
455 Debug.Assert(constructors !=
null);
456 Debug.Assert(constructors.All(c => c !=
null));
459 CheckContextMatch(name);
460 CheckContextMatch<Constructor>(constructors);
469 Debug.Assert(constructors !=
null);
470 Debug.Assert(constructors.All(c => c !=
null));
472 CheckContextMatch<Constructor>(constructors);
485 Debug.Assert(name !=
null);
486 CheckContextMatch(name);
487 if (parameters !=
null)
488 CheckContextMatch<Sort>(parameters);
490 var numParams = (parameters ==
null) ? 0 : (uint)parameters.Length;
491 var paramsNative = (parameters ==
null) ?
null :
AST.ArrayToNative(parameters);
492 return new DatatypeSort(
this, Native.Z3_mk_datatype_sort(nCtx, name.NativeObject, numParams, paramsNative));
514 Debug.Assert(names !=
null);
515 Debug.Assert(c !=
null);
516 Debug.Assert(names.Length == c.Length);
518 Debug.Assert(names.All(name => name !=
null));
520 CheckContextMatch<Symbol>(names);
521 uint n = (uint)names.Length;
523 IntPtr[] n_constr =
new IntPtr[n];
524 for (uint i = 0; i < n; i++)
527 CheckContextMatch<Constructor>(constructor);
529 n_constr[i] = cla[i].NativeObject;
531 IntPtr[] n_res =
new IntPtr[n];
532 Native.Z3_mk_datatypes(nCtx, n,
Symbol.ArrayToNative(names), n_res, n_constr);
534 for (uint i = 0; i < n; i++)
547 Debug.Assert(names !=
null);
548 Debug.Assert(c !=
null);
549 Debug.Assert(names.Length == c.Length);
553 var symbols = MkSymbols(names);
560 foreach (var symbol
in symbols)
571 Debug.Assert(name !=
null);
572 CheckContextMatch(name);
573 return new Sort(
this, Native.Z3_mk_type_variable(nCtx, name.NativeObject));
595 Debug.Assert(name !=
null);
596 Debug.Assert(typeParams !=
null);
597 Debug.Assert(constructors !=
null);
598 Debug.Assert(constructors.All(c => c !=
null));
600 CheckContextMatch(name);
601 CheckContextMatch<Sort>(typeParams);
602 CheckContextMatch<Constructor>(constructors);
604 Native.Z3_mk_polymorphic_datatype(nCtx, name.NativeObject,
605 (uint)typeParams.Length,
AST.ArrayToNative(typeParams),
606 (uint)constructors.Length,
Z3Object.ArrayToNative(constructors)));
630 return Expr.Create(
this, Native.Z3_datatype_update_field(
631 nCtx, field.NativeObject,
632 t.NativeObject, v.NativeObject));
638 #region Function Declarations
644 Debug.Assert(name !=
null);
645 Debug.Assert(range !=
null);
646 Debug.Assert(domain.All(d => d !=
null));
648 CheckContextMatch(name);
649 CheckContextMatch<Sort>(domain);
650 CheckContextMatch(range);
651 return new FuncDecl(
this, name, domain, range);
659 Debug.Assert(name !=
null);
660 Debug.Assert(domain !=
null);
661 Debug.Assert(range !=
null);
663 CheckContextMatch(name);
664 CheckContextMatch(domain);
665 CheckContextMatch(range);
667 return new FuncDecl(
this, name, q, range);
675 Debug.Assert(range !=
null);
676 Debug.Assert(domain.All(d => d !=
null));
678 CheckContextMatch<Sort>(domain);
679 CheckContextMatch(range);
681 return new FuncDecl(
this, symbol, domain, range);
689 Debug.Assert(range !=
null);
690 Debug.Assert(domain.All(d => d !=
null));
692 CheckContextMatch<Sort>(domain);
693 CheckContextMatch(range);
695 return new FuncDecl(
this, symbol, domain, range,
true);
706 CheckContextMatch(f);
707 CheckContextMatch<Expr>(args);
708 CheckContextMatch(body);
709 IntPtr[] argsNative =
AST.ArrayToNative(args);
710 Native.Z3_add_rec_def(nCtx, f.NativeObject, (uint)args.Length, argsNative, body.NativeObject);
718 Debug.Assert(range !=
null);
719 Debug.Assert(domain !=
null);
721 CheckContextMatch(domain);
722 CheckContextMatch(range);
725 return new FuncDecl(
this, symbol, q, range);
735 Debug.Assert(range !=
null);
736 Debug.Assert(domain.All(d => d !=
null));
738 CheckContextMatch<Sort>(domain);
739 CheckContextMatch(range);
740 return new FuncDecl(
this, prefix, domain, range);
748 Debug.Assert(name !=
null);
749 Debug.Assert(range !=
null);
751 CheckContextMatch(name);
752 CheckContextMatch(range);
753 return new FuncDecl(
this, name,
null, range);
761 Debug.Assert(range !=
null);
763 CheckContextMatch(range);
765 return new FuncDecl(
this, symbol,
null, range);
775 Debug.Assert(range !=
null);
777 CheckContextMatch(range);
778 return new FuncDecl(
this, prefix,
null, range);
787 var fn = Native.Z3_solver_propagate_declare(nCtx, _name.NativeObject,
AST.ArrayLength(domain),
AST.ArrayToNative(domain), range.NativeObject);
792 #region Bound Variables
800 Debug.Assert(ty !=
null);
802 return Expr.Create(
this, Native.Z3_mk_bound(nCtx, index, ty.NativeObject));
806 #region Quantifier Patterns
812 Debug.Assert(terms !=
null);
813 if (terms.Length == 0)
814 throw new Z3Exception(
"Cannot create a pattern from zero terms");
816 IntPtr[] termsNative =
AST.ArrayToNative(terms);
817 return new Pattern(
this, Native.Z3_mk_pattern(nCtx, (uint)terms.Length, termsNative));
827 Debug.Assert(name !=
null);
828 Debug.Assert(range !=
null);
830 CheckContextMatch(name);
831 CheckContextMatch(range);
833 return Expr.Create(
this, Native.Z3_mk_const(nCtx, name.NativeObject, range.NativeObject));
841 Debug.Assert(range !=
null);
853 Debug.Assert(range !=
null);
855 CheckContextMatch(range);
856 return Expr.Create(
this, Native.Z3_mk_fresh_const(nCtx, prefix, range.NativeObject));
865 Debug.Assert(f !=
null);
875 Debug.Assert(name !=
null);
894 Debug.Assert(name !=
null);
904 Debug.Assert(name !=
null);
914 Debug.Assert(name !=
null);
933 Debug.Assert(name !=
null);
955 Debug.Assert(f !=
null);
956 Debug.Assert(args ==
null || args.All(a => a !=
null));
957 CheckContextMatch(f);
958 CheckContextMatch<Expr>(args);
959 return Expr.Create(
this, f, args);
967 Debug.Assert(f !=
null);
968 return MkApp(f, args?.ToArray());
971 #region Propositional
977 return new BoolExpr(
this, Native.Z3_mk_true(nCtx));
985 return new BoolExpr(
this, Native.Z3_mk_false(nCtx));
1001 Debug.Assert(x !=
null);
1002 Debug.Assert(y !=
null);
1004 CheckContextMatch(x);
1005 CheckContextMatch(y);
1006 return new BoolExpr(
this, Native.Z3_mk_eq(nCtx, x.NativeObject, y.NativeObject));
1014 Debug.Assert(args !=
null);
1015 Debug.Assert(args.All(a => a !=
null));
1017 CheckContextMatch<Expr>(args);
1018 return new BoolExpr(
this, Native.Z3_mk_distinct(nCtx, (uint)args.Length,
AST.ArrayToNative(args)));
1026 Debug.Assert(args !=
null);
1035 Debug.Assert(a !=
null);
1036 CheckContextMatch(a);
1037 return new BoolExpr(
this, Native.Z3_mk_not(nCtx, a.NativeObject));
1048 Debug.Assert(t1 !=
null);
1049 Debug.Assert(t2 !=
null);
1050 Debug.Assert(t3 !=
null);
1052 CheckContextMatch(t1);
1053 CheckContextMatch(t2);
1054 CheckContextMatch(t3);
1055 return Expr.Create(
this, Native.Z3_mk_ite(nCtx, t1.NativeObject, t2.NativeObject, t3.NativeObject));
1063 Debug.Assert(t1 !=
null);
1064 Debug.Assert(t2 !=
null);
1066 CheckContextMatch(t1);
1067 CheckContextMatch(t2);
1068 return new BoolExpr(
this, Native.Z3_mk_iff(nCtx, t1.NativeObject, t2.NativeObject));
1076 Debug.Assert(t1 !=
null);
1077 Debug.Assert(t2 !=
null);
1079 CheckContextMatch(t1);
1080 CheckContextMatch(t2);
1081 return new BoolExpr(
this, Native.Z3_mk_implies(nCtx, t1.NativeObject, t2.NativeObject));
1089 Debug.Assert(t1 !=
null);
1090 Debug.Assert(t2 !=
null);
1092 CheckContextMatch(t1);
1093 CheckContextMatch(t2);
1094 return new BoolExpr(
this, Native.Z3_mk_xor(nCtx, t1.NativeObject, t2.NativeObject));
1102 Debug.Assert(args !=
null);
1103 var ts = args.ToArray();
1104 Debug.Assert(ts.All(a => a !=
null));
1105 CheckContextMatch<BoolExpr>(ts);
1107 return ts.Aggregate(
MkFalse(), (r, t) =>
1119 Debug.Assert(ts !=
null);
1120 Debug.Assert(ts.All(a => a !=
null));
1122 CheckContextMatch<BoolExpr>(ts);
1123 return new BoolExpr(
this, Native.Z3_mk_and(nCtx, (uint)ts.Length,
AST.ArrayToNative(ts)));
1131 Debug.Assert(t !=
null);
1132 return MkAnd(t.ToArray());
1140 Debug.Assert(ts !=
null);
1141 Debug.Assert(ts.All(a => a !=
null));
1143 CheckContextMatch<BoolExpr>(ts);
1144 return new BoolExpr(
this, Native.Z3_mk_or(nCtx, (uint)ts.Length,
AST.ArrayToNative(ts)));
1153 Debug.Assert(ts !=
null);
1154 return MkOr(ts.ToArray());
1165 Debug.Assert(ts !=
null);
1166 Debug.Assert(ts.All(a => a !=
null));
1168 CheckContextMatch<ArithExpr>(ts);
1169 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_add(nCtx, (uint)ts.Length,
AST.ArrayToNative(ts)));
1177 Debug.Assert(ts !=
null);
1178 return MkAdd(ts.ToArray());
1186 Debug.Assert(ts !=
null);
1187 Debug.Assert(ts.All(a => a !=
null));
1189 CheckContextMatch<ArithExpr>(ts);
1190 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_mul(nCtx, (uint)ts.Length,
AST.ArrayToNative(ts)));
1198 Debug.Assert(ts !=
null);
1199 return MkMul(ts.ToArray());
1207 Debug.Assert(ts !=
null);
1208 Debug.Assert(ts.All(a => a !=
null));
1210 CheckContextMatch<ArithExpr>(ts);
1211 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_sub(nCtx, (uint)ts.Length,
AST.ArrayToNative(ts)));
1219 Debug.Assert(t !=
null);
1221 CheckContextMatch(t);
1222 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_unary_minus(nCtx, t.NativeObject));
1230 Debug.Assert(t1 !=
null);
1231 Debug.Assert(t2 !=
null);
1233 CheckContextMatch(t1);
1234 CheckContextMatch(t2);
1235 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_div(nCtx, t1.NativeObject, t2.NativeObject));
1244 Debug.Assert(t1 !=
null);
1245 Debug.Assert(t2 !=
null);
1247 CheckContextMatch(t1);
1248 CheckContextMatch(t2);
1249 return new IntExpr(
this, Native.Z3_mk_mod(nCtx, t1.NativeObject, t2.NativeObject));
1258 Debug.Assert(t1 !=
null);
1259 Debug.Assert(t2 !=
null);
1261 CheckContextMatch(t1);
1262 CheckContextMatch(t2);
1263 return new IntExpr(
this, Native.Z3_mk_rem(nCtx, t1.NativeObject, t2.NativeObject));
1271 Debug.Assert(t1 !=
null);
1272 Debug.Assert(t2 !=
null);
1274 CheckContextMatch(t1);
1275 CheckContextMatch(t2);
1276 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_power(nCtx, t1.NativeObject, t2.NativeObject));
1284 Debug.Assert(t1 !=
null);
1285 Debug.Assert(t2 !=
null);
1287 CheckContextMatch(t1);
1288 CheckContextMatch(t2);
1289 return new BoolExpr(
this, Native.Z3_mk_lt(nCtx, t1.NativeObject, t2.NativeObject));
1297 Debug.Assert(t1 !=
null);
1298 Debug.Assert(t2 !=
null);
1300 CheckContextMatch(t1);
1301 CheckContextMatch(t2);
1302 return new BoolExpr(
this, Native.Z3_mk_le(nCtx, t1.NativeObject, t2.NativeObject));
1310 Debug.Assert(t1 !=
null);
1311 Debug.Assert(t2 !=
null);
1313 CheckContextMatch(t1);
1314 CheckContextMatch(t2);
1315 return new BoolExpr(
this, Native.Z3_mk_gt(nCtx, t1.NativeObject, t2.NativeObject));
1323 Debug.Assert(t1 !=
null);
1324 Debug.Assert(t2 !=
null);
1326 CheckContextMatch(t1);
1327 CheckContextMatch(t2);
1328 return new BoolExpr(
this, Native.Z3_mk_ge(nCtx, t1.NativeObject, t2.NativeObject));
1343 Debug.Assert(t !=
null);
1345 CheckContextMatch(t);
1346 return new RealExpr(
this, Native.Z3_mk_int2real(nCtx, t.NativeObject));
1358 Debug.Assert(t !=
null);
1360 CheckContextMatch(t);
1361 return new IntExpr(
this, Native.Z3_mk_real2int(nCtx, t.NativeObject));
1369 Debug.Assert(t !=
null);
1371 CheckContextMatch(t);
1372 return new BoolExpr(
this, Native.Z3_mk_is_int(nCtx, t.NativeObject));
1383 Debug.Assert(t !=
null);
1385 CheckContextMatch(t);
1386 return new BitVecExpr(
this, Native.Z3_mk_bvnot(nCtx, t.NativeObject));
1395 Debug.Assert(t !=
null);
1397 CheckContextMatch(t);
1398 return new BitVecExpr(
this, Native.Z3_mk_bvredand(nCtx, t.NativeObject));
1407 Debug.Assert(t !=
null);
1409 CheckContextMatch(t);
1410 return new BitVecExpr(
this, Native.Z3_mk_bvredor(nCtx, t.NativeObject));
1419 Debug.Assert(t1 !=
null);
1420 Debug.Assert(t2 !=
null);
1422 CheckContextMatch(t1);
1423 CheckContextMatch(t2);
1424 return new BitVecExpr(
this, Native.Z3_mk_bvand(nCtx, t1.NativeObject, t2.NativeObject));
1433 Debug.Assert(t1 !=
null);
1434 Debug.Assert(t2 !=
null);
1436 CheckContextMatch(t1);
1437 CheckContextMatch(t2);
1438 return new BitVecExpr(
this, Native.Z3_mk_bvor(nCtx, t1.NativeObject, t2.NativeObject));
1447 Debug.Assert(t1 !=
null);
1448 Debug.Assert(t2 !=
null);
1450 CheckContextMatch(t1);
1451 CheckContextMatch(t2);
1452 return new BitVecExpr(
this, Native.Z3_mk_bvxor(nCtx, t1.NativeObject, t2.NativeObject));
1461 Debug.Assert(t1 !=
null);
1462 Debug.Assert(t2 !=
null);
1464 CheckContextMatch(t1);
1465 CheckContextMatch(t2);
1466 return new BitVecExpr(
this, Native.Z3_mk_bvnand(nCtx, t1.NativeObject, t2.NativeObject));
1475 Debug.Assert(t1 !=
null);
1476 Debug.Assert(t2 !=
null);
1478 CheckContextMatch(t1);
1479 CheckContextMatch(t2);
1480 return new BitVecExpr(
this, Native.Z3_mk_bvnor(nCtx, t1.NativeObject, t2.NativeObject));
1489 Debug.Assert(t1 !=
null);
1490 Debug.Assert(t2 !=
null);
1492 CheckContextMatch(t1);
1493 CheckContextMatch(t2);
1494 return new BitVecExpr(
this, Native.Z3_mk_bvxnor(nCtx, t1.NativeObject, t2.NativeObject));
1503 Debug.Assert(t !=
null);
1505 CheckContextMatch(t);
1506 return new BitVecExpr(
this, Native.Z3_mk_bvneg(nCtx, t.NativeObject));
1515 Debug.Assert(t1 !=
null);
1516 Debug.Assert(t2 !=
null);
1518 CheckContextMatch(t1);
1519 CheckContextMatch(t2);
1520 return new BitVecExpr(
this, Native.Z3_mk_bvadd(nCtx, t1.NativeObject, t2.NativeObject));
1529 Debug.Assert(t1 !=
null);
1530 Debug.Assert(t2 !=
null);
1532 CheckContextMatch(t1);
1533 CheckContextMatch(t2);
1534 return new BitVecExpr(
this, Native.Z3_mk_bvsub(nCtx, t1.NativeObject, t2.NativeObject));
1543 Debug.Assert(t1 !=
null);
1544 Debug.Assert(t2 !=
null);
1546 CheckContextMatch(t1);
1547 CheckContextMatch(t2);
1548 return new BitVecExpr(
this, Native.Z3_mk_bvmul(nCtx, t1.NativeObject, t2.NativeObject));
1562 Debug.Assert(t1 !=
null);
1563 Debug.Assert(t2 !=
null);
1565 CheckContextMatch(t1);
1566 CheckContextMatch(t2);
1567 return new BitVecExpr(
this, Native.Z3_mk_bvudiv(nCtx, t1.NativeObject, t2.NativeObject));
1585 Debug.Assert(t1 !=
null);
1586 Debug.Assert(t2 !=
null);
1588 CheckContextMatch(t1);
1589 CheckContextMatch(t2);
1590 return new BitVecExpr(
this, Native.Z3_mk_bvsdiv(nCtx, t1.NativeObject, t2.NativeObject));
1603 Debug.Assert(t1 !=
null);
1604 Debug.Assert(t2 !=
null);
1606 CheckContextMatch(t1);
1607 CheckContextMatch(t2);
1608 return new BitVecExpr(
this, Native.Z3_mk_bvurem(nCtx, t1.NativeObject, t2.NativeObject));
1623 Debug.Assert(t1 !=
null);
1624 Debug.Assert(t2 !=
null);
1626 CheckContextMatch(t1);
1627 CheckContextMatch(t2);
1628 return new BitVecExpr(
this, Native.Z3_mk_bvsrem(nCtx, t1.NativeObject, t2.NativeObject));
1640 Debug.Assert(t1 !=
null);
1641 Debug.Assert(t2 !=
null);
1643 CheckContextMatch(t1);
1644 CheckContextMatch(t2);
1645 return new BitVecExpr(
this, Native.Z3_mk_bvsmod(nCtx, t1.NativeObject, t2.NativeObject));
1656 Debug.Assert(t1 !=
null);
1657 Debug.Assert(t2 !=
null);
1659 CheckContextMatch(t1);
1660 CheckContextMatch(t2);
1661 return new BoolExpr(
this, Native.Z3_mk_bvult(nCtx, t1.NativeObject, t2.NativeObject));
1672 Debug.Assert(t1 !=
null);
1673 Debug.Assert(t2 !=
null);
1675 CheckContextMatch(t1);
1676 CheckContextMatch(t2);
1677 return new BoolExpr(
this, Native.Z3_mk_bvslt(nCtx, t1.NativeObject, t2.NativeObject));
1688 Debug.Assert(t1 !=
null);
1689 Debug.Assert(t2 !=
null);
1691 CheckContextMatch(t1);
1692 CheckContextMatch(t2);
1693 return new BoolExpr(
this, Native.Z3_mk_bvule(nCtx, t1.NativeObject, t2.NativeObject));
1704 Debug.Assert(t1 !=
null);
1705 Debug.Assert(t2 !=
null);
1707 CheckContextMatch(t1);
1708 CheckContextMatch(t2);
1709 return new BoolExpr(
this, Native.Z3_mk_bvsle(nCtx, t1.NativeObject, t2.NativeObject));
1720 Debug.Assert(t1 !=
null);
1721 Debug.Assert(t2 !=
null);
1723 CheckContextMatch(t1);
1724 CheckContextMatch(t2);
1725 return new BoolExpr(
this, Native.Z3_mk_bvuge(nCtx, t1.NativeObject, t2.NativeObject));
1736 Debug.Assert(t1 !=
null);
1737 Debug.Assert(t2 !=
null);
1739 CheckContextMatch(t1);
1740 CheckContextMatch(t2);
1741 return new BoolExpr(
this, Native.Z3_mk_bvsge(nCtx, t1.NativeObject, t2.NativeObject));
1752 Debug.Assert(t1 !=
null);
1753 Debug.Assert(t2 !=
null);
1755 CheckContextMatch(t1);
1756 CheckContextMatch(t2);
1757 return new BoolExpr(
this, Native.Z3_mk_bvugt(nCtx, t1.NativeObject, t2.NativeObject));
1768 Debug.Assert(t1 !=
null);
1769 Debug.Assert(t2 !=
null);
1771 CheckContextMatch(t1);
1772 CheckContextMatch(t2);
1773 return new BoolExpr(
this, Native.Z3_mk_bvsgt(nCtx, t1.NativeObject, t2.NativeObject));
1788 Debug.Assert(t1 !=
null);
1789 Debug.Assert(t2 !=
null);
1791 CheckContextMatch(t1);
1792 CheckContextMatch(t2);
1793 return new BitVecExpr(
this, Native.Z3_mk_concat(nCtx, t1.NativeObject, t2.NativeObject));
1807 Debug.Assert(t !=
null);
1809 CheckContextMatch(t);
1810 return new BitVecExpr(
this, Native.Z3_mk_extract(nCtx, high, low, t.NativeObject));
1823 Debug.Assert(t !=
null);
1825 CheckContextMatch(t);
1826 return new BitVecExpr(
this, Native.Z3_mk_sign_ext(nCtx, i, t.NativeObject));
1840 Debug.Assert(t !=
null);
1842 CheckContextMatch(t);
1843 return new BitVecExpr(
this, Native.Z3_mk_zero_ext(nCtx, i, t.NativeObject));
1854 Debug.Assert(t !=
null);
1856 CheckContextMatch(t);
1857 return new BitVecExpr(
this, Native.Z3_mk_repeat(nCtx, i, t.NativeObject));
1874 Debug.Assert(t1 !=
null);
1875 Debug.Assert(t2 !=
null);
1877 CheckContextMatch(t1);
1878 CheckContextMatch(t2);
1879 return new BitVecExpr(
this, Native.Z3_mk_bvshl(nCtx, t1.NativeObject, t2.NativeObject));
1896 Debug.Assert(t1 !=
null);
1897 Debug.Assert(t2 !=
null);
1899 CheckContextMatch(t1);
1900 CheckContextMatch(t2);
1901 return new BitVecExpr(
this, Native.Z3_mk_bvlshr(nCtx, t1.NativeObject, t2.NativeObject));
1920 Debug.Assert(t1 !=
null);
1921 Debug.Assert(t2 !=
null);
1923 CheckContextMatch(t1);
1924 CheckContextMatch(t2);
1925 return new BitVecExpr(
this, Native.Z3_mk_bvashr(nCtx, t1.NativeObject, t2.NativeObject));
1937 Debug.Assert(t !=
null);
1939 CheckContextMatch(t);
1940 return new BitVecExpr(
this, Native.Z3_mk_rotate_left(nCtx, i, t.NativeObject));
1952 Debug.Assert(t !=
null);
1954 CheckContextMatch(t);
1955 return new BitVecExpr(
this, Native.Z3_mk_rotate_right(nCtx, i, t.NativeObject));
1967 Debug.Assert(t1 !=
null);
1968 Debug.Assert(t2 !=
null);
1970 CheckContextMatch(t1);
1971 CheckContextMatch(t2);
1972 return new BitVecExpr(
this, Native.Z3_mk_ext_rotate_left(nCtx, t1.NativeObject, t2.NativeObject));
1984 Debug.Assert(t1 !=
null);
1985 Debug.Assert(t2 !=
null);
1987 CheckContextMatch(t1);
1988 CheckContextMatch(t2);
1989 return new BitVecExpr(
this, Native.Z3_mk_ext_rotate_right(nCtx, t1.NativeObject, t2.NativeObject));
2004 Debug.Assert(t !=
null);
2006 CheckContextMatch(t);
2007 return new BitVecExpr(
this, Native.Z3_mk_int2bv(nCtx, n, t.NativeObject));
2027 Debug.Assert(t !=
null);
2029 CheckContextMatch(t);
2030 return new IntExpr(
this, Native.Z3_mk_bv2int(nCtx, t.NativeObject, (
byte)(
signed ? 1 : 0)));
2041 Debug.Assert(t1 !=
null);
2042 Debug.Assert(t2 !=
null);
2044 CheckContextMatch(t1);
2045 CheckContextMatch(t2);
2046 return new BoolExpr(
this, Native.Z3_mk_bvadd_no_overflow(nCtx, t1.NativeObject, t2.NativeObject, (
byte)(isSigned ? 1 : 0)));
2057 Debug.Assert(t1 !=
null);
2058 Debug.Assert(t2 !=
null);
2060 CheckContextMatch(t1);
2061 CheckContextMatch(t2);
2062 return new BoolExpr(
this, Native.Z3_mk_bvadd_no_underflow(nCtx, t1.NativeObject, t2.NativeObject));
2073 Debug.Assert(t1 !=
null);
2074 Debug.Assert(t2 !=
null);
2076 CheckContextMatch(t1);
2077 CheckContextMatch(t2);
2078 return new BoolExpr(
this, Native.Z3_mk_bvsub_no_overflow(nCtx, t1.NativeObject, t2.NativeObject));
2089 Debug.Assert(t1 !=
null);
2090 Debug.Assert(t2 !=
null);
2092 CheckContextMatch(t1);
2093 CheckContextMatch(t2);
2094 return new BoolExpr(
this, Native.Z3_mk_bvsub_no_underflow(nCtx, t1.NativeObject, t2.NativeObject, (
byte)(isSigned ? 1 : 0)));
2105 Debug.Assert(t1 !=
null);
2106 Debug.Assert(t2 !=
null);
2108 CheckContextMatch(t1);
2109 CheckContextMatch(t2);
2110 return new BoolExpr(
this, Native.Z3_mk_bvsdiv_no_overflow(nCtx, t1.NativeObject, t2.NativeObject));
2121 Debug.Assert(t !=
null);
2123 CheckContextMatch(t);
2124 return new BoolExpr(
this, Native.Z3_mk_bvneg_no_overflow(nCtx, t.NativeObject));
2135 Debug.Assert(t1 !=
null);
2136 Debug.Assert(t2 !=
null);
2138 CheckContextMatch(t1);
2139 CheckContextMatch(t2);
2140 return new BoolExpr(
this, Native.Z3_mk_bvmul_no_overflow(nCtx, t1.NativeObject, t2.NativeObject, (
byte)(isSigned ? 1 : 0)));
2151 Debug.Assert(t1 !=
null);
2152 Debug.Assert(t2 !=
null);
2154 CheckContextMatch(t1);
2155 CheckContextMatch(t2);
2156 return new BoolExpr(
this, Native.Z3_mk_bvmul_no_underflow(nCtx, t1.NativeObject, t2.NativeObject));
2166 Debug.Assert(name !=
null);
2167 Debug.Assert(domain !=
null);
2168 Debug.Assert(range !=
null);
2179 Debug.Assert(domain !=
null);
2180 Debug.Assert(range !=
null);
2203 Debug.Assert(a !=
null);
2204 Debug.Assert(i !=
null);
2206 CheckContextMatch(a);
2207 CheckContextMatch(i);
2208 return Expr.Create(
this, Native.Z3_mk_select(nCtx, a.NativeObject, i.NativeObject));
2226 Debug.Assert(a !=
null);
2227 Debug.Assert(args !=
null && args.All(n => n !=
null));
2229 CheckContextMatch(a);
2230 CheckContextMatch<Expr>(args);
2231 return Expr.Create(
this, Native.Z3_mk_select_n(nCtx, a.NativeObject,
AST.ArrayLength(args),
AST.ArrayToNative(args)));
2255 Debug.Assert(a !=
null);
2256 Debug.Assert(i !=
null);
2257 Debug.Assert(v !=
null);
2259 CheckContextMatch(a);
2260 CheckContextMatch(i);
2261 CheckContextMatch(v);
2262 return new ArrayExpr(
this, Native.Z3_mk_store(nCtx, a.NativeObject, i.NativeObject, v.NativeObject));
2285 Debug.Assert(a !=
null);
2286 Debug.Assert(args !=
null);
2287 Debug.Assert(v !=
null);
2289 CheckContextMatch<Expr>(args);
2290 CheckContextMatch(a);
2291 CheckContextMatch(v);
2292 return new ArrayExpr(
this, Native.Z3_mk_store_n(nCtx, a.NativeObject,
AST.ArrayLength(args),
AST.ArrayToNative(args), v.NativeObject));
2306 Debug.Assert(domain !=
null);
2307 Debug.Assert(v !=
null);
2309 CheckContextMatch(domain);
2310 CheckContextMatch(v);
2311 return new ArrayExpr(
this, Native.Z3_mk_const_array(nCtx, domain.NativeObject, v.NativeObject));
2327 Debug.Assert(f !=
null);
2328 Debug.Assert(args ==
null || args.All(a => a !=
null));
2330 CheckContextMatch(f);
2331 CheckContextMatch<ArrayExpr>(args);
2332 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_map(nCtx, f.NativeObject,
AST.ArrayLength(args),
AST.ArrayToNative(args)));
2344 Debug.Assert(array !=
null);
2346 CheckContextMatch(array);
2347 return Expr.Create(
this, Native.Z3_mk_array_default(nCtx, array.NativeObject));
2355 Debug.Assert(arg1 !=
null);
2356 Debug.Assert(arg2 !=
null);
2358 CheckContextMatch(arg1);
2359 CheckContextMatch(arg2);
2360 return Expr.Create(
this, Native.Z3_mk_array_ext(nCtx, arg1.NativeObject, arg2.NativeObject));
2371 Debug.Assert(ty !=
null);
2373 CheckContextMatch(ty);
2382 Debug.Assert(domain !=
null);
2384 CheckContextMatch(domain);
2385 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_empty_set(nCtx, domain.NativeObject));
2393 Debug.Assert(domain !=
null);
2395 CheckContextMatch(domain);
2396 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_full_set(nCtx, domain.NativeObject));
2404 Debug.Assert(
set !=
null);
2405 Debug.Assert(element !=
null);
2407 CheckContextMatch(
set);
2408 CheckContextMatch(element);
2409 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_add(nCtx,
set.NativeObject, element.NativeObject));
2418 Debug.Assert(
set !=
null);
2419 Debug.Assert(element !=
null);
2421 CheckContextMatch(
set);
2422 CheckContextMatch(element);
2423 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_del(nCtx,
set.NativeObject, element.NativeObject));
2431 Debug.Assert(args !=
null);
2432 Debug.Assert(args.All(a => a !=
null));
2434 CheckContextMatch<ArrayExpr>(args);
2435 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_union(nCtx, (uint)args.Length,
AST.ArrayToNative(args)));
2443 Debug.Assert(args !=
null);
2444 Debug.Assert(args.All(a => a !=
null));
2446 CheckContextMatch<ArrayExpr>(args);
2447 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_intersect(nCtx, (uint)args.Length,
AST.ArrayToNative(args)));
2455 Debug.Assert(arg1 !=
null);
2456 Debug.Assert(arg2 !=
null);
2458 CheckContextMatch(arg1);
2459 CheckContextMatch(arg2);
2460 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_difference(nCtx, arg1.NativeObject, arg2.NativeObject));
2468 Debug.Assert(arg !=
null);
2470 CheckContextMatch(arg);
2471 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_complement(nCtx, arg.NativeObject));
2479 Debug.Assert(elem !=
null);
2480 Debug.Assert(
set !=
null);
2482 CheckContextMatch(elem);
2483 CheckContextMatch(
set);
2484 return (
BoolExpr)
Expr.Create(
this, Native.Z3_mk_set_member(nCtx, elem.NativeObject,
set.NativeObject));
2492 Debug.Assert(arg1 !=
null);
2493 Debug.Assert(arg2 !=
null);
2495 CheckContextMatch(arg1);
2496 CheckContextMatch(arg2);
2497 return (
BoolExpr)
Expr.Create(
this, Native.Z3_mk_set_subset(nCtx, arg1.NativeObject, arg2.NativeObject));
2509 Debug.Assert(elemSort !=
null);
2511 CheckContextMatch(elemSort);
2520 Debug.Assert(s !=
null);
2522 CheckContextMatch(s);
2523 return Native.Z3_is_finite_set_sort(nCtx, s.NativeObject) != 0;
2531 Debug.Assert(s !=
null);
2533 CheckContextMatch(s);
2534 return Sort.Create(
this, Native.Z3_get_finite_set_sort_basis(nCtx, s.NativeObject));
2542 Debug.Assert(setSort !=
null);
2544 CheckContextMatch(setSort);
2545 return Expr.Create(
this, Native.Z3_mk_finite_set_empty(nCtx, setSort.NativeObject));
2553 Debug.Assert(elem !=
null);
2555 CheckContextMatch(elem);
2556 return Expr.Create(
this, Native.Z3_mk_finite_set_singleton(nCtx, elem.NativeObject));
2564 Debug.Assert(s1 !=
null);
2565 Debug.Assert(s2 !=
null);
2567 CheckContextMatch(s1);
2568 CheckContextMatch(s2);
2569 return Expr.Create(
this, Native.Z3_mk_finite_set_union(nCtx, s1.NativeObject, s2.NativeObject));
2577 Debug.Assert(s1 !=
null);
2578 Debug.Assert(s2 !=
null);
2580 CheckContextMatch(s1);
2581 CheckContextMatch(s2);
2582 return Expr.Create(
this, Native.Z3_mk_finite_set_intersect(nCtx, s1.NativeObject, s2.NativeObject));
2590 Debug.Assert(s1 !=
null);
2591 Debug.Assert(s2 !=
null);
2593 CheckContextMatch(s1);
2594 CheckContextMatch(s2);
2595 return Expr.Create(
this, Native.Z3_mk_finite_set_difference(nCtx, s1.NativeObject, s2.NativeObject));
2603 Debug.Assert(elem !=
null);
2604 Debug.Assert(
set !=
null);
2606 CheckContextMatch(elem);
2607 CheckContextMatch(
set);
2608 return (
BoolExpr)
Expr.Create(
this, Native.Z3_mk_finite_set_member(nCtx, elem.NativeObject,
set.NativeObject));
2616 Debug.Assert(
set !=
null);
2618 CheckContextMatch(
set);
2619 return Expr.Create(
this, Native.Z3_mk_finite_set_size(nCtx,
set.NativeObject));
2627 Debug.Assert(s1 !=
null);
2628 Debug.Assert(s2 !=
null);
2630 CheckContextMatch(s1);
2631 CheckContextMatch(s2);
2632 return (
BoolExpr)
Expr.Create(
this, Native.Z3_mk_finite_set_subset(nCtx, s1.NativeObject, s2.NativeObject));
2640 Debug.Assert(f !=
null);
2641 Debug.Assert(
set !=
null);
2643 CheckContextMatch(f);
2644 CheckContextMatch(
set);
2645 return Expr.Create(
this, Native.Z3_mk_finite_set_map(nCtx, f.NativeObject,
set.NativeObject));
2653 Debug.Assert(f !=
null);
2654 Debug.Assert(
set !=
null);
2656 CheckContextMatch(f);
2657 CheckContextMatch(
set);
2658 return Expr.Create(
this, Native.Z3_mk_finite_set_filter(nCtx, f.NativeObject,
set.NativeObject));
2666 Debug.Assert(low !=
null);
2667 Debug.Assert(high !=
null);
2669 CheckContextMatch(low);
2670 CheckContextMatch(high);
2671 return Expr.Create(
this, Native.Z3_mk_finite_set_range(nCtx, low.NativeObject, high.NativeObject));
2676 #region Sequence, string and regular expressions
2683 Debug.Assert(s !=
null);
2684 return new SeqExpr(
this, Native.Z3_mk_seq_empty(nCtx, s.NativeObject));
2692 Debug.Assert(elem !=
null);
2693 return new SeqExpr(
this, Native.Z3_mk_seq_unit(nCtx, elem.NativeObject));
2701 Debug.Assert(s !=
null);
2702 return new SeqExpr(
this, Native.Z3_mk_string(nCtx, s));
2710 Debug.Assert(e !=
null);
2712 return new SeqExpr(
this, Native.Z3_mk_int_to_str(nCtx, e.NativeObject));
2720 Debug.Assert(e !=
null);
2722 return new SeqExpr(
this, Native.Z3_mk_ubv_to_str(nCtx, e.NativeObject));
2730 Debug.Assert(e !=
null);
2732 return new SeqExpr(
this, Native.Z3_mk_sbv_to_str(nCtx, e.NativeObject));
2740 Debug.Assert(e !=
null);
2742 return new IntExpr(
this, Native.Z3_mk_str_to_int(nCtx, e.NativeObject));
2751 Debug.Assert(t !=
null);
2752 Debug.Assert(t.All(a => a !=
null));
2754 CheckContextMatch<SeqExpr>(t);
2755 return new SeqExpr(
this, Native.Z3_mk_seq_concat(nCtx, (uint)t.Length,
AST.ArrayToNative(t)));
2764 Debug.Assert(s !=
null);
2765 return (
IntExpr)
Expr.Create(
this, Native.Z3_mk_seq_length(nCtx, s.NativeObject));
2773 Debug.Assert(s1 !=
null);
2774 Debug.Assert(s2 !=
null);
2775 CheckContextMatch(s1, s2);
2776 return new BoolExpr(
this, Native.Z3_mk_seq_prefix(nCtx, s1.NativeObject, s2.NativeObject));
2784 Debug.Assert(s1 !=
null);
2785 Debug.Assert(s2 !=
null);
2786 CheckContextMatch(s1, s2);
2787 return new BoolExpr(
this, Native.Z3_mk_seq_suffix(nCtx, s1.NativeObject, s2.NativeObject));
2795 Debug.Assert(s1 !=
null);
2796 Debug.Assert(s2 !=
null);
2797 CheckContextMatch(s1, s2);
2798 return new BoolExpr(
this, Native.Z3_mk_seq_contains(nCtx, s1.NativeObject, s2.NativeObject));
2806 Debug.Assert(s1 !=
null);
2807 Debug.Assert(s2 !=
null);
2808 CheckContextMatch(s1, s2);
2809 return new BoolExpr(
this, Native.Z3_mk_str_lt(nCtx, s1.NativeObject, s2.NativeObject));
2817 Debug.Assert(s1 !=
null);
2818 Debug.Assert(s2 !=
null);
2819 CheckContextMatch(s1, s2);
2820 return new BoolExpr(
this, Native.Z3_mk_str_le(nCtx, s1.NativeObject, s2.NativeObject));
2828 Debug.Assert(s !=
null);
2829 Debug.Assert(index !=
null);
2830 CheckContextMatch(s, index);
2831 return new SeqExpr(
this, Native.Z3_mk_seq_at(nCtx, s.NativeObject, index.NativeObject));
2839 Debug.Assert(s !=
null);
2840 Debug.Assert(index !=
null);
2841 CheckContextMatch(s, index);
2842 return Expr.Create(
this, Native.Z3_mk_seq_nth(nCtx, s.NativeObject, index.NativeObject));
2850 Debug.Assert(s !=
null);
2851 Debug.Assert(offset !=
null);
2852 Debug.Assert(length !=
null);
2853 CheckContextMatch(s, offset, length);
2854 return new SeqExpr(
this, Native.Z3_mk_seq_extract(nCtx, s.NativeObject, offset.NativeObject, length.NativeObject));
2862 Debug.Assert(s !=
null);
2863 Debug.Assert(offset !=
null);
2864 Debug.Assert(substr !=
null);
2865 CheckContextMatch(s, substr, offset);
2866 return new IntExpr(
this, Native.Z3_mk_seq_index(nCtx, s.NativeObject, substr.NativeObject, offset.NativeObject));
2874 Debug.Assert(s !=
null);
2875 Debug.Assert(src !=
null);
2876 Debug.Assert(dst !=
null);
2877 CheckContextMatch(s, src, dst);
2878 return new SeqExpr(
this, Native.Z3_mk_seq_replace(nCtx, s.NativeObject, src.NativeObject, dst.NativeObject));
2886 Debug.Assert(f !=
null);
2887 Debug.Assert(s !=
null);
2888 CheckContextMatch(f, s);
2889 return Expr.Create(
this, Native.Z3_mk_seq_map(nCtx, f.NativeObject, s.NativeObject));
2897 Debug.Assert(f !=
null);
2898 Debug.Assert(i !=
null);
2899 Debug.Assert(s !=
null);
2900 CheckContextMatch(f, i, s);
2901 return Expr.Create(
this, Native.Z3_mk_seq_mapi(nCtx, f.NativeObject, i.NativeObject, s.NativeObject));
2909 Debug.Assert(f !=
null);
2910 Debug.Assert(a !=
null);
2911 Debug.Assert(s !=
null);
2912 CheckContextMatch(f, a, s);
2913 return Expr.Create(
this, Native.Z3_mk_seq_foldl(nCtx, f.NativeObject, a.NativeObject, s.NativeObject));
2921 Debug.Assert(f !=
null);
2922 Debug.Assert(i !=
null);
2923 Debug.Assert(a !=
null);
2924 Debug.Assert(s !=
null);
2925 CheckContextMatch(f, i, a);
2926 CheckContextMatch(s, a);
2927 return Expr.Create(
this, Native.Z3_mk_seq_foldli(nCtx, f.NativeObject, i.NativeObject, a.NativeObject, s.NativeObject));
2935 Debug.Assert(s !=
null);
2936 return new ReExpr(
this, Native.Z3_mk_seq_to_re(nCtx, s.NativeObject));
2945 Debug.Assert(s !=
null);
2946 Debug.Assert(re !=
null);
2947 CheckContextMatch(s, re);
2948 return new BoolExpr(
this, Native.Z3_mk_seq_in_re(nCtx, s.NativeObject, re.NativeObject));
2956 Debug.Assert(re !=
null);
2957 return new ReExpr(
this, Native.Z3_mk_re_star(nCtx, re.NativeObject));
2965 Debug.Assert(re !=
null);
2966 return new ReExpr(
this, Native.Z3_mk_re_loop(nCtx, re.NativeObject, lo, hi));
2974 Debug.Assert(re !=
null);
2975 return new ReExpr(
this, Native.Z3_mk_re_plus(nCtx, re.NativeObject));
2983 Debug.Assert(re !=
null);
2984 return new ReExpr(
this, Native.Z3_mk_re_option(nCtx, re.NativeObject));
2992 Debug.Assert(re !=
null);
2993 return new ReExpr(
this, Native.Z3_mk_re_complement(nCtx, re.NativeObject));
3001 Debug.Assert(t !=
null);
3002 Debug.Assert(t.All(a => a !=
null));
3004 CheckContextMatch<ReExpr>(t);
3005 return new ReExpr(
this, Native.Z3_mk_re_concat(nCtx, (uint)t.Length,
AST.ArrayToNative(t)));
3013 Debug.Assert(t !=
null);
3014 Debug.Assert(t.All(a => a !=
null));
3016 CheckContextMatch<ReExpr>(t);
3017 return new ReExpr(
this, Native.Z3_mk_re_union(nCtx, (uint)t.Length,
AST.ArrayToNative(t)));
3025 Debug.Assert(t !=
null);
3026 Debug.Assert(t.All(a => a !=
null));
3028 CheckContextMatch<ReExpr>(t);
3029 return new ReExpr(
this, Native.Z3_mk_re_intersect(nCtx, (uint)t.Length,
AST.ArrayToNative(t)));
3037 Debug.Assert(a !=
null);
3038 Debug.Assert(b !=
null);
3039 CheckContextMatch(a, b);
3040 return new ReExpr(
this, Native.Z3_mk_re_diff(nCtx, a.NativeObject, b.NativeObject));
3049 Debug.Assert(s !=
null);
3050 return new ReExpr(
this, Native.Z3_mk_re_empty(nCtx, s.NativeObject));
3059 Debug.Assert(s !=
null);
3060 return new ReExpr(
this, Native.Z3_mk_re_full(nCtx, s.NativeObject));
3069 Debug.Assert(lo !=
null);
3070 Debug.Assert(hi !=
null);
3071 CheckContextMatch(lo, hi);
3072 return new ReExpr(
this, Native.Z3_mk_re_range(nCtx, lo.NativeObject, hi.NativeObject));
3080 Debug.Assert(ch1 !=
null);
3081 Debug.Assert(ch2 !=
null);
3082 return new BoolExpr(
this, Native.Z3_mk_char_le(nCtx, ch1.NativeObject, ch2.NativeObject));
3090 Debug.Assert(ch !=
null);
3091 return new IntExpr(
this, Native.Z3_mk_char_to_int(nCtx, ch.NativeObject));
3099 Debug.Assert(ch !=
null);
3100 return new BitVecExpr(
this, Native.Z3_mk_char_to_bv(nCtx, ch.NativeObject));
3108 Debug.Assert(bv !=
null);
3109 return new Expr(
this, Native.Z3_mk_char_from_bv(nCtx, bv.NativeObject));
3117 Debug.Assert(ch !=
null);
3118 return new BoolExpr(
this, Native.Z3_mk_char_is_digit(nCtx, ch.NativeObject));
3123 #region Pseudo-Boolean constraints
3130 Debug.Assert(args !=
null);
3131 var ts = args.ToArray();
3132 CheckContextMatch<BoolExpr>(ts);
3133 return new BoolExpr(
this, Native.Z3_mk_atmost(nCtx, (uint)ts.Length,
3134 AST.ArrayToNative(ts), k));
3142 Debug.Assert(args !=
null);
3143 var ts = args.ToArray();
3144 CheckContextMatch<BoolExpr>(ts);
3145 return new BoolExpr(
this, Native.Z3_mk_atleast(nCtx, (uint)ts.Length,
3146 AST.ArrayToNative(ts), k));
3154 Debug.Assert(args !=
null);
3155 Debug.Assert(coeffs !=
null);
3156 Debug.Assert(args.Length == coeffs.Length);
3157 CheckContextMatch<BoolExpr>(args);
3158 return new BoolExpr(
this, Native.Z3_mk_pble(nCtx, (uint)args.Length,
3159 AST.ArrayToNative(args),
3168 Debug.Assert(args !=
null);
3169 Debug.Assert(coeffs !=
null);
3170 Debug.Assert(args.Length == coeffs.Length);
3171 CheckContextMatch<BoolExpr>(args);
3172 return new BoolExpr(
this, Native.Z3_mk_pbge(nCtx, (uint)args.Length,
3173 AST.ArrayToNative(args),
3181 Debug.Assert(args !=
null);
3182 Debug.Assert(coeffs !=
null);
3183 Debug.Assert(args.Length == coeffs.Length);
3184 CheckContextMatch<BoolExpr>(args);
3185 return new BoolExpr(
this, Native.Z3_mk_pbeq(nCtx, (uint)args.Length,
3186 AST.ArrayToNative(args),
3193 #region General Numerals
3202 Debug.Assert(ty !=
null);
3204 CheckContextMatch(ty);
3205 return Expr.Create(
this, Native.Z3_mk_numeral(nCtx, v, ty.NativeObject));
3217 Debug.Assert(ty !=
null);
3219 CheckContextMatch(ty);
3220 return Expr.Create(
this, Native.Z3_mk_int(nCtx, v, ty.NativeObject));
3232 Debug.Assert(ty !=
null);
3234 CheckContextMatch(ty);
3235 return Expr.Create(
this, Native.Z3_mk_unsigned_int(nCtx, v, ty.NativeObject));
3247 Debug.Assert(ty !=
null);
3249 CheckContextMatch(ty);
3250 return Expr.Create(
this, Native.Z3_mk_int64(nCtx, v, ty.NativeObject));
3262 Debug.Assert(ty !=
null);
3264 CheckContextMatch(ty);
3265 return Expr.Create(
this, Native.Z3_mk_unsigned_int64(nCtx, v, ty.NativeObject));
3282 return new RatNum(
this, Native.Z3_mk_real(nCtx, num, den));
3293 return new RatNum(
this, Native.Z3_mk_numeral(nCtx, v,
RealSort.NativeObject));
3304 return new RatNum(
this, Native.Z3_mk_int(nCtx, v,
RealSort.NativeObject));
3315 return new RatNum(
this, Native.Z3_mk_unsigned_int(nCtx, v,
RealSort.NativeObject));
3326 return new RatNum(
this, Native.Z3_mk_int64(nCtx, v,
RealSort.NativeObject));
3337 return new RatNum(
this, Native.Z3_mk_unsigned_int64(nCtx, v,
RealSort.NativeObject));
3349 return new IntNum(
this, Native.Z3_mk_numeral(nCtx, v,
IntSort.NativeObject));
3360 return new IntNum(
this, Native.Z3_mk_int(nCtx, v,
IntSort.NativeObject));
3371 return new IntNum(
this, Native.Z3_mk_unsigned_int(nCtx, v,
IntSort.NativeObject));
3382 return new IntNum(
this, Native.Z3_mk_int64(nCtx, v,
IntSort.NativeObject));
3393 return new IntNum(
this, Native.Z3_mk_unsigned_int64(nCtx, v,
IntSort.NativeObject));
3459 byte[] _bits =
new byte[bits.Length];
3460 for (
int i = 0; i < bits.Length; ++i) _bits[i] = (
byte)(bits[i] ? 1 : 0);
3461 return (
BitVecNum)
Expr.Create(
this, Native.Z3_mk_bv_numeral(nCtx, (uint)bits.Length, _bits));
3496 Debug.Assert(sorts !=
null);
3497 Debug.Assert(names !=
null);
3498 Debug.Assert(body !=
null);
3499 Debug.Assert(sorts.Length == names.Length);
3500 Debug.Assert(sorts.All(s => s !=
null));
3501 Debug.Assert(names.All(n => n !=
null));
3502 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3503 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3506 return new Quantifier(
this,
true, sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3520 Debug.Assert(body !=
null);
3521 Debug.Assert(boundConstants ==
null || boundConstants.All(b => b !=
null));
3522 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3523 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3526 return new Quantifier(
this,
true, boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3538 Debug.Assert(sorts !=
null);
3539 Debug.Assert(names !=
null);
3540 Debug.Assert(body !=
null);
3541 Debug.Assert(sorts.Length == names.Length);
3542 Debug.Assert(sorts.All(s => s !=
null));
3543 Debug.Assert(names.All(n => n !=
null));
3544 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3545 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3547 return new Quantifier(
this,
false, sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3560 Debug.Assert(body !=
null);
3561 Debug.Assert(boundConstants ==
null || boundConstants.All(n => n !=
null));
3562 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3563 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3565 return new Quantifier(
this,
false, boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3575 Debug.Assert(body !=
null);
3576 Debug.Assert(names !=
null);
3577 Debug.Assert(sorts !=
null);
3578 Debug.Assert(sorts.Length == names.Length);
3579 Debug.Assert(sorts.All(s => s !=
null));
3580 Debug.Assert(names.All(n => n !=
null));
3581 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3582 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3586 return MkForall(sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3588 return MkExists(sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3598 Debug.Assert(body !=
null);
3599 Debug.Assert(boundConstants ==
null || boundConstants.All(n => n !=
null));
3600 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3601 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3605 return MkForall(boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3607 return MkExists(boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3630 Debug.Assert(sorts !=
null);
3631 Debug.Assert(names !=
null);
3632 Debug.Assert(body !=
null);
3633 Debug.Assert(sorts.Length == names.Length);
3634 Debug.Assert(sorts.All(s => s !=
null));
3635 Debug.Assert(names.All(n => n !=
null));
3636 return new Lambda(
this, sorts, names, body);
3649 Debug.Assert(body !=
null);
3650 Debug.Assert(boundConstants !=
null && boundConstants.All(b => b !=
null));
3651 return new Lambda(
this, boundConstants, body);
3678 get {
return m_print_mode; }
3681 Native.Z3_set_ast_print_mode(nCtx, (uint)value);
3682 m_print_mode = value;
3687 #region SMT Files & Strings
3696 uint csn =
Symbol.ArrayLength(sortNames);
3697 uint cs =
Sort.ArrayLength(sorts);
3698 uint cdn =
Symbol.ArrayLength(declNames);
3699 uint cd =
AST.ArrayLength(decls);
3700 if (csn != cs || cdn != cd)
3702 using ASTVector assertions =
new ASTVector(
this, Native.Z3_parse_smtlib2_string(nCtx, str,
3703 AST.ArrayLength(sorts),
Symbol.ArrayToNative(sortNames),
AST.ArrayToNative(sorts),
3704 AST.ArrayLength(decls),
Symbol.ArrayToNative(declNames),
AST.ArrayToNative(decls)));
3705 return assertions.ToBoolExprArray();
3715 uint csn =
Symbol.ArrayLength(sortNames);
3716 uint cs =
Sort.ArrayLength(sorts);
3717 uint cdn =
Symbol.ArrayLength(declNames);
3718 uint cd =
AST.ArrayLength(decls);
3719 if (csn != cs || cdn != cd)
3721 using ASTVector assertions =
new ASTVector(
this, Native.Z3_parse_smtlib2_file(nCtx, fileName,
3722 AST.ArrayLength(sorts),
Symbol.ArrayToNative(sortNames),
AST.ArrayToNative(sorts),
3723 AST.ArrayLength(decls),
Symbol.ArrayToNative(declNames),
AST.ArrayToNative(decls)));
3724 return assertions.ToBoolExprArray();
3739 Debug.Assert(assumptions !=
null);
3740 Debug.Assert(formula !=
null);
3742 return Native.Z3_benchmark_to_smtlib_string(
3748 (uint)(assumptions?.Length ?? 0),
3749 AST.ArrayToNative(assumptions),
3750 formula.NativeObject);
3765 public Goal MkGoal(
bool models =
true,
bool unsatCores =
false,
bool proofs =
false)
3768 return new Goal(
this, models, unsatCores, proofs);
3772 #region ParameterSets
3789 get {
return Native.Z3_get_num_tactics(nCtx); }
3801 string[] res =
new string[n];
3802 for (uint i = 0; i < n; i++)
3803 res[i] = Native.Z3_get_tactic_name(nCtx, i);
3814 return Native.Z3_tactic_get_descr(nCtx, name);
3823 return new Tactic(
this, name);
3832 Debug.Assert(t1 !=
null);
3833 Debug.Assert(t2 !=
null);
3837 CheckContextMatch(t1);
3838 CheckContextMatch(t2);
3839 CheckContextMatch<Tactic>(ts);
3841 IntPtr last = IntPtr.Zero;
3842 if (ts !=
null && ts.Length > 0)
3844 last = ts[ts.Length - 1].NativeObject;
3845 for (
int i = ts.Length - 2; i >= 0; i--)
3846 last = Native.Z3_tactic_and_then(nCtx, ts[i].NativeObject, last);
3848 if (last != IntPtr.Zero)
3850 last = Native.Z3_tactic_and_then(nCtx, t2.NativeObject, last);
3851 return new Tactic(
this, Native.Z3_tactic_and_then(nCtx, t1.NativeObject, last));
3854 return new Tactic(
this, Native.Z3_tactic_and_then(nCtx, t1.NativeObject, t2.NativeObject));
3866 Debug.Assert(t1 !=
null);
3867 Debug.Assert(t2 !=
null);
3879 Debug.Assert(t1 !=
null);
3880 Debug.Assert(t2 !=
null);
3882 CheckContextMatch(t1);
3883 CheckContextMatch(t2);
3884 return new Tactic(
this, Native.Z3_tactic_or_else(nCtx, t1.NativeObject, t2.NativeObject));
3895 Debug.Assert(t !=
null);
3897 CheckContextMatch(t);
3898 return new Tactic(
this, Native.Z3_tactic_try_for(nCtx, t.NativeObject, ms));
3910 Debug.Assert(p !=
null);
3911 Debug.Assert(t !=
null);
3913 CheckContextMatch(t);
3914 CheckContextMatch(p);
3915 return new Tactic(
this, Native.Z3_tactic_when(nCtx, p.NativeObject, t.NativeObject));
3924 Debug.Assert(p !=
null);
3925 Debug.Assert(t1 !=
null);
3926 Debug.Assert(t2 !=
null);
3928 CheckContextMatch(p);
3929 CheckContextMatch(t1);
3930 CheckContextMatch(t2);
3931 return new Tactic(
this, Native.Z3_tactic_cond(nCtx, p.NativeObject, t1.NativeObject, t2.NativeObject));
3940 Debug.Assert(t !=
null);
3942 CheckContextMatch(t);
3943 return new Tactic(
this, Native.Z3_tactic_repeat(nCtx, t.NativeObject, max));
3952 return new Tactic(
this, Native.Z3_tactic_skip(nCtx));
3961 return new Tactic(
this, Native.Z3_tactic_fail(nCtx));
3969 Debug.Assert(p !=
null);
3971 CheckContextMatch(p);
3972 return new Tactic(
this, Native.Z3_tactic_fail_if(nCtx, p.NativeObject));
3982 return new Tactic(
this, Native.Z3_tactic_fail_if_not_decided(nCtx));
3990 Debug.Assert(t !=
null);
3991 Debug.Assert(p !=
null);
3993 CheckContextMatch(t);
3994 CheckContextMatch(p);
3995 return new Tactic(
this, Native.Z3_tactic_using_params(nCtx, t.NativeObject, p.NativeObject));
4004 Debug.Assert(t !=
null);
4005 Debug.Assert(p !=
null);
4015 Debug.Assert(t ==
null || t.All(tactic => tactic !=
null));
4017 CheckContextMatch<Tactic>(t);
4018 return new Tactic(
this, Native.Z3_tactic_par_or(nCtx,
Tactic.ArrayLength(t),
Tactic.ArrayToNative(t)));
4027 Debug.Assert(t1 !=
null);
4028 Debug.Assert(t2 !=
null);
4030 CheckContextMatch(t1);
4031 CheckContextMatch(t2);
4032 return new Tactic(
this, Native.Z3_tactic_par_and_then(nCtx, t1.NativeObject, t2.NativeObject));
4041 Native.Z3_interrupt(nCtx);
4045 #region Quantifier Elimination
4059 CheckContextMatch(vars);
4060 CheckContextMatch(body);
4061 return Expr.Create(
this, Native.Z3_qe_lite(nCtx, vars.NativeObject, body.NativeObject));
4069 CheckContextMatch(model);
4070 CheckContextMatch<Expr>(bounds);
4071 CheckContextMatch(body);
4072 return Expr.Create(
this, Native.Z3_qe_model_project(nCtx, model.NativeObject,
4073 (uint)bounds.Length,
AST.ArrayToNative(bounds), body.NativeObject));
4081 CheckContextMatch(model);
4082 CheckContextMatch<Expr>(bounds);
4083 CheckContextMatch(body);
4084 CheckContextMatch(map);
4085 return Expr.Create(
this, Native.Z3_qe_model_project_skolem(nCtx, model.NativeObject,
4086 (uint)bounds.Length,
AST.ArrayToNative(bounds), body.NativeObject, map.NativeObject));
4094 CheckContextMatch(model);
4095 CheckContextMatch<Expr>(bounds);
4096 CheckContextMatch(body);
4097 CheckContextMatch(map);
4098 return Expr.Create(
this, Native.Z3_qe_model_project_with_witness(nCtx, model.NativeObject,
4099 (uint)bounds.Length,
AST.ArrayToNative(bounds), body.NativeObject, map.NativeObject));
4109 get {
return Native.Z3_get_num_simplifiers(nCtx); }
4121 string[] res =
new string[n];
4122 for (uint i = 0; i < n; i++)
4123 res[i] = Native.Z3_get_simplifier_name(nCtx, i);
4134 return Native.Z3_simplifier_get_descr(nCtx, name);
4152 Debug.Assert(t1 !=
null);
4153 Debug.Assert(t2 !=
null);
4157 CheckContextMatch(t1);
4158 CheckContextMatch(t2);
4159 CheckContextMatch<Simplifier>(ts);
4161 IntPtr last = IntPtr.Zero;
4162 if (ts !=
null && ts.Length > 0)
4164 last = ts[ts.Length - 1].NativeObject;
4165 for (
int i = ts.Length - 2; i >= 0; i--)
4166 last = Native.Z3_simplifier_and_then(nCtx, ts[i].NativeObject, last);
4168 if (last != IntPtr.Zero)
4170 last = Native.Z3_simplifier_and_then(nCtx, t2.NativeObject, last);
4171 return new Simplifier(
this, Native.Z3_simplifier_and_then(nCtx, t1.NativeObject, last));
4174 return new Simplifier(
this, Native.Z3_simplifier_and_then(nCtx, t1.NativeObject, t2.NativeObject));
4186 Debug.Assert(t1 !=
null);
4187 Debug.Assert(t2 !=
null);
4198 Debug.Assert(t !=
null);
4199 Debug.Assert(p !=
null);
4201 CheckContextMatch(t);
4202 CheckContextMatch(p);
4203 return new Simplifier(
this, Native.Z3_simplifier_using_params(nCtx, t.NativeObject, p.NativeObject));
4213 get {
return Native.Z3_get_num_probes(nCtx); }
4225 string[] res =
new string[n];
4226 for (uint i = 0; i < n; i++)
4227 res[i] = Native.Z3_get_probe_name(nCtx, i);
4238 return Native.Z3_probe_get_descr(nCtx, name);
4247 return new Probe(
this, name);
4256 return new Probe(
this, Native.Z3_probe_const(nCtx, val));
4265 Debug.Assert(p1 !=
null);
4266 Debug.Assert(p2 !=
null);
4268 CheckContextMatch(p1);
4269 CheckContextMatch(p2);
4270 return new Probe(
this, Native.Z3_probe_lt(nCtx, p1.NativeObject, p2.NativeObject));
4279 Debug.Assert(p1 !=
null);
4280 Debug.Assert(p2 !=
null);
4282 CheckContextMatch(p1);
4283 CheckContextMatch(p2);
4284 return new Probe(
this, Native.Z3_probe_gt(nCtx, p1.NativeObject, p2.NativeObject));
4293 Debug.Assert(p1 !=
null);
4294 Debug.Assert(p2 !=
null);
4296 CheckContextMatch(p1);
4297 CheckContextMatch(p2);
4298 return new Probe(
this, Native.Z3_probe_le(nCtx, p1.NativeObject, p2.NativeObject));
4307 Debug.Assert(p1 !=
null);
4308 Debug.Assert(p2 !=
null);
4310 CheckContextMatch(p1);
4311 CheckContextMatch(p2);
4312 return new Probe(
this, Native.Z3_probe_ge(nCtx, p1.NativeObject, p2.NativeObject));
4321 Debug.Assert(p1 !=
null);
4322 Debug.Assert(p2 !=
null);
4324 CheckContextMatch(p1);
4325 CheckContextMatch(p2);
4326 return new Probe(
this, Native.Z3_probe_eq(nCtx, p1.NativeObject, p2.NativeObject));
4335 Debug.Assert(p1 !=
null);
4336 Debug.Assert(p2 !=
null);
4338 CheckContextMatch(p1);
4339 CheckContextMatch(p2);
4340 return new Probe(
this, Native.Z3_probe_and(nCtx, p1.NativeObject, p2.NativeObject));
4349 Debug.Assert(p1 !=
null);
4350 Debug.Assert(p2 !=
null);
4352 CheckContextMatch(p1);
4353 CheckContextMatch(p2);
4354 return new Probe(
this, Native.Z3_probe_or(nCtx, p1.NativeObject, p2.NativeObject));
4363 Debug.Assert(p !=
null);
4365 CheckContextMatch(p);
4366 return new Probe(
this, Native.Z3_probe_not(nCtx, p.NativeObject));
4383 return new Solver(
this, Native.Z3_mk_solver(nCtx));
4385 return new Solver(
this, Native.Z3_mk_solver_for_logic(nCtx, logic.NativeObject));
4394 using var symbol =
MkSymbol(logic);
4404 return new Solver(
this, Native.Z3_mk_simple_solver(nCtx));
4413 Debug.Assert(s !=
null);
4414 return new Solver(
this, Native.Z3_solver_add_simplifier(nCtx, s.NativeObject, t.NativeObject));
4428 return new Solver(
this, Native.Z3_mk_solver_from_tactic(nCtx, t.NativeObject));
4445 #region Optimization
4456 #region Floating-Point Arithmetic
4458 #region Rounding Modes
4459 #region RoundingMode Sort
4475 return new FPRMExpr(
this, Native.Z3_mk_fpa_round_nearest_ties_to_even(nCtx));
4483 return new FPRMNum(
this, Native.Z3_mk_fpa_rne(nCtx));
4491 return new FPRMNum(
this, Native.Z3_mk_fpa_round_nearest_ties_to_away(nCtx));
4499 return new FPRMNum(
this, Native.Z3_mk_fpa_rna(nCtx));
4507 return new FPRMNum(
this, Native.Z3_mk_fpa_round_toward_positive(nCtx));
4515 return new FPRMNum(
this, Native.Z3_mk_fpa_rtp(nCtx));
4523 return new FPRMNum(
this, Native.Z3_mk_fpa_round_toward_negative(nCtx));
4531 return new FPRMNum(
this, Native.Z3_mk_fpa_rtn(nCtx));
4539 return new FPRMNum(
this, Native.Z3_mk_fpa_round_toward_zero(nCtx));
4547 return new FPRMNum(
this, Native.Z3_mk_fpa_rtz(nCtx));
4552 #region FloatingPoint Sorts
4560 return new FPSort(
this, ebits, sbits);
4568 return new FPSort(
this, Native.Z3_mk_fpa_sort_half(nCtx));
4576 return new FPSort(
this, Native.Z3_mk_fpa_sort_16(nCtx));
4584 return new FPSort(
this, Native.Z3_mk_fpa_sort_single(nCtx));
4592 return new FPSort(
this, Native.Z3_mk_fpa_sort_32(nCtx));
4600 return new FPSort(
this, Native.Z3_mk_fpa_sort_double(nCtx));
4608 return new FPSort(
this, Native.Z3_mk_fpa_sort_64(nCtx));
4616 return new FPSort(
this, Native.Z3_mk_fpa_sort_quadruple(nCtx));
4624 return new FPSort(
this, Native.Z3_mk_fpa_sort_128(nCtx));
4635 return new FPNum(
this, Native.Z3_mk_fpa_nan(nCtx, s.NativeObject));
4645 return new FPNum(
this, Native.Z3_mk_fpa_inf(nCtx, s.NativeObject, (
byte)(negative ? 1 : 0)));
4655 return new FPNum(
this, Native.Z3_mk_fpa_zero(nCtx, s.NativeObject, (
byte)(negative ? 1 : 0)));
4665 return new FPNum(
this, Native.Z3_mk_fpa_numeral_float(nCtx, v, s.NativeObject));
4675 return new FPNum(
this, Native.Z3_mk_fpa_numeral_double(nCtx, v, s.NativeObject));
4685 return new FPNum(
this, Native.Z3_mk_fpa_numeral_int(nCtx, v, s.NativeObject));
4697 return new FPNum(
this, Native.Z3_mk_fpa_numeral_int_uint(nCtx, (
byte)(sgn ? 1 : 0), exp, sig, s.NativeObject));
4709 return new FPNum(
this, Native.Z3_mk_fpa_numeral_int64_uint64(nCtx, (
byte)(sgn ? 1 : 0), exp, sig, s.NativeObject));
4775 return new FPExpr(
this, Native.Z3_mk_fpa_abs(
this.nCtx, t.NativeObject));
4784 return new FPExpr(
this, Native.Z3_mk_fpa_neg(
this.nCtx, t.NativeObject));
4795 return new FPExpr(
this, Native.Z3_mk_fpa_add(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4806 return new FPExpr(
this, Native.Z3_mk_fpa_sub(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4817 return new FPExpr(
this, Native.Z3_mk_fpa_mul(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4828 return new FPExpr(
this, Native.Z3_mk_fpa_div(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4843 return new FPExpr(
this, Native.Z3_mk_fpa_fma(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject, t3.NativeObject));
4853 return new FPExpr(
this, Native.Z3_mk_fpa_sqrt(
this.nCtx, rm.NativeObject, t.NativeObject));
4863 return new FPExpr(
this, Native.Z3_mk_fpa_rem(
this.nCtx, t1.NativeObject, t2.NativeObject));
4874 return new FPExpr(
this, Native.Z3_mk_fpa_round_to_integral(
this.nCtx, rm.NativeObject, t.NativeObject));
4884 return new FPExpr(
this, Native.Z3_mk_fpa_min(
this.nCtx, t1.NativeObject, t2.NativeObject));
4894 return new FPExpr(
this, Native.Z3_mk_fpa_max(
this.nCtx, t1.NativeObject, t2.NativeObject));
4904 return new BoolExpr(
this, Native.Z3_mk_fpa_leq(
this.nCtx, t1.NativeObject, t2.NativeObject));
4914 return new BoolExpr(
this, Native.Z3_mk_fpa_lt(
this.nCtx, t1.NativeObject, t2.NativeObject));
4924 return new BoolExpr(
this, Native.Z3_mk_fpa_geq(
this.nCtx, t1.NativeObject, t2.NativeObject));
4934 return new BoolExpr(
this, Native.Z3_mk_fpa_gt(
this.nCtx, t1.NativeObject, t2.NativeObject));
4947 return new BoolExpr(
this, Native.Z3_mk_fpa_eq(
this.nCtx, t1.NativeObject, t2.NativeObject));
4956 return new BoolExpr(
this, Native.Z3_mk_fpa_is_normal(
this.nCtx, t.NativeObject));
4965 return new BoolExpr(
this, Native.Z3_mk_fpa_is_subnormal(
this.nCtx, t.NativeObject));
4974 return new BoolExpr(
this, Native.Z3_mk_fpa_is_zero(
this.nCtx, t.NativeObject));
4983 return new BoolExpr(
this, Native.Z3_mk_fpa_is_infinite(
this.nCtx, t.NativeObject));
4992 return new BoolExpr(
this, Native.Z3_mk_fpa_is_nan(
this.nCtx, t.NativeObject));
5001 return new BoolExpr(
this, Native.Z3_mk_fpa_is_negative(
this.nCtx, t.NativeObject));
5010 return new BoolExpr(
this, Native.Z3_mk_fpa_is_positive(
this.nCtx, t.NativeObject));
5014 #region Conversions to FloatingPoint terms
5030 return new FPExpr(
this, Native.Z3_mk_fpa_fp(
this.nCtx, sgn.NativeObject, sig.NativeObject, exp.NativeObject));
5046 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_bv(
this.nCtx, bv.NativeObject, s.NativeObject));
5062 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_float(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5078 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_real(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5097 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_signed(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5099 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_unsigned(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5114 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_float(
this.nCtx, s.NativeObject, rm.NativeObject, t.NativeObject));
5118 #region Conversions from FloatingPoint terms
5134 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_sbv(
this.nCtx, rm.NativeObject, t.NativeObject, sz));
5136 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_ubv(
this.nCtx, rm.NativeObject, t.NativeObject, sz));
5150 return new RealExpr(
this, Native.Z3_mk_fpa_to_real(
this.nCtx, t.NativeObject));
5154 #region Z3-specific extensions
5167 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_ieee_bv(
this.nCtx, t.NativeObject));
5184 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_fp_int_real(
this.nCtx, rm.NativeObject, exp.NativeObject, sig.NativeObject, s.NativeObject));
5189 #region Miscellaneous
5202 return AST.Create(
this, nativeObject);
5218 return a.NativeObject;
5228 return new FuncDecl(
this, Native.Z3_mk_partial_order(
this.nCtx, a.NativeObject, index));
5238 return new FuncDecl(
this, Native.Z3_mk_transitive_closure(
this.nCtx, f.NativeObject));
5253 CheckContextMatch(p);
5254 CheckContextMatch(q);
5255 CheckContextMatch(x);
5256 return new ASTVector(
this, Native.Z3_polynomial_subresultants(
this.nCtx, p.NativeObject, q.NativeObject, x.NativeObject));
5265 return Native.Z3_simplify_get_help(nCtx);
5273 get {
return new ParamDescrs(
this, Native.Z3_simplify_get_param_descrs(nCtx)); }
5277 #region Error Handling
5305 Native.Z3_update_param_value(nCtx,
id, value);
5311 internal IntPtr m_ctx = IntPtr.Zero;
5312 internal Native.Z3_error_handler m_n_err_handler =
null;
5313 internal static Object creation_lock =
new Object();
5314 internal IntPtr nCtx {
get {
return m_ctx; } }
5319 private const long NativeMemoryPressureEstimate = 8 * 1024 * 1024;
5320 private bool m_memPressureAdded =
false;
5322 internal void NativeErrorHandler(IntPtr ctx,
Z3_error_code errorCode)
5327 internal void InitContext()
5330 m_n_err_handler =
new Native.Z3_error_handler(NativeErrorHandler);
5331 Native.Z3_set_error_handler(m_ctx, m_n_err_handler);
5334 GC.AddMemoryPressure(NativeMemoryPressureEstimate);
5335 m_memPressureAdded =
true;
5339 internal void CheckContextMatch(Z3Object other)
5341 Debug.Assert(other !=
null);
5343 if (!ReferenceEquals(
this, other.Context))
5344 throw new Z3Exception(
"Context mismatch");
5347 internal void CheckContextMatch(Z3Object other1, Z3Object other2)
5349 Debug.Assert(other1 !=
null);
5350 Debug.Assert(other2 !=
null);
5351 CheckContextMatch(other1);
5352 CheckContextMatch(other2);
5355 internal void CheckContextMatch(Z3Object other1, Z3Object other2, Z3Object other3)
5357 Debug.Assert(other1 !=
null);
5358 Debug.Assert(other2 !=
null);
5359 Debug.Assert(other3 !=
null);
5360 CheckContextMatch(other1);
5361 CheckContextMatch(other2);
5362 CheckContextMatch(other3);
5365 internal void CheckContextMatch(Z3Object[] arr)
5367 Debug.Assert(arr ==
null || arr.All(a => a !=
null));
5371 foreach (Z3Object a
in arr)
5373 Debug.Assert(a !=
null);
5374 CheckContextMatch(a);
5379 internal void CheckContextMatch<T>(IEnumerable<T> arr) where T : Z3Object
5381 Debug.Assert(arr ==
null || arr.All(a => a !=
null));
5385 foreach (Z3Object a
in arr)
5387 Debug.Assert(a !=
null);
5388 CheckContextMatch(a);
5393 private void ObjectInvariant()
5414 if (m_boolSort !=
null) m_boolSort.Dispose();
5415 if (m_intSort !=
null) m_intSort.Dispose();
5416 if (m_realSort !=
null) m_realSort.Dispose();
5417 if (m_stringSort !=
null) m_stringSort.Dispose();
5418 if (m_charSort !=
null) m_charSort.Dispose();
5422 m_stringSort =
null;
5424 if (m_ctx != IntPtr.Zero)
5428 GC.SuppressFinalize(
this);
5434 Native.Z3_error_handler errHandler;
5438 errHandler = m_n_err_handler;
5439 m_n_err_handler =
null;
5440 m_ctx = IntPtr.Zero;
5444 if (ctx != IntPtr.Zero)
5448 Native.Z3_del_context(ctx);
5449 GC.KeepAlive(errHandler);
5451 if (m_memPressureAdded)
5453 GC.RemoveMemoryPressure(NativeMemoryPressureEstimate);
5454 m_memPressureAdded =
false;
The abstract syntax tree (AST) class.
Arithmetic expressions (int/real)
Constructors are used for datatype sorts.
The main interaction with Z3 happens via the Context.
FPExpr MkFPToFP(FPRMExpr rm, RealExpr t, FPSort s)
Conversion of a term of real sort into a term of FloatingPoint sort.
BitVecExpr MkBVNAND(BitVecExpr t1, BitVecExpr t2)
Bitwise NAND.
FPNum MkFP(float v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
RealExpr MkInt2Real(IntExpr t)
Coerce an integer to a real.
FPSort MkFPSort16()
Create the half-precision (16-bit) FloatingPoint sort.
ArithExpr MkAdd(IEnumerable< ArithExpr > ts)
Create an expression representing t[0] + t[1] + ....
BoolExpr MkCharLe(Expr ch1, Expr ch2)
Create less than or equal to between two characters.
Expr MkNumeral(uint v, Sort ty)
Create a Term of a given sort. This function can be used to create numerals that fit in a machine int...
ArrayExpr MkArrayConst(string name, Sort domain, Sort range)
Create an array constant.
BoolExpr MkAtLeast(IEnumerable< BoolExpr > args, uint k)
Create an at-least-k constraint.
BitVecExpr MkBVSHL(BitVecExpr t1, BitVecExpr t2)
Shift left.
Expr MkFiniteSetMap(Expr f, Expr set)
Map a function over all elements in a finite set.
Tactic Skip()
Create a tactic that just returns the given goal.
Constructor MkConstructor(string name, string recognizer, string[] fieldNames=null, Sort[] sorts=null, uint[] sortRefs=null)
Create a datatype constructor.
Simplifier Then(Simplifier t1, Simplifier t2, params Simplifier[] ts)
Create a simplifier that applies t1 and then then t2 .
DatatypeSort MkPolymorphicDatatypeSort(Symbol name, Sort[] typeParams, Constructor[] constructors)
Create a polymorphic datatype sort with explicit type parameters. Type parameters should be sorts cre...
BoolSort BoolSort
Retrieves the Boolean sort of the context.
Expr MkFiniteSetUnion(Expr s1, Expr s2)
Create the union of two finite sets.
BitVecNum MkBV(bool[] bits)
Create a bit-vector numeral.
FiniteDomainSort MkFiniteDomainSort(Symbol name, ulong size)
Create a new finite domain sort. The result is a sort
BoolExpr MkStringLe(SeqExpr s1, SeqExpr s2)
Check if the string s1 is lexicographically less or equal to s2.
FPSort MkFPSort(uint ebits, uint sbits)
Create a FloatingPoint sort.
Tactic With(Tactic t, Params p)
Create a tactic that applies t using the given set of parameters p .
string[] TacticNames
The names of all supported tactics.
BoolExpr MkIsDigit(Expr ch)
Create a check if the character is a digit.
ArithExpr MkAdd(params ArithExpr[] ts)
Create an expression representing t[0] + t[1] + ....
FPExpr MkFPAdd(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point addition.
BitVecExpr MkBVRotateLeft(BitVecExpr t1, BitVecExpr t2)
Rotate Left.
RealExpr MkRealConst(string name)
Creates a real constant.
RatNum MkReal(uint v)
Create a real numeral.
Probe Gt(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value returned by p1 is greater than the value retu...
BitVecExpr MkBVLSHR(BitVecExpr t1, BitVecExpr t2)
Logical shift right.
FPRMSort MkFPRoundingModeSort()
Create the floating-point RoundingMode sort.
RealExpr MkFPToReal(FPExpr t)
Conversion of a floating-point term into a real-numbered term.
FiniteSetSort MkFiniteSetSort(Sort elemSort)
Create a finite set sort over the given element sort.
TupleSort MkTupleSort(Symbol name, Symbol[] fieldNames, Sort[] fieldSorts)
Create a new tuple sort.
Lambda MkLambda(Expr[] boundConstants, Expr body)
Create a lambda expression.
BitVecSort MkBitVecSort(uint size)
Create a new bit-vector sort.
BoolExpr MkBVMulNoUnderflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise multiplication does not underflow.
Expr MkFiniteSetSingleton(Expr elem)
Create a singleton finite set.
ReExpr MkDiff(ReExpr a, ReExpr b)
Create a difference regular expression.
ArrayExpr MkFullSet(Sort domain)
Create the full set.
FPSort MkFPSortQuadruple()
Create the quadruple-precision (128-bit) FloatingPoint sort.
BoolExpr MkLe(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 <= t2
Probe ConstProbe(double val)
Create a probe that always evaluates to val .
Expr MkFreshConst(string prefix, Sort range)
Creates a fresh Constant of sort range and a name prefixed with prefix .
BoolExpr MkOr(params BoolExpr[] ts)
Create an expression representing t[0] or t[1] or ....
IntExpr MkReal2Int(RealExpr t)
Coerce a real to an integer.
UninterpretedSort MkUninterpretedSort(Symbol s)
Create a new uninterpreted sort.
FPSort MkFPSortHalf()
Create the half-precision (16-bit) FloatingPoint sort.
Quantifier MkForall(Expr[] boundConstants, Expr body, uint weight=1, Pattern[] patterns=null, Expr[] noPatterns=null, Symbol quantifierID=null, Symbol skolemID=null)
Create a universal Quantifier.
ArrayExpr MkSetDifference(ArrayExpr arg1, ArrayExpr arg2)
Take the difference between two sets.
BoolExpr MkXor(BoolExpr t1, BoolExpr t2)
Create an expression representing t1 xor t2.
Expr MkNumeral(long v, Sort ty)
Create a Term of a given sort. This function can be used to create numerals that fit in a machine int...
Expr MkITE(BoolExpr t1, Expr t2, Expr t3)
Create an expression representing an if-then-else: ite(t1, t2, t3).
IntNum MkInt(uint v)
Create an integer numeral.
Expr QeLite(ASTVector vars, Expr body)
Performs best-effort quantifier elimination for the variables in vars .
IntExpr MkIntConst(Symbol name)
Creates an integer constant.
AST WrapAST(IntPtr nativeObject)
Wraps an AST.
FuncDecl MkPartialOrder(Sort a, uint index)
Create a partial order relation over a sort.
SeqExpr IntToString(Expr e)
Convert an integer expression to a string.
FPExpr MkFPMax(FPExpr t1, FPExpr t2)
Maximum of floating-point numbers.
ArithExpr MkUnaryMinus(ArithExpr t)
Create an expression representing -t.
BitVecExpr MkFPToIEEEBV(FPExpr t)
Conversion of a floating-point term into a bit-vector term in IEEE 754-2008 format.
Constructor MkConstructor(Symbol name, Symbol recognizer, Symbol[] fieldNames=null, Sort[] sorts=null, uint[] sortRefs=null)
Create a datatype constructor.
IntSort IntSort
Retrieves the Integer sort of the context.
BoolExpr MkSuffixOf(SeqExpr s1, SeqExpr s2)
Check for sequence suffix.
SeqExpr MkConcat(params SeqExpr[] t)
Concatenate sequences.
FuncDecl MkFuncDecl(string name, Sort domain, Sort range)
Creates a new function declaration.
BoolExpr MkNot(BoolExpr a)
Mk an expression representing not(a).
FuncDecl MkFuncDecl(string name, Sort[] domain, Sort range)
Creates a new function declaration.
FuncDecl MkUserPropagatorFuncDecl(string name, Sort[] domain, Sort range)
Declare a function to be processed by the user propagator plugin.
Expr MkTermArray(ArrayExpr array)
Access the array default value.
BitVecExpr MkBVSRem(BitVecExpr t1, BitVecExpr t2)
Signed remainder.
Simplifier UsingParams(Simplifier t, Params p)
Create a tactic that applies t using the given set of parameters p .
BitVecExpr MkBVRedOR(BitVecExpr t)
Take disjunction of bits in a vector, return vector of length 1.
Tactic MkTactic(string name)
Creates a new Tactic.
BoolExpr MkFPLEq(FPExpr t1, FPExpr t2)
Floating-point less than or equal.
string BenchmarkToSmtlibString(string name, string logic, string status, string attributes, BoolExpr[] assumptions, BoolExpr formula)
Convert a benchmark into SMT-LIB2 formatted string.
Expr MkFiniteSetEmpty(Sort setSort)
Create an empty finite set.
ReExpr MkOption(ReExpr re)
Create the optional regular expression.
BoolExpr MkFPEq(FPExpr t1, FPExpr t2)
Floating-point equality.
DatatypeSort[] MkDatatypeSorts(Symbol[] names, Constructor[][] c)
Create mutually recursive datatypes.
SeqExpr MkExtract(SeqExpr s, IntExpr offset, IntExpr length)
Extract subsequence.
RatNum MkReal(string v)
Create a real numeral.
FPExpr MkFPToFP(FPRMExpr rm, FPExpr t, FPSort s)
Conversion of a FloatingPoint term into another term of different FloatingPoint sort.
DatatypeSort MkDatatypeSort(string name, Constructor[] constructors)
Create a new datatype sort.
FPExpr MkFPToFP(FPRMExpr rm, BitVecExpr t, FPSort s, bool signed)
Conversion of a 2's complement signed bit-vector term into a term of FloatingPoint sort.
Tactic UsingParams(Tactic t, Params p)
Create a tactic that applies t using the given set of parameters p .
string[] SimplifierNames
The names of all supported tactics.
BoolExpr MkBVNegNoOverflow(BitVecExpr t)
Create a predicate that checks that the bit-wise negation does not overflow.
ListSort MkListSort(string name, Sort elemSort)
Create a new list sort.
uint NumTactics
The number of supported tactics.
SeqExpr UbvToString(Expr e)
Convert a bit-vector expression, represented as an unsigned number, to a string.
ReExpr MkConcat(params ReExpr[] t)
Create the concatenation of regular languages.
BoolExpr MkBVULT(BitVecExpr t1, BitVecExpr t2)
Unsigned less-than.
BoolExpr MkBVMulNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
Create a predicate that checks that the bit-wise multiplication does not overflow.
FuncDecl MkConstDecl(Symbol name, Sort range)
Creates a new constant function declaration.
BoolExpr MkXor(IEnumerable< BoolExpr > args)
Create an expression representing t1 xor t2 xor t3 ... .
BitVecExpr MkBVSDiv(BitVecExpr t1, BitVecExpr t2)
Signed division.
ParamDescrs SimplifyParameterDescriptions
Retrieves parameter descriptions for simplifier.
BitVecNum MkBV(ulong v, uint size)
Create a bit-vector numeral.
FPExpr MkFPFMA(FPRMExpr rm, FPExpr t1, FPExpr t2, FPExpr t3)
Floating-point fused multiply-add.
BoolExpr MkFPIsInfinite(FPExpr t)
Predicate indicating whether t is a floating-point number representing +oo or -oo.
BitVecExpr MkInt2BV(uint n, IntExpr t)
Create an n bit bit-vector from the integer argument t .
BoolExpr MkTrue()
The true Term.
FPExpr MkFPSub(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point subtraction.
FPNum MkFPNumeral(double v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
FPExpr MkFPToFP(BitVecExpr bv, FPSort s)
Conversion of a single IEEE 754-2008 bit-vector into a floating-point number.
ReExpr MkUnion(params ReExpr[] t)
Create the union of regular languages.
RatNum MkReal(ulong v)
Create a real numeral.
BoolExpr MkBoolConst(Symbol name)
Create a Boolean constant.
ReExpr MkEmptyRe(Sort s)
Create the empty regular expression. The sort s should be a regular expression.
FuncDecl MkTransitiveClosure(FuncDecl f)
Create the transitive closure of a binary relation.
Expr MkNth(SeqExpr s, Expr index)
Retrieve element at index.
Expr MkSeqMap(Expr f, SeqExpr s)
Map function f over the sequence s.
FPSort MkFPSortSingle()
Create the single-precision (32-bit) FloatingPoint sort.
IntPtr UnwrapAST(AST a)
Unwraps an AST.
IntExpr MkMod(IntExpr t1, IntExpr t2)
Create an expression representing t1 mod t2.
BoolExpr MkPBLe(int[] coeffs, BoolExpr[] args, int k)
Create a pseudo-Boolean less-or-equal constraint.
IntNum MkInt(string v)
Create an integer numeral.
Expr MkConst(FuncDecl f)
Creates a fresh constant from the FuncDecl f .
FPRMNum MkFPRTZ()
Create a numeral of RoundingMode sort which represents the RoundTowardZero rounding mode.
Tactic TryFor(Tactic t, uint ms)
Create a tactic that applies t to a goal for ms milliseconds.
BoolExpr MkImplies(BoolExpr t1, BoolExpr t2)
Create an expression representing t1 -> t2.
BoolExpr MkBVSubNoUnderflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
Create a predicate that checks that the bit-wise subtraction does not underflow.
Expr MkSelect(ArrayExpr a, Expr i)
Array read.
ArrayExpr MkSetUnion(params ArrayExpr[] args)
Take the union of a list of sets.
IntExpr MkIndexOf(SeqExpr s, SeqExpr substr, ArithExpr offset)
Extract index of sub-string starting at offset.
Expr MkFiniteSetDifference(Expr s1, Expr s2)
Create the difference of two finite sets.
BoolExpr MkBoolConst(string name)
Create a Boolean constant.
Expr MkApp(FuncDecl f, params Expr[] args)
Create a new function application.
BitVecExpr MkBVSMod(BitVecExpr t1, BitVecExpr t2)
Two's complement signed remainder (sign follows divisor).
Probe Or(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value p1 or p2 evaluate to "true".
BitVecExpr MkRepeat(uint i, BitVecExpr t)
Bit-vector repetition.
BoolExpr MkDistinct(IEnumerable< Expr > args)
Creates a distinct term.
FuncDecl MkFuncDecl(Symbol name, Sort domain, Sort range)
Creates a new function declaration.
BoolExpr MkFPGt(FPExpr t1, FPExpr t2)
Floating-point greater than.
BoolExpr MkAtMost(IEnumerable< BoolExpr > args, uint k)
Create an at-most-k constraint.
Tactic ParAndThen(Tactic t1, Tactic t2)
Create a tactic that applies t1 to a given goal and then t2 to every subgoal produced by t1 ....
Solver MkSolver(string logic)
Creates a new (incremental) solver.
Quantifier MkQuantifier(bool universal, Expr[] boundConstants, Expr body, uint weight=1, Pattern[] patterns=null, Expr[] noPatterns=null, Symbol quantifierID=null, Symbol skolemID=null)
Create a Quantifier.
ArrayExpr MkSetDel(ArrayExpr set, Expr element)
Remove an element from a set.
Expr MkUpdateField(FuncDecl field, Expr t, Expr v)
Update a datatype field at expression t with value v. The function performs a record update at t....
Probe Lt(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value returned by p1 is less than the value returne...
ReExpr MkRange(SeqExpr lo, SeqExpr hi)
Create a range expression.
BitVecNum MkBV(long v, uint size)
Create a bit-vector numeral.
Expr QeModelProjectSkolem(Model model, Expr[] bounds, Expr body, ASTMap map)
Projects bound applications and records Skolem terms in map .
BoolExpr MkBVSGT(BitVecExpr t1, BitVecExpr t2)
Two's complement signed greater-than.
Params MkParams()
Creates a new ParameterSet.
ArrayExpr MkSetIntersection(params ArrayExpr[] args)
Take the intersection of a list of sets.
FPNum MkFPNaN(FPSort s)
Create a NaN of sort s.
FPNum MkFP(bool sgn, Int64 exp, UInt64 sig, FPSort s)
Create a numeral of FloatingPoint sort from a sign bit and two 64-bit integers.
BoolExpr[] ParseSMTLIB2String(string str, Symbol[] sortNames=null, Sort[] sorts=null, Symbol[] declNames=null, FuncDecl[] decls=null)
Parse the given string using the SMT-LIB2 parser.
BitVecExpr MkBVNOR(BitVecExpr t1, BitVecExpr t2)
Bitwise NOR.
IntExpr CharToInt(Expr ch)
Create an integer (code point) from character.
BoolExpr MkDistinct(params Expr[] args)
Creates a distinct term.
FPExpr MkFPRoundToIntegral(FPRMExpr rm, FPExpr t)
Floating-point roundToIntegral. Rounds a floating-point number to the closest integer,...
Fixedpoint MkFixedpoint()
Create a Fixedpoint context.
Expr MkSeqMapi(Expr f, Expr i, SeqExpr s)
Map function f over the sequence s at index i.
void UpdateParamValue(string id, string value)
Update a mutable configuration parameter.
DatatypeSort MkDatatypeSort(Symbol name, Constructor[] constructors)
Create a new datatype sort.
Expr QeModelProjectWithWitness(Model model, Expr[] bounds, Expr body, ASTMap map)
Projects bound applications and records witnesses in map .
void AddRecDef(FuncDecl f, Expr[] args, Expr body)
Bind a definition to a recursive function declaration. The function must have previously been created...
FPNum MkFPNumeral(float v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
ArrayExpr MkConstArray(Sort domain, Expr v)
Create a constant array.
ArrayExpr MkSetComplement(ArrayExpr arg)
Take the complement of a set.
ASTMap MkASTMap()
Creates an empty map from ASTs to ASTs.
BoolExpr MkSetSubset(ArrayExpr arg1, ArrayExpr arg2)
Check for subsetness of sets.
Probe Eq(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value returned by p1 is equal to the value returned...
FPRMNum MkFPRoundNearestTiesToAway()
Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode.
string[] ProbeNames
The names of all supported Probes.
Tactic AndThen(Tactic t1, Tactic t2, params Tactic[] ts)
Create a tactic that applies t1 to a Goal and then t2 to every subgoal produced by t1 .
BitVecExpr MkZeroExt(uint i, BitVecExpr t)
Bit-vector zero extension.
Z3_ast_print_mode PrintMode
Selects the format used for pretty-printing expressions.
void Dispose()
Disposes of the context.
BitVecExpr CharToBV(Expr ch)
Create a bit-vector (code point) from character.
SeqExpr SbvToString(Expr e)
Convert a bit-vector expression, represented as an signed number, to a string.
ArithExpr MkMul(IEnumerable< ArithExpr > ts)
Create an expression representing t[0] * t[1] * ....
ArrayExpr MkEmptySet(Sort domain)
Create an empty set.
Quantifier MkExists(Sort[] sorts, Symbol[] names, Expr body, uint weight=1, Pattern[] patterns=null, Expr[] noPatterns=null, Symbol quantifierID=null, Symbol skolemID=null)
Create an existential Quantifier.
UninterpretedSort MkUninterpretedSort(string str)
Create a new uninterpreted sort.
Expr MkNumeral(ulong v, Sort ty)
Create a Term of a given sort. This function can be used to create numerals that fit in a machine int...
ReExpr MkStar(ReExpr re)
Take the Kleene star of a regular expression.
BitVecExpr MkBVConst(string name, uint size)
Creates a bit-vector constant.
BitVecNum MkBV(uint v, uint size)
Create a bit-vector numeral.
Optimize MkOptimize()
Create an Optimization context.
Expr MkFiniteSetFilter(Expr f, Expr set)
Filter a finite set with a predicate.
Quantifier MkQuantifier(bool universal, Sort[] sorts, Symbol[] names, Expr body, uint weight=1, Pattern[] patterns=null, Expr[] noPatterns=null, Symbol quantifierID=null, Symbol skolemID=null)
Create a Quantifier.
Expr CharFromBV(BitVecExpr bv)
Create a character from a bit-vector (code point).
Expr MkArrayExt(ArrayExpr arg1, ArrayExpr arg2)
Create Extentionality index. Two arrays are equal if and only if they are equal on the index returned...
CharSort CharSort
Retrieves the String sort of the context.
FPNum MkFPInf(FPSort s, bool negative)
Create a floating-point infinity of sort s.
FuncDecl MkConstDecl(string name, Sort range)
Creates a new constant function declaration.
ArrayExpr MkMap(FuncDecl f, params ArrayExpr[] args)
Maps f on the argument arrays.
ReExpr MkIntersect(params ReExpr[] t)
Create the intersection of regular languages.
Tactic Repeat(Tactic t, uint max=uint.MaxValue)
Create a tactic that keeps applying t until the goal is not modified anymore or the maximum number o...
BoolExpr MkBVSLE(BitVecExpr t1, BitVecExpr t2)
Two's complement signed less-than or equal to.
FPNum MkFP(int v, FPSort s)
Create a numeral of FloatingPoint sort from an int.
uint NumSimplifiers
The number of supported simplifiers.
BoolExpr MkLt(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 < t2
FPNum MkFP(bool sgn, int exp, uint sig, FPSort s)
Create a numeral of FloatingPoint sort from a sign bit and two integers.
ListSort MkListSort(Symbol name, Sort elemSort)
Create a new list sort.
SeqExpr MkAt(SeqExpr s, Expr index)
Retrieve sequence of length one at index.
FPExpr MkFPToFP(FPSort s, FPRMExpr rm, FPExpr t)
Conversion of a floating-point number to another FloatingPoint sort s.
BoolExpr MkSetMembership(Expr elem, ArrayExpr set)
Check for set membership.
BitVecExpr MkBVRotateRight(BitVecExpr t1, BitVecExpr t2)
Rotate Right.
SeqExpr MkReplace(SeqExpr s, SeqExpr src, SeqExpr dst)
Replace the first occurrence of src by dst in s.
FPRMExpr MkFPRoundNearestTiesToEven()
Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
string ProbeDescription(string name)
Returns a string containing a description of the probe with the given name.
Pattern MkPattern(params Expr[] terms)
Create a quantifier pattern.
Probe And(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value p1 and p2 evaluate to "true".
Probe Le(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value returned by p1 is less than or equal the valu...
Expr QeModelProject(Model model, Expr[] bounds, Expr body)
Projects the bound applications from body using model .
FPExpr MkFPNeg(FPExpr t)
Floating-point negation.
FPSort MkFPSort32()
Create the single-precision (32-bit) FloatingPoint sort.
Expr MkConst(Symbol name, Sort range)
Creates a new Constant of sort range and named name .
BoolExpr MkAnd(params BoolExpr[] ts)
Create an expression representing t[0] and t[1] and ....
RealSort RealSort
Retrieves the Real sort of the context.
BoolExpr MkIsInteger(RealExpr t)
Creates an expression that checks whether a real number is an integer.
BitVecExpr MkBVXNOR(BitVecExpr t1, BitVecExpr t2)
Bitwise XNOR.
BoolExpr MkBVULE(BitVecExpr t1, BitVecExpr t2)
Unsigned less-than or equal to.
BoolExpr MkGe(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 >= t2
ASTVector PolynomialSubresultants(Expr p, Expr q, Expr x)
Return the nonzero subresultants of p and q with respect to the "variable" x.
FPNum MkFPNumeral(bool sgn, Int64 exp, UInt64 sig, FPSort s)
Create a numeral of FloatingPoint sort from a sign bit and two 64-bit integers.
BitVecExpr MkFPToBV(FPRMExpr rm, FPExpr t, uint sz, bool sign)
Conversion of a floating-point term into a bit-vector.
BoolExpr MkBVAddNoUnderflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise addition does not underflow.
BitVecNum MkBV(string v, uint size)
Create a bit-vector numeral.
ReExpr MkFullRe(Sort s)
Create the full regular expression. The sort s should be a regular expression.
Expr MkSeqFoldLeft(Expr f, Expr a, SeqExpr s)
Fold left the function f over the sequence s with initial value a.
BoolExpr MkFPIsSubnormal(FPExpr t)
Predicate indicating whether t is a subnormal floating-point number.
ArrayExpr MkArrayConst(Symbol name, Sort domain, Sort range)
Create an array constant.
BoolExpr MkFPIsZero(FPExpr t)
Predicate indicating whether t is a floating-point number with zero value, i.e., +0 or -0.
ReSort MkReSort(SeqSort s)
Create a new regular expression sort.
FPSort MkFPSortDouble()
Create the double-precision (64-bit) FloatingPoint sort.
string SimplifierDescription(string name)
Returns a string containing a description of the simplifier with the given name.
FPRMNum MkFPRoundTowardZero()
Create a numeral of RoundingMode sort which represents the RoundTowardZero rounding mode.
ArithExpr MkSub(params ArithExpr[] ts)
Create an expression representing t[0] - t[1] - ....
Goal MkGoal(bool models=true, bool unsatCores=false, bool proofs=false)
Creates a new Goal.
IntExpr MkBV2Int(BitVecExpr t, bool signed)
Create an integer from the bit-vector argument t .
BoolExpr MkInRe(SeqExpr s, ReExpr re)
Check for regular expression membership.
ArrayExpr MkSetAdd(ArrayExpr set, Expr element)
Add an element to the set.
BitVecExpr MkBVRedAND(BitVecExpr t)
Take conjunction of bits in a vector, return vector of length 1.
Probe Ge(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value returned by p1 is greater than or equal the v...
DatatypeSort MkDatatypeSortRef(string name, Sort[] parameters=null)
Create a forward reference to a datatype sort. This is useful for creating recursive datatypes or par...
ReExpr MkLoop(ReExpr re, uint lo, uint hi=0)
Take the bounded Kleene star of a regular expression.
FPRMNum MkFPRoundTowardNegative()
Create a numeral of RoundingMode sort which represents the RoundTowardNegative rounding mode.
Probe MkProbe(string name)
Creates a new Probe.
Expr MkFiniteSetRange(Expr low, Expr high)
Create a finite set containing integers in the range [low, high].
FPNum MkFPNumeral(bool sgn, uint sig, int exp, FPSort s)
Create a numeral of FloatingPoint sort from a sign bit and two integers.
SeqSort MkSeqSort(Sort s)
Create a new sequence sort.
Sort MkTypeVariable(Symbol name)
Create a type variable sort for use as a parameter in polymorphic datatypes.
DatatypeSort[] MkDatatypeSorts(string[] names, Constructor[][] c)
Create mutually recursive data-types.
Tactic FailIf(Probe p)
Create a tactic that fails if the probe p evaluates to false.
Expr MkBound(uint index, Sort ty)
Creates a new bound variable.
FPRMNum MkFPRTN()
Create a numeral of RoundingMode sort which represents the RoundTowardNegative rounding mode.
FPSort MkFPSort128()
Create the quadruple-precision (128-bit) FloatingPoint sort.
BoolExpr MkBVUGE(BitVecExpr t1, BitVecExpr t2)
Unsigned greater than or equal to.
Expr MkNumeral(int v, Sort ty)
Create a Term of a given sort. This function can be used to create numerals that fit in a machine int...
FPRMNum MkFPRTP()
Create a numeral of RoundingMode sort which represents the RoundTowardPositive rounding mode.
BoolSort MkBoolSort()
Create a new Boolean sort.
BoolExpr MkFiniteSetMember(Expr elem, Expr set)
Check for membership in a finite set.
BitVecExpr MkConcat(BitVecExpr t1, BitVecExpr t2)
Bit-vector concatenation.
ArithExpr MkPower(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 ^ t2.
SeqExpr MkEmptySeq(Sort s)
Create the empty sequence.
Expr MkFiniteSetSize(Expr set)
Get the cardinality of a finite set.
BitVecExpr MkBVNot(BitVecExpr t)
Bitwise negation.
FPExpr MkFPRem(FPExpr t1, FPExpr t2)
Floating-point remainder.
RealSort MkRealSort()
Create a real sort.
BoolExpr MkBVAddNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
Create a predicate that checks that the bit-wise addition does not overflow.
ArithExpr MkDiv(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 / t2.
Expr MkSelect(ArrayExpr a, params Expr[] args)
Array read.
FPNum MkFPNumeral(int v, FPSort s)
Create a numeral of FloatingPoint sort from an int.
BoolExpr[] ParseSMTLIB2File(string fileName, Symbol[] sortNames=null, Sort[] sorts=null, Symbol[] declNames=null, FuncDecl[] decls=null)
Parse the given file using the SMT-LIB2 parser.
BoolExpr MkFPLt(FPExpr t1, FPExpr t2)
Floating-point less than.
Simplifier MkSimplifier(string name)
Creates a new Tactic.
BoolExpr MkFPGEq(FPExpr t1, FPExpr t2)
Floating-point greater than or equal.
BitVecExpr MkSignExt(uint i, BitVecExpr t)
Bit-vector sign extension.
Tactic ParOr(params Tactic[] t)
Create a tactic that applies the given tactics in parallel until one of them succeeds (i....
IntSort MkIntSort()
Create a new integer sort.
BoolExpr MkFiniteSetSubset(Expr s1, Expr s2)
Check if one finite set is a subset of another.
BoolExpr MkAnd(IEnumerable< BoolExpr > t)
Create an expression representing t[0] and t[1] and ....
BitVecExpr MkBVMul(BitVecExpr t1, BitVecExpr t2)
Two's complement multiplication.
IntExpr StringToInt(Expr e)
Convert an integer expression to a string.
BoolExpr MkBVSDivNoOverflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise signed division does not overflow.
BoolExpr MkContains(SeqExpr s1, SeqExpr s2)
Check for sequence containment of s2 in s1.
Tactic OrElse(Tactic t1, Tactic t2)
Create a tactic that first applies t1 to a Goal and if it fails then returns the result of t2 appli...
SeqSort StringSort
Retrieves the String sort of the context.
BoolExpr MkEq(Expr x, Expr y)
Creates the equality x = y .
Tactic Cond(Probe p, Tactic t1, Tactic t2)
Create a tactic that applies t1 to a given goal if the probe p evaluates to true and t2 otherwise.
BitVecExpr MkBVSub(BitVecExpr t1, BitVecExpr t2)
Two's complement subtraction.
BitVecExpr MkBVUDiv(BitVecExpr t1, BitVecExpr t2)
Unsigned division.
void Interrupt()
Interrupt the execution of a Z3 procedure.
BoolExpr MkBVUGT(BitVecExpr t1, BitVecExpr t2)
Unsigned greater-than.
ArraySort MkArraySort(Sort domain, Sort range)
Create a new array sort.
BitVecExpr MkBVConst(Symbol name, uint size)
Creates a bit-vector constant.
BitVecExpr MkBVASHR(BitVecExpr t1, BitVecExpr t2)
Arithmetic shift right.
Tactic Then(Tactic t1, Tactic t2, params Tactic[] ts)
Create a tactic that applies t1 to a Goal and then t2 to every subgoal produced by t1 .
FPNum MkFPZero(FPSort s, bool negative)
Create a floating-point zero of sort s.
BoolExpr MkPBGe(int[] coeffs, BoolExpr[] args, int k)
Create a pseudo-Boolean greater-or-equal constraint.
IntNum MkInt(long v)
Create an integer numeral.
RatNum MkReal(long v)
Create a real numeral.
ReExpr MkPlus(ReExpr re)
Take the Kleene plus of a regular expression.
FPExpr MkFPSqrt(FPRMExpr rm, FPExpr t)
Floating-point square root.
BoolExpr MkIff(BoolExpr t1, BoolExpr t2)
Create an expression representing t1 iff t2.
FiniteDomainSort MkFiniteDomainSort(string name, ulong size)
Create a new finite domain sort. The result is a sortElements of the sort are created using MkNumeral...
Expr MkNumeral(string v, Sort ty)
Create a Term of a given sort.
FuncDecl MkRecFuncDecl(string name, Sort[] domain, Sort range)
Creates a new recursive function declaration.
BitVecExpr MkBVAdd(BitVecExpr t1, BitVecExpr t2)
Two's complement addition.
BoolExpr MkGt(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 > t2
Solver MkSimpleSolver()
Creates a new (incremental) solver.
ArraySort MkArraySort(Sort[] domain, Sort range)
Create a new n-ary array sort.
DatatypeSort MkDatatypeSortRef(Symbol name, Sort[] parameters=null)
Create a forward reference to a datatype sort. This is useful for creating recursive datatypes or par...
Probe Not(Probe p)
Create a probe that evaluates to "true" when the value p does not evaluate to "true".
BoolExpr MkBool(bool value)
Creates a Boolean value.
BitVecExpr MkBVAND(BitVecExpr t1, BitVecExpr t2)
Bitwise conjunction.
Solver MkSolver(Tactic t)
Creates a solver that is implemented using the given tactic.
RealExpr MkRealConst(Symbol name)
Creates a real constant.
IntNum MkInt(ulong v)
Create an integer numeral.
Expr MkApp(FuncDecl f, IEnumerable< Expr > args)
Create a new function application.
ReExpr MkToRe(SeqExpr s)
Convert a regular expression that accepts sequence s.
BoolExpr MkFPIsNaN(FPExpr t)
Predicate indicating whether t is a NaN.
BitVecExpr MkBVRotateRight(uint i, BitVecExpr t)
Rotate Right.
string SimplifyHelp()
Return a string describing all available parameters to Expr.Simplify.
Quantifier MkExists(Expr[] boundConstants, Expr body, uint weight=1, Pattern[] patterns=null, Expr[] noPatterns=null, Symbol quantifierID=null, Symbol skolemID=null)
Create an existential Quantifier.
Lambda MkLambda(Sort[] sorts, Symbol[] names, Expr body)
Create a lambda expression.
FuncDecl MkFuncDecl(Symbol name, Sort[] domain, Sort range)
Creates a new function declaration.
BoolExpr MkBVSLT(BitVecExpr t1, BitVecExpr t2)
Two's complement signed less-than.
SetSort MkSetSort(Sort ty)
Create a set type.
EnumSort MkEnumSort(string name, params string[] enumNames)
Create a new enumeration sort.
Simplifier AndThen(Simplifier t1, Simplifier t2, params Simplifier[] ts)
Create a simplifier that applies t1 and then t2 .
Sort MkTypeVariable(string name)
Create a type variable sort for use as a parameter in polymorphic datatypes.
BitVecNum MkBV(int v, uint size)
Create a bit-vector numeral.
RatNum MkReal(int num, int den)
Create a real from a fraction.
EnumSort MkEnumSort(Symbol name, params Symbol[] enumNames)
Create a new enumeration sort.
Solver MkSolver(Solver s, Simplifier t)
Creates a solver that uses an incremental simplifier.
BoolExpr MkFPIsNegative(FPExpr t)
Predicate indicating whether t is a negative floating-point number.
FuncDecl MkFreshFuncDecl(string prefix, Sort[] domain, Sort range)
Creates a fresh function declaration with a name prefixed with prefix .
IntExpr MkIntConst(string name)
Creates an integer constant.
Tactic When(Probe p, Tactic t)
Create a tactic that applies t to a given goal if the probe p evaluates to true.
BitVecExpr MkBVNeg(BitVecExpr t)
Standard two's complement unary minus.
FuncDecl MkFreshConstDecl(string prefix, Sort range)
Creates a fresh constant function declaration with a name prefixed with prefix .
Tactic Fail()
Create a tactic always fails.
Tactic FailIfNotDecided()
Create a tactic that fails if the goal is not trivially satisfiable (i.e., empty) or trivially unsati...
FPRMNum MkFPRoundTowardPositive()
Create a numeral of RoundingMode sort which represents the RoundTowardPositive rounding mode.
BitVecExpr MkBVOR(BitVecExpr t1, BitVecExpr t2)
Bitwise disjunction.
Expr MkConst(string name, Sort range)
Creates a new Constant of sort range and named name .
IntExpr MkRem(IntExpr t1, IntExpr t2)
Create an expression representing t1 rem t2.
FPExpr MkFPMul(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point multiplication.
BoolExpr MkStringLt(SeqExpr s1, SeqExpr s2)
Check if the string s1 is lexicographically strictly less than s2.
BoolExpr MkBVSubNoOverflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise subtraction does not overflow.
BitVecExpr MkFPToFP(FPRMExpr rm, IntExpr exp, RealExpr sig, FPSort s)
Conversion of a real-sorted significand and an integer-sorted exponent into a term of FloatingPoint s...
DatatypeSort MkPolymorphicDatatypeSort(string name, Sort[] typeParams, Constructor[] constructors)
Create a polymorphic datatype sort with explicit type parameters. Type parameters should be sorts cre...
FPSort MkFPSort64()
Create the double-precision (64-bit) FloatingPoint sort.
BoolExpr MkOr(IEnumerable< BoolExpr > ts)
Create an expression representing t[0] or t[1] or ....
bool IsFiniteSetSort(Sort s)
Check if a sort is a finite set sort.
FPRMNum MkFPRNA()
Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode.
Context(Dictionary< string, string > settings)
Constructor.
BitVecExpr MkBVRotateLeft(uint i, BitVecExpr t)
Rotate Left.
string TacticDescription(string name)
Returns a string containing a description of the tactic with the given name.
FPRMNum MkFPRNE()
Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
SeqExpr MkUnit(Expr elem)
Create the singleton sequence.
uint NumProbes
The number of supported Probes.
Sort GetFiniteSetSortBasis(Sort s)
Get the element sort (basis) of a finite set sort.
BoolExpr MkPBEq(int[] coeffs, BoolExpr[] args, int k)
Create a pseudo-Boolean equal constraint.
IntNum MkInt(int v)
Create an integer numeral.
BitVecExpr MkBVXOR(BitVecExpr t1, BitVecExpr t2)
Bitwise XOR.
ArrayExpr MkStore(ArrayExpr a, Expr[] args, Expr v)
Array update.
Solver MkSolver(Symbol logic=null)
Creates a new (incremental) solver.
FPExpr MkFPAbs(FPExpr t)
Floating-point absolute value.
FPExpr MkFPMin(FPExpr t1, FPExpr t2)
Minimum of floating-point numbers.
FPExpr MkFPDiv(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point division.
ReExpr MkComplement(ReExpr re)
Create the complement regular expression.
BitVecExpr MkExtract(uint high, uint low, BitVecExpr t)
Bit-vector extraction.
StringSymbol MkSymbol(string name)
Create a symbol using a string.
BitVecExpr MkBVURem(BitVecExpr t1, BitVecExpr t2)
Unsigned remainder.
BoolExpr MkFalse()
The false Term.
IntExpr MkLength(SeqExpr s)
Retrieve the length of a given sequence.
RatNum MkReal(int v)
Create a real numeral.
IntSymbol MkSymbol(int i)
Creates a new symbol using an integer.
SeqExpr MkString(string s)
Create a string constant.
ArrayExpr MkStore(ArrayExpr a, Expr i, Expr v)
Array update.
Expr MkFiniteSetIntersect(Expr s1, Expr s2)
Create the intersection of two finite sets.
FPExpr MkFP(BitVecExpr sgn, BitVecExpr sig, BitVecExpr exp)
Create an expression of FloatingPoint sort from three bit-vector expressions.
Expr MkSeqFoldLeftI(Expr f, Expr i, Expr a, SeqExpr s)
Fold left with index the function f over the sequence s with initial value a starting at index i.
ArithExpr MkMul(params ArithExpr[] ts)
Create an expression representing t[0] * t[1] * ....
BoolExpr MkBVSGE(BitVecExpr t1, BitVecExpr t2)
Two's complement signed greater than or equal to.
Quantifier MkForall(Sort[] sorts, Symbol[] names, Expr body, uint weight=1, Pattern[] patterns=null, Expr[] noPatterns=null, Symbol quantifierID=null, Symbol skolemID=null)
Create a universal Quantifier.
FPNum MkFP(double v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
BoolExpr MkFPIsNormal(FPExpr t)
Predicate indicating whether t is a normal floating-point number.
BoolExpr MkPrefixOf(SeqExpr s1, SeqExpr s2)
Check for sequence prefix.
BoolExpr MkFPIsPositive(FPExpr t)
Predicate indicating whether t is a positive floating-point number.
FloatingPoint Expressions.
FloatingPoint RoundingMode Expressions.
Floating-point rounding mode numerals.
The FloatingPoint RoundingMode sort.
Object for managing fixedpoints.
A goal (aka problem). A goal is essentially a set of formulas, that can be solved and/or transformed ...
A Model contains interpretations (assignments) of constants and functions.
Object for managing optimization context.
A ParamDescrs describes a set of parameters.
A Params objects represents a configuration in the form of Symbol/value pairs.
Patterns comprise a list of terms. The list should be non-empty. If the list comprises of more than o...
Probes are used to inspect a goal (aka problem) and collect information that may be used to decide wh...
Regular expression expressions.
A regular expression sort.
Simplifiers are the basic building block for creating custom solvers with incremental pre-processing....
void Assert(params BoolExpr[] constraints)
Assert a constraint (or multiple) into the solver.
The Sort class implements type information for ASTs.
Symbols are used to name several term and type constructors.
Tactics are the basic building block for creating custom solvers for specific problem domains....
The exception base class for error reporting from Z3.
Internal base class for interfacing with native Z3 objects. Should not be used externally.
Z3_ast_print_mode
Z3 pretty printing modes (See Z3_set_ast_print_mode).
Z3_error_code
Z3 error codes (See Z3_get_error_code).