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;
141 private SeqSort m_stringSort =
null;
151 if (m_boolSort ==
null) m_boolSort =
new BoolSort(
this);
return m_boolSort;
162 if (m_intSort ==
null) m_intSort =
new IntSort(
this);
return m_intSort;
174 if (m_realSort ==
null) m_realSort =
new RealSort(
this);
return m_realSort;
185 if (m_complexSort ==
null) m_complexSort =
new ComplexSort(
this);
186 return m_complexSort;
195 if (m_charSort ==
null) m_charSort =
new CharSort(
this);
return m_charSort;
207 if (m_stringSort ==
null) m_stringSort =
new SeqSort(
this, Native.Z3_mk_string_sort(nCtx));
226 Debug.Assert(s !=
null);
228 CheckContextMatch(s);
269 return new BitVecSort(
this, Native.Z3_mk_bv_sort(nCtx, size));
277 Debug.Assert(s !=
null);
278 return new SeqSort(
this, Native.Z3_mk_seq_sort(nCtx, s.NativeObject));
286 Debug.Assert(s !=
null);
287 return new ReSort(
this, Native.Z3_mk_re_sort(nCtx, s.NativeObject));
295 Debug.Assert(domain !=
null);
296 Debug.Assert(range !=
null);
298 CheckContextMatch(domain);
299 CheckContextMatch(range);
300 return new ArraySort(
this, domain, range);
308 Debug.Assert(domain !=
null);
309 Debug.Assert(range !=
null);
311 CheckContextMatch<Sort>(domain);
312 CheckContextMatch(range);
313 return new ArraySort(
this, domain, range);
321 Debug.Assert(name !=
null);
322 Debug.Assert(fieldNames !=
null);
323 Debug.Assert(fieldNames.All(fn => fn !=
null));
324 Debug.Assert(fieldSorts ==
null || fieldSorts.All(fs => fs !=
null));
326 CheckContextMatch(name);
327 CheckContextMatch<Symbol>(fieldNames);
328 CheckContextMatch<Sort>(fieldSorts);
329 return new TupleSort(
this, name, (uint)fieldNames.Length, fieldNames, fieldSorts);
337 Debug.Assert(name !=
null);
338 Debug.Assert(enumNames !=
null);
339 Debug.Assert(enumNames.All(f => f !=
null));
342 CheckContextMatch(name);
343 CheckContextMatch<Symbol>(enumNames);
344 return new EnumSort(
this, name, enumNames);
352 Debug.Assert(enumNames !=
null);
354 var enumSymbols = MkSymbols(enumNames);
358 return new EnumSort(
this, symbol, enumSymbols);
362 foreach (var enumSymbol
in enumSymbols)
363 enumSymbol.Dispose();
372 Debug.Assert(name !=
null);
373 Debug.Assert(elemSort !=
null);
375 CheckContextMatch(name);
376 CheckContextMatch(elemSort);
377 return new ListSort(
this, name, elemSort);
385 Debug.Assert(elemSort !=
null);
387 CheckContextMatch(elemSort);
389 return new ListSort(
this, symbol, elemSort);
400 Debug.Assert(name !=
null);
402 CheckContextMatch(name);
434 Debug.Assert(name !=
null);
435 Debug.Assert(recognizer !=
null);
437 return new Constructor(
this, name, recognizer, fieldNames, sorts, sortRefs);
452 using var nameSymbol =
MkSymbol(name);
453 using var recognizerSymbol =
MkSymbol(recognizer);
454 var fieldSymbols = MkSymbols(fieldNames);
457 return new Constructor(
this, nameSymbol, recognizerSymbol, fieldSymbols, sorts, sortRefs);
461 foreach (var fieldSymbol
in fieldSymbols)
462 fieldSymbol.Dispose();
471 Debug.Assert(name !=
null);
472 Debug.Assert(constructors !=
null);
473 Debug.Assert(constructors.All(c => c !=
null));
476 CheckContextMatch(name);
477 CheckContextMatch<Constructor>(constructors);
486 Debug.Assert(constructors !=
null);
487 Debug.Assert(constructors.All(c => c !=
null));
489 CheckContextMatch<Constructor>(constructors);
502 Debug.Assert(name !=
null);
503 CheckContextMatch(name);
504 if (parameters !=
null)
505 CheckContextMatch<Sort>(parameters);
507 var numParams = (parameters ==
null) ? 0 : (uint)parameters.Length;
508 var paramsNative = (parameters ==
null) ?
null :
AST.ArrayToNative(parameters);
509 return new DatatypeSort(
this, Native.Z3_mk_datatype_sort(nCtx, name.NativeObject, numParams, paramsNative));
531 Debug.Assert(names !=
null);
532 Debug.Assert(c !=
null);
533 Debug.Assert(names.Length == c.Length);
535 Debug.Assert(names.All(name => name !=
null));
537 CheckContextMatch<Symbol>(names);
538 uint n = (uint)names.Length;
540 IntPtr[] n_constr =
new IntPtr[n];
541 for (uint i = 0; i < n; i++)
544 CheckContextMatch<Constructor>(constructor);
546 n_constr[i] = cla[i].NativeObject;
548 IntPtr[] n_res =
new IntPtr[n];
549 Native.Z3_mk_datatypes(nCtx, n,
Symbol.ArrayToNative(names), n_res, n_constr);
551 for (uint i = 0; i < n; i++)
564 Debug.Assert(names !=
null);
565 Debug.Assert(c !=
null);
566 Debug.Assert(names.Length == c.Length);
570 var symbols = MkSymbols(names);
577 foreach (var symbol
in symbols)
588 Debug.Assert(name !=
null);
589 CheckContextMatch(name);
590 return new Sort(
this, Native.Z3_mk_type_variable(nCtx, name.NativeObject));
612 Debug.Assert(name !=
null);
613 Debug.Assert(typeParams !=
null);
614 Debug.Assert(constructors !=
null);
615 Debug.Assert(constructors.All(c => c !=
null));
617 CheckContextMatch(name);
618 CheckContextMatch<Sort>(typeParams);
619 CheckContextMatch<Constructor>(constructors);
621 Native.Z3_mk_polymorphic_datatype(nCtx, name.NativeObject,
622 (uint)typeParams.Length,
AST.ArrayToNative(typeParams),
623 (uint)constructors.Length,
Z3Object.ArrayToNative(constructors)));
647 return Expr.Create(
this, Native.Z3_datatype_update_field(
648 nCtx, field.NativeObject,
649 t.NativeObject, v.NativeObject));
655 #region Function Declarations
661 Debug.Assert(name !=
null);
662 Debug.Assert(range !=
null);
663 Debug.Assert(domain.All(d => d !=
null));
665 CheckContextMatch(name);
666 CheckContextMatch<Sort>(domain);
667 CheckContextMatch(range);
668 return new FuncDecl(
this, name, domain, range);
676 Debug.Assert(name !=
null);
677 Debug.Assert(domain !=
null);
678 Debug.Assert(range !=
null);
680 CheckContextMatch(name);
681 CheckContextMatch(domain);
682 CheckContextMatch(range);
684 return new FuncDecl(
this, name, q, range);
692 Debug.Assert(range !=
null);
693 Debug.Assert(domain.All(d => d !=
null));
695 CheckContextMatch<Sort>(domain);
696 CheckContextMatch(range);
698 return new FuncDecl(
this, symbol, domain, range);
706 Debug.Assert(range !=
null);
707 Debug.Assert(domain.All(d => d !=
null));
709 CheckContextMatch<Sort>(domain);
710 CheckContextMatch(range);
712 return new FuncDecl(
this, symbol, domain, range,
true);
723 CheckContextMatch(f);
724 CheckContextMatch<Expr>(args);
725 CheckContextMatch(body);
726 IntPtr[] argsNative =
AST.ArrayToNative(args);
727 Native.Z3_add_rec_def(nCtx, f.NativeObject, (uint)args.Length, argsNative, body.NativeObject);
735 Debug.Assert(range !=
null);
736 Debug.Assert(domain !=
null);
738 CheckContextMatch(domain);
739 CheckContextMatch(range);
742 return new FuncDecl(
this, symbol, q, range);
752 Debug.Assert(range !=
null);
753 Debug.Assert(domain.All(d => d !=
null));
755 CheckContextMatch<Sort>(domain);
756 CheckContextMatch(range);
757 return new FuncDecl(
this, prefix, domain, range);
765 Debug.Assert(name !=
null);
766 Debug.Assert(range !=
null);
768 CheckContextMatch(name);
769 CheckContextMatch(range);
770 return new FuncDecl(
this, name,
null, range);
778 Debug.Assert(range !=
null);
780 CheckContextMatch(range);
782 return new FuncDecl(
this, symbol,
null, range);
792 Debug.Assert(range !=
null);
794 CheckContextMatch(range);
795 return new FuncDecl(
this, prefix,
null, range);
804 var fn = Native.Z3_solver_propagate_declare(nCtx, _name.NativeObject,
AST.ArrayLength(domain),
AST.ArrayToNative(domain), range.NativeObject);
809 #region Bound Variables
817 Debug.Assert(ty !=
null);
819 return Expr.Create(
this, Native.Z3_mk_bound(nCtx, index, ty.NativeObject));
823 #region Quantifier Patterns
829 Debug.Assert(terms !=
null);
830 if (terms.Length == 0)
831 throw new Z3Exception(
"Cannot create a pattern from zero terms");
833 IntPtr[] termsNative =
AST.ArrayToNative(terms);
834 return new Pattern(
this, Native.Z3_mk_pattern(nCtx, (uint)terms.Length, termsNative));
844 Debug.Assert(name !=
null);
845 Debug.Assert(range !=
null);
847 CheckContextMatch(name);
848 CheckContextMatch(range);
850 return Expr.Create(
this, Native.Z3_mk_const(nCtx, name.NativeObject, range.NativeObject));
858 Debug.Assert(range !=
null);
870 Debug.Assert(range !=
null);
872 CheckContextMatch(range);
873 return Expr.Create(
this, Native.Z3_mk_fresh_const(nCtx, prefix, range.NativeObject));
882 Debug.Assert(f !=
null);
892 Debug.Assert(name !=
null);
911 Debug.Assert(name !=
null);
921 Debug.Assert(name !=
null);
931 Debug.Assert(name !=
null);
960 CheckContextMatch(real, imag);
961 return new ComplexExpr(
this, Native.Z3_mk_complex(nCtx, real.NativeObject, imag.NativeObject));
967 CheckContextMatch(value);
968 return new RealExpr(
this, Native.Z3_mk_real_part(nCtx, value.NativeObject));
974 CheckContextMatch(value);
975 return new RealExpr(
this, Native.Z3_mk_imag_part(nCtx, value.NativeObject));
983 Debug.Assert(name !=
null);
1005 Debug.Assert(f !=
null);
1006 Debug.Assert(args ==
null || args.All(a => a !=
null));
1007 CheckContextMatch(f);
1008 CheckContextMatch<Expr>(args);
1009 return Expr.Create(
this, f, args);
1017 Debug.Assert(f !=
null);
1018 return MkApp(f, args?.ToArray());
1021 #region Propositional
1027 return new BoolExpr(
this, Native.Z3_mk_true(nCtx));
1035 return new BoolExpr(
this, Native.Z3_mk_false(nCtx));
1051 Debug.Assert(x !=
null);
1052 Debug.Assert(y !=
null);
1054 CheckContextMatch(x);
1055 CheckContextMatch(y);
1056 return new BoolExpr(
this, Native.Z3_mk_eq(nCtx, x.NativeObject, y.NativeObject));
1064 Debug.Assert(args !=
null);
1065 Debug.Assert(args.All(a => a !=
null));
1067 CheckContextMatch<Expr>(args);
1068 return new BoolExpr(
this, Native.Z3_mk_distinct(nCtx, (uint)args.Length,
AST.ArrayToNative(args)));
1076 Debug.Assert(args !=
null);
1085 Debug.Assert(a !=
null);
1086 CheckContextMatch(a);
1087 return new BoolExpr(
this, Native.Z3_mk_not(nCtx, a.NativeObject));
1098 Debug.Assert(t1 !=
null);
1099 Debug.Assert(t2 !=
null);
1100 Debug.Assert(t3 !=
null);
1102 CheckContextMatch(t1);
1103 CheckContextMatch(t2);
1104 CheckContextMatch(t3);
1105 return Expr.Create(
this, Native.Z3_mk_ite(nCtx, t1.NativeObject, t2.NativeObject, t3.NativeObject));
1113 Debug.Assert(t1 !=
null);
1114 Debug.Assert(t2 !=
null);
1116 CheckContextMatch(t1);
1117 CheckContextMatch(t2);
1118 return new BoolExpr(
this, Native.Z3_mk_iff(nCtx, t1.NativeObject, t2.NativeObject));
1126 Debug.Assert(t1 !=
null);
1127 Debug.Assert(t2 !=
null);
1129 CheckContextMatch(t1);
1130 CheckContextMatch(t2);
1131 return new BoolExpr(
this, Native.Z3_mk_implies(nCtx, t1.NativeObject, t2.NativeObject));
1139 Debug.Assert(t1 !=
null);
1140 Debug.Assert(t2 !=
null);
1142 CheckContextMatch(t1);
1143 CheckContextMatch(t2);
1144 return new BoolExpr(
this, Native.Z3_mk_xor(nCtx, t1.NativeObject, t2.NativeObject));
1152 Debug.Assert(args !=
null);
1153 var ts = args.ToArray();
1154 Debug.Assert(ts.All(a => a !=
null));
1155 CheckContextMatch<BoolExpr>(ts);
1157 return ts.Aggregate(
MkFalse(), (r, t) =>
1169 Debug.Assert(ts !=
null);
1170 Debug.Assert(ts.All(a => a !=
null));
1172 CheckContextMatch<BoolExpr>(ts);
1173 return new BoolExpr(
this, Native.Z3_mk_and(nCtx, (uint)ts.Length,
AST.ArrayToNative(ts)));
1181 Debug.Assert(t !=
null);
1182 return MkAnd(t.ToArray());
1190 Debug.Assert(ts !=
null);
1191 Debug.Assert(ts.All(a => a !=
null));
1193 CheckContextMatch<BoolExpr>(ts);
1194 return new BoolExpr(
this, Native.Z3_mk_or(nCtx, (uint)ts.Length,
AST.ArrayToNative(ts)));
1203 Debug.Assert(ts !=
null);
1204 return MkOr(ts.ToArray());
1215 Debug.Assert(ts !=
null);
1216 Debug.Assert(ts.All(a => a !=
null));
1218 CheckContextMatch<ArithExpr>(ts);
1219 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_add(nCtx, (uint)ts.Length,
AST.ArrayToNative(ts)));
1227 Debug.Assert(ts !=
null);
1228 return MkAdd(ts.ToArray());
1236 Debug.Assert(ts !=
null);
1237 Debug.Assert(ts.All(a => a !=
null));
1239 CheckContextMatch<ArithExpr>(ts);
1240 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_mul(nCtx, (uint)ts.Length,
AST.ArrayToNative(ts)));
1248 Debug.Assert(ts !=
null);
1249 return MkMul(ts.ToArray());
1257 Debug.Assert(ts !=
null);
1258 Debug.Assert(ts.All(a => a !=
null));
1260 CheckContextMatch<ArithExpr>(ts);
1261 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_sub(nCtx, (uint)ts.Length,
AST.ArrayToNative(ts)));
1269 Debug.Assert(t !=
null);
1271 CheckContextMatch(t);
1272 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_unary_minus(nCtx, t.NativeObject));
1280 Debug.Assert(t1 !=
null);
1281 Debug.Assert(t2 !=
null);
1283 CheckContextMatch(t1);
1284 CheckContextMatch(t2);
1285 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_div(nCtx, t1.NativeObject, t2.NativeObject));
1294 Debug.Assert(t1 !=
null);
1295 Debug.Assert(t2 !=
null);
1297 CheckContextMatch(t1);
1298 CheckContextMatch(t2);
1299 return new IntExpr(
this, Native.Z3_mk_mod(nCtx, t1.NativeObject, t2.NativeObject));
1308 Debug.Assert(t1 !=
null);
1309 Debug.Assert(t2 !=
null);
1311 CheckContextMatch(t1);
1312 CheckContextMatch(t2);
1313 return new IntExpr(
this, Native.Z3_mk_rem(nCtx, t1.NativeObject, t2.NativeObject));
1321 Debug.Assert(t1 !=
null);
1322 Debug.Assert(t2 !=
null);
1324 CheckContextMatch(t1);
1325 CheckContextMatch(t2);
1326 return (
ArithExpr)
Expr.Create(
this, Native.Z3_mk_power(nCtx, t1.NativeObject, t2.NativeObject));
1334 Debug.Assert(t1 !=
null);
1335 Debug.Assert(t2 !=
null);
1337 CheckContextMatch(t1);
1338 CheckContextMatch(t2);
1339 return new BoolExpr(
this, Native.Z3_mk_lt(nCtx, t1.NativeObject, t2.NativeObject));
1347 Debug.Assert(t1 !=
null);
1348 Debug.Assert(t2 !=
null);
1350 CheckContextMatch(t1);
1351 CheckContextMatch(t2);
1352 return new BoolExpr(
this, Native.Z3_mk_le(nCtx, t1.NativeObject, t2.NativeObject));
1360 Debug.Assert(t1 !=
null);
1361 Debug.Assert(t2 !=
null);
1363 CheckContextMatch(t1);
1364 CheckContextMatch(t2);
1365 return new BoolExpr(
this, Native.Z3_mk_gt(nCtx, t1.NativeObject, t2.NativeObject));
1373 Debug.Assert(t1 !=
null);
1374 Debug.Assert(t2 !=
null);
1376 CheckContextMatch(t1);
1377 CheckContextMatch(t2);
1378 return new BoolExpr(
this, Native.Z3_mk_ge(nCtx, t1.NativeObject, t2.NativeObject));
1393 Debug.Assert(t !=
null);
1395 CheckContextMatch(t);
1396 return new RealExpr(
this, Native.Z3_mk_int2real(nCtx, t.NativeObject));
1408 Debug.Assert(t !=
null);
1410 CheckContextMatch(t);
1411 return new IntExpr(
this, Native.Z3_mk_real2int(nCtx, t.NativeObject));
1419 Debug.Assert(t !=
null);
1421 CheckContextMatch(t);
1422 return new BoolExpr(
this, Native.Z3_mk_is_int(nCtx, t.NativeObject));
1433 Debug.Assert(t !=
null);
1435 CheckContextMatch(t);
1436 return new BitVecExpr(
this, Native.Z3_mk_bvnot(nCtx, t.NativeObject));
1445 Debug.Assert(t !=
null);
1447 CheckContextMatch(t);
1448 return new BitVecExpr(
this, Native.Z3_mk_bvredand(nCtx, t.NativeObject));
1457 Debug.Assert(t !=
null);
1459 CheckContextMatch(t);
1460 return new BitVecExpr(
this, Native.Z3_mk_bvredor(nCtx, t.NativeObject));
1469 Debug.Assert(t1 !=
null);
1470 Debug.Assert(t2 !=
null);
1472 CheckContextMatch(t1);
1473 CheckContextMatch(t2);
1474 return new BitVecExpr(
this, Native.Z3_mk_bvand(nCtx, t1.NativeObject, t2.NativeObject));
1483 Debug.Assert(t1 !=
null);
1484 Debug.Assert(t2 !=
null);
1486 CheckContextMatch(t1);
1487 CheckContextMatch(t2);
1488 return new BitVecExpr(
this, Native.Z3_mk_bvor(nCtx, t1.NativeObject, t2.NativeObject));
1497 Debug.Assert(t1 !=
null);
1498 Debug.Assert(t2 !=
null);
1500 CheckContextMatch(t1);
1501 CheckContextMatch(t2);
1502 return new BitVecExpr(
this, Native.Z3_mk_bvxor(nCtx, t1.NativeObject, t2.NativeObject));
1511 Debug.Assert(t1 !=
null);
1512 Debug.Assert(t2 !=
null);
1514 CheckContextMatch(t1);
1515 CheckContextMatch(t2);
1516 return new BitVecExpr(
this, Native.Z3_mk_bvnand(nCtx, t1.NativeObject, t2.NativeObject));
1525 Debug.Assert(t1 !=
null);
1526 Debug.Assert(t2 !=
null);
1528 CheckContextMatch(t1);
1529 CheckContextMatch(t2);
1530 return new BitVecExpr(
this, Native.Z3_mk_bvnor(nCtx, t1.NativeObject, t2.NativeObject));
1539 Debug.Assert(t1 !=
null);
1540 Debug.Assert(t2 !=
null);
1542 CheckContextMatch(t1);
1543 CheckContextMatch(t2);
1544 return new BitVecExpr(
this, Native.Z3_mk_bvxnor(nCtx, t1.NativeObject, t2.NativeObject));
1553 Debug.Assert(t !=
null);
1555 CheckContextMatch(t);
1556 return new BitVecExpr(
this, Native.Z3_mk_bvneg(nCtx, t.NativeObject));
1565 Debug.Assert(t1 !=
null);
1566 Debug.Assert(t2 !=
null);
1568 CheckContextMatch(t1);
1569 CheckContextMatch(t2);
1570 return new BitVecExpr(
this, Native.Z3_mk_bvadd(nCtx, t1.NativeObject, t2.NativeObject));
1579 Debug.Assert(t1 !=
null);
1580 Debug.Assert(t2 !=
null);
1582 CheckContextMatch(t1);
1583 CheckContextMatch(t2);
1584 return new BitVecExpr(
this, Native.Z3_mk_bvsub(nCtx, t1.NativeObject, t2.NativeObject));
1593 Debug.Assert(t1 !=
null);
1594 Debug.Assert(t2 !=
null);
1596 CheckContextMatch(t1);
1597 CheckContextMatch(t2);
1598 return new BitVecExpr(
this, Native.Z3_mk_bvmul(nCtx, t1.NativeObject, t2.NativeObject));
1612 Debug.Assert(t1 !=
null);
1613 Debug.Assert(t2 !=
null);
1615 CheckContextMatch(t1);
1616 CheckContextMatch(t2);
1617 return new BitVecExpr(
this, Native.Z3_mk_bvudiv(nCtx, t1.NativeObject, t2.NativeObject));
1635 Debug.Assert(t1 !=
null);
1636 Debug.Assert(t2 !=
null);
1638 CheckContextMatch(t1);
1639 CheckContextMatch(t2);
1640 return new BitVecExpr(
this, Native.Z3_mk_bvsdiv(nCtx, t1.NativeObject, t2.NativeObject));
1653 Debug.Assert(t1 !=
null);
1654 Debug.Assert(t2 !=
null);
1656 CheckContextMatch(t1);
1657 CheckContextMatch(t2);
1658 return new BitVecExpr(
this, Native.Z3_mk_bvurem(nCtx, t1.NativeObject, t2.NativeObject));
1673 Debug.Assert(t1 !=
null);
1674 Debug.Assert(t2 !=
null);
1676 CheckContextMatch(t1);
1677 CheckContextMatch(t2);
1678 return new BitVecExpr(
this, Native.Z3_mk_bvsrem(nCtx, t1.NativeObject, t2.NativeObject));
1690 Debug.Assert(t1 !=
null);
1691 Debug.Assert(t2 !=
null);
1693 CheckContextMatch(t1);
1694 CheckContextMatch(t2);
1695 return new BitVecExpr(
this, Native.Z3_mk_bvsmod(nCtx, t1.NativeObject, t2.NativeObject));
1706 Debug.Assert(t1 !=
null);
1707 Debug.Assert(t2 !=
null);
1709 CheckContextMatch(t1);
1710 CheckContextMatch(t2);
1711 return new BoolExpr(
this, Native.Z3_mk_bvult(nCtx, t1.NativeObject, t2.NativeObject));
1722 Debug.Assert(t1 !=
null);
1723 Debug.Assert(t2 !=
null);
1725 CheckContextMatch(t1);
1726 CheckContextMatch(t2);
1727 return new BoolExpr(
this, Native.Z3_mk_bvslt(nCtx, t1.NativeObject, t2.NativeObject));
1738 Debug.Assert(t1 !=
null);
1739 Debug.Assert(t2 !=
null);
1741 CheckContextMatch(t1);
1742 CheckContextMatch(t2);
1743 return new BoolExpr(
this, Native.Z3_mk_bvule(nCtx, t1.NativeObject, t2.NativeObject));
1754 Debug.Assert(t1 !=
null);
1755 Debug.Assert(t2 !=
null);
1757 CheckContextMatch(t1);
1758 CheckContextMatch(t2);
1759 return new BoolExpr(
this, Native.Z3_mk_bvsle(nCtx, t1.NativeObject, t2.NativeObject));
1770 Debug.Assert(t1 !=
null);
1771 Debug.Assert(t2 !=
null);
1773 CheckContextMatch(t1);
1774 CheckContextMatch(t2);
1775 return new BoolExpr(
this, Native.Z3_mk_bvuge(nCtx, t1.NativeObject, t2.NativeObject));
1786 Debug.Assert(t1 !=
null);
1787 Debug.Assert(t2 !=
null);
1789 CheckContextMatch(t1);
1790 CheckContextMatch(t2);
1791 return new BoolExpr(
this, Native.Z3_mk_bvsge(nCtx, t1.NativeObject, t2.NativeObject));
1802 Debug.Assert(t1 !=
null);
1803 Debug.Assert(t2 !=
null);
1805 CheckContextMatch(t1);
1806 CheckContextMatch(t2);
1807 return new BoolExpr(
this, Native.Z3_mk_bvugt(nCtx, t1.NativeObject, t2.NativeObject));
1818 Debug.Assert(t1 !=
null);
1819 Debug.Assert(t2 !=
null);
1821 CheckContextMatch(t1);
1822 CheckContextMatch(t2);
1823 return new BoolExpr(
this, Native.Z3_mk_bvsgt(nCtx, t1.NativeObject, t2.NativeObject));
1838 Debug.Assert(t1 !=
null);
1839 Debug.Assert(t2 !=
null);
1841 CheckContextMatch(t1);
1842 CheckContextMatch(t2);
1843 return new BitVecExpr(
this, Native.Z3_mk_concat(nCtx, t1.NativeObject, t2.NativeObject));
1857 Debug.Assert(t !=
null);
1859 CheckContextMatch(t);
1860 return new BitVecExpr(
this, Native.Z3_mk_extract(nCtx, high, low, t.NativeObject));
1873 Debug.Assert(t !=
null);
1875 CheckContextMatch(t);
1876 return new BitVecExpr(
this, Native.Z3_mk_sign_ext(nCtx, i, t.NativeObject));
1890 Debug.Assert(t !=
null);
1892 CheckContextMatch(t);
1893 return new BitVecExpr(
this, Native.Z3_mk_zero_ext(nCtx, i, t.NativeObject));
1904 Debug.Assert(t !=
null);
1906 CheckContextMatch(t);
1907 return new BitVecExpr(
this, Native.Z3_mk_repeat(nCtx, i, t.NativeObject));
1924 Debug.Assert(t1 !=
null);
1925 Debug.Assert(t2 !=
null);
1927 CheckContextMatch(t1);
1928 CheckContextMatch(t2);
1929 return new BitVecExpr(
this, Native.Z3_mk_bvshl(nCtx, t1.NativeObject, t2.NativeObject));
1946 Debug.Assert(t1 !=
null);
1947 Debug.Assert(t2 !=
null);
1949 CheckContextMatch(t1);
1950 CheckContextMatch(t2);
1951 return new BitVecExpr(
this, Native.Z3_mk_bvlshr(nCtx, t1.NativeObject, t2.NativeObject));
1970 Debug.Assert(t1 !=
null);
1971 Debug.Assert(t2 !=
null);
1973 CheckContextMatch(t1);
1974 CheckContextMatch(t2);
1975 return new BitVecExpr(
this, Native.Z3_mk_bvashr(nCtx, t1.NativeObject, t2.NativeObject));
1987 Debug.Assert(t !=
null);
1989 CheckContextMatch(t);
1990 return new BitVecExpr(
this, Native.Z3_mk_rotate_left(nCtx, i, t.NativeObject));
2002 Debug.Assert(t !=
null);
2004 CheckContextMatch(t);
2005 return new BitVecExpr(
this, Native.Z3_mk_rotate_right(nCtx, i, t.NativeObject));
2017 Debug.Assert(t1 !=
null);
2018 Debug.Assert(t2 !=
null);
2020 CheckContextMatch(t1);
2021 CheckContextMatch(t2);
2022 return new BitVecExpr(
this, Native.Z3_mk_ext_rotate_left(nCtx, t1.NativeObject, t2.NativeObject));
2034 Debug.Assert(t1 !=
null);
2035 Debug.Assert(t2 !=
null);
2037 CheckContextMatch(t1);
2038 CheckContextMatch(t2);
2039 return new BitVecExpr(
this, Native.Z3_mk_ext_rotate_right(nCtx, t1.NativeObject, t2.NativeObject));
2054 Debug.Assert(t !=
null);
2056 CheckContextMatch(t);
2057 return new BitVecExpr(
this, Native.Z3_mk_int2bv(nCtx, n, t.NativeObject));
2077 Debug.Assert(t !=
null);
2079 CheckContextMatch(t);
2080 return new IntExpr(
this, Native.Z3_mk_bv2int(nCtx, t.NativeObject, (
byte)(
signed ? 1 : 0)));
2091 Debug.Assert(t1 !=
null);
2092 Debug.Assert(t2 !=
null);
2094 CheckContextMatch(t1);
2095 CheckContextMatch(t2);
2096 return new BoolExpr(
this, Native.Z3_mk_bvadd_no_overflow(nCtx, t1.NativeObject, t2.NativeObject, (
byte)(isSigned ? 1 : 0)));
2107 Debug.Assert(t1 !=
null);
2108 Debug.Assert(t2 !=
null);
2110 CheckContextMatch(t1);
2111 CheckContextMatch(t2);
2112 return new BoolExpr(
this, Native.Z3_mk_bvadd_no_underflow(nCtx, t1.NativeObject, t2.NativeObject));
2123 Debug.Assert(t1 !=
null);
2124 Debug.Assert(t2 !=
null);
2126 CheckContextMatch(t1);
2127 CheckContextMatch(t2);
2128 return new BoolExpr(
this, Native.Z3_mk_bvsub_no_overflow(nCtx, t1.NativeObject, t2.NativeObject));
2139 Debug.Assert(t1 !=
null);
2140 Debug.Assert(t2 !=
null);
2142 CheckContextMatch(t1);
2143 CheckContextMatch(t2);
2144 return new BoolExpr(
this, Native.Z3_mk_bvsub_no_underflow(nCtx, t1.NativeObject, t2.NativeObject, (
byte)(isSigned ? 1 : 0)));
2155 Debug.Assert(t1 !=
null);
2156 Debug.Assert(t2 !=
null);
2158 CheckContextMatch(t1);
2159 CheckContextMatch(t2);
2160 return new BoolExpr(
this, Native.Z3_mk_bvsdiv_no_overflow(nCtx, t1.NativeObject, t2.NativeObject));
2171 Debug.Assert(t !=
null);
2173 CheckContextMatch(t);
2174 return new BoolExpr(
this, Native.Z3_mk_bvneg_no_overflow(nCtx, t.NativeObject));
2185 Debug.Assert(t1 !=
null);
2186 Debug.Assert(t2 !=
null);
2188 CheckContextMatch(t1);
2189 CheckContextMatch(t2);
2190 return new BoolExpr(
this, Native.Z3_mk_bvmul_no_overflow(nCtx, t1.NativeObject, t2.NativeObject, (
byte)(isSigned ? 1 : 0)));
2201 Debug.Assert(t1 !=
null);
2202 Debug.Assert(t2 !=
null);
2204 CheckContextMatch(t1);
2205 CheckContextMatch(t2);
2206 return new BoolExpr(
this, Native.Z3_mk_bvmul_no_underflow(nCtx, t1.NativeObject, t2.NativeObject));
2216 Debug.Assert(name !=
null);
2217 Debug.Assert(domain !=
null);
2218 Debug.Assert(range !=
null);
2229 Debug.Assert(domain !=
null);
2230 Debug.Assert(range !=
null);
2253 Debug.Assert(a !=
null);
2254 Debug.Assert(i !=
null);
2256 CheckContextMatch(a);
2257 CheckContextMatch(i);
2258 return Expr.Create(
this, Native.Z3_mk_select(nCtx, a.NativeObject, i.NativeObject));
2276 Debug.Assert(a !=
null);
2277 Debug.Assert(args !=
null && args.All(n => n !=
null));
2279 CheckContextMatch(a);
2280 CheckContextMatch<Expr>(args);
2281 return Expr.Create(
this, Native.Z3_mk_select_n(nCtx, a.NativeObject,
AST.ArrayLength(args),
AST.ArrayToNative(args)));
2305 Debug.Assert(a !=
null);
2306 Debug.Assert(i !=
null);
2307 Debug.Assert(v !=
null);
2309 CheckContextMatch(a);
2310 CheckContextMatch(i);
2311 CheckContextMatch(v);
2312 return new ArrayExpr(
this, Native.Z3_mk_store(nCtx, a.NativeObject, i.NativeObject, v.NativeObject));
2335 Debug.Assert(a !=
null);
2336 Debug.Assert(args !=
null);
2337 Debug.Assert(v !=
null);
2339 CheckContextMatch<Expr>(args);
2340 CheckContextMatch(a);
2341 CheckContextMatch(v);
2342 return new ArrayExpr(
this, Native.Z3_mk_store_n(nCtx, a.NativeObject,
AST.ArrayLength(args),
AST.ArrayToNative(args), v.NativeObject));
2356 Debug.Assert(domain !=
null);
2357 Debug.Assert(v !=
null);
2359 CheckContextMatch(domain);
2360 CheckContextMatch(v);
2361 return new ArrayExpr(
this, Native.Z3_mk_const_array(nCtx, domain.NativeObject, v.NativeObject));
2377 Debug.Assert(f !=
null);
2378 Debug.Assert(args ==
null || args.All(a => a !=
null));
2380 CheckContextMatch(f);
2381 CheckContextMatch<ArrayExpr>(args);
2382 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_map(nCtx, f.NativeObject,
AST.ArrayLength(args),
AST.ArrayToNative(args)));
2394 Debug.Assert(array !=
null);
2396 CheckContextMatch(array);
2397 return Expr.Create(
this, Native.Z3_mk_array_default(nCtx, array.NativeObject));
2405 Debug.Assert(arg1 !=
null);
2406 Debug.Assert(arg2 !=
null);
2408 CheckContextMatch(arg1);
2409 CheckContextMatch(arg2);
2410 return Expr.Create(
this, Native.Z3_mk_array_ext(nCtx, arg1.NativeObject, arg2.NativeObject));
2421 Debug.Assert(ty !=
null);
2423 CheckContextMatch(ty);
2432 Debug.Assert(domain !=
null);
2434 CheckContextMatch(domain);
2435 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_empty_set(nCtx, domain.NativeObject));
2443 Debug.Assert(domain !=
null);
2445 CheckContextMatch(domain);
2446 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_full_set(nCtx, domain.NativeObject));
2454 Debug.Assert(
set !=
null);
2455 Debug.Assert(element !=
null);
2457 CheckContextMatch(
set);
2458 CheckContextMatch(element);
2459 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_add(nCtx,
set.NativeObject, element.NativeObject));
2468 Debug.Assert(
set !=
null);
2469 Debug.Assert(element !=
null);
2471 CheckContextMatch(
set);
2472 CheckContextMatch(element);
2473 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_del(nCtx,
set.NativeObject, element.NativeObject));
2481 Debug.Assert(args !=
null);
2482 Debug.Assert(args.All(a => a !=
null));
2484 CheckContextMatch<ArrayExpr>(args);
2485 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_union(nCtx, (uint)args.Length,
AST.ArrayToNative(args)));
2493 Debug.Assert(args !=
null);
2494 Debug.Assert(args.All(a => a !=
null));
2496 CheckContextMatch<ArrayExpr>(args);
2497 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_intersect(nCtx, (uint)args.Length,
AST.ArrayToNative(args)));
2505 Debug.Assert(arg1 !=
null);
2506 Debug.Assert(arg2 !=
null);
2508 CheckContextMatch(arg1);
2509 CheckContextMatch(arg2);
2510 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_difference(nCtx, arg1.NativeObject, arg2.NativeObject));
2518 Debug.Assert(arg !=
null);
2520 CheckContextMatch(arg);
2521 return (
ArrayExpr)
Expr.Create(
this, Native.Z3_mk_set_complement(nCtx, arg.NativeObject));
2529 Debug.Assert(elem !=
null);
2530 Debug.Assert(
set !=
null);
2532 CheckContextMatch(elem);
2533 CheckContextMatch(
set);
2534 return (
BoolExpr)
Expr.Create(
this, Native.Z3_mk_set_member(nCtx, elem.NativeObject,
set.NativeObject));
2542 Debug.Assert(arg1 !=
null);
2543 Debug.Assert(arg2 !=
null);
2545 CheckContextMatch(arg1);
2546 CheckContextMatch(arg2);
2547 return (
BoolExpr)
Expr.Create(
this, Native.Z3_mk_set_subset(nCtx, arg1.NativeObject, arg2.NativeObject));
2559 Debug.Assert(elemSort !=
null);
2561 CheckContextMatch(elemSort);
2570 Debug.Assert(s !=
null);
2572 CheckContextMatch(s);
2573 return Native.Z3_is_finite_set_sort(nCtx, s.NativeObject) != 0;
2581 Debug.Assert(s !=
null);
2583 CheckContextMatch(s);
2584 return Sort.Create(
this, Native.Z3_get_finite_set_sort_basis(nCtx, s.NativeObject));
2592 Debug.Assert(setSort !=
null);
2594 CheckContextMatch(setSort);
2595 return Expr.Create(
this, Native.Z3_mk_finite_set_empty(nCtx, setSort.NativeObject));
2603 Debug.Assert(elem !=
null);
2605 CheckContextMatch(elem);
2606 return Expr.Create(
this, Native.Z3_mk_finite_set_singleton(nCtx, elem.NativeObject));
2614 Debug.Assert(s1 !=
null);
2615 Debug.Assert(s2 !=
null);
2617 CheckContextMatch(s1);
2618 CheckContextMatch(s2);
2619 return Expr.Create(
this, Native.Z3_mk_finite_set_union(nCtx, s1.NativeObject, s2.NativeObject));
2627 Debug.Assert(s1 !=
null);
2628 Debug.Assert(s2 !=
null);
2630 CheckContextMatch(s1);
2631 CheckContextMatch(s2);
2632 return Expr.Create(
this, Native.Z3_mk_finite_set_intersect(nCtx, s1.NativeObject, s2.NativeObject));
2640 Debug.Assert(s1 !=
null);
2641 Debug.Assert(s2 !=
null);
2643 CheckContextMatch(s1);
2644 CheckContextMatch(s2);
2645 return Expr.Create(
this, Native.Z3_mk_finite_set_difference(nCtx, s1.NativeObject, s2.NativeObject));
2653 Debug.Assert(elem !=
null);
2654 Debug.Assert(
set !=
null);
2656 CheckContextMatch(elem);
2657 CheckContextMatch(
set);
2658 return (
BoolExpr)
Expr.Create(
this, Native.Z3_mk_finite_set_member(nCtx, elem.NativeObject,
set.NativeObject));
2666 Debug.Assert(
set !=
null);
2668 CheckContextMatch(
set);
2669 return Expr.Create(
this, Native.Z3_mk_finite_set_size(nCtx,
set.NativeObject));
2677 Debug.Assert(s1 !=
null);
2678 Debug.Assert(s2 !=
null);
2680 CheckContextMatch(s1);
2681 CheckContextMatch(s2);
2682 return (
BoolExpr)
Expr.Create(
this, Native.Z3_mk_finite_set_subset(nCtx, s1.NativeObject, s2.NativeObject));
2690 Debug.Assert(f !=
null);
2691 Debug.Assert(
set !=
null);
2693 CheckContextMatch(f);
2694 CheckContextMatch(
set);
2695 return Expr.Create(
this, Native.Z3_mk_finite_set_map(nCtx, f.NativeObject,
set.NativeObject));
2703 Debug.Assert(f !=
null);
2704 Debug.Assert(
set !=
null);
2706 CheckContextMatch(f);
2707 CheckContextMatch(
set);
2708 return Expr.Create(
this, Native.Z3_mk_finite_set_filter(nCtx, f.NativeObject,
set.NativeObject));
2716 Debug.Assert(low !=
null);
2717 Debug.Assert(high !=
null);
2719 CheckContextMatch(low);
2720 CheckContextMatch(high);
2721 return Expr.Create(
this, Native.Z3_mk_finite_set_range(nCtx, low.NativeObject, high.NativeObject));
2726 #region Sequence, string and regular expressions
2733 Debug.Assert(s !=
null);
2734 return new SeqExpr(
this, Native.Z3_mk_seq_empty(nCtx, s.NativeObject));
2742 Debug.Assert(elem !=
null);
2743 return new SeqExpr(
this, Native.Z3_mk_seq_unit(nCtx, elem.NativeObject));
2751 Debug.Assert(s !=
null);
2752 return new SeqExpr(
this, Native.Z3_mk_string(nCtx, s));
2760 Debug.Assert(e !=
null);
2762 return new SeqExpr(
this, Native.Z3_mk_int_to_str(nCtx, e.NativeObject));
2770 Debug.Assert(e !=
null);
2772 return new SeqExpr(
this, Native.Z3_mk_ubv_to_str(nCtx, e.NativeObject));
2780 Debug.Assert(e !=
null);
2782 return new SeqExpr(
this, Native.Z3_mk_sbv_to_str(nCtx, e.NativeObject));
2790 Debug.Assert(e !=
null);
2792 return new IntExpr(
this, Native.Z3_mk_str_to_int(nCtx, e.NativeObject));
2801 Debug.Assert(t !=
null);
2802 Debug.Assert(t.All(a => a !=
null));
2804 CheckContextMatch<SeqExpr>(t);
2805 return new SeqExpr(
this, Native.Z3_mk_seq_concat(nCtx, (uint)t.Length,
AST.ArrayToNative(t)));
2814 Debug.Assert(s !=
null);
2815 return (
IntExpr)
Expr.Create(
this, Native.Z3_mk_seq_length(nCtx, s.NativeObject));
2823 Debug.Assert(s !=
null);
2824 Debug.Assert(n !=
null);
2825 CheckContextMatch(s, n);
2826 return new SeqExpr(
this, Native.Z3_mk_seq_power(nCtx, s.NativeObject, n.NativeObject));
2834 Debug.Assert(s1 !=
null);
2835 Debug.Assert(s2 !=
null);
2836 CheckContextMatch(s1, s2);
2837 return new BoolExpr(
this, Native.Z3_mk_seq_prefix(nCtx, s1.NativeObject, s2.NativeObject));
2845 Debug.Assert(s1 !=
null);
2846 Debug.Assert(s2 !=
null);
2847 CheckContextMatch(s1, s2);
2848 return new BoolExpr(
this, Native.Z3_mk_seq_suffix(nCtx, s1.NativeObject, s2.NativeObject));
2856 Debug.Assert(s1 !=
null);
2857 Debug.Assert(s2 !=
null);
2858 CheckContextMatch(s1, s2);
2859 return new BoolExpr(
this, Native.Z3_mk_seq_contains(nCtx, s1.NativeObject, s2.NativeObject));
2867 Debug.Assert(s1 !=
null);
2868 Debug.Assert(s2 !=
null);
2869 CheckContextMatch(s1, s2);
2870 return new BoolExpr(
this, Native.Z3_mk_str_lt(nCtx, s1.NativeObject, s2.NativeObject));
2878 Debug.Assert(s1 !=
null);
2879 Debug.Assert(s2 !=
null);
2880 CheckContextMatch(s1, s2);
2881 return new BoolExpr(
this, Native.Z3_mk_str_le(nCtx, s1.NativeObject, s2.NativeObject));
2889 Debug.Assert(s !=
null);
2890 Debug.Assert(index !=
null);
2891 CheckContextMatch(s, index);
2892 return new SeqExpr(
this, Native.Z3_mk_seq_at(nCtx, s.NativeObject, index.NativeObject));
2900 Debug.Assert(s !=
null);
2901 Debug.Assert(index !=
null);
2902 CheckContextMatch(s, index);
2903 return Expr.Create(
this, Native.Z3_mk_seq_nth(nCtx, s.NativeObject, index.NativeObject));
2911 Debug.Assert(s !=
null);
2912 Debug.Assert(offset !=
null);
2913 Debug.Assert(length !=
null);
2914 CheckContextMatch(s, offset, length);
2915 return new SeqExpr(
this, Native.Z3_mk_seq_extract(nCtx, s.NativeObject, offset.NativeObject, length.NativeObject));
2923 Debug.Assert(s !=
null);
2924 Debug.Assert(offset !=
null);
2925 Debug.Assert(substr !=
null);
2926 CheckContextMatch(s, substr, offset);
2927 return new IntExpr(
this, Native.Z3_mk_seq_index(nCtx, s.NativeObject, substr.NativeObject, offset.NativeObject));
2935 Debug.Assert(s !=
null);
2936 Debug.Assert(src !=
null);
2937 Debug.Assert(dst !=
null);
2938 CheckContextMatch(s, src, dst);
2939 return new SeqExpr(
this, Native.Z3_mk_seq_replace(nCtx, s.NativeObject, src.NativeObject, dst.NativeObject));
2947 Debug.Assert(f !=
null);
2948 Debug.Assert(s !=
null);
2949 CheckContextMatch(f, s);
2950 return Expr.Create(
this, Native.Z3_mk_seq_map(nCtx, f.NativeObject, s.NativeObject));
2958 Debug.Assert(f !=
null);
2959 Debug.Assert(i !=
null);
2960 Debug.Assert(s !=
null);
2961 CheckContextMatch(f, i, s);
2962 return Expr.Create(
this, Native.Z3_mk_seq_mapi(nCtx, f.NativeObject, i.NativeObject, s.NativeObject));
2970 Debug.Assert(f !=
null);
2971 Debug.Assert(a !=
null);
2972 Debug.Assert(s !=
null);
2973 CheckContextMatch(f, a, s);
2974 return Expr.Create(
this, Native.Z3_mk_seq_foldl(nCtx, f.NativeObject, a.NativeObject, s.NativeObject));
2982 Debug.Assert(f !=
null);
2983 Debug.Assert(i !=
null);
2984 Debug.Assert(a !=
null);
2985 Debug.Assert(s !=
null);
2986 CheckContextMatch(f, i, a);
2987 CheckContextMatch(s, a);
2988 return Expr.Create(
this, Native.Z3_mk_seq_foldli(nCtx, f.NativeObject, i.NativeObject, a.NativeObject, s.NativeObject));
2996 Debug.Assert(s !=
null);
2997 return new ReExpr(
this, Native.Z3_mk_seq_to_re(nCtx, s.NativeObject));
3006 Debug.Assert(s !=
null);
3007 Debug.Assert(re !=
null);
3008 CheckContextMatch(s, re);
3009 return new BoolExpr(
this, Native.Z3_mk_seq_in_re(nCtx, s.NativeObject, re.NativeObject));
3017 Debug.Assert(re !=
null);
3018 return new ReExpr(
this, Native.Z3_mk_re_star(nCtx, re.NativeObject));
3026 Debug.Assert(re !=
null);
3027 return new ReExpr(
this, Native.Z3_mk_re_loop(nCtx, re.NativeObject, lo, hi));
3035 Debug.Assert(re !=
null);
3036 return new ReExpr(
this, Native.Z3_mk_re_plus(nCtx, re.NativeObject));
3044 Debug.Assert(re !=
null);
3045 return new ReExpr(
this, Native.Z3_mk_re_option(nCtx, re.NativeObject));
3053 Debug.Assert(re !=
null);
3054 return new ReExpr(
this, Native.Z3_mk_re_complement(nCtx, re.NativeObject));
3062 Debug.Assert(t !=
null);
3063 Debug.Assert(t.All(a => a !=
null));
3065 CheckContextMatch<ReExpr>(t);
3066 return new ReExpr(
this, Native.Z3_mk_re_concat(nCtx, (uint)t.Length,
AST.ArrayToNative(t)));
3074 Debug.Assert(t !=
null);
3075 Debug.Assert(t.All(a => a !=
null));
3077 CheckContextMatch<ReExpr>(t);
3078 return new ReExpr(
this, Native.Z3_mk_re_union(nCtx, (uint)t.Length,
AST.ArrayToNative(t)));
3086 Debug.Assert(t !=
null);
3087 Debug.Assert(t.All(a => a !=
null));
3089 CheckContextMatch<ReExpr>(t);
3090 return new ReExpr(
this, Native.Z3_mk_re_intersect(nCtx, (uint)t.Length,
AST.ArrayToNative(t)));
3098 Debug.Assert(a !=
null);
3099 Debug.Assert(b !=
null);
3100 CheckContextMatch(a, b);
3101 return new ReExpr(
this, Native.Z3_mk_re_diff(nCtx, a.NativeObject, b.NativeObject));
3110 Debug.Assert(s !=
null);
3111 return new ReExpr(
this, Native.Z3_mk_re_empty(nCtx, s.NativeObject));
3120 Debug.Assert(s !=
null);
3121 return new ReExpr(
this, Native.Z3_mk_re_full(nCtx, s.NativeObject));
3130 Debug.Assert(lo !=
null);
3131 Debug.Assert(hi !=
null);
3132 CheckContextMatch(lo, hi);
3133 return new ReExpr(
this, Native.Z3_mk_re_range(nCtx, lo.NativeObject, hi.NativeObject));
3141 Debug.Assert(ch1 !=
null);
3142 Debug.Assert(ch2 !=
null);
3143 return new BoolExpr(
this, Native.Z3_mk_char_le(nCtx, ch1.NativeObject, ch2.NativeObject));
3151 Debug.Assert(ch !=
null);
3152 return new IntExpr(
this, Native.Z3_mk_char_to_int(nCtx, ch.NativeObject));
3160 Debug.Assert(ch !=
null);
3161 return new BitVecExpr(
this, Native.Z3_mk_char_to_bv(nCtx, ch.NativeObject));
3169 Debug.Assert(bv !=
null);
3170 return new Expr(
this, Native.Z3_mk_char_from_bv(nCtx, bv.NativeObject));
3178 Debug.Assert(ch !=
null);
3179 return new BoolExpr(
this, Native.Z3_mk_char_is_digit(nCtx, ch.NativeObject));
3184 #region Pseudo-Boolean constraints
3191 Debug.Assert(args !=
null);
3192 var ts = args.ToArray();
3193 CheckContextMatch<BoolExpr>(ts);
3194 return new BoolExpr(
this, Native.Z3_mk_atmost(nCtx, (uint)ts.Length,
3195 AST.ArrayToNative(ts), k));
3203 Debug.Assert(args !=
null);
3204 var ts = args.ToArray();
3205 CheckContextMatch<BoolExpr>(ts);
3206 return new BoolExpr(
this, Native.Z3_mk_atleast(nCtx, (uint)ts.Length,
3207 AST.ArrayToNative(ts), k));
3215 Debug.Assert(args !=
null);
3216 Debug.Assert(coeffs !=
null);
3217 Debug.Assert(args.Length == coeffs.Length);
3218 CheckContextMatch<BoolExpr>(args);
3219 return new BoolExpr(
this, Native.Z3_mk_pble(nCtx, (uint)args.Length,
3220 AST.ArrayToNative(args),
3229 Debug.Assert(args !=
null);
3230 Debug.Assert(coeffs !=
null);
3231 Debug.Assert(args.Length == coeffs.Length);
3232 CheckContextMatch<BoolExpr>(args);
3233 return new BoolExpr(
this, Native.Z3_mk_pbge(nCtx, (uint)args.Length,
3234 AST.ArrayToNative(args),
3242 Debug.Assert(args !=
null);
3243 Debug.Assert(coeffs !=
null);
3244 Debug.Assert(args.Length == coeffs.Length);
3245 CheckContextMatch<BoolExpr>(args);
3246 return new BoolExpr(
this, Native.Z3_mk_pbeq(nCtx, (uint)args.Length,
3247 AST.ArrayToNative(args),
3254 #region General Numerals
3263 Debug.Assert(ty !=
null);
3265 CheckContextMatch(ty);
3266 return Expr.Create(
this, Native.Z3_mk_numeral(nCtx, v, ty.NativeObject));
3278 Debug.Assert(ty !=
null);
3280 CheckContextMatch(ty);
3281 return Expr.Create(
this, Native.Z3_mk_int(nCtx, v, ty.NativeObject));
3293 Debug.Assert(ty !=
null);
3295 CheckContextMatch(ty);
3296 return Expr.Create(
this, Native.Z3_mk_unsigned_int(nCtx, v, ty.NativeObject));
3308 Debug.Assert(ty !=
null);
3310 CheckContextMatch(ty);
3311 return Expr.Create(
this, Native.Z3_mk_int64(nCtx, v, ty.NativeObject));
3323 Debug.Assert(ty !=
null);
3325 CheckContextMatch(ty);
3326 return Expr.Create(
this, Native.Z3_mk_unsigned_int64(nCtx, v, ty.NativeObject));
3343 return new RatNum(
this, Native.Z3_mk_real(nCtx, num, den));
3354 return new RatNum(
this, Native.Z3_mk_numeral(nCtx, v,
RealSort.NativeObject));
3365 return new RatNum(
this, Native.Z3_mk_int(nCtx, v,
RealSort.NativeObject));
3376 return new RatNum(
this, Native.Z3_mk_unsigned_int(nCtx, v,
RealSort.NativeObject));
3387 return new RatNum(
this, Native.Z3_mk_int64(nCtx, v,
RealSort.NativeObject));
3398 return new RatNum(
this, Native.Z3_mk_unsigned_int64(nCtx, v,
RealSort.NativeObject));
3410 return new IntNum(
this, Native.Z3_mk_numeral(nCtx, v,
IntSort.NativeObject));
3421 return new IntNum(
this, Native.Z3_mk_int(nCtx, v,
IntSort.NativeObject));
3432 return new IntNum(
this, Native.Z3_mk_unsigned_int(nCtx, v,
IntSort.NativeObject));
3443 return new IntNum(
this, Native.Z3_mk_int64(nCtx, v,
IntSort.NativeObject));
3454 return new IntNum(
this, Native.Z3_mk_unsigned_int64(nCtx, v,
IntSort.NativeObject));
3520 byte[] _bits =
new byte[bits.Length];
3521 for (
int i = 0; i < bits.Length; ++i) _bits[i] = (
byte)(bits[i] ? 1 : 0);
3522 return (
BitVecNum)
Expr.Create(
this, Native.Z3_mk_bv_numeral(nCtx, (uint)bits.Length, _bits));
3557 Debug.Assert(sorts !=
null);
3558 Debug.Assert(names !=
null);
3559 Debug.Assert(body !=
null);
3560 Debug.Assert(sorts.Length == names.Length);
3561 Debug.Assert(sorts.All(s => s !=
null));
3562 Debug.Assert(names.All(n => n !=
null));
3563 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3564 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3567 return new Quantifier(
this,
true, sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3581 Debug.Assert(body !=
null);
3582 Debug.Assert(boundConstants ==
null || boundConstants.All(b => b !=
null));
3583 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3584 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3587 return new Quantifier(
this,
true, boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3599 Debug.Assert(sorts !=
null);
3600 Debug.Assert(names !=
null);
3601 Debug.Assert(body !=
null);
3602 Debug.Assert(sorts.Length == names.Length);
3603 Debug.Assert(sorts.All(s => s !=
null));
3604 Debug.Assert(names.All(n => n !=
null));
3605 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3606 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3608 return new Quantifier(
this,
false, sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3621 Debug.Assert(body !=
null);
3622 Debug.Assert(boundConstants ==
null || boundConstants.All(n => n !=
null));
3623 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3624 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3626 return new Quantifier(
this,
false, boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3636 Debug.Assert(body !=
null);
3637 Debug.Assert(names !=
null);
3638 Debug.Assert(sorts !=
null);
3639 Debug.Assert(sorts.Length == names.Length);
3640 Debug.Assert(sorts.All(s => s !=
null));
3641 Debug.Assert(names.All(n => n !=
null));
3642 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3643 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3647 return MkForall(sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3649 return MkExists(sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3659 Debug.Assert(body !=
null);
3660 Debug.Assert(boundConstants ==
null || boundConstants.All(n => n !=
null));
3661 Debug.Assert(patterns ==
null || patterns.All(p => p !=
null));
3662 Debug.Assert(noPatterns ==
null || noPatterns.All(np => np !=
null));
3666 return MkForall(boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3668 return MkExists(boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3691 Debug.Assert(sorts !=
null);
3692 Debug.Assert(names !=
null);
3693 Debug.Assert(body !=
null);
3694 Debug.Assert(sorts.Length == names.Length);
3695 Debug.Assert(sorts.All(s => s !=
null));
3696 Debug.Assert(names.All(n => n !=
null));
3697 return new Lambda(
this, sorts, names, body);
3710 Debug.Assert(body !=
null);
3711 Debug.Assert(boundConstants !=
null && boundConstants.All(b => b !=
null));
3712 return new Lambda(
this, boundConstants, body);
3739 get {
return m_print_mode; }
3742 Native.Z3_set_ast_print_mode(nCtx, (uint)value);
3743 m_print_mode = value;
3748 #region SMT Files & Strings
3757 uint csn =
Symbol.ArrayLength(sortNames);
3758 uint cs =
Sort.ArrayLength(sorts);
3759 uint cdn =
Symbol.ArrayLength(declNames);
3760 uint cd =
AST.ArrayLength(decls);
3761 if (csn != cs || cdn != cd)
3763 using ASTVector assertions =
new ASTVector(
this, Native.Z3_parse_smtlib2_string(nCtx, str,
3764 AST.ArrayLength(sorts),
Symbol.ArrayToNative(sortNames),
AST.ArrayToNative(sorts),
3765 AST.ArrayLength(decls),
Symbol.ArrayToNative(declNames),
AST.ArrayToNative(decls)));
3766 return assertions.ToBoolExprArray();
3776 uint csn =
Symbol.ArrayLength(sortNames);
3777 uint cs =
Sort.ArrayLength(sorts);
3778 uint cdn =
Symbol.ArrayLength(declNames);
3779 uint cd =
AST.ArrayLength(decls);
3780 if (csn != cs || cdn != cd)
3782 using ASTVector assertions =
new ASTVector(
this, Native.Z3_parse_smtlib2_file(nCtx, fileName,
3783 AST.ArrayLength(sorts),
Symbol.ArrayToNative(sortNames),
AST.ArrayToNative(sorts),
3784 AST.ArrayLength(decls),
Symbol.ArrayToNative(declNames),
AST.ArrayToNative(decls)));
3785 return assertions.ToBoolExprArray();
3800 Debug.Assert(assumptions !=
null);
3801 Debug.Assert(formula !=
null);
3803 return Native.Z3_benchmark_to_smtlib_string(
3809 (uint)(assumptions?.Length ?? 0),
3810 AST.ArrayToNative(assumptions),
3811 formula.NativeObject);
3826 public Goal MkGoal(
bool models =
true,
bool unsatCores =
false,
bool proofs =
false)
3829 return new Goal(
this, models, unsatCores, proofs);
3833 #region ParameterSets
3850 get {
return Native.Z3_get_num_tactics(nCtx); }
3862 string[] res =
new string[n];
3863 for (uint i = 0; i < n; i++)
3864 res[i] = Native.Z3_get_tactic_name(nCtx, i);
3875 return Native.Z3_tactic_get_descr(nCtx, name);
3884 return new Tactic(
this, name);
3893 Debug.Assert(t1 !=
null);
3894 Debug.Assert(t2 !=
null);
3898 CheckContextMatch(t1);
3899 CheckContextMatch(t2);
3900 CheckContextMatch<Tactic>(ts);
3902 IntPtr last = IntPtr.Zero;
3903 if (ts !=
null && ts.Length > 0)
3905 last = ts[ts.Length - 1].NativeObject;
3906 for (
int i = ts.Length - 2; i >= 0; i--)
3907 last = Native.Z3_tactic_and_then(nCtx, ts[i].NativeObject, last);
3909 if (last != IntPtr.Zero)
3911 last = Native.Z3_tactic_and_then(nCtx, t2.NativeObject, last);
3912 return new Tactic(
this, Native.Z3_tactic_and_then(nCtx, t1.NativeObject, last));
3915 return new Tactic(
this, Native.Z3_tactic_and_then(nCtx, t1.NativeObject, t2.NativeObject));
3927 Debug.Assert(t1 !=
null);
3928 Debug.Assert(t2 !=
null);
3940 Debug.Assert(t1 !=
null);
3941 Debug.Assert(t2 !=
null);
3943 CheckContextMatch(t1);
3944 CheckContextMatch(t2);
3945 return new Tactic(
this, Native.Z3_tactic_or_else(nCtx, t1.NativeObject, t2.NativeObject));
3956 Debug.Assert(t !=
null);
3958 CheckContextMatch(t);
3959 return new Tactic(
this, Native.Z3_tactic_try_for(nCtx, t.NativeObject, ms));
3971 Debug.Assert(p !=
null);
3972 Debug.Assert(t !=
null);
3974 CheckContextMatch(t);
3975 CheckContextMatch(p);
3976 return new Tactic(
this, Native.Z3_tactic_when(nCtx, p.NativeObject, t.NativeObject));
3985 Debug.Assert(p !=
null);
3986 Debug.Assert(t1 !=
null);
3987 Debug.Assert(t2 !=
null);
3989 CheckContextMatch(p);
3990 CheckContextMatch(t1);
3991 CheckContextMatch(t2);
3992 return new Tactic(
this, Native.Z3_tactic_cond(nCtx, p.NativeObject, t1.NativeObject, t2.NativeObject));
4001 Debug.Assert(t !=
null);
4003 CheckContextMatch(t);
4004 return new Tactic(
this, Native.Z3_tactic_repeat(nCtx, t.NativeObject, max));
4013 return new Tactic(
this, Native.Z3_tactic_skip(nCtx));
4022 return new Tactic(
this, Native.Z3_tactic_fail(nCtx));
4030 Debug.Assert(p !=
null);
4032 CheckContextMatch(p);
4033 return new Tactic(
this, Native.Z3_tactic_fail_if(nCtx, p.NativeObject));
4043 return new Tactic(
this, Native.Z3_tactic_fail_if_not_decided(nCtx));
4051 Debug.Assert(t !=
null);
4052 Debug.Assert(p !=
null);
4054 CheckContextMatch(t);
4055 CheckContextMatch(p);
4056 return new Tactic(
this, Native.Z3_tactic_using_params(nCtx, t.NativeObject, p.NativeObject));
4065 Debug.Assert(t !=
null);
4066 Debug.Assert(p !=
null);
4076 Debug.Assert(t ==
null || t.All(tactic => tactic !=
null));
4078 CheckContextMatch<Tactic>(t);
4079 return new Tactic(
this, Native.Z3_tactic_par_or(nCtx,
Tactic.ArrayLength(t),
Tactic.ArrayToNative(t)));
4088 Debug.Assert(t1 !=
null);
4089 Debug.Assert(t2 !=
null);
4091 CheckContextMatch(t1);
4092 CheckContextMatch(t2);
4093 return new Tactic(
this, Native.Z3_tactic_par_and_then(nCtx, t1.NativeObject, t2.NativeObject));
4102 Native.Z3_interrupt(nCtx);
4106 #region Quantifier Elimination
4120 CheckContextMatch(vars);
4121 CheckContextMatch(body);
4122 return Expr.Create(
this, Native.Z3_qe_lite(nCtx, vars.NativeObject, body.NativeObject));
4130 CheckContextMatch(model);
4131 CheckContextMatch<Expr>(bounds);
4132 CheckContextMatch(body);
4133 return Expr.Create(
this, Native.Z3_qe_model_project(nCtx, model.NativeObject,
4134 (uint)bounds.Length,
AST.ArrayToNative(bounds), body.NativeObject));
4142 CheckContextMatch(model);
4143 CheckContextMatch<Expr>(bounds);
4144 CheckContextMatch(body);
4145 CheckContextMatch(map);
4146 return Expr.Create(
this, Native.Z3_qe_model_project_skolem(nCtx, model.NativeObject,
4147 (uint)bounds.Length,
AST.ArrayToNative(bounds), body.NativeObject, map.NativeObject));
4155 CheckContextMatch(model);
4156 CheckContextMatch<Expr>(bounds);
4157 CheckContextMatch(body);
4158 CheckContextMatch(map);
4159 return Expr.Create(
this, Native.Z3_qe_model_project_with_witness(nCtx, model.NativeObject,
4160 (uint)bounds.Length,
AST.ArrayToNative(bounds), body.NativeObject, map.NativeObject));
4170 get {
return Native.Z3_get_num_simplifiers(nCtx); }
4182 string[] res =
new string[n];
4183 for (uint i = 0; i < n; i++)
4184 res[i] = Native.Z3_get_simplifier_name(nCtx, i);
4195 return Native.Z3_simplifier_get_descr(nCtx, name);
4213 Debug.Assert(t1 !=
null);
4214 Debug.Assert(t2 !=
null);
4218 CheckContextMatch(t1);
4219 CheckContextMatch(t2);
4220 CheckContextMatch<Simplifier>(ts);
4222 IntPtr last = IntPtr.Zero;
4223 if (ts !=
null && ts.Length > 0)
4225 last = ts[ts.Length - 1].NativeObject;
4226 for (
int i = ts.Length - 2; i >= 0; i--)
4227 last = Native.Z3_simplifier_and_then(nCtx, ts[i].NativeObject, last);
4229 if (last != IntPtr.Zero)
4231 last = Native.Z3_simplifier_and_then(nCtx, t2.NativeObject, last);
4232 return new Simplifier(
this, Native.Z3_simplifier_and_then(nCtx, t1.NativeObject, last));
4235 return new Simplifier(
this, Native.Z3_simplifier_and_then(nCtx, t1.NativeObject, t2.NativeObject));
4247 Debug.Assert(t1 !=
null);
4248 Debug.Assert(t2 !=
null);
4259 Debug.Assert(t !=
null);
4260 Debug.Assert(p !=
null);
4262 CheckContextMatch(t);
4263 CheckContextMatch(p);
4264 return new Simplifier(
this, Native.Z3_simplifier_using_params(nCtx, t.NativeObject, p.NativeObject));
4274 get {
return Native.Z3_get_num_probes(nCtx); }
4286 string[] res =
new string[n];
4287 for (uint i = 0; i < n; i++)
4288 res[i] = Native.Z3_get_probe_name(nCtx, i);
4299 return Native.Z3_probe_get_descr(nCtx, name);
4308 return new Probe(
this, name);
4317 return new Probe(
this, Native.Z3_probe_const(nCtx, val));
4326 Debug.Assert(p1 !=
null);
4327 Debug.Assert(p2 !=
null);
4329 CheckContextMatch(p1);
4330 CheckContextMatch(p2);
4331 return new Probe(
this, Native.Z3_probe_lt(nCtx, p1.NativeObject, p2.NativeObject));
4340 Debug.Assert(p1 !=
null);
4341 Debug.Assert(p2 !=
null);
4343 CheckContextMatch(p1);
4344 CheckContextMatch(p2);
4345 return new Probe(
this, Native.Z3_probe_gt(nCtx, p1.NativeObject, p2.NativeObject));
4354 Debug.Assert(p1 !=
null);
4355 Debug.Assert(p2 !=
null);
4357 CheckContextMatch(p1);
4358 CheckContextMatch(p2);
4359 return new Probe(
this, Native.Z3_probe_le(nCtx, p1.NativeObject, p2.NativeObject));
4368 Debug.Assert(p1 !=
null);
4369 Debug.Assert(p2 !=
null);
4371 CheckContextMatch(p1);
4372 CheckContextMatch(p2);
4373 return new Probe(
this, Native.Z3_probe_ge(nCtx, p1.NativeObject, p2.NativeObject));
4382 Debug.Assert(p1 !=
null);
4383 Debug.Assert(p2 !=
null);
4385 CheckContextMatch(p1);
4386 CheckContextMatch(p2);
4387 return new Probe(
this, Native.Z3_probe_eq(nCtx, p1.NativeObject, p2.NativeObject));
4396 Debug.Assert(p1 !=
null);
4397 Debug.Assert(p2 !=
null);
4399 CheckContextMatch(p1);
4400 CheckContextMatch(p2);
4401 return new Probe(
this, Native.Z3_probe_and(nCtx, p1.NativeObject, p2.NativeObject));
4410 Debug.Assert(p1 !=
null);
4411 Debug.Assert(p2 !=
null);
4413 CheckContextMatch(p1);
4414 CheckContextMatch(p2);
4415 return new Probe(
this, Native.Z3_probe_or(nCtx, p1.NativeObject, p2.NativeObject));
4424 Debug.Assert(p !=
null);
4426 CheckContextMatch(p);
4427 return new Probe(
this, Native.Z3_probe_not(nCtx, p.NativeObject));
4444 return new Solver(
this, Native.Z3_mk_solver(nCtx));
4446 return new Solver(
this, Native.Z3_mk_solver_for_logic(nCtx, logic.NativeObject));
4455 using var symbol =
MkSymbol(logic);
4465 return new Solver(
this, Native.Z3_mk_simple_solver(nCtx));
4474 Debug.Assert(s !=
null);
4475 return new Solver(
this, Native.Z3_solver_add_simplifier(nCtx, s.NativeObject, t.NativeObject));
4489 return new Solver(
this, Native.Z3_mk_solver_from_tactic(nCtx, t.NativeObject));
4506 #region Optimization
4517 #region Floating-Point Arithmetic
4519 #region Rounding Modes
4520 #region RoundingMode Sort
4536 return new FPRMExpr(
this, Native.Z3_mk_fpa_round_nearest_ties_to_even(nCtx));
4544 return new FPRMNum(
this, Native.Z3_mk_fpa_rne(nCtx));
4552 return new FPRMNum(
this, Native.Z3_mk_fpa_round_nearest_ties_to_away(nCtx));
4560 return new FPRMNum(
this, Native.Z3_mk_fpa_rna(nCtx));
4568 return new FPRMNum(
this, Native.Z3_mk_fpa_round_toward_positive(nCtx));
4576 return new FPRMNum(
this, Native.Z3_mk_fpa_rtp(nCtx));
4584 return new FPRMNum(
this, Native.Z3_mk_fpa_round_toward_negative(nCtx));
4592 return new FPRMNum(
this, Native.Z3_mk_fpa_rtn(nCtx));
4600 return new FPRMNum(
this, Native.Z3_mk_fpa_round_toward_zero(nCtx));
4608 return new FPRMNum(
this, Native.Z3_mk_fpa_rtz(nCtx));
4613 #region FloatingPoint Sorts
4621 return new FPSort(
this, ebits, sbits);
4629 return new FPSort(
this, Native.Z3_mk_fpa_sort_half(nCtx));
4637 return new FPSort(
this, Native.Z3_mk_fpa_sort_16(nCtx));
4645 return new FPSort(
this, Native.Z3_mk_fpa_sort_single(nCtx));
4653 return new FPSort(
this, Native.Z3_mk_fpa_sort_32(nCtx));
4661 return new FPSort(
this, Native.Z3_mk_fpa_sort_double(nCtx));
4669 return new FPSort(
this, Native.Z3_mk_fpa_sort_64(nCtx));
4677 return new FPSort(
this, Native.Z3_mk_fpa_sort_quadruple(nCtx));
4685 return new FPSort(
this, Native.Z3_mk_fpa_sort_128(nCtx));
4696 return new FPNum(
this, Native.Z3_mk_fpa_nan(nCtx, s.NativeObject));
4706 return new FPNum(
this, Native.Z3_mk_fpa_inf(nCtx, s.NativeObject, (
byte)(negative ? 1 : 0)));
4716 return new FPNum(
this, Native.Z3_mk_fpa_zero(nCtx, s.NativeObject, (
byte)(negative ? 1 : 0)));
4726 return new FPNum(
this, Native.Z3_mk_fpa_numeral_float(nCtx, v, s.NativeObject));
4736 return new FPNum(
this, Native.Z3_mk_fpa_numeral_double(nCtx, v, s.NativeObject));
4746 return new FPNum(
this, Native.Z3_mk_fpa_numeral_int(nCtx, v, s.NativeObject));
4758 return new FPNum(
this, Native.Z3_mk_fpa_numeral_int_uint(nCtx, (
byte)(sgn ? 1 : 0), exp, sig, s.NativeObject));
4770 return new FPNum(
this, Native.Z3_mk_fpa_numeral_int64_uint64(nCtx, (
byte)(sgn ? 1 : 0), exp, sig, s.NativeObject));
4836 return new FPExpr(
this, Native.Z3_mk_fpa_abs(
this.nCtx, t.NativeObject));
4845 return new FPExpr(
this, Native.Z3_mk_fpa_neg(
this.nCtx, t.NativeObject));
4856 return new FPExpr(
this, Native.Z3_mk_fpa_add(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4867 return new FPExpr(
this, Native.Z3_mk_fpa_sub(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4878 return new FPExpr(
this, Native.Z3_mk_fpa_mul(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4889 return new FPExpr(
this, Native.Z3_mk_fpa_div(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4904 return new FPExpr(
this, Native.Z3_mk_fpa_fma(
this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject, t3.NativeObject));
4914 return new FPExpr(
this, Native.Z3_mk_fpa_sqrt(
this.nCtx, rm.NativeObject, t.NativeObject));
4924 return new FPExpr(
this, Native.Z3_mk_fpa_rem(
this.nCtx, t1.NativeObject, t2.NativeObject));
4935 return new FPExpr(
this, Native.Z3_mk_fpa_round_to_integral(
this.nCtx, rm.NativeObject, t.NativeObject));
4945 return new FPExpr(
this, Native.Z3_mk_fpa_min(
this.nCtx, t1.NativeObject, t2.NativeObject));
4955 return new FPExpr(
this, Native.Z3_mk_fpa_max(
this.nCtx, t1.NativeObject, t2.NativeObject));
4965 return new BoolExpr(
this, Native.Z3_mk_fpa_leq(
this.nCtx, t1.NativeObject, t2.NativeObject));
4975 return new BoolExpr(
this, Native.Z3_mk_fpa_lt(
this.nCtx, t1.NativeObject, t2.NativeObject));
4985 return new BoolExpr(
this, Native.Z3_mk_fpa_geq(
this.nCtx, t1.NativeObject, t2.NativeObject));
4995 return new BoolExpr(
this, Native.Z3_mk_fpa_gt(
this.nCtx, t1.NativeObject, t2.NativeObject));
5008 return new BoolExpr(
this, Native.Z3_mk_fpa_eq(
this.nCtx, t1.NativeObject, t2.NativeObject));
5017 return new BoolExpr(
this, Native.Z3_mk_fpa_is_normal(
this.nCtx, t.NativeObject));
5026 return new BoolExpr(
this, Native.Z3_mk_fpa_is_subnormal(
this.nCtx, t.NativeObject));
5035 return new BoolExpr(
this, Native.Z3_mk_fpa_is_zero(
this.nCtx, t.NativeObject));
5044 return new BoolExpr(
this, Native.Z3_mk_fpa_is_infinite(
this.nCtx, t.NativeObject));
5053 return new BoolExpr(
this, Native.Z3_mk_fpa_is_nan(
this.nCtx, t.NativeObject));
5062 return new BoolExpr(
this, Native.Z3_mk_fpa_is_negative(
this.nCtx, t.NativeObject));
5071 return new BoolExpr(
this, Native.Z3_mk_fpa_is_positive(
this.nCtx, t.NativeObject));
5075 #region Conversions to FloatingPoint terms
5091 return new FPExpr(
this, Native.Z3_mk_fpa_fp(
this.nCtx, sgn.NativeObject, sig.NativeObject, exp.NativeObject));
5107 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_bv(
this.nCtx, bv.NativeObject, s.NativeObject));
5123 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_float(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5139 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_real(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5158 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_signed(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5160 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_unsigned(
this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5175 return new FPExpr(
this, Native.Z3_mk_fpa_to_fp_float(
this.nCtx, s.NativeObject, rm.NativeObject, t.NativeObject));
5179 #region Conversions from FloatingPoint terms
5195 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_sbv(
this.nCtx, rm.NativeObject, t.NativeObject, sz));
5197 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_ubv(
this.nCtx, rm.NativeObject, t.NativeObject, sz));
5211 return new RealExpr(
this, Native.Z3_mk_fpa_to_real(
this.nCtx, t.NativeObject));
5215 #region Z3-specific extensions
5228 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_ieee_bv(
this.nCtx, t.NativeObject));
5245 return new BitVecExpr(
this, Native.Z3_mk_fpa_to_fp_int_real(
this.nCtx, rm.NativeObject, exp.NativeObject, sig.NativeObject, s.NativeObject));
5250 #region Miscellaneous
5263 return AST.Create(
this, nativeObject);
5279 return a.NativeObject;
5289 return new FuncDecl(
this, Native.Z3_mk_partial_order(
this.nCtx, a.NativeObject, index));
5299 return new FuncDecl(
this, Native.Z3_mk_transitive_closure(
this.nCtx, f.NativeObject));
5314 CheckContextMatch(p);
5315 CheckContextMatch(q);
5316 CheckContextMatch(x);
5317 return new ASTVector(
this, Native.Z3_polynomial_subresultants(
this.nCtx, p.NativeObject, q.NativeObject, x.NativeObject));
5326 return Native.Z3_simplify_get_help(nCtx);
5334 get {
return new ParamDescrs(
this, Native.Z3_simplify_get_param_descrs(nCtx)); }
5338 #region Error Handling
5366 Native.Z3_update_param_value(nCtx,
id, value);
5372 internal IntPtr m_ctx = IntPtr.Zero;
5373 internal Native.Z3_error_handler m_n_err_handler =
null;
5374 internal static Object creation_lock =
new Object();
5375 internal IntPtr nCtx {
get {
return m_ctx; } }
5380 private const long NativeMemoryPressureEstimate = 8 * 1024 * 1024;
5381 private bool m_memPressureAdded =
false;
5383 internal void NativeErrorHandler(IntPtr ctx,
Z3_error_code errorCode)
5388 internal void InitContext()
5391 m_n_err_handler =
new Native.Z3_error_handler(NativeErrorHandler);
5392 Native.Z3_set_error_handler(m_ctx, m_n_err_handler);
5395 GC.AddMemoryPressure(NativeMemoryPressureEstimate);
5396 m_memPressureAdded =
true;
5400 internal void CheckContextMatch(Z3Object other)
5402 Debug.Assert(other !=
null);
5404 if (!ReferenceEquals(
this, other.Context))
5405 throw new Z3Exception(
"Context mismatch");
5408 internal void CheckContextMatch(Z3Object other1, Z3Object other2)
5410 Debug.Assert(other1 !=
null);
5411 Debug.Assert(other2 !=
null);
5412 CheckContextMatch(other1);
5413 CheckContextMatch(other2);
5416 internal void CheckContextMatch(Z3Object other1, Z3Object other2, Z3Object other3)
5418 Debug.Assert(other1 !=
null);
5419 Debug.Assert(other2 !=
null);
5420 Debug.Assert(other3 !=
null);
5421 CheckContextMatch(other1);
5422 CheckContextMatch(other2);
5423 CheckContextMatch(other3);
5426 internal void CheckContextMatch(Z3Object[] arr)
5428 Debug.Assert(arr ==
null || arr.All(a => a !=
null));
5432 foreach (Z3Object a
in arr)
5434 Debug.Assert(a !=
null);
5435 CheckContextMatch(a);
5440 internal void CheckContextMatch<T>(IEnumerable<T> arr) where T : Z3Object
5442 Debug.Assert(arr ==
null || arr.All(a => a !=
null));
5446 foreach (Z3Object a
in arr)
5448 Debug.Assert(a !=
null);
5449 CheckContextMatch(a);
5454 private void ObjectInvariant()
5475 if (m_boolSort !=
null) m_boolSort.Dispose();
5476 if (m_intSort !=
null) m_intSort.Dispose();
5477 if (m_realSort !=
null) m_realSort.Dispose();
5478 if (m_complexSort !=
null) m_complexSort.Dispose();
5479 if (m_stringSort !=
null) m_stringSort.Dispose();
5480 if (m_charSort !=
null) m_charSort.Dispose();
5484 m_complexSort =
null;
5485 m_stringSort =
null;
5487 if (m_ctx != IntPtr.Zero)
5491 GC.SuppressFinalize(
this);
5497 Native.Z3_error_handler errHandler;
5501 errHandler = m_n_err_handler;
5502 m_n_err_handler =
null;
5503 m_ctx = IntPtr.Zero;
5507 if (ctx != IntPtr.Zero)
5511 Native.Z3_del_context(ctx);
5512 GC.KeepAlive(errHandler);
5514 if (m_memPressureAdded)
5516 GC.RemoveMemoryPressure(NativeMemoryPressureEstimate);
5517 m_memPressureAdded =
false;
The abstract syntax tree (AST) class.
Arithmetic expressions (Int, Real, or Complex). Ordering requires Int or Real.
A Complex expression. Complex numbers have no ordering.
A Complex sort, representing pairs of Reals.
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 .
ComplexExpr MkComplexConst(string name)
Creates a Complex constant.
DatatypeSort MkPolymorphicDatatypeSort(Symbol name, Sort[] typeParams, Constructor[] constructors)
Create a polymorphic datatype sort with explicit type parameters. Type parameters should be sorts cre...
BoolSort BoolSort
Retrieves the Boolean sort of the context.
Expr MkFiniteSetUnion(Expr s1, Expr s2)
Create the union of two finite sets.
BitVecNum MkBV(bool[] bits)
Create a bit-vector numeral.
FiniteDomainSort MkFiniteDomainSort(Symbol name, ulong size)
Create a new finite domain sort. The result is a sort
BoolExpr MkStringLe(SeqExpr s1, SeqExpr s2)
Check if the string s1 is lexicographically less or equal to s2.
FPSort MkFPSort(uint ebits, uint sbits)
Create a FloatingPoint sort.
Tactic With(Tactic t, Params p)
Create a tactic that applies t using the given set of parameters p .
string[] TacticNames
The names of all supported tactics.
BoolExpr MkIsDigit(Expr ch)
Create a check if the character is a digit.
ArithExpr MkAdd(params ArithExpr[] ts)
Create an expression representing t[0] + t[1] + ....
FPExpr MkFPAdd(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point addition.
BitVecExpr MkBVRotateLeft(BitVecExpr t1, BitVecExpr t2)
Rotate Left.
RealExpr MkRealConst(string name)
Creates a real constant.
RatNum MkReal(uint v)
Create a real numeral.
Probe Gt(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value returned by p1 is greater than the value retu...
BitVecExpr MkBVLSHR(BitVecExpr t1, BitVecExpr t2)
Logical shift right.
FPRMSort MkFPRoundingModeSort()
Create the floating-point RoundingMode sort.
RealExpr MkFPToReal(FPExpr t)
Conversion of a floating-point term into a real-numbered term.
FiniteSetSort MkFiniteSetSort(Sort elemSort)
Create a finite set sort over the given element sort.
TupleSort MkTupleSort(Symbol name, Symbol[] fieldNames, Sort[] fieldSorts)
Create a new tuple sort.
Lambda MkLambda(Expr[] boundConstants, Expr body)
Create a lambda expression.
BitVecSort MkBitVecSort(uint size)
Create a new bit-vector sort.
BoolExpr MkBVMulNoUnderflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise multiplication does not underflow.
Expr MkFiniteSetSingleton(Expr elem)
Create a singleton finite set.
ReExpr MkDiff(ReExpr a, ReExpr b)
Create a difference regular expression.
ArrayExpr MkFullSet(Sort domain)
Create the full set.
FPSort MkFPSortQuadruple()
Create the quadruple-precision (128-bit) FloatingPoint sort.
BoolExpr MkLe(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 <= t2
Probe ConstProbe(double val)
Create a probe that always evaluates to val .
Expr MkFreshConst(string prefix, Sort range)
Creates a fresh Constant of sort range and a name prefixed with prefix .
BoolExpr MkOr(params BoolExpr[] ts)
Create an expression representing t[0] or t[1] or ....
IntExpr MkReal2Int(RealExpr t)
Coerce a real to an integer.
UninterpretedSort MkUninterpretedSort(Symbol s)
Create a new uninterpreted sort.
FPSort MkFPSortHalf()
Create the half-precision (16-bit) FloatingPoint sort.
Quantifier MkForall(Expr[] boundConstants, Expr body, uint weight=1, Pattern[] patterns=null, Expr[] noPatterns=null, Symbol quantifierID=null, Symbol skolemID=null)
Create a universal Quantifier.
ArrayExpr MkSetDifference(ArrayExpr arg1, ArrayExpr arg2)
Take the difference between two sets.
BoolExpr MkXor(BoolExpr t1, BoolExpr t2)
Create an expression representing t1 xor t2.
Expr MkNumeral(long v, Sort ty)
Create a Term of a given sort. This function can be used to create numerals that fit in a machine int...
Expr MkITE(BoolExpr t1, Expr t2, Expr t3)
Create an expression representing an if-then-else: ite(t1, t2, t3).
IntNum MkInt(uint v)
Create an integer numeral.
Expr QeLite(ASTVector vars, Expr body)
Performs best-effort quantifier elimination for the variables in vars .
IntExpr MkIntConst(Symbol name)
Creates an integer constant.
AST WrapAST(IntPtr nativeObject)
Wraps an AST.
FuncDecl MkPartialOrder(Sort a, uint index)
Create a partial order relation over a sort.
SeqExpr IntToString(Expr e)
Convert an integer expression to a string.
FPExpr MkFPMax(FPExpr t1, FPExpr t2)
Maximum of floating-point numbers.
ArithExpr MkUnaryMinus(ArithExpr t)
Create an expression representing -t.
BitVecExpr MkFPToIEEEBV(FPExpr t)
Conversion of a floating-point term into a bit-vector term in IEEE 754-2008 format.
Constructor MkConstructor(Symbol name, Symbol recognizer, Symbol[] fieldNames=null, Sort[] sorts=null, uint[] sortRefs=null)
Create a datatype constructor.
IntSort IntSort
Retrieves the Integer sort of the context.
BoolExpr MkSuffixOf(SeqExpr s1, SeqExpr s2)
Check for sequence suffix.
SeqExpr MkConcat(params SeqExpr[] t)
Concatenate sequences.
FuncDecl MkFuncDecl(string name, Sort domain, Sort range)
Creates a new function declaration.
BoolExpr MkNot(BoolExpr a)
Mk an expression representing not(a).
FuncDecl MkFuncDecl(string name, Sort[] domain, Sort range)
Creates a new function declaration.
FuncDecl MkUserPropagatorFuncDecl(string name, Sort[] domain, Sort range)
Declare a function to be processed by the user propagator plugin.
Expr MkTermArray(ArrayExpr array)
Access the array default value.
BitVecExpr MkBVSRem(BitVecExpr t1, BitVecExpr t2)
Signed remainder.
Simplifier UsingParams(Simplifier t, Params p)
Create a tactic that applies t using the given set of parameters p .
BitVecExpr MkBVRedOR(BitVecExpr t)
Take disjunction of bits in a vector, return vector of length 1.
Tactic MkTactic(string name)
Creates a new Tactic.
BoolExpr MkFPLEq(FPExpr t1, FPExpr t2)
Floating-point less than or equal.
string BenchmarkToSmtlibString(string name, string logic, string status, string attributes, BoolExpr[] assumptions, BoolExpr formula)
Convert a benchmark into SMT-LIB2 formatted string.
ComplexExpr MkComplexConst(Symbol name)
Creates a Complex constant.
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 .
ComplexSort ComplexSort
Retrieves the Complex sort of the context.
string[] SimplifierNames
The names of all supported tactics.
BoolExpr MkBVNegNoOverflow(BitVecExpr t)
Create a predicate that checks that the bit-wise negation does not overflow.
ListSort MkListSort(string name, Sort elemSort)
Create a new list sort.
uint NumTactics
The number of supported tactics.
SeqExpr UbvToString(Expr e)
Convert a bit-vector expression, represented as an unsigned number, to a string.
ReExpr MkConcat(params ReExpr[] t)
Create the concatenation of regular languages.
BoolExpr MkBVULT(BitVecExpr t1, BitVecExpr t2)
Unsigned less-than.
BoolExpr MkBVMulNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
Create a predicate that checks that the bit-wise multiplication does not overflow.
FuncDecl MkConstDecl(Symbol name, Sort range)
Creates a new constant function declaration.
BoolExpr MkXor(IEnumerable< BoolExpr > args)
Create an expression representing t1 xor t2 xor t3 ... .
BitVecExpr MkBVSDiv(BitVecExpr t1, BitVecExpr t2)
Signed division.
ParamDescrs SimplifyParameterDescriptions
Retrieves parameter descriptions for simplifier.
BitVecNum MkBV(ulong v, uint size)
Create a bit-vector numeral.
FPExpr MkFPFMA(FPRMExpr rm, FPExpr t1, FPExpr t2, FPExpr t3)
Floating-point fused multiply-add.
BoolExpr MkFPIsInfinite(FPExpr t)
Predicate indicating whether t is a floating-point number representing +oo or -oo.
BitVecExpr MkInt2BV(uint n, IntExpr t)
Create an n bit bit-vector from the integer argument t .
BoolExpr MkTrue()
The true Term.
FPExpr MkFPSub(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point subtraction.
FPNum MkFPNumeral(double v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
FPExpr MkFPToFP(BitVecExpr bv, FPSort s)
Conversion of a single IEEE 754-2008 bit-vector into a floating-point number.
ReExpr MkUnion(params ReExpr[] t)
Create the union of regular languages.
RatNum MkReal(ulong v)
Create a real numeral.
BoolExpr MkBoolConst(Symbol name)
Create a Boolean constant.
ReExpr MkEmptyRe(Sort s)
Create the empty regular expression. The sort s should be a regular expression.
FuncDecl MkTransitiveClosure(FuncDecl f)
Create the transitive closure of a binary relation.
Expr MkNth(SeqExpr s, Expr index)
Retrieve element at index.
Expr MkSeqMap(Expr f, SeqExpr s)
Map function f over the sequence s.
FPSort MkFPSortSingle()
Create the single-precision (32-bit) FloatingPoint sort.
IntPtr UnwrapAST(AST a)
Unwraps an AST.
IntExpr MkMod(IntExpr t1, IntExpr t2)
Create an expression representing t1 mod t2.
BoolExpr MkPBLe(int[] coeffs, BoolExpr[] args, int k)
Create a pseudo-Boolean less-or-equal constraint.
IntNum MkInt(string v)
Create an integer numeral.
Expr MkConst(FuncDecl f)
Creates a fresh constant from the FuncDecl f .
FPRMNum MkFPRTZ()
Create a numeral of RoundingMode sort which represents the RoundTowardZero rounding mode.
Tactic TryFor(Tactic t, uint ms)
Create a tactic that applies t to a goal for ms milliseconds.
BoolExpr MkImplies(BoolExpr t1, BoolExpr t2)
Create an expression representing t1 -> t2.
BoolExpr MkBVSubNoUnderflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
Create a predicate that checks that the bit-wise subtraction does not underflow.
Expr MkSelect(ArrayExpr a, Expr i)
Array read.
ArrayExpr MkSetUnion(params ArrayExpr[] args)
Take the union of a list of sets.
IntExpr MkIndexOf(SeqExpr s, SeqExpr substr, ArithExpr offset)
Extract index of sub-string starting at offset.
Expr MkFiniteSetDifference(Expr s1, Expr s2)
Create the difference of two finite sets.
BoolExpr MkBoolConst(string name)
Create a Boolean constant.
Expr MkApp(FuncDecl f, params Expr[] args)
Create a new function application.
BitVecExpr MkBVSMod(BitVecExpr t1, BitVecExpr t2)
Two's complement signed remainder (sign follows divisor).
Probe Or(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value p1 or p2 evaluate to "true".
BitVecExpr MkRepeat(uint i, BitVecExpr t)
Bit-vector repetition.
BoolExpr MkDistinct(IEnumerable< Expr > args)
Creates a distinct term.
FuncDecl MkFuncDecl(Symbol name, Sort domain, Sort range)
Creates a new function declaration.
BoolExpr MkFPGt(FPExpr t1, FPExpr t2)
Floating-point greater than.
BoolExpr MkAtMost(IEnumerable< BoolExpr > args, uint k)
Create an at-most-k constraint.
Tactic ParAndThen(Tactic t1, Tactic t2)
Create a tactic that applies t1 to a given goal and then t2 to every subgoal produced by t1 ....
Solver MkSolver(string logic)
Creates a new (incremental) solver.
Quantifier MkQuantifier(bool universal, Expr[] boundConstants, Expr body, uint weight=1, Pattern[] patterns=null, Expr[] noPatterns=null, Symbol quantifierID=null, Symbol skolemID=null)
Create a Quantifier.
ArrayExpr MkSetDel(ArrayExpr set, Expr element)
Remove an element from a set.
Expr MkUpdateField(FuncDecl field, Expr t, Expr v)
Update a datatype field at expression t with value v. The function performs a record update at t....
Probe Lt(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value returned by p1 is less than the value returne...
ReExpr MkRange(SeqExpr lo, SeqExpr hi)
Create a range expression.
BitVecNum MkBV(long v, uint size)
Create a bit-vector numeral.
Expr QeModelProjectSkolem(Model model, Expr[] bounds, Expr body, ASTMap map)
Projects bound applications and records Skolem terms in map .
BoolExpr MkBVSGT(BitVecExpr t1, BitVecExpr t2)
Two's complement signed greater-than.
Params MkParams()
Creates a new ParameterSet.
ArrayExpr MkSetIntersection(params ArrayExpr[] args)
Take the intersection of a list of sets.
FPNum MkFPNaN(FPSort s)
Create a NaN of sort s.
FPNum MkFP(bool sgn, Int64 exp, UInt64 sig, FPSort s)
Create a numeral of FloatingPoint sort from a sign bit and two 64-bit integers.
BoolExpr[] ParseSMTLIB2String(string str, Symbol[] sortNames=null, Sort[] sorts=null, Symbol[] declNames=null, FuncDecl[] decls=null)
Parse the given string using the SMT-LIB2 parser.
BitVecExpr MkBVNOR(BitVecExpr t1, BitVecExpr t2)
Bitwise NOR.
IntExpr CharToInt(Expr ch)
Create an integer (code point) from character.
BoolExpr MkDistinct(params Expr[] args)
Creates a distinct term.
FPExpr MkFPRoundToIntegral(FPRMExpr rm, FPExpr t)
Floating-point roundToIntegral. Rounds a floating-point number to the closest integer,...
Fixedpoint MkFixedpoint()
Create a Fixedpoint context.
RealExpr MkRealPart(ArithExpr value)
Returns the Real-valued real component of a Complex expression.
Expr MkSeqMapi(Expr f, Expr i, SeqExpr s)
Map function f over the sequence s at index i.
void UpdateParamValue(string id, string value)
Update a mutable configuration parameter.
DatatypeSort MkDatatypeSort(Symbol name, Constructor[] constructors)
Create a new datatype sort.
Expr QeModelProjectWithWitness(Model model, Expr[] bounds, Expr body, ASTMap map)
Projects bound applications and records witnesses in map .
void AddRecDef(FuncDecl f, Expr[] args, Expr body)
Bind a definition to a recursive function declaration. The function must have previously been created...
FPNum MkFPNumeral(float v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
ArrayExpr MkConstArray(Sort domain, Expr v)
Create a constant array.
ArrayExpr MkSetComplement(ArrayExpr arg)
Take the complement of a set.
ASTMap MkASTMap()
Creates an empty map from ASTs to ASTs.
BoolExpr MkSetSubset(ArrayExpr arg1, ArrayExpr arg2)
Check for subsetness of sets.
Probe Eq(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value returned by p1 is equal to the value returned...
FPRMNum MkFPRoundNearestTiesToAway()
Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode.
string[] ProbeNames
The names of all supported Probes.
Tactic AndThen(Tactic t1, Tactic t2, params Tactic[] ts)
Create a tactic that applies t1 to a Goal and then t2 to every subgoal produced by t1 .
BitVecExpr MkZeroExt(uint i, BitVecExpr t)
Bit-vector zero extension.
Z3_ast_print_mode PrintMode
Selects the format used for pretty-printing expressions.
void Dispose()
Disposes of the context.
BitVecExpr CharToBV(Expr ch)
Create a bit-vector (code point) from character.
SeqExpr SbvToString(Expr e)
Convert a bit-vector expression, represented as an signed number, to a string.
ArithExpr MkMul(IEnumerable< ArithExpr > ts)
Create an expression representing t[0] * t[1] * ....
ArrayExpr MkEmptySet(Sort domain)
Create an empty set.
Quantifier MkExists(Sort[] sorts, Symbol[] names, Expr body, uint weight=1, Pattern[] patterns=null, Expr[] noPatterns=null, Symbol quantifierID=null, Symbol skolemID=null)
Create an existential Quantifier.
UninterpretedSort MkUninterpretedSort(string str)
Create a new uninterpreted sort.
Expr MkNumeral(ulong v, Sort ty)
Create a Term of a given sort. This function can be used to create numerals that fit in a machine int...
ReExpr MkStar(ReExpr re)
Take the Kleene star of a regular expression.
BitVecExpr MkBVConst(string name, uint size)
Creates a bit-vector constant.
BitVecNum MkBV(uint v, uint size)
Create a bit-vector numeral.
Optimize MkOptimize()
Create an Optimization context.
Expr MkFiniteSetFilter(Expr f, Expr set)
Filter a finite set with a predicate.
Quantifier MkQuantifier(bool universal, Sort[] sorts, Symbol[] names, Expr body, uint weight=1, Pattern[] patterns=null, Expr[] noPatterns=null, Symbol quantifierID=null, Symbol skolemID=null)
Create a Quantifier.
Expr CharFromBV(BitVecExpr bv)
Create a character from a bit-vector (code point).
Expr MkArrayExt(ArrayExpr arg1, ArrayExpr arg2)
Create Extentionality index. Two arrays are equal if and only if they are equal on the index returned...
CharSort CharSort
Retrieves the character 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.
RealExpr MkImagPart(ArithExpr value)
Returns the Real-valued imaginary component of a Complex expression.
BoolExpr MkLt(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 < t2
FPNum MkFP(bool sgn, int exp, uint sig, FPSort s)
Create a numeral of FloatingPoint sort from a sign bit and two integers.
ListSort MkListSort(Symbol name, Sort elemSort)
Create a new list sort.
SeqExpr MkAt(SeqExpr s, Expr index)
Retrieve sequence of length one at index.
FPExpr MkFPToFP(FPSort s, FPRMExpr rm, FPExpr t)
Conversion of a floating-point number to another FloatingPoint sort s.
BoolExpr MkSetMembership(Expr elem, ArrayExpr set)
Check for set membership.
BitVecExpr MkBVRotateRight(BitVecExpr t1, BitVecExpr t2)
Rotate Right.
SeqExpr MkReplace(SeqExpr s, SeqExpr src, SeqExpr dst)
Replace the first occurrence of src by dst in s.
FPRMExpr MkFPRoundNearestTiesToEven()
Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
string ProbeDescription(string name)
Returns a string containing a description of the probe with the given name.
Pattern MkPattern(params Expr[] terms)
Create a quantifier pattern.
Probe And(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value p1 and p2 evaluate to "true".
Probe Le(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value returned by p1 is less than or equal the valu...
Expr QeModelProject(Model model, Expr[] bounds, Expr body)
Projects the bound applications from body using model .
FPExpr MkFPNeg(FPExpr t)
Floating-point negation.
FPSort MkFPSort32()
Create the single-precision (32-bit) FloatingPoint sort.
Expr MkConst(Symbol name, Sort range)
Creates a new Constant of sort range and named name .
BoolExpr MkAnd(params BoolExpr[] ts)
Create an expression representing t[0] and t[1] and ....
RealSort RealSort
Retrieves the Real sort of the context.
BoolExpr MkIsInteger(RealExpr t)
Creates an expression that checks whether a real number is an integer.
BitVecExpr MkBVXNOR(BitVecExpr t1, BitVecExpr t2)
Bitwise XNOR.
BoolExpr MkBVULE(BitVecExpr t1, BitVecExpr t2)
Unsigned less-than or equal to.
BoolExpr MkGe(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 >= t2
ASTVector PolynomialSubresultants(Expr p, Expr q, Expr x)
Return the nonzero subresultants of p and q with respect to the "variable" x.
FPNum MkFPNumeral(bool sgn, Int64 exp, UInt64 sig, FPSort s)
Create a numeral of FloatingPoint sort from a sign bit and two 64-bit integers.
BitVecExpr MkFPToBV(FPRMExpr rm, FPExpr t, uint sz, bool sign)
Conversion of a floating-point term into a bit-vector.
BoolExpr MkBVAddNoUnderflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise addition does not underflow.
BitVecNum MkBV(string v, uint size)
Create a bit-vector numeral.
ReExpr MkFullRe(Sort s)
Create the full regular expression. The sort s should be a regular expression.
Expr MkSeqFoldLeft(Expr f, Expr a, SeqExpr s)
Fold left the function f over the sequence s with initial value a.
BoolExpr MkFPIsSubnormal(FPExpr t)
Predicate indicating whether t is a subnormal floating-point number.
ArrayExpr MkArrayConst(Symbol name, Sort domain, Sort range)
Create an array constant.
BoolExpr MkFPIsZero(FPExpr t)
Predicate indicating whether t is a floating-point number with zero value, i.e., +0 or -0.
ReSort MkReSort(SeqSort s)
Create a new regular expression sort.
FPSort MkFPSortDouble()
Create the double-precision (64-bit) FloatingPoint sort.
string SimplifierDescription(string name)
Returns a string containing a description of the simplifier with the given name.
FPRMNum MkFPRoundTowardZero()
Create a numeral of RoundingMode sort which represents the RoundTowardZero rounding mode.
ArithExpr MkSub(params ArithExpr[] ts)
Create an expression representing t[0] - t[1] - ....
Goal MkGoal(bool models=true, bool unsatCores=false, bool proofs=false)
Creates a new Goal.
IntExpr MkBV2Int(BitVecExpr t, bool signed)
Create an integer from the bit-vector argument t .
BoolExpr MkInRe(SeqExpr s, ReExpr re)
Check for regular expression membership.
ArrayExpr MkSetAdd(ArrayExpr set, Expr element)
Add an element to the set.
BitVecExpr MkBVRedAND(BitVecExpr t)
Take conjunction of bits in a vector, return vector of length 1.
SeqExpr MkSeqPower(SeqExpr s, Expr n)
Retrieve the sequence s concatenated n times with itself.
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.
ComplexSort MkComplexSort()
Creates the Complex 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.
ComplexExpr MkComplex(ArithExpr real, ArithExpr imag)
Constructs a Complex expression from Int or Real components.
Quantifier MkForall(Sort[] sorts, Symbol[] names, Expr body, uint weight=1, Pattern[] patterns=null, Expr[] noPatterns=null, Symbol quantifierID=null, Symbol skolemID=null)
Create a universal Quantifier.
FPNum MkFP(double v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
BoolExpr MkFPIsNormal(FPExpr t)
Predicate indicating whether t is a normal floating-point number.
BoolExpr MkPrefixOf(SeqExpr s1, SeqExpr s2)
Check for sequence prefix.
BoolExpr MkFPIsPositive(FPExpr t)
Predicate indicating whether t is a positive floating-point number.
FloatingPoint Expressions.
FloatingPoint RoundingMode Expressions.
Floating-point rounding mode numerals.
The FloatingPoint RoundingMode sort.
Object for managing fixedpoints.
A goal (aka problem). A goal is essentially a set of formulas, that can be solved and/or transformed ...
A Model contains interpretations (assignments) of constants and functions.
Object for managing optimization context.
A ParamDescrs describes a set of parameters.
A Params objects represents a configuration in the form of Symbol/value pairs.
Patterns comprise a list of terms. The list should be non-empty. If the list comprises of more than o...
Probes are used to inspect a goal (aka problem) and collect information that may be used to decide wh...
Regular expression expressions.
A regular expression sort.
Simplifiers are the basic building block for creating custom solvers with incremental pre-processing....
void Assert(params BoolExpr[] constraints)
Assert a constraint (or multiple) into the solver.
The Sort class implements type information for ASTs.
Symbols are used to name several term and type constructors.
Tactics are the basic building block for creating custom solvers for specific problem domains....
The exception base class for error reporting from Z3.
Internal base class for interfacing with native Z3 objects. Should not be used externally.
Z3_ast_print_mode
Z3 pretty printing modes (See Z3_set_ast_print_mode).
Z3_error_code
Z3 error codes (See Z3_get_error_code).