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);
4051 get {
return Native.Z3_get_num_simplifiers(nCtx); }
4063 string[] res =
new string[n];
4064 for (uint i = 0; i < n; i++)
4065 res[i] = Native.Z3_get_simplifier_name(nCtx, i);
4076 return Native.Z3_simplifier_get_descr(nCtx, name);
4094 Debug.Assert(t1 !=
null);
4095 Debug.Assert(t2 !=
null);
4099 CheckContextMatch(t1);
4100 CheckContextMatch(t2);
4101 CheckContextMatch<Simplifier>(ts);
4103 IntPtr last = IntPtr.Zero;
4104 if (ts !=
null && ts.Length > 0)
4106 last = ts[ts.Length - 1].NativeObject;
4107 for (
int i = ts.Length - 2; i >= 0; i--)
4108 last = Native.Z3_simplifier_and_then(nCtx, ts[i].NativeObject, last);
4110 if (last != IntPtr.Zero)
4112 last = Native.Z3_simplifier_and_then(nCtx, t2.NativeObject, last);
4113 return new Simplifier(
this, Native.Z3_simplifier_and_then(nCtx, t1.NativeObject, last));
4116 return new Simplifier(
this, Native.Z3_simplifier_and_then(nCtx, t1.NativeObject, t2.NativeObject));
4128 Debug.Assert(t1 !=
null);
4129 Debug.Assert(t2 !=
null);
4140 Debug.Assert(t !=
null);
4141 Debug.Assert(p !=
null);
4143 CheckContextMatch(t);
4144 CheckContextMatch(p);
4145 return new Simplifier(
this, Native.Z3_simplifier_using_params(nCtx, t.NativeObject, p.NativeObject));
4155 get {
return Native.Z3_get_num_probes(nCtx); }
4167 string[] res =
new string[n];
4168 for (uint i = 0; i < n; i++)
4169 res[i] = Native.Z3_get_probe_name(nCtx, i);
4180 return Native.Z3_probe_get_descr(nCtx, name);
4189 return new Probe(
this, name);
4198 return new Probe(
this, Native.Z3_probe_const(nCtx, val));
4207 Debug.Assert(p1 !=
null);
4208 Debug.Assert(p2 !=
null);
4210 CheckContextMatch(p1);
4211 CheckContextMatch(p2);
4212 return new Probe(
this, Native.Z3_probe_lt(nCtx, p1.NativeObject, p2.NativeObject));
4221 Debug.Assert(p1 !=
null);
4222 Debug.Assert(p2 !=
null);
4224 CheckContextMatch(p1);
4225 CheckContextMatch(p2);
4226 return new Probe(
this, Native.Z3_probe_gt(nCtx, p1.NativeObject, p2.NativeObject));
4235 Debug.Assert(p1 !=
null);
4236 Debug.Assert(p2 !=
null);
4238 CheckContextMatch(p1);
4239 CheckContextMatch(p2);
4240 return new Probe(
this, Native.Z3_probe_le(nCtx, p1.NativeObject, p2.NativeObject));
4249 Debug.Assert(p1 !=
null);
4250 Debug.Assert(p2 !=
null);
4252 CheckContextMatch(p1);
4253 CheckContextMatch(p2);
4254 return new Probe(
this, Native.Z3_probe_ge(nCtx, p1.NativeObject, p2.NativeObject));
4263 Debug.Assert(p1 !=
null);
4264 Debug.Assert(p2 !=
null);
4266 CheckContextMatch(p1);
4267 CheckContextMatch(p2);
4268 return new Probe(
this, Native.Z3_probe_eq(nCtx, p1.NativeObject, p2.NativeObject));
4277 Debug.Assert(p1 !=
null);
4278 Debug.Assert(p2 !=
null);
4280 CheckContextMatch(p1);
4281 CheckContextMatch(p2);
4282 return new Probe(
this, Native.Z3_probe_and(nCtx, p1.NativeObject, p2.NativeObject));
4291 Debug.Assert(p1 !=
null);
4292 Debug.Assert(p2 !=
null);
4294 CheckContextMatch(p1);
4295 CheckContextMatch(p2);
4296 return new Probe(
this, Native.Z3_probe_or(nCtx, p1.NativeObject, p2.NativeObject));
4305 Debug.Assert(p !=
null);
4307 CheckContextMatch(p);
4308 return new Probe(
this, Native.Z3_probe_not(nCtx, p.NativeObject));
4325 return new Solver(
this, Native.Z3_mk_solver(nCtx));
4327 return new Solver(
this, Native.Z3_mk_solver_for_logic(nCtx, logic.NativeObject));
4336 using var symbol =
MkSymbol(logic);
4346 return new Solver(
this, Native.Z3_mk_simple_solver(nCtx));
4355 Debug.Assert(s !=
null);
4356 return new Solver(
this, Native.Z3_solver_add_simplifier(nCtx, s.NativeObject, t.NativeObject));
4370 return new Solver(
this, Native.Z3_mk_solver_from_tactic(nCtx, t.NativeObject));
4387 #region Optimization
4398 #region Floating-Point Arithmetic
4400 #region Rounding Modes
4401 #region RoundingMode Sort
4417 return new FPRMExpr(
this, Native.Z3_mk_fpa_round_nearest_ties_to_even(nCtx));
4425 return new FPRMNum(
this, Native.Z3_mk_fpa_rne(nCtx));
4433 return new FPRMNum(
this, Native.Z3_mk_fpa_round_nearest_ties_to_away(nCtx));
4441 return new FPRMNum(
this, Native.Z3_mk_fpa_rna(nCtx));
4449 return new FPRMNum(
this, Native.Z3_mk_fpa_round_toward_positive(nCtx));
4457 return new FPRMNum(
this, Native.Z3_mk_fpa_rtp(nCtx));
4465 return new FPRMNum(
this, Native.Z3_mk_fpa_round_toward_negative(nCtx));
4473 return new FPRMNum(
this, Native.Z3_mk_fpa_rtn(nCtx));
4481 return new FPRMNum(
this, Native.Z3_mk_fpa_round_toward_zero(nCtx));
4489 return new FPRMNum(
this, Native.Z3_mk_fpa_rtz(nCtx));
4494 #region FloatingPoint Sorts
4502 return new FPSort(
this, ebits, sbits);
4510 return new FPSort(
this, Native.Z3_mk_fpa_sort_half(nCtx));
4518 return new FPSort(
this, Native.Z3_mk_fpa_sort_16(nCtx));
4526 return new FPSort(
this, Native.Z3_mk_fpa_sort_single(nCtx));
4534 return new FPSort(
this, Native.Z3_mk_fpa_sort_32(nCtx));
4542 return new FPSort(
this, Native.Z3_mk_fpa_sort_double(nCtx));
4550 return new FPSort(
this, Native.Z3_mk_fpa_sort_64(nCtx));
4558 return new FPSort(
this, Native.Z3_mk_fpa_sort_quadruple(nCtx));
4566 return new FPSort(
this, Native.Z3_mk_fpa_sort_128(nCtx));
4577 return new FPNum(
this, Native.Z3_mk_fpa_nan(nCtx, s.NativeObject));
4587 return new FPNum(
this, Native.Z3_mk_fpa_inf(nCtx, s.NativeObject, (
byte)(negative ? 1 : 0)));
4597 return new FPNum(
this, Native.Z3_mk_fpa_zero(nCtx, s.NativeObject, (
byte)(negative ? 1 : 0)));
4607 return new FPNum(
this, Native.Z3_mk_fpa_numeral_float(nCtx, v, s.NativeObject));
4617 return new FPNum(
this, Native.Z3_mk_fpa_numeral_double(nCtx, v, s.NativeObject));
4627 return new FPNum(
this, Native.Z3_mk_fpa_numeral_int(nCtx, v, s.NativeObject));
4639 return new FPNum(
this, Native.Z3_mk_fpa_numeral_int_uint(nCtx, (
byte)(sgn ? 1 : 0), exp, sig, s.NativeObject));
4651 return new FPNum(
this, Native.Z3_mk_fpa_numeral_int64_uint64(nCtx, (
byte)(sgn ? 1 : 0), exp, sig, s.NativeObject));
4717 return new FPExpr(
this, Native.Z3_mk_fpa_abs(
this.nCtx, t.NativeObject));
4726 return new FPExpr(
this, Native.Z3_mk_fpa_neg(
this.nCtx, t.NativeObject));
4737 return new FPExpr(
this, Native.Z3_mk_fpa_add(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4748 return new FPExpr(
this, Native.Z3_mk_fpa_sub(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4759 return new FPExpr(
this, Native.Z3_mk_fpa_mul(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4770 return new FPExpr(
this, Native.Z3_mk_fpa_div(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4785 return new FPExpr(
this, Native.Z3_mk_fpa_fma(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject, t3.NativeObject));
4795 return new FPExpr(
this, Native.Z3_mk_fpa_sqrt(
this.nCtx, rm.NativeObject, t.NativeObject));
4805 return new FPExpr(
this, Native.Z3_mk_fpa_rem(
this.nCtx, t1.NativeObject, t2.NativeObject));
4816 return new FPExpr(
this, Native.Z3_mk_fpa_round_to_integral(
this.nCtx, rm.NativeObject, t.NativeObject));
4826 return new FPExpr(
this, Native.Z3_mk_fpa_min(
this.nCtx, t1.NativeObject, t2.NativeObject));
4836 return new FPExpr(
this, Native.Z3_mk_fpa_max(
this.nCtx, t1.NativeObject, t2.NativeObject));
4846 return new BoolExpr(
this, Native.Z3_mk_fpa_leq(
this.nCtx, t1.NativeObject, t2.NativeObject));
4856 return new BoolExpr(
this, Native.Z3_mk_fpa_lt(
this.nCtx, t1.NativeObject, t2.NativeObject));
4866 return new BoolExpr(
this, Native.Z3_mk_fpa_geq(
this.nCtx, t1.NativeObject, t2.NativeObject));
4876 return new BoolExpr(
this, Native.Z3_mk_fpa_gt(
this.nCtx, t1.NativeObject, t2.NativeObject));
4889 return new BoolExpr(
this, Native.Z3_mk_fpa_eq(
this.nCtx, t1.NativeObject, t2.NativeObject));
4898 return new BoolExpr(
this, Native.Z3_mk_fpa_is_normal(
this.nCtx, t.NativeObject));
4907 return new BoolExpr(
this, Native.Z3_mk_fpa_is_subnormal(
this.nCtx, t.NativeObject));
4916 return new BoolExpr(
this, Native.Z3_mk_fpa_is_zero(
this.nCtx, t.NativeObject));
4925 return new BoolExpr(
this, Native.Z3_mk_fpa_is_infinite(
this.nCtx, t.NativeObject));
4934 return new BoolExpr(
this, Native.Z3_mk_fpa_is_nan(
this.nCtx, t.NativeObject));
4943 return new BoolExpr(
this, Native.Z3_mk_fpa_is_negative(
this.nCtx, t.NativeObject));
4952 return new BoolExpr(
this, Native.Z3_mk_fpa_is_positive(
this.nCtx, t.NativeObject));
4956 #region Conversions to FloatingPoint terms
4972 return new FPExpr(
this, Native.Z3_mk_fpa_fp(
this.nCtx, sgn.NativeObject, sig.NativeObject, exp.NativeObject));
4988 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_bv(
this.nCtx, bv.NativeObject, s.NativeObject));
5004 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_float(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5020 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_real(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5039 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_signed(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5041 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_unsigned(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5056 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_float(
this.nCtx, s.NativeObject, rm.NativeObject, t.NativeObject));
5060 #region Conversions from FloatingPoint terms
5076 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_sbv(
this.nCtx, rm.NativeObject, t.NativeObject, sz));
5078 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_ubv(
this.nCtx, rm.NativeObject, t.NativeObject, sz));
5092 return new RealExpr(
this, Native.Z3_mk_fpa_to_real(
this.nCtx, t.NativeObject));
5096 #region Z3-specific extensions
5109 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_ieee_bv(
this.nCtx, t.NativeObject));
5126 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_fp_int_real(
this.nCtx, rm.NativeObject, exp.NativeObject, sig.NativeObject, s.NativeObject));
5131 #region Miscellaneous
5144 return AST.Create(
this, nativeObject);
5160 return a.NativeObject;
5170 return new FuncDecl(
this, Native.Z3_mk_partial_order(
this.nCtx, a.NativeObject, index));
5180 return new FuncDecl(
this, Native.Z3_mk_transitive_closure(
this.nCtx, f.NativeObject));
5195 CheckContextMatch(p);
5196 CheckContextMatch(q);
5197 CheckContextMatch(x);
5198 return new ASTVector(
this, Native.Z3_polynomial_subresultants(
this.nCtx, p.NativeObject, q.NativeObject, x.NativeObject));
5207 return Native.Z3_simplify_get_help(nCtx);
5215 get {
return new ParamDescrs(
this, Native.Z3_simplify_get_param_descrs(nCtx)); }
5219 #region Error Handling
5247 Native.Z3_update_param_value(nCtx,
id, value);
5253 internal IntPtr m_ctx = IntPtr.Zero;
5254 internal Native.Z3_error_handler m_n_err_handler =
null;
5255 internal static Object creation_lock =
new Object();
5256 internal IntPtr nCtx {
get {
return m_ctx; } }
5261 private const long NativeMemoryPressureEstimate = 8 * 1024 * 1024;
5262 private bool m_memPressureAdded =
false;
5264 internal void NativeErrorHandler(IntPtr ctx,
Z3_error_code errorCode)
5269 internal void InitContext()
5272 m_n_err_handler =
new Native.Z3_error_handler(NativeErrorHandler);
5273 Native.Z3_set_error_handler(m_ctx, m_n_err_handler);
5276 GC.AddMemoryPressure(NativeMemoryPressureEstimate);
5277 m_memPressureAdded =
true;
5281 internal void CheckContextMatch(Z3Object other)
5283 Debug.Assert(other !=
null);
5285 if (!ReferenceEquals(
this, other.Context))
5286 throw new Z3Exception(
"Context mismatch");
5289 internal void CheckContextMatch(Z3Object other1, Z3Object other2)
5291 Debug.Assert(other1 !=
null);
5292 Debug.Assert(other2 !=
null);
5293 CheckContextMatch(other1);
5294 CheckContextMatch(other2);
5297 internal void CheckContextMatch(Z3Object other1, Z3Object other2, Z3Object other3)
5299 Debug.Assert(other1 !=
null);
5300 Debug.Assert(other2 !=
null);
5301 Debug.Assert(other3 !=
null);
5302 CheckContextMatch(other1);
5303 CheckContextMatch(other2);
5304 CheckContextMatch(other3);
5307 internal void CheckContextMatch(Z3Object[] arr)
5309 Debug.Assert(arr ==
null || arr.All(a => a !=
null));
5313 foreach (Z3Object a
in arr)
5315 Debug.Assert(a !=
null);
5316 CheckContextMatch(a);
5321 internal void CheckContextMatch<T>(IEnumerable<T> arr) where T : Z3Object
5323 Debug.Assert(arr ==
null || arr.All(a => a !=
null));
5327 foreach (Z3Object a
in arr)
5329 Debug.Assert(a !=
null);
5330 CheckContextMatch(a);
5335 private void ObjectInvariant()
5356 if (m_boolSort !=
null) m_boolSort.Dispose();
5357 if (m_intSort !=
null) m_intSort.Dispose();
5358 if (m_realSort !=
null) m_realSort.Dispose();
5359 if (m_stringSort !=
null) m_stringSort.Dispose();
5360 if (m_charSort !=
null) m_charSort.Dispose();
5364 m_stringSort =
null;
5366 if (m_ctx != IntPtr.Zero)
5370 GC.SuppressFinalize(
this);
5376 Native.Z3_error_handler errHandler;
5380 errHandler = m_n_err_handler;
5381 m_n_err_handler =
null;
5382 m_ctx = IntPtr.Zero;
5386 if (ctx != IntPtr.Zero)
5390 Native.Z3_del_context(ctx);
5391 GC.KeepAlive(errHandler);
5393 if (m_memPressureAdded)
5395 GC.RemoveMemoryPressure(NativeMemoryPressureEstimate);
5396 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.
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.
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.
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.
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...
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 ...
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).