Z3
 
Loading...
Searching...
No Matches
Context.cs
Go to the documentation of this file.
1/*++
2Copyright (c) 2012 Microsoft Corporation
3
4Module Name:
5
6 Context.cs
7
8Abstract:
9
10 Z3 Managed API: Context
11
12Author:
13
14 Christoph Wintersteiger (cwinter) 2012-03-15
15
16Notes:
17
18--*/
19
20using System;
21using System.Collections.Generic;
22using System.Diagnostics;
23using System.Linq;
24using System.Runtime.InteropServices;
25
26namespace Microsoft.Z3
27{
28
29 using Z3_context = System.IntPtr;
33 public class Context : IDisposable
34 {
35 #region Constructors
39 public Context()
40 : base()
41 {
42 lock (creation_lock)
43 {
44 m_ctx = Native.Z3_mk_context_rc(IntPtr.Zero);
45 Native.Z3_enable_concurrent_dec_ref(m_ctx);
46 InitContext();
47 }
48 }
49
68 public Context(Dictionary<string, string> settings)
69 : base()
70 {
71 Debug.Assert(settings != null);
72
73 lock (creation_lock)
74 {
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);
81 InitContext();
82 }
83 }
84
88 internal Context(Z3_context ctx)
89 : base()
90 {
91 lock (creation_lock)
92 {
93 is_external = true;
94 m_ctx = ctx;
95 InitContext();
96 }
97 }
98
99 bool is_external = false;
100
101 #endregion
102
103 #region Symbols
111 public IntSymbol MkSymbol(int i)
112 {
113 return new IntSymbol(this, i);
114 }
115
119 public StringSymbol MkSymbol(string name)
120 {
121 return new StringSymbol(this, name);
122 }
123
127 internal Symbol[] MkSymbols(string[] names)
128 {
129 if (names == null) return new Symbol[0];
130 Symbol[] result = new Symbol[names.Length];
131 for (int i = 0; i < names.Length; ++i) result[i] = MkSymbol(names[i]);
132 return result;
133 }
134 #endregion
135
136 #region Sorts
137 private BoolSort m_boolSort = null;
138 private IntSort m_intSort = null;
139 private RealSort m_realSort = null;
140 private ComplexSort m_complexSort = null;
141 private SeqSort m_stringSort = null;
142 private CharSort m_charSort = null;
143
148 {
149 get
150 {
151 if (m_boolSort == null) m_boolSort = new BoolSort(this); return m_boolSort;
152 }
153 }
154
159 {
160 get
161 {
162 if (m_intSort == null) m_intSort = new IntSort(this); return m_intSort;
163 }
164 }
165
166
171 {
172 get
173 {
174 if (m_realSort == null) m_realSort = new RealSort(this); return m_realSort;
175 }
176 }
177
182 {
183 get
184 {
185 if (m_complexSort == null) m_complexSort = new ComplexSort(this);
186 return m_complexSort;
187 }
188 }
189
192 {
193 get
194 {
195 if (m_charSort == null) m_charSort = new CharSort(this); return m_charSort;
196 }
197 }
198
199
204 {
205 get
206 {
207 if (m_stringSort == null) m_stringSort = new SeqSort(this, Native.Z3_mk_string_sort(nCtx));
208 return m_stringSort;
209 }
210 }
211
212
217 {
218 return new BoolSort(this);
219 }
220
225 {
226 Debug.Assert(s != null);
227
228 CheckContextMatch(s);
229 return new UninterpretedSort(this, s);
230 }
231
236 {
237 using var sym = MkSymbol(str);
238 return MkUninterpretedSort(sym);
239 }
240
245 {
246
247 return new IntSort(this);
248 }
249
254 {
255 return new RealSort(this);
256 }
257
260 {
261 return new ComplexSort(this);
262 }
263
267 public BitVecSort MkBitVecSort(uint size)
268 {
269 return new BitVecSort(this, Native.Z3_mk_bv_sort(nCtx, size));
270 }
271
276 {
277 Debug.Assert(s != null);
278 return new SeqSort(this, Native.Z3_mk_seq_sort(nCtx, s.NativeObject));
279 }
280
285 {
286 Debug.Assert(s != null);
287 return new ReSort(this, Native.Z3_mk_re_sort(nCtx, s.NativeObject));
288 }
289
293 public ArraySort MkArraySort(Sort domain, Sort range)
294 {
295 Debug.Assert(domain != null);
296 Debug.Assert(range != null);
297
298 CheckContextMatch(domain);
299 CheckContextMatch(range);
300 return new ArraySort(this, domain, range);
301 }
302
306 public ArraySort MkArraySort(Sort[] domain, Sort range)
307 {
308 Debug.Assert(domain != null);
309 Debug.Assert(range != null);
310
311 CheckContextMatch<Sort>(domain);
312 CheckContextMatch(range);
313 return new ArraySort(this, domain, range);
314 }
315
319 public TupleSort MkTupleSort(Symbol name, Symbol[] fieldNames, Sort[] fieldSorts)
320 {
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));
325
326 CheckContextMatch(name);
327 CheckContextMatch<Symbol>(fieldNames);
328 CheckContextMatch<Sort>(fieldSorts);
329 return new TupleSort(this, name, (uint)fieldNames.Length, fieldNames, fieldSorts);
330 }
331
335 public EnumSort MkEnumSort(Symbol name, params Symbol[] enumNames)
336 {
337 Debug.Assert(name != null);
338 Debug.Assert(enumNames != null);
339 Debug.Assert(enumNames.All(f => f != null));
340
341
342 CheckContextMatch(name);
343 CheckContextMatch<Symbol>(enumNames);
344 return new EnumSort(this, name, enumNames);
345 }
346
350 public EnumSort MkEnumSort(string name, params string[] enumNames)
351 {
352 Debug.Assert(enumNames != null);
353
354 var enumSymbols = MkSymbols(enumNames);
355 try
356 {
357 using var symbol = MkSymbol(name);
358 return new EnumSort(this, symbol, enumSymbols);
359 }
360 finally
361 {
362 foreach (var enumSymbol in enumSymbols)
363 enumSymbol.Dispose();
364 }
365 }
366
370 public ListSort MkListSort(Symbol name, Sort elemSort)
371 {
372 Debug.Assert(name != null);
373 Debug.Assert(elemSort != null);
374
375 CheckContextMatch(name);
376 CheckContextMatch(elemSort);
377 return new ListSort(this, name, elemSort);
378 }
379
383 public ListSort MkListSort(string name, Sort elemSort)
384 {
385 Debug.Assert(elemSort != null);
386
387 CheckContextMatch(elemSort);
388 using var symbol = MkSymbol(name);
389 return new ListSort(this, symbol, elemSort);
390 }
391
399 {
400 Debug.Assert(name != null);
401
402 CheckContextMatch(name);
403 return new FiniteDomainSort(this, name, size);
404 }
405
414 public FiniteDomainSort MkFiniteDomainSort(string name, ulong size)
415 {
416 using var symbol = MkSymbol(name);
417 return new FiniteDomainSort(this, symbol, size);
418 }
419
420
421 #region Datatypes
432 public Constructor MkConstructor(Symbol name, Symbol recognizer, Symbol[] fieldNames = null, Sort[] sorts = null, uint[] sortRefs = null)
433 {
434 Debug.Assert(name != null);
435 Debug.Assert(recognizer != null);
436
437 return new Constructor(this, name, recognizer, fieldNames, sorts, sortRefs);
438 }
439
449 public Constructor MkConstructor(string name, string recognizer, string[] fieldNames = null, Sort[] sorts = null, uint[] sortRefs = null)
450 {
451
452 using var nameSymbol = MkSymbol(name);
453 using var recognizerSymbol = MkSymbol(recognizer);
454 var fieldSymbols = MkSymbols(fieldNames);
455 try
456 {
457 return new Constructor(this, nameSymbol, recognizerSymbol, fieldSymbols, sorts, sortRefs);
458 }
459 finally
460 {
461 foreach (var fieldSymbol in fieldSymbols)
462 fieldSymbol.Dispose();
463 }
464 }
465
469 public DatatypeSort MkDatatypeSort(Symbol name, Constructor[] constructors)
470 {
471 Debug.Assert(name != null);
472 Debug.Assert(constructors != null);
473 Debug.Assert(constructors.All(c => c != null));
474
475
476 CheckContextMatch(name);
477 CheckContextMatch<Constructor>(constructors);
478 return new DatatypeSort(this, name, constructors);
479 }
480
484 public DatatypeSort MkDatatypeSort(string name, Constructor[] constructors)
485 {
486 Debug.Assert(constructors != null);
487 Debug.Assert(constructors.All(c => c != null));
488
489 CheckContextMatch<Constructor>(constructors);
490 using var symbol = MkSymbol(name);
491 return new DatatypeSort(this, symbol, constructors);
492 }
493
500 public DatatypeSort MkDatatypeSortRef(Symbol name, Sort[] parameters = null)
501 {
502 Debug.Assert(name != null);
503 CheckContextMatch(name);
504 if (parameters != null)
505 CheckContextMatch<Sort>(parameters);
506
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));
510 }
511
518 public DatatypeSort MkDatatypeSortRef(string name, Sort[] parameters = null)
519 {
520 using var symbol = MkSymbol(name);
521 return MkDatatypeSortRef(symbol, parameters);
522 }
523
530 {
531 Debug.Assert(names != null);
532 Debug.Assert(c != null);
533 Debug.Assert(names.Length == c.Length);
534 //Debug.Assert(Contract.ForAll(0, c.Length, j => c[j] != null));
535 Debug.Assert(names.All(name => name != null));
536
537 CheckContextMatch<Symbol>(names);
538 uint n = (uint)names.Length;
539 ConstructorList[] cla = new ConstructorList[n];
540 IntPtr[] n_constr = new IntPtr[n];
541 for (uint i = 0; i < n; i++)
542 {
543 Constructor[] constructor = c[i];
544 CheckContextMatch<Constructor>(constructor);
545 cla[i] = new ConstructorList(this, constructor);
546 n_constr[i] = cla[i].NativeObject;
547 }
548 IntPtr[] n_res = new IntPtr[n];
549 Native.Z3_mk_datatypes(nCtx, n, Symbol.ArrayToNative(names), n_res, n_constr);
550 DatatypeSort[] res = new DatatypeSort[n];
551 for (uint i = 0; i < n; i++)
552 res[i] = new DatatypeSort(this, n_res[i]);
553 return res;
554 }
555
562 public DatatypeSort[] MkDatatypeSorts(string[] names, Constructor[][] c)
563 {
564 Debug.Assert(names != null);
565 Debug.Assert(c != null);
566 Debug.Assert(names.Length == c.Length);
567 //Debug.Assert(Contract.ForAll(0, c.Length, j => c[j] != null));
568 //Debug.Assert(names.All(name => name != null));
569
570 var symbols = MkSymbols(names);
571 try
572 {
573 return MkDatatypeSorts(symbols, c);
574 }
575 finally
576 {
577 foreach (var symbol in symbols)
578 symbol.Dispose();
579 }
580 }
581
587 {
588 Debug.Assert(name != null);
589 CheckContextMatch(name);
590 return new Sort(this, Native.Z3_mk_type_variable(nCtx, name.NativeObject));
591 }
592
597 public Sort MkTypeVariable(string name)
598 {
599 using var symbol = MkSymbol(name);
600 return MkTypeVariable(symbol);
601 }
602
610 public DatatypeSort MkPolymorphicDatatypeSort(Symbol name, Sort[] typeParams, Constructor[] constructors)
611 {
612 Debug.Assert(name != null);
613 Debug.Assert(typeParams != null);
614 Debug.Assert(constructors != null);
615 Debug.Assert(constructors.All(c => c != null));
616
617 CheckContextMatch(name);
618 CheckContextMatch<Sort>(typeParams);
619 CheckContextMatch<Constructor>(constructors);
620 return new DatatypeSort(this,
621 Native.Z3_mk_polymorphic_datatype(nCtx, name.NativeObject,
622 (uint)typeParams.Length, AST.ArrayToNative(typeParams),
623 (uint)constructors.Length, Z3Object.ArrayToNative(constructors)));
624 }
625
633 public DatatypeSort MkPolymorphicDatatypeSort(string name, Sort[] typeParams, Constructor[] constructors)
634 {
635 using var symbol = MkSymbol(name);
636 return MkPolymorphicDatatypeSort(symbol, typeParams, constructors);
637 }
638
645 public Expr MkUpdateField(FuncDecl field, Expr t, Expr v)
646 {
647 return Expr.Create(this, Native.Z3_datatype_update_field(
648 nCtx, field.NativeObject,
649 t.NativeObject, v.NativeObject));
650 }
651
652 #endregion
653 #endregion
654
655 #region Function Declarations
659 public FuncDecl MkFuncDecl(Symbol name, Sort[] domain, Sort range)
660 {
661 Debug.Assert(name != null);
662 Debug.Assert(range != null);
663 Debug.Assert(domain.All(d => d != null));
664
665 CheckContextMatch(name);
666 CheckContextMatch<Sort>(domain);
667 CheckContextMatch(range);
668 return new FuncDecl(this, name, domain, range);
669 }
670
674 public FuncDecl MkFuncDecl(Symbol name, Sort domain, Sort range)
675 {
676 Debug.Assert(name != null);
677 Debug.Assert(domain != null);
678 Debug.Assert(range != null);
679
680 CheckContextMatch(name);
681 CheckContextMatch(domain);
682 CheckContextMatch(range);
683 Sort[] q = new Sort[] { domain };
684 return new FuncDecl(this, name, q, range);
685 }
686
690 public FuncDecl MkFuncDecl(string name, Sort[] domain, Sort range)
691 {
692 Debug.Assert(range != null);
693 Debug.Assert(domain.All(d => d != null));
694
695 CheckContextMatch<Sort>(domain);
696 CheckContextMatch(range);
697 using var symbol = MkSymbol(name);
698 return new FuncDecl(this, symbol, domain, range);
699 }
700
704 public FuncDecl MkRecFuncDecl(string name, Sort[] domain, Sort range)
705 {
706 Debug.Assert(range != null);
707 Debug.Assert(domain.All(d => d != null));
708
709 CheckContextMatch<Sort>(domain);
710 CheckContextMatch(range);
711 using var symbol = MkSymbol(name);
712 return new FuncDecl(this, symbol, domain, range, true);
713 }
714
721 public void AddRecDef(FuncDecl f, Expr[] args, Expr body)
722 {
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);
728 }
729
733 public FuncDecl MkFuncDecl(string name, Sort domain, Sort range)
734 {
735 Debug.Assert(range != null);
736 Debug.Assert(domain != null);
737
738 CheckContextMatch(domain);
739 CheckContextMatch(range);
740 using var symbol = MkSymbol(name);
741 Sort[] q = new Sort[] { domain };
742 return new FuncDecl(this, symbol, q, range);
743 }
744
750 public FuncDecl MkFreshFuncDecl(string prefix, Sort[] domain, Sort range)
751 {
752 Debug.Assert(range != null);
753 Debug.Assert(domain.All(d => d != null));
754
755 CheckContextMatch<Sort>(domain);
756 CheckContextMatch(range);
757 return new FuncDecl(this, prefix, domain, range);
758 }
759
763 public FuncDecl MkConstDecl(Symbol name, Sort range)
764 {
765 Debug.Assert(name != null);
766 Debug.Assert(range != null);
767
768 CheckContextMatch(name);
769 CheckContextMatch(range);
770 return new FuncDecl(this, name, null, range);
771 }
772
776 public FuncDecl MkConstDecl(string name, Sort range)
777 {
778 Debug.Assert(range != null);
779
780 CheckContextMatch(range);
781 using var symbol = MkSymbol(name);
782 return new FuncDecl(this, symbol, null, range);
783 }
784
790 public FuncDecl MkFreshConstDecl(string prefix, Sort range)
791 {
792 Debug.Assert(range != null);
793
794 CheckContextMatch(range);
795 return new FuncDecl(this, prefix, null, range);
796 }
797
801 public FuncDecl MkUserPropagatorFuncDecl(string name, Sort[] domain, Sort range)
802 {
803 using var _name = MkSymbol(name);
804 var fn = Native.Z3_solver_propagate_declare(nCtx, _name.NativeObject, AST.ArrayLength(domain), AST.ArrayToNative(domain), range.NativeObject);
805 return new FuncDecl(this, fn);
806 }
807 #endregion
808
809 #region Bound Variables
815 public Expr MkBound(uint index, Sort ty)
816 {
817 Debug.Assert(ty != null);
818
819 return Expr.Create(this, Native.Z3_mk_bound(nCtx, index, ty.NativeObject));
820 }
821 #endregion
822
823 #region Quantifier Patterns
827 public Pattern MkPattern(params Expr[] terms)
828 {
829 Debug.Assert(terms != null);
830 if (terms.Length == 0)
831 throw new Z3Exception("Cannot create a pattern from zero terms");
832
833 IntPtr[] termsNative = AST.ArrayToNative(terms);
834 return new Pattern(this, Native.Z3_mk_pattern(nCtx, (uint)terms.Length, termsNative));
835 }
836 #endregion
837
838 #region Constants
842 public Expr MkConst(Symbol name, Sort range)
843 {
844 Debug.Assert(name != null);
845 Debug.Assert(range != null);
846
847 CheckContextMatch(name);
848 CheckContextMatch(range);
849
850 return Expr.Create(this, Native.Z3_mk_const(nCtx, name.NativeObject, range.NativeObject));
851 }
852
856 public Expr MkConst(string name, Sort range)
857 {
858 Debug.Assert(range != null);
859
860 using var symbol = MkSymbol(name);
861 return MkConst(symbol, range);
862 }
863
868 public Expr MkFreshConst(string prefix, Sort range)
869 {
870 Debug.Assert(range != null);
871
872 CheckContextMatch(range);
873 return Expr.Create(this, Native.Z3_mk_fresh_const(nCtx, prefix, range.NativeObject));
874 }
875
881 {
882 Debug.Assert(f != null);
883
884 return MkApp(f);
885 }
886
891 {
892 Debug.Assert(name != null);
893
894 return (BoolExpr)MkConst(name, BoolSort);
895 }
896
900 public BoolExpr MkBoolConst(string name)
901 {
902 using var symbol = MkSymbol(name);
903 return (BoolExpr)MkConst(symbol, BoolSort);
904 }
905
910 {
911 Debug.Assert(name != null);
912
913 return (IntExpr)MkConst(name, IntSort);
914 }
915
919 public IntExpr MkIntConst(string name)
920 {
921 Debug.Assert(name != null);
922
923 return (IntExpr)MkConst(name, IntSort);
924 }
925
930 {
931 Debug.Assert(name != null);
932
933 return (RealExpr)MkConst(name, RealSort);
934 }
935
939 public RealExpr MkRealConst(string name)
940 {
941
942 return (RealExpr)MkConst(name, RealSort);
943 }
944
947 {
948 return (ComplexExpr)MkConst(name, ComplexSort);
949 }
950
952 public ComplexExpr MkComplexConst(string name)
953 {
954 return (ComplexExpr)MkConst(name, ComplexSort);
955 }
956
959 {
960 CheckContextMatch(real, imag);
961 return new ComplexExpr(this, Native.Z3_mk_complex(nCtx, real.NativeObject, imag.NativeObject));
962 }
963
966 {
967 CheckContextMatch(value);
968 return new RealExpr(this, Native.Z3_mk_real_part(nCtx, value.NativeObject));
969 }
970
973 {
974 CheckContextMatch(value);
975 return new RealExpr(this, Native.Z3_mk_imag_part(nCtx, value.NativeObject));
976 }
977
981 public BitVecExpr MkBVConst(Symbol name, uint size)
982 {
983 Debug.Assert(name != null);
984
985 using var sort = MkBitVecSort(size);
986 return (BitVecExpr)MkConst(name, sort);
987 }
988
992 public BitVecExpr MkBVConst(string name, uint size)
993 {
994 using var sort = MkBitVecSort(size);
995 return (BitVecExpr)MkConst(name, sort);
996 }
997 #endregion
998
999 #region Terms
1003 public Expr MkApp(FuncDecl f, params Expr[] args)
1004 {
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);
1010 }
1011
1015 public Expr MkApp(FuncDecl f, IEnumerable<Expr> args)
1016 {
1017 Debug.Assert(f != null);
1018 return MkApp(f, args?.ToArray());
1019 }
1020
1021 #region Propositional
1026 {
1027 return new BoolExpr(this, Native.Z3_mk_true(nCtx));
1028 }
1029
1034 {
1035 return new BoolExpr(this, Native.Z3_mk_false(nCtx));
1036 }
1037
1041 public BoolExpr MkBool(bool value)
1042 {
1043 return value ? MkTrue() : MkFalse();
1044 }
1045
1049 public BoolExpr MkEq(Expr x, Expr y)
1050 {
1051 Debug.Assert(x != null);
1052 Debug.Assert(y != null);
1053
1054 CheckContextMatch(x);
1055 CheckContextMatch(y);
1056 return new BoolExpr(this, Native.Z3_mk_eq(nCtx, x.NativeObject, y.NativeObject));
1057 }
1058
1062 public BoolExpr MkDistinct(params Expr[] args)
1063 {
1064 Debug.Assert(args != null);
1065 Debug.Assert(args.All(a => a != null));
1066
1067 CheckContextMatch<Expr>(args);
1068 return new BoolExpr(this, Native.Z3_mk_distinct(nCtx, (uint)args.Length, AST.ArrayToNative(args)));
1069 }
1070
1074 public BoolExpr MkDistinct(IEnumerable<Expr> args)
1075 {
1076 Debug.Assert(args != null);
1077 return MkDistinct(args.ToArray());
1078 }
1079
1084 {
1085 Debug.Assert(a != null);
1086 CheckContextMatch(a);
1087 return new BoolExpr(this, Native.Z3_mk_not(nCtx, a.NativeObject));
1088 }
1089
1096 public Expr MkITE(BoolExpr t1, Expr t2, Expr t3)
1097 {
1098 Debug.Assert(t1 != null);
1099 Debug.Assert(t2 != null);
1100 Debug.Assert(t3 != null);
1101
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));
1106 }
1107
1112 {
1113 Debug.Assert(t1 != null);
1114 Debug.Assert(t2 != null);
1115
1116 CheckContextMatch(t1);
1117 CheckContextMatch(t2);
1118 return new BoolExpr(this, Native.Z3_mk_iff(nCtx, t1.NativeObject, t2.NativeObject));
1119 }
1120
1125 {
1126 Debug.Assert(t1 != null);
1127 Debug.Assert(t2 != null);
1128
1129 CheckContextMatch(t1);
1130 CheckContextMatch(t2);
1131 return new BoolExpr(this, Native.Z3_mk_implies(nCtx, t1.NativeObject, t2.NativeObject));
1132 }
1133
1138 {
1139 Debug.Assert(t1 != null);
1140 Debug.Assert(t2 != null);
1141
1142 CheckContextMatch(t1);
1143 CheckContextMatch(t2);
1144 return new BoolExpr(this, Native.Z3_mk_xor(nCtx, t1.NativeObject, t2.NativeObject));
1145 }
1146
1150 public BoolExpr MkXor(IEnumerable<BoolExpr> args)
1151 {
1152 Debug.Assert(args != null);
1153 var ts = args.ToArray();
1154 Debug.Assert(ts.All(a => a != null));
1155 CheckContextMatch<BoolExpr>(ts);
1156
1157 return ts.Aggregate(MkFalse(), (r, t) =>
1158 {
1159 using (r)
1160 return MkXor(r, t);
1161 });
1162 }
1163
1167 public BoolExpr MkAnd(params BoolExpr[] ts)
1168 {
1169 Debug.Assert(ts != null);
1170 Debug.Assert(ts.All(a => a != null));
1171
1172 CheckContextMatch<BoolExpr>(ts);
1173 return new BoolExpr(this, Native.Z3_mk_and(nCtx, (uint)ts.Length, AST.ArrayToNative(ts)));
1174 }
1175
1179 public BoolExpr MkAnd(IEnumerable<BoolExpr> t)
1180 {
1181 Debug.Assert(t != null);
1182 return MkAnd(t.ToArray());
1183 }
1184
1188 public BoolExpr MkOr(params BoolExpr[] ts)
1189 {
1190 Debug.Assert(ts != null);
1191 Debug.Assert(ts.All(a => a != null));
1192
1193 CheckContextMatch<BoolExpr>(ts);
1194 return new BoolExpr(this, Native.Z3_mk_or(nCtx, (uint)ts.Length, AST.ArrayToNative(ts)));
1195 }
1196
1197
1201 public BoolExpr MkOr(IEnumerable<BoolExpr> ts)
1202 {
1203 Debug.Assert(ts != null);
1204 return MkOr(ts.ToArray());
1205 }
1206
1207 #endregion
1208
1209 #region Arithmetic
1213 public ArithExpr MkAdd(params ArithExpr[] ts)
1214 {
1215 Debug.Assert(ts != null);
1216 Debug.Assert(ts.All(a => a != null));
1217
1218 CheckContextMatch<ArithExpr>(ts);
1219 return (ArithExpr)Expr.Create(this, Native.Z3_mk_add(nCtx, (uint)ts.Length, AST.ArrayToNative(ts)));
1220 }
1221
1225 public ArithExpr MkAdd(IEnumerable<ArithExpr> ts)
1226 {
1227 Debug.Assert(ts != null);
1228 return MkAdd(ts.ToArray());
1229 }
1230
1234 public ArithExpr MkMul(params ArithExpr[] ts)
1235 {
1236 Debug.Assert(ts != null);
1237 Debug.Assert(ts.All(a => a != null));
1238
1239 CheckContextMatch<ArithExpr>(ts);
1240 return (ArithExpr)Expr.Create(this, Native.Z3_mk_mul(nCtx, (uint)ts.Length, AST.ArrayToNative(ts)));
1241 }
1242
1246 public ArithExpr MkMul(IEnumerable<ArithExpr> ts)
1247 {
1248 Debug.Assert(ts != null);
1249 return MkMul(ts.ToArray());
1250 }
1251
1255 public ArithExpr MkSub(params ArithExpr[] ts)
1256 {
1257 Debug.Assert(ts != null);
1258 Debug.Assert(ts.All(a => a != null));
1259
1260 CheckContextMatch<ArithExpr>(ts);
1261 return (ArithExpr)Expr.Create(this, Native.Z3_mk_sub(nCtx, (uint)ts.Length, AST.ArrayToNative(ts)));
1262 }
1263
1268 {
1269 Debug.Assert(t != null);
1270
1271 CheckContextMatch(t);
1272 return (ArithExpr)Expr.Create(this, Native.Z3_mk_unary_minus(nCtx, t.NativeObject));
1273 }
1274
1279 {
1280 Debug.Assert(t1 != null);
1281 Debug.Assert(t2 != null);
1282
1283 CheckContextMatch(t1);
1284 CheckContextMatch(t2);
1285 return (ArithExpr)Expr.Create(this, Native.Z3_mk_div(nCtx, t1.NativeObject, t2.NativeObject));
1286 }
1287
1293 {
1294 Debug.Assert(t1 != null);
1295 Debug.Assert(t2 != null);
1296
1297 CheckContextMatch(t1);
1298 CheckContextMatch(t2);
1299 return new IntExpr(this, Native.Z3_mk_mod(nCtx, t1.NativeObject, t2.NativeObject));
1300 }
1301
1307 {
1308 Debug.Assert(t1 != null);
1309 Debug.Assert(t2 != null);
1310
1311 CheckContextMatch(t1);
1312 CheckContextMatch(t2);
1313 return new IntExpr(this, Native.Z3_mk_rem(nCtx, t1.NativeObject, t2.NativeObject));
1314 }
1315
1320 {
1321 Debug.Assert(t1 != null);
1322 Debug.Assert(t2 != null);
1323
1324 CheckContextMatch(t1);
1325 CheckContextMatch(t2);
1326 return (ArithExpr)Expr.Create(this, Native.Z3_mk_power(nCtx, t1.NativeObject, t2.NativeObject));
1327 }
1328
1333 {
1334 Debug.Assert(t1 != null);
1335 Debug.Assert(t2 != null);
1336
1337 CheckContextMatch(t1);
1338 CheckContextMatch(t2);
1339 return new BoolExpr(this, Native.Z3_mk_lt(nCtx, t1.NativeObject, t2.NativeObject));
1340 }
1341
1346 {
1347 Debug.Assert(t1 != null);
1348 Debug.Assert(t2 != null);
1349
1350 CheckContextMatch(t1);
1351 CheckContextMatch(t2);
1352 return new BoolExpr(this, Native.Z3_mk_le(nCtx, t1.NativeObject, t2.NativeObject));
1353 }
1354
1359 {
1360 Debug.Assert(t1 != null);
1361 Debug.Assert(t2 != null);
1362
1363 CheckContextMatch(t1);
1364 CheckContextMatch(t2);
1365 return new BoolExpr(this, Native.Z3_mk_gt(nCtx, t1.NativeObject, t2.NativeObject));
1366 }
1367
1372 {
1373 Debug.Assert(t1 != null);
1374 Debug.Assert(t2 != null);
1375
1376 CheckContextMatch(t1);
1377 CheckContextMatch(t2);
1378 return new BoolExpr(this, Native.Z3_mk_ge(nCtx, t1.NativeObject, t2.NativeObject));
1379 }
1380
1392 {
1393 Debug.Assert(t != null);
1394
1395 CheckContextMatch(t);
1396 return new RealExpr(this, Native.Z3_mk_int2real(nCtx, t.NativeObject));
1397 }
1398
1407 {
1408 Debug.Assert(t != null);
1409
1410 CheckContextMatch(t);
1411 return new IntExpr(this, Native.Z3_mk_real2int(nCtx, t.NativeObject));
1412 }
1413
1418 {
1419 Debug.Assert(t != null);
1420
1421 CheckContextMatch(t);
1422 return new BoolExpr(this, Native.Z3_mk_is_int(nCtx, t.NativeObject));
1423 }
1424 #endregion
1425
1426 #region Bit-vectors
1432 {
1433 Debug.Assert(t != null);
1434
1435 CheckContextMatch(t);
1436 return new BitVecExpr(this, Native.Z3_mk_bvnot(nCtx, t.NativeObject));
1437 }
1438
1444 {
1445 Debug.Assert(t != null);
1446
1447 CheckContextMatch(t);
1448 return new BitVecExpr(this, Native.Z3_mk_bvredand(nCtx, t.NativeObject));
1449 }
1450
1456 {
1457 Debug.Assert(t != null);
1458
1459 CheckContextMatch(t);
1460 return new BitVecExpr(this, Native.Z3_mk_bvredor(nCtx, t.NativeObject));
1461 }
1462
1468 {
1469 Debug.Assert(t1 != null);
1470 Debug.Assert(t2 != null);
1471
1472 CheckContextMatch(t1);
1473 CheckContextMatch(t2);
1474 return new BitVecExpr(this, Native.Z3_mk_bvand(nCtx, t1.NativeObject, t2.NativeObject));
1475 }
1476
1482 {
1483 Debug.Assert(t1 != null);
1484 Debug.Assert(t2 != null);
1485
1486 CheckContextMatch(t1);
1487 CheckContextMatch(t2);
1488 return new BitVecExpr(this, Native.Z3_mk_bvor(nCtx, t1.NativeObject, t2.NativeObject));
1489 }
1490
1496 {
1497 Debug.Assert(t1 != null);
1498 Debug.Assert(t2 != null);
1499
1500 CheckContextMatch(t1);
1501 CheckContextMatch(t2);
1502 return new BitVecExpr(this, Native.Z3_mk_bvxor(nCtx, t1.NativeObject, t2.NativeObject));
1503 }
1504
1510 {
1511 Debug.Assert(t1 != null);
1512 Debug.Assert(t2 != null);
1513
1514 CheckContextMatch(t1);
1515 CheckContextMatch(t2);
1516 return new BitVecExpr(this, Native.Z3_mk_bvnand(nCtx, t1.NativeObject, t2.NativeObject));
1517 }
1518
1524 {
1525 Debug.Assert(t1 != null);
1526 Debug.Assert(t2 != null);
1527
1528 CheckContextMatch(t1);
1529 CheckContextMatch(t2);
1530 return new BitVecExpr(this, Native.Z3_mk_bvnor(nCtx, t1.NativeObject, t2.NativeObject));
1531 }
1532
1538 {
1539 Debug.Assert(t1 != null);
1540 Debug.Assert(t2 != null);
1541
1542 CheckContextMatch(t1);
1543 CheckContextMatch(t2);
1544 return new BitVecExpr(this, Native.Z3_mk_bvxnor(nCtx, t1.NativeObject, t2.NativeObject));
1545 }
1546
1552 {
1553 Debug.Assert(t != null);
1554
1555 CheckContextMatch(t);
1556 return new BitVecExpr(this, Native.Z3_mk_bvneg(nCtx, t.NativeObject));
1557 }
1558
1564 {
1565 Debug.Assert(t1 != null);
1566 Debug.Assert(t2 != null);
1567
1568 CheckContextMatch(t1);
1569 CheckContextMatch(t2);
1570 return new BitVecExpr(this, Native.Z3_mk_bvadd(nCtx, t1.NativeObject, t2.NativeObject));
1571 }
1572
1578 {
1579 Debug.Assert(t1 != null);
1580 Debug.Assert(t2 != null);
1581
1582 CheckContextMatch(t1);
1583 CheckContextMatch(t2);
1584 return new BitVecExpr(this, Native.Z3_mk_bvsub(nCtx, t1.NativeObject, t2.NativeObject));
1585 }
1586
1592 {
1593 Debug.Assert(t1 != null);
1594 Debug.Assert(t2 != null);
1595
1596 CheckContextMatch(t1);
1597 CheckContextMatch(t2);
1598 return new BitVecExpr(this, Native.Z3_mk_bvmul(nCtx, t1.NativeObject, t2.NativeObject));
1599 }
1600
1611 {
1612 Debug.Assert(t1 != null);
1613 Debug.Assert(t2 != null);
1614
1615 CheckContextMatch(t1);
1616 CheckContextMatch(t2);
1617 return new BitVecExpr(this, Native.Z3_mk_bvudiv(nCtx, t1.NativeObject, t2.NativeObject));
1618 }
1619
1634 {
1635 Debug.Assert(t1 != null);
1636 Debug.Assert(t2 != null);
1637
1638 CheckContextMatch(t1);
1639 CheckContextMatch(t2);
1640 return new BitVecExpr(this, Native.Z3_mk_bvsdiv(nCtx, t1.NativeObject, t2.NativeObject));
1641 }
1642
1652 {
1653 Debug.Assert(t1 != null);
1654 Debug.Assert(t2 != null);
1655
1656 CheckContextMatch(t1);
1657 CheckContextMatch(t2);
1658 return new BitVecExpr(this, Native.Z3_mk_bvurem(nCtx, t1.NativeObject, t2.NativeObject));
1659 }
1660
1672 {
1673 Debug.Assert(t1 != null);
1674 Debug.Assert(t2 != null);
1675
1676 CheckContextMatch(t1);
1677 CheckContextMatch(t2);
1678 return new BitVecExpr(this, Native.Z3_mk_bvsrem(nCtx, t1.NativeObject, t2.NativeObject));
1679 }
1680
1689 {
1690 Debug.Assert(t1 != null);
1691 Debug.Assert(t2 != null);
1692
1693 CheckContextMatch(t1);
1694 CheckContextMatch(t2);
1695 return new BitVecExpr(this, Native.Z3_mk_bvsmod(nCtx, t1.NativeObject, t2.NativeObject));
1696 }
1697
1705 {
1706 Debug.Assert(t1 != null);
1707 Debug.Assert(t2 != null);
1708
1709 CheckContextMatch(t1);
1710 CheckContextMatch(t2);
1711 return new BoolExpr(this, Native.Z3_mk_bvult(nCtx, t1.NativeObject, t2.NativeObject));
1712 }
1713
1721 {
1722 Debug.Assert(t1 != null);
1723 Debug.Assert(t2 != null);
1724
1725 CheckContextMatch(t1);
1726 CheckContextMatch(t2);
1727 return new BoolExpr(this, Native.Z3_mk_bvslt(nCtx, t1.NativeObject, t2.NativeObject));
1728 }
1729
1737 {
1738 Debug.Assert(t1 != null);
1739 Debug.Assert(t2 != null);
1740
1741 CheckContextMatch(t1);
1742 CheckContextMatch(t2);
1743 return new BoolExpr(this, Native.Z3_mk_bvule(nCtx, t1.NativeObject, t2.NativeObject));
1744 }
1745
1753 {
1754 Debug.Assert(t1 != null);
1755 Debug.Assert(t2 != null);
1756
1757 CheckContextMatch(t1);
1758 CheckContextMatch(t2);
1759 return new BoolExpr(this, Native.Z3_mk_bvsle(nCtx, t1.NativeObject, t2.NativeObject));
1760 }
1761
1769 {
1770 Debug.Assert(t1 != null);
1771 Debug.Assert(t2 != null);
1772
1773 CheckContextMatch(t1);
1774 CheckContextMatch(t2);
1775 return new BoolExpr(this, Native.Z3_mk_bvuge(nCtx, t1.NativeObject, t2.NativeObject));
1776 }
1777
1785 {
1786 Debug.Assert(t1 != null);
1787 Debug.Assert(t2 != null);
1788
1789 CheckContextMatch(t1);
1790 CheckContextMatch(t2);
1791 return new BoolExpr(this, Native.Z3_mk_bvsge(nCtx, t1.NativeObject, t2.NativeObject));
1792 }
1793
1801 {
1802 Debug.Assert(t1 != null);
1803 Debug.Assert(t2 != null);
1804
1805 CheckContextMatch(t1);
1806 CheckContextMatch(t2);
1807 return new BoolExpr(this, Native.Z3_mk_bvugt(nCtx, t1.NativeObject, t2.NativeObject));
1808 }
1809
1817 {
1818 Debug.Assert(t1 != null);
1819 Debug.Assert(t2 != null);
1820
1821 CheckContextMatch(t1);
1822 CheckContextMatch(t2);
1823 return new BoolExpr(this, Native.Z3_mk_bvsgt(nCtx, t1.NativeObject, t2.NativeObject));
1824 }
1825
1837 {
1838 Debug.Assert(t1 != null);
1839 Debug.Assert(t2 != null);
1840
1841 CheckContextMatch(t1);
1842 CheckContextMatch(t2);
1843 return new BitVecExpr(this, Native.Z3_mk_concat(nCtx, t1.NativeObject, t2.NativeObject));
1844 }
1845
1855 public BitVecExpr MkExtract(uint high, uint low, BitVecExpr t)
1856 {
1857 Debug.Assert(t != null);
1858
1859 CheckContextMatch(t);
1860 return new BitVecExpr(this, Native.Z3_mk_extract(nCtx, high, low, t.NativeObject));
1861 }
1862
1872 {
1873 Debug.Assert(t != null);
1874
1875 CheckContextMatch(t);
1876 return new BitVecExpr(this, Native.Z3_mk_sign_ext(nCtx, i, t.NativeObject));
1877 }
1878
1889 {
1890 Debug.Assert(t != null);
1891
1892 CheckContextMatch(t);
1893 return new BitVecExpr(this, Native.Z3_mk_zero_ext(nCtx, i, t.NativeObject));
1894 }
1895
1903 {
1904 Debug.Assert(t != null);
1905
1906 CheckContextMatch(t);
1907 return new BitVecExpr(this, Native.Z3_mk_repeat(nCtx, i, t.NativeObject));
1908 }
1909
1923 {
1924 Debug.Assert(t1 != null);
1925 Debug.Assert(t2 != null);
1926
1927 CheckContextMatch(t1);
1928 CheckContextMatch(t2);
1929 return new BitVecExpr(this, Native.Z3_mk_bvshl(nCtx, t1.NativeObject, t2.NativeObject));
1930 }
1931
1945 {
1946 Debug.Assert(t1 != null);
1947 Debug.Assert(t2 != null);
1948
1949 CheckContextMatch(t1);
1950 CheckContextMatch(t2);
1951 return new BitVecExpr(this, Native.Z3_mk_bvlshr(nCtx, t1.NativeObject, t2.NativeObject));
1952 }
1953
1969 {
1970 Debug.Assert(t1 != null);
1971 Debug.Assert(t2 != null);
1972
1973 CheckContextMatch(t1);
1974 CheckContextMatch(t2);
1975 return new BitVecExpr(this, Native.Z3_mk_bvashr(nCtx, t1.NativeObject, t2.NativeObject));
1976 }
1977
1986 {
1987 Debug.Assert(t != null);
1988
1989 CheckContextMatch(t);
1990 return new BitVecExpr(this, Native.Z3_mk_rotate_left(nCtx, i, t.NativeObject));
1991 }
1992
2001 {
2002 Debug.Assert(t != null);
2003
2004 CheckContextMatch(t);
2005 return new BitVecExpr(this, Native.Z3_mk_rotate_right(nCtx, i, t.NativeObject));
2006 }
2007
2016 {
2017 Debug.Assert(t1 != null);
2018 Debug.Assert(t2 != null);
2019
2020 CheckContextMatch(t1);
2021 CheckContextMatch(t2);
2022 return new BitVecExpr(this, Native.Z3_mk_ext_rotate_left(nCtx, t1.NativeObject, t2.NativeObject));
2023 }
2024
2033 {
2034 Debug.Assert(t1 != null);
2035 Debug.Assert(t2 != null);
2036
2037 CheckContextMatch(t1);
2038 CheckContextMatch(t2);
2039 return new BitVecExpr(this, Native.Z3_mk_ext_rotate_right(nCtx, t1.NativeObject, t2.NativeObject));
2040 }
2041
2052 public BitVecExpr MkInt2BV(uint n, IntExpr t)
2053 {
2054 Debug.Assert(t != null);
2055
2056 CheckContextMatch(t);
2057 return new BitVecExpr(this, Native.Z3_mk_int2bv(nCtx, n, t.NativeObject));
2058 }
2059
2075 public IntExpr MkBV2Int(BitVecExpr t, bool signed)
2076 {
2077 Debug.Assert(t != null);
2078
2079 CheckContextMatch(t);
2080 return new IntExpr(this, Native.Z3_mk_bv2int(nCtx, t.NativeObject, (byte)(signed ? 1 : 0)));
2081 }
2082
2089 public BoolExpr MkBVAddNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
2090 {
2091 Debug.Assert(t1 != null);
2092 Debug.Assert(t2 != null);
2093
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)));
2097 }
2098
2106 {
2107 Debug.Assert(t1 != null);
2108 Debug.Assert(t2 != null);
2109
2110 CheckContextMatch(t1);
2111 CheckContextMatch(t2);
2112 return new BoolExpr(this, Native.Z3_mk_bvadd_no_underflow(nCtx, t1.NativeObject, t2.NativeObject));
2113 }
2114
2122 {
2123 Debug.Assert(t1 != null);
2124 Debug.Assert(t2 != null);
2125
2126 CheckContextMatch(t1);
2127 CheckContextMatch(t2);
2128 return new BoolExpr(this, Native.Z3_mk_bvsub_no_overflow(nCtx, t1.NativeObject, t2.NativeObject));
2129 }
2130
2137 public BoolExpr MkBVSubNoUnderflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
2138 {
2139 Debug.Assert(t1 != null);
2140 Debug.Assert(t2 != null);
2141
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)));
2145 }
2146
2154 {
2155 Debug.Assert(t1 != null);
2156 Debug.Assert(t2 != null);
2157
2158 CheckContextMatch(t1);
2159 CheckContextMatch(t2);
2160 return new BoolExpr(this, Native.Z3_mk_bvsdiv_no_overflow(nCtx, t1.NativeObject, t2.NativeObject));
2161 }
2162
2170 {
2171 Debug.Assert(t != null);
2172
2173 CheckContextMatch(t);
2174 return new BoolExpr(this, Native.Z3_mk_bvneg_no_overflow(nCtx, t.NativeObject));
2175 }
2176
2183 public BoolExpr MkBVMulNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
2184 {
2185 Debug.Assert(t1 != null);
2186 Debug.Assert(t2 != null);
2187
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)));
2191 }
2192
2200 {
2201 Debug.Assert(t1 != null);
2202 Debug.Assert(t2 != null);
2203
2204 CheckContextMatch(t1);
2205 CheckContextMatch(t2);
2206 return new BoolExpr(this, Native.Z3_mk_bvmul_no_underflow(nCtx, t1.NativeObject, t2.NativeObject));
2207 }
2208 #endregion
2209
2210 #region Arrays
2214 public ArrayExpr MkArrayConst(Symbol name, Sort domain, Sort range)
2215 {
2216 Debug.Assert(name != null);
2217 Debug.Assert(domain != null);
2218 Debug.Assert(range != null);
2219
2220 using var sort = MkArraySort(domain, range);
2221 return (ArrayExpr)MkConst(name, sort);
2222 }
2223
2227 public ArrayExpr MkArrayConst(string name, Sort domain, Sort range)
2228 {
2229 Debug.Assert(domain != null);
2230 Debug.Assert(range != null);
2231
2232 using var symbol = MkSymbol(name);
2233 using var sort = MkArraySort(domain, range);
2234 return (ArrayExpr)MkConst(symbol, sort);
2235 }
2236
2237
2252 {
2253 Debug.Assert(a != null);
2254 Debug.Assert(i != null);
2255
2256 CheckContextMatch(a);
2257 CheckContextMatch(i);
2258 return Expr.Create(this, Native.Z3_mk_select(nCtx, a.NativeObject, i.NativeObject));
2259 }
2260
2274 public Expr MkSelect(ArrayExpr a, params Expr[] args)
2275 {
2276 Debug.Assert(a != null);
2277 Debug.Assert(args != null && args.All(n => n != null));
2278
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)));
2282 }
2283
2284
2304 {
2305 Debug.Assert(a != null);
2306 Debug.Assert(i != null);
2307 Debug.Assert(v != null);
2308
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));
2313 }
2314
2333 public ArrayExpr MkStore(ArrayExpr a, Expr[] args, Expr v)
2334 {
2335 Debug.Assert(a != null);
2336 Debug.Assert(args != null);
2337 Debug.Assert(v != null);
2338
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));
2343 }
2344
2355 {
2356 Debug.Assert(domain != null);
2357 Debug.Assert(v != null);
2358
2359 CheckContextMatch(domain);
2360 CheckContextMatch(v);
2361 return new ArrayExpr(this, Native.Z3_mk_const_array(nCtx, domain.NativeObject, v.NativeObject));
2362 }
2363
2375 public ArrayExpr MkMap(FuncDecl f, params ArrayExpr[] args)
2376 {
2377 Debug.Assert(f != null);
2378 Debug.Assert(args == null || args.All(a => a != null));
2379
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)));
2383 }
2384
2393 {
2394 Debug.Assert(array != null);
2395
2396 CheckContextMatch(array);
2397 return Expr.Create(this, Native.Z3_mk_array_default(nCtx, array.NativeObject));
2398 }
2399
2404 {
2405 Debug.Assert(arg1 != null);
2406 Debug.Assert(arg2 != null);
2407
2408 CheckContextMatch(arg1);
2409 CheckContextMatch(arg2);
2410 return Expr.Create(this, Native.Z3_mk_array_ext(nCtx, arg1.NativeObject, arg2.NativeObject));
2411 }
2412
2413 #endregion
2414
2415 #region Sets
2420 {
2421 Debug.Assert(ty != null);
2422
2423 CheckContextMatch(ty);
2424 return new SetSort(this, ty);
2425 }
2426
2431 {
2432 Debug.Assert(domain != null);
2433
2434 CheckContextMatch(domain);
2435 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_empty_set(nCtx, domain.NativeObject));
2436 }
2437
2441 public ArrayExpr MkFullSet(Sort domain)
2442 {
2443 Debug.Assert(domain != null);
2444
2445 CheckContextMatch(domain);
2446 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_full_set(nCtx, domain.NativeObject));
2447 }
2448
2452 public ArrayExpr MkSetAdd(ArrayExpr set, Expr element)
2453 {
2454 Debug.Assert(set != null);
2455 Debug.Assert(element != null);
2456
2457 CheckContextMatch(set);
2458 CheckContextMatch(element);
2459 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_add(nCtx, set.NativeObject, element.NativeObject));
2460 }
2461
2462
2466 public ArrayExpr MkSetDel(ArrayExpr set, Expr element)
2467 {
2468 Debug.Assert(set != null);
2469 Debug.Assert(element != null);
2470
2471 CheckContextMatch(set);
2472 CheckContextMatch(element);
2473 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_del(nCtx, set.NativeObject, element.NativeObject));
2474 }
2475
2479 public ArrayExpr MkSetUnion(params ArrayExpr[] args)
2480 {
2481 Debug.Assert(args != null);
2482 Debug.Assert(args.All(a => a != null));
2483
2484 CheckContextMatch<ArrayExpr>(args);
2485 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_union(nCtx, (uint)args.Length, AST.ArrayToNative(args)));
2486 }
2487
2492 {
2493 Debug.Assert(args != null);
2494 Debug.Assert(args.All(a => a != null));
2495
2496 CheckContextMatch<ArrayExpr>(args);
2497 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_intersect(nCtx, (uint)args.Length, AST.ArrayToNative(args)));
2498 }
2499
2504 {
2505 Debug.Assert(arg1 != null);
2506 Debug.Assert(arg2 != null);
2507
2508 CheckContextMatch(arg1);
2509 CheckContextMatch(arg2);
2510 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_difference(nCtx, arg1.NativeObject, arg2.NativeObject));
2511 }
2512
2517 {
2518 Debug.Assert(arg != null);
2519
2520 CheckContextMatch(arg);
2521 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_complement(nCtx, arg.NativeObject));
2522 }
2523
2528 {
2529 Debug.Assert(elem != null);
2530 Debug.Assert(set != null);
2531
2532 CheckContextMatch(elem);
2533 CheckContextMatch(set);
2534 return (BoolExpr)Expr.Create(this, Native.Z3_mk_set_member(nCtx, elem.NativeObject, set.NativeObject));
2535 }
2536
2541 {
2542 Debug.Assert(arg1 != null);
2543 Debug.Assert(arg2 != null);
2544
2545 CheckContextMatch(arg1);
2546 CheckContextMatch(arg2);
2547 return (BoolExpr)Expr.Create(this, Native.Z3_mk_set_subset(nCtx, arg1.NativeObject, arg2.NativeObject));
2548 }
2549
2550 #endregion
2551
2552 #region Finite Sets
2553
2558 {
2559 Debug.Assert(elemSort != null);
2560
2561 CheckContextMatch(elemSort);
2562 return new FiniteSetSort(this, elemSort);
2563 }
2564
2568 public bool IsFiniteSetSort(Sort s)
2569 {
2570 Debug.Assert(s != null);
2571
2572 CheckContextMatch(s);
2573 return Native.Z3_is_finite_set_sort(nCtx, s.NativeObject) != 0;
2574 }
2575
2580 {
2581 Debug.Assert(s != null);
2582
2583 CheckContextMatch(s);
2584 return Sort.Create(this, Native.Z3_get_finite_set_sort_basis(nCtx, s.NativeObject));
2585 }
2586
2591 {
2592 Debug.Assert(setSort != null);
2593
2594 CheckContextMatch(setSort);
2595 return Expr.Create(this, Native.Z3_mk_finite_set_empty(nCtx, setSort.NativeObject));
2596 }
2597
2602 {
2603 Debug.Assert(elem != null);
2604
2605 CheckContextMatch(elem);
2606 return Expr.Create(this, Native.Z3_mk_finite_set_singleton(nCtx, elem.NativeObject));
2607 }
2608
2613 {
2614 Debug.Assert(s1 != null);
2615 Debug.Assert(s2 != null);
2616
2617 CheckContextMatch(s1);
2618 CheckContextMatch(s2);
2619 return Expr.Create(this, Native.Z3_mk_finite_set_union(nCtx, s1.NativeObject, s2.NativeObject));
2620 }
2621
2626 {
2627 Debug.Assert(s1 != null);
2628 Debug.Assert(s2 != null);
2629
2630 CheckContextMatch(s1);
2631 CheckContextMatch(s2);
2632 return Expr.Create(this, Native.Z3_mk_finite_set_intersect(nCtx, s1.NativeObject, s2.NativeObject));
2633 }
2634
2639 {
2640 Debug.Assert(s1 != null);
2641 Debug.Assert(s2 != null);
2642
2643 CheckContextMatch(s1);
2644 CheckContextMatch(s2);
2645 return Expr.Create(this, Native.Z3_mk_finite_set_difference(nCtx, s1.NativeObject, s2.NativeObject));
2646 }
2647
2652 {
2653 Debug.Assert(elem != null);
2654 Debug.Assert(set != null);
2655
2656 CheckContextMatch(elem);
2657 CheckContextMatch(set);
2658 return (BoolExpr)Expr.Create(this, Native.Z3_mk_finite_set_member(nCtx, elem.NativeObject, set.NativeObject));
2659 }
2660
2665 {
2666 Debug.Assert(set != null);
2667
2668 CheckContextMatch(set);
2669 return Expr.Create(this, Native.Z3_mk_finite_set_size(nCtx, set.NativeObject));
2670 }
2671
2676 {
2677 Debug.Assert(s1 != null);
2678 Debug.Assert(s2 != null);
2679
2680 CheckContextMatch(s1);
2681 CheckContextMatch(s2);
2682 return (BoolExpr)Expr.Create(this, Native.Z3_mk_finite_set_subset(nCtx, s1.NativeObject, s2.NativeObject));
2683 }
2684
2689 {
2690 Debug.Assert(f != null);
2691 Debug.Assert(set != null);
2692
2693 CheckContextMatch(f);
2694 CheckContextMatch(set);
2695 return Expr.Create(this, Native.Z3_mk_finite_set_map(nCtx, f.NativeObject, set.NativeObject));
2696 }
2697
2702 {
2703 Debug.Assert(f != null);
2704 Debug.Assert(set != null);
2705
2706 CheckContextMatch(f);
2707 CheckContextMatch(set);
2708 return Expr.Create(this, Native.Z3_mk_finite_set_filter(nCtx, f.NativeObject, set.NativeObject));
2709 }
2710
2714 public Expr MkFiniteSetRange(Expr low, Expr high)
2715 {
2716 Debug.Assert(low != null);
2717 Debug.Assert(high != null);
2718
2719 CheckContextMatch(low);
2720 CheckContextMatch(high);
2721 return Expr.Create(this, Native.Z3_mk_finite_set_range(nCtx, low.NativeObject, high.NativeObject));
2722 }
2723
2724 #endregion
2725
2726 #region Sequence, string and regular expressions
2727
2732 {
2733 Debug.Assert(s != null);
2734 return new SeqExpr(this, Native.Z3_mk_seq_empty(nCtx, s.NativeObject));
2735 }
2736
2740 public SeqExpr MkUnit(Expr elem)
2741 {
2742 Debug.Assert(elem != null);
2743 return new SeqExpr(this, Native.Z3_mk_seq_unit(nCtx, elem.NativeObject));
2744 }
2745
2749 public SeqExpr MkString(string s)
2750 {
2751 Debug.Assert(s != null);
2752 return new SeqExpr(this, Native.Z3_mk_string(nCtx, s));
2753 }
2754
2759 {
2760 Debug.Assert(e != null);
2761 Debug.Assert(e is ArithExpr);
2762 return new SeqExpr(this, Native.Z3_mk_int_to_str(nCtx, e.NativeObject));
2763 }
2764
2769 {
2770 Debug.Assert(e != null);
2771 Debug.Assert(e is ArithExpr);
2772 return new SeqExpr(this, Native.Z3_mk_ubv_to_str(nCtx, e.NativeObject));
2773 }
2774
2779 {
2780 Debug.Assert(e != null);
2781 Debug.Assert(e is ArithExpr);
2782 return new SeqExpr(this, Native.Z3_mk_sbv_to_str(nCtx, e.NativeObject));
2783 }
2784
2789 {
2790 Debug.Assert(e != null);
2791 Debug.Assert(e is SeqExpr);
2792 return new IntExpr(this, Native.Z3_mk_str_to_int(nCtx, e.NativeObject));
2793 }
2794
2795
2799 public SeqExpr MkConcat(params SeqExpr[] t)
2800 {
2801 Debug.Assert(t != null);
2802 Debug.Assert(t.All(a => a != null));
2803
2804 CheckContextMatch<SeqExpr>(t);
2805 return new SeqExpr(this, Native.Z3_mk_seq_concat(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
2806 }
2807
2808
2813 {
2814 Debug.Assert(s != null);
2815 return (IntExpr)Expr.Create(this, Native.Z3_mk_seq_length(nCtx, s.NativeObject));
2816 }
2817
2822 {
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));
2827 }
2828
2833 {
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));
2838 }
2839
2844 {
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));
2849 }
2850
2855 {
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));
2860 }
2861
2866 {
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));
2871 }
2872
2877 {
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));
2882 }
2883
2887 public SeqExpr MkAt(SeqExpr s, Expr index)
2888 {
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));
2893 }
2894
2898 public Expr MkNth(SeqExpr s, Expr index)
2899 {
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));
2904 }
2905
2909 public SeqExpr MkExtract(SeqExpr s, IntExpr offset, IntExpr length)
2910 {
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));
2916 }
2917
2921 public IntExpr MkIndexOf(SeqExpr s, SeqExpr substr, ArithExpr offset)
2922 {
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));
2928 }
2929
2934 {
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));
2940 }
2941
2946 {
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));
2951 }
2952
2957 {
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));
2963 }
2964
2969 {
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));
2975 }
2976
2981 {
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));
2989 }
2990
2995 {
2996 Debug.Assert(s != null);
2997 return new ReExpr(this, Native.Z3_mk_seq_to_re(nCtx, s.NativeObject));
2998 }
2999
3000
3005 {
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));
3010 }
3011
3016 {
3017 Debug.Assert(re != null);
3018 return new ReExpr(this, Native.Z3_mk_re_star(nCtx, re.NativeObject));
3019 }
3020
3024 public ReExpr MkLoop(ReExpr re, uint lo, uint hi = 0)
3025 {
3026 Debug.Assert(re != null);
3027 return new ReExpr(this, Native.Z3_mk_re_loop(nCtx, re.NativeObject, lo, hi));
3028 }
3029
3034 {
3035 Debug.Assert(re != null);
3036 return new ReExpr(this, Native.Z3_mk_re_plus(nCtx, re.NativeObject));
3037 }
3038
3043 {
3044 Debug.Assert(re != null);
3045 return new ReExpr(this, Native.Z3_mk_re_option(nCtx, re.NativeObject));
3046 }
3047
3052 {
3053 Debug.Assert(re != null);
3054 return new ReExpr(this, Native.Z3_mk_re_complement(nCtx, re.NativeObject));
3055 }
3056
3060 public ReExpr MkConcat(params ReExpr[] t)
3061 {
3062 Debug.Assert(t != null);
3063 Debug.Assert(t.All(a => a != null));
3064
3065 CheckContextMatch<ReExpr>(t);
3066 return new ReExpr(this, Native.Z3_mk_re_concat(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
3067 }
3068
3072 public ReExpr MkUnion(params ReExpr[] t)
3073 {
3074 Debug.Assert(t != null);
3075 Debug.Assert(t.All(a => a != null));
3076
3077 CheckContextMatch<ReExpr>(t);
3078 return new ReExpr(this, Native.Z3_mk_re_union(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
3079 }
3080
3084 public ReExpr MkIntersect(params ReExpr[] t)
3085 {
3086 Debug.Assert(t != null);
3087 Debug.Assert(t.All(a => a != null));
3088
3089 CheckContextMatch<ReExpr>(t);
3090 return new ReExpr(this, Native.Z3_mk_re_intersect(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
3091 }
3092
3097 {
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));
3102 }
3103
3109 {
3110 Debug.Assert(s != null);
3111 return new ReExpr(this, Native.Z3_mk_re_empty(nCtx, s.NativeObject));
3112 }
3113
3119 {
3120 Debug.Assert(s != null);
3121 return new ReExpr(this, Native.Z3_mk_re_full(nCtx, s.NativeObject));
3122 }
3123
3124
3129 {
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));
3134 }
3135
3139 public BoolExpr MkCharLe(Expr ch1, Expr ch2)
3140 {
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));
3144 }
3145
3150 {
3151 Debug.Assert(ch != null);
3152 return new IntExpr(this, Native.Z3_mk_char_to_int(nCtx, ch.NativeObject));
3153 }
3154
3159 {
3160 Debug.Assert(ch != null);
3161 return new BitVecExpr(this, Native.Z3_mk_char_to_bv(nCtx, ch.NativeObject));
3162 }
3163
3168 {
3169 Debug.Assert(bv != null);
3170 return new Expr(this, Native.Z3_mk_char_from_bv(nCtx, bv.NativeObject));
3171 }
3172
3177 {
3178 Debug.Assert(ch != null);
3179 return new BoolExpr(this, Native.Z3_mk_char_is_digit(nCtx, ch.NativeObject));
3180 }
3181
3182 #endregion
3183
3184 #region Pseudo-Boolean constraints
3185
3189 public BoolExpr MkAtMost(IEnumerable<BoolExpr> args, uint k)
3190 {
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));
3196 }
3197
3201 public BoolExpr MkAtLeast(IEnumerable<BoolExpr> args, uint k)
3202 {
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));
3208 }
3209
3213 public BoolExpr MkPBLe(int[] coeffs, BoolExpr[] args, int k)
3214 {
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),
3221 coeffs, k));
3222 }
3223
3227 public BoolExpr MkPBGe(int[] coeffs, BoolExpr[] args, int k)
3228 {
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),
3235 coeffs, k));
3236 }
3240 public BoolExpr MkPBEq(int[] coeffs, BoolExpr[] args, int k)
3241 {
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),
3248 coeffs, k));
3249 }
3250 #endregion
3251
3252 #region Numerals
3253
3254 #region General Numerals
3261 public Expr MkNumeral(string v, Sort ty)
3262 {
3263 Debug.Assert(ty != null);
3264
3265 CheckContextMatch(ty);
3266 return Expr.Create(this, Native.Z3_mk_numeral(nCtx, v, ty.NativeObject));
3267 }
3268
3276 public Expr MkNumeral(int v, Sort ty)
3277 {
3278 Debug.Assert(ty != null);
3279
3280 CheckContextMatch(ty);
3281 return Expr.Create(this, Native.Z3_mk_int(nCtx, v, ty.NativeObject));
3282 }
3283
3291 public Expr MkNumeral(uint v, Sort ty)
3292 {
3293 Debug.Assert(ty != null);
3294
3295 CheckContextMatch(ty);
3296 return Expr.Create(this, Native.Z3_mk_unsigned_int(nCtx, v, ty.NativeObject));
3297 }
3298
3306 public Expr MkNumeral(long v, Sort ty)
3307 {
3308 Debug.Assert(ty != null);
3309
3310 CheckContextMatch(ty);
3311 return Expr.Create(this, Native.Z3_mk_int64(nCtx, v, ty.NativeObject));
3312 }
3313
3321 public Expr MkNumeral(ulong v, Sort ty)
3322 {
3323 Debug.Assert(ty != null);
3324
3325 CheckContextMatch(ty);
3326 return Expr.Create(this, Native.Z3_mk_unsigned_int64(nCtx, v, ty.NativeObject));
3327 }
3328 #endregion
3329
3330 #region Reals
3338 public RatNum MkReal(int num, int den)
3339 {
3340 if (den == 0)
3341 throw new Z3Exception("Denominator is zero");
3342
3343 return new RatNum(this, Native.Z3_mk_real(nCtx, num, den));
3344 }
3345
3351 public RatNum MkReal(string v)
3352 {
3353
3354 return new RatNum(this, Native.Z3_mk_numeral(nCtx, v, RealSort.NativeObject));
3355 }
3356
3362 public RatNum MkReal(int v)
3363 {
3364
3365 return new RatNum(this, Native.Z3_mk_int(nCtx, v, RealSort.NativeObject));
3366 }
3367
3373 public RatNum MkReal(uint v)
3374 {
3375
3376 return new RatNum(this, Native.Z3_mk_unsigned_int(nCtx, v, RealSort.NativeObject));
3377 }
3378
3384 public RatNum MkReal(long v)
3385 {
3386
3387 return new RatNum(this, Native.Z3_mk_int64(nCtx, v, RealSort.NativeObject));
3388 }
3389
3395 public RatNum MkReal(ulong v)
3396 {
3397
3398 return new RatNum(this, Native.Z3_mk_unsigned_int64(nCtx, v, RealSort.NativeObject));
3399 }
3400 #endregion
3401
3402 #region Integers
3407 public IntNum MkInt(string v)
3408 {
3409
3410 return new IntNum(this, Native.Z3_mk_numeral(nCtx, v, IntSort.NativeObject));
3411 }
3412
3418 public IntNum MkInt(int v)
3419 {
3420
3421 return new IntNum(this, Native.Z3_mk_int(nCtx, v, IntSort.NativeObject));
3422 }
3423
3429 public IntNum MkInt(uint v)
3430 {
3431
3432 return new IntNum(this, Native.Z3_mk_unsigned_int(nCtx, v, IntSort.NativeObject));
3433 }
3434
3440 public IntNum MkInt(long v)
3441 {
3442
3443 return new IntNum(this, Native.Z3_mk_int64(nCtx, v, IntSort.NativeObject));
3444 }
3445
3451 public IntNum MkInt(ulong v)
3452 {
3453
3454 return new IntNum(this, Native.Z3_mk_unsigned_int64(nCtx, v, IntSort.NativeObject));
3455 }
3456 #endregion
3457
3458 #region Bit-vectors
3464 public BitVecNum MkBV(string v, uint size)
3465 {
3466 using var sort = MkBitVecSort(size);
3467 return (BitVecNum)MkNumeral(v, sort);
3468 }
3469
3475 public BitVecNum MkBV(int v, uint size)
3476 {
3477 using var sort = MkBitVecSort(size);
3478 return (BitVecNum)MkNumeral(v, sort);
3479 }
3480
3486 public BitVecNum MkBV(uint v, uint size)
3487 {
3488 using var sort = MkBitVecSort(size);
3489 return (BitVecNum)MkNumeral(v, sort);
3490 }
3491
3497 public BitVecNum MkBV(long v, uint size)
3498 {
3499 using var sort = MkBitVecSort(size);
3500 return (BitVecNum)MkNumeral(v, sort);
3501 }
3502
3508 public BitVecNum MkBV(ulong v, uint size)
3509 {
3510 using var sort = MkBitVecSort(size);
3511 return (BitVecNum)MkNumeral(v, sort);
3512 }
3513
3518 public BitVecNum MkBV(bool[] bits)
3519 {
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));
3523 }
3524
3525
3526 #endregion
3527
3528 #endregion // Numerals
3529
3530 #region Quantifiers
3555 public Quantifier MkForall(Sort[] sorts, Symbol[] names, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
3556 {
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));
3565
3566
3567 return new Quantifier(this, true, sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3568 }
3569
3570
3579 public Quantifier MkForall(Expr[] boundConstants, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
3580 {
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));
3585
3586
3587 return new Quantifier(this, true, boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3588 }
3589
3597 public Quantifier MkExists(Sort[] sorts, Symbol[] names, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
3598 {
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));
3607
3608 return new Quantifier(this, false, sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3609 }
3610
3619 public Quantifier MkExists(Expr[] boundConstants, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
3620 {
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));
3625
3626 return new Quantifier(this, false, boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3627 }
3628
3629
3634 public 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)
3635 {
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));
3644
3645
3646 if (universal)
3647 return MkForall(sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3648 else
3649 return MkExists(sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3650 }
3651
3652
3657 public Quantifier MkQuantifier(bool universal, Expr[] boundConstants, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
3658 {
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));
3663
3664
3665 if (universal)
3666 return MkForall(boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3667 else
3668 return MkExists(boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3669 }
3670
3689 public Lambda MkLambda(Sort[] sorts, Symbol[] names, Expr body)
3690 {
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);
3698 }
3699
3708 public Lambda MkLambda(Expr[] boundConstants, Expr body)
3709 {
3710 Debug.Assert(body != null);
3711 Debug.Assert(boundConstants != null && boundConstants.All(b => b != null));
3712 return new Lambda(this, boundConstants, body);
3713 }
3714
3715
3716 #endregion
3717
3718 #endregion // Expr
3719
3720 #region Options
3738 {
3739 get { return m_print_mode; }
3740 set
3741 {
3742 Native.Z3_set_ast_print_mode(nCtx, (uint)value);
3743 m_print_mode = value;
3744 }
3745 }
3746 #endregion
3747
3748 #region SMT Files & Strings
3749
3754 public BoolExpr[] ParseSMTLIB2String(string str, Symbol[] sortNames = null, Sort[] sorts = null, Symbol[] declNames = null, FuncDecl[] decls = null)
3755 {
3756
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)
3762 throw new Z3Exception("Argument size mismatch");
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();
3767 }
3768
3773 public BoolExpr[] ParseSMTLIB2File(string fileName, Symbol[] sortNames = null, Sort[] sorts = null, Symbol[] declNames = null, FuncDecl[] decls = null)
3774 {
3775
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)
3781 throw new Z3Exception("Argument size mismatch");
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();
3786 }
3787
3798 public string BenchmarkToSmtlibString(string name, string logic, string status, string attributes, BoolExpr[] assumptions, BoolExpr formula)
3799 {
3800 Debug.Assert(assumptions != null);
3801 Debug.Assert(formula != null);
3802
3803 return Native.Z3_benchmark_to_smtlib_string(
3804 nCtx,
3805 name,
3806 logic,
3807 status,
3808 attributes,
3809 (uint)(assumptions?.Length ?? 0),
3810 AST.ArrayToNative(assumptions),
3811 formula.NativeObject);
3812 }
3813 #endregion
3814
3815 #region Goals
3826 public Goal MkGoal(bool models = true, bool unsatCores = false, bool proofs = false)
3827 {
3828
3829 return new Goal(this, models, unsatCores, proofs);
3830 }
3831 #endregion
3832
3833 #region ParameterSets
3838 {
3839
3840 return new Params(this);
3841 }
3842 #endregion
3843
3844 #region Tactics
3848 public uint NumTactics
3849 {
3850 get { return Native.Z3_get_num_tactics(nCtx); }
3851 }
3852
3856 public string[] TacticNames
3857 {
3858 get
3859 {
3860
3861 uint n = NumTactics;
3862 string[] res = new string[n];
3863 for (uint i = 0; i < n; i++)
3864 res[i] = Native.Z3_get_tactic_name(nCtx, i);
3865 return res;
3866 }
3867 }
3868
3872 public string TacticDescription(string name)
3873 {
3874
3875 return Native.Z3_tactic_get_descr(nCtx, name);
3876 }
3877
3881 public Tactic MkTactic(string name)
3882 {
3883
3884 return new Tactic(this, name);
3885 }
3886
3891 public Tactic AndThen(Tactic t1, Tactic t2, params Tactic[] ts)
3892 {
3893 Debug.Assert(t1 != null);
3894 Debug.Assert(t2 != null);
3895 // Debug.Assert(ts == null || Contract.ForAll(0, ts.Length, j => ts[j] != null));
3896
3897
3898 CheckContextMatch(t1);
3899 CheckContextMatch(t2);
3900 CheckContextMatch<Tactic>(ts);
3901
3902 IntPtr last = IntPtr.Zero;
3903 if (ts != null && ts.Length > 0)
3904 {
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);
3908 }
3909 if (last != IntPtr.Zero)
3910 {
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));
3913 }
3914 else
3915 return new Tactic(this, Native.Z3_tactic_and_then(nCtx, t1.NativeObject, t2.NativeObject));
3916 }
3917
3925 public Tactic Then(Tactic t1, Tactic t2, params Tactic[] ts)
3926 {
3927 Debug.Assert(t1 != null);
3928 Debug.Assert(t2 != null);
3929 // Debug.Assert(ts == null || Contract.ForAll(0, ts.Length, j => ts[j] != null));
3930
3931 return AndThen(t1, t2, ts);
3932 }
3933
3939 {
3940 Debug.Assert(t1 != null);
3941 Debug.Assert(t2 != null);
3942
3943 CheckContextMatch(t1);
3944 CheckContextMatch(t2);
3945 return new Tactic(this, Native.Z3_tactic_or_else(nCtx, t1.NativeObject, t2.NativeObject));
3946 }
3947
3954 public Tactic TryFor(Tactic t, uint ms)
3955 {
3956 Debug.Assert(t != null);
3957
3958 CheckContextMatch(t);
3959 return new Tactic(this, Native.Z3_tactic_try_for(nCtx, t.NativeObject, ms));
3960 }
3961
3970 {
3971 Debug.Assert(p != null);
3972 Debug.Assert(t != null);
3973
3974 CheckContextMatch(t);
3975 CheckContextMatch(p);
3976 return new Tactic(this, Native.Z3_tactic_when(nCtx, p.NativeObject, t.NativeObject));
3977 }
3978
3983 public Tactic Cond(Probe p, Tactic t1, Tactic t2)
3984 {
3985 Debug.Assert(p != null);
3986 Debug.Assert(t1 != null);
3987 Debug.Assert(t2 != null);
3988
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));
3993 }
3994
3999 public Tactic Repeat(Tactic t, uint max = uint.MaxValue)
4000 {
4001 Debug.Assert(t != null);
4002
4003 CheckContextMatch(t);
4004 return new Tactic(this, Native.Z3_tactic_repeat(nCtx, t.NativeObject, max));
4005 }
4006
4010 public Tactic Skip()
4011 {
4012
4013 return new Tactic(this, Native.Z3_tactic_skip(nCtx));
4014 }
4015
4019 public Tactic Fail()
4020 {
4021
4022 return new Tactic(this, Native.Z3_tactic_fail(nCtx));
4023 }
4024
4029 {
4030 Debug.Assert(p != null);
4031
4032 CheckContextMatch(p);
4033 return new Tactic(this, Native.Z3_tactic_fail_if(nCtx, p.NativeObject));
4034 }
4035
4041 {
4042
4043 return new Tactic(this, Native.Z3_tactic_fail_if_not_decided(nCtx));
4044 }
4045
4050 {
4051 Debug.Assert(t != null);
4052 Debug.Assert(p != null);
4053
4054 CheckContextMatch(t);
4055 CheckContextMatch(p);
4056 return new Tactic(this, Native.Z3_tactic_using_params(nCtx, t.NativeObject, p.NativeObject));
4057 }
4058
4064 {
4065 Debug.Assert(t != null);
4066 Debug.Assert(p != null);
4067
4068 return UsingParams(t, p);
4069 }
4070
4074 public Tactic ParOr(params Tactic[] t)
4075 {
4076 Debug.Assert(t == null || t.All(tactic => tactic != null));
4077
4078 CheckContextMatch<Tactic>(t);
4079 return new Tactic(this, Native.Z3_tactic_par_or(nCtx, Tactic.ArrayLength(t), Tactic.ArrayToNative(t)));
4080 }
4081
4087 {
4088 Debug.Assert(t1 != null);
4089 Debug.Assert(t2 != null);
4090
4091 CheckContextMatch(t1);
4092 CheckContextMatch(t2);
4093 return new Tactic(this, Native.Z3_tactic_par_and_then(nCtx, t1.NativeObject, t2.NativeObject));
4094 }
4095
4100 public void Interrupt()
4101 {
4102 Native.Z3_interrupt(nCtx);
4103 }
4104 #endregion
4105
4106 #region Quantifier Elimination
4111 {
4112 return new ASTMap(this);
4113 }
4114
4118 public Expr QeLite(ASTVector vars, Expr body)
4119 {
4120 CheckContextMatch(vars);
4121 CheckContextMatch(body);
4122 return Expr.Create(this, Native.Z3_qe_lite(nCtx, vars.NativeObject, body.NativeObject));
4123 }
4124
4128 public Expr QeModelProject(Model model, Expr[] bounds, Expr body)
4129 {
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));
4135 }
4136
4140 public Expr QeModelProjectSkolem(Model model, Expr[] bounds, Expr body, ASTMap map)
4141 {
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));
4148 }
4149
4153 public Expr QeModelProjectWithWitness(Model model, Expr[] bounds, Expr body, ASTMap map)
4154 {
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));
4161 }
4162 #endregion
4163
4164 #region Simplifiers
4168 public uint NumSimplifiers
4169 {
4170 get { return Native.Z3_get_num_simplifiers(nCtx); }
4171 }
4172
4176 public string[] SimplifierNames
4177 {
4178 get
4179 {
4180
4181 uint n = NumSimplifiers;
4182 string[] res = new string[n];
4183 for (uint i = 0; i < n; i++)
4184 res[i] = Native.Z3_get_simplifier_name(nCtx, i);
4185 return res;
4186 }
4187 }
4188
4192 public string SimplifierDescription(string name)
4193 {
4194
4195 return Native.Z3_simplifier_get_descr(nCtx, name);
4196 }
4197
4201 public Simplifier MkSimplifier(string name)
4202 {
4203
4204 return new Simplifier(this, name);
4205 }
4206
4212 {
4213 Debug.Assert(t1 != null);
4214 Debug.Assert(t2 != null);
4215 // Debug.Assert(ts == null || Contract.ForAll(0, ts.Length, j => ts[j] != null));
4216
4217
4218 CheckContextMatch(t1);
4219 CheckContextMatch(t2);
4220 CheckContextMatch<Simplifier>(ts);
4221
4222 IntPtr last = IntPtr.Zero;
4223 if (ts != null && ts.Length > 0)
4224 {
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);
4228 }
4229 if (last != IntPtr.Zero)
4230 {
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));
4233 }
4234 else
4235 return new Simplifier(this, Native.Z3_simplifier_and_then(nCtx, t1.NativeObject, t2.NativeObject));
4236 }
4237
4245 public Simplifier Then(Simplifier t1, Simplifier t2, params Simplifier[] ts)
4246 {
4247 Debug.Assert(t1 != null);
4248 Debug.Assert(t2 != null);
4249 // Debug.Assert(ts == null || Contract.ForAll(0, ts.Length, j => ts[j] != null));
4250
4251 return AndThen(t1, t2, ts);
4252 }
4253
4258 {
4259 Debug.Assert(t != null);
4260 Debug.Assert(p != null);
4261
4262 CheckContextMatch(t);
4263 CheckContextMatch(p);
4264 return new Simplifier(this, Native.Z3_simplifier_using_params(nCtx, t.NativeObject, p.NativeObject));
4265 }
4266 #endregion
4267
4268 #region Probes
4272 public uint NumProbes
4273 {
4274 get { return Native.Z3_get_num_probes(nCtx); }
4275 }
4276
4280 public string[] ProbeNames
4281 {
4282 get
4283 {
4284
4285 uint n = NumProbes;
4286 string[] res = new string[n];
4287 for (uint i = 0; i < n; i++)
4288 res[i] = Native.Z3_get_probe_name(nCtx, i);
4289 return res;
4290 }
4291 }
4292
4296 public string ProbeDescription(string name)
4297 {
4298
4299 return Native.Z3_probe_get_descr(nCtx, name);
4300 }
4301
4305 public Probe MkProbe(string name)
4306 {
4307
4308 return new Probe(this, name);
4309 }
4310
4314 public Probe ConstProbe(double val)
4315 {
4316
4317 return new Probe(this, Native.Z3_probe_const(nCtx, val));
4318 }
4319
4324 public Probe Lt(Probe p1, Probe p2)
4325 {
4326 Debug.Assert(p1 != null);
4327 Debug.Assert(p2 != null);
4328
4329 CheckContextMatch(p1);
4330 CheckContextMatch(p2);
4331 return new Probe(this, Native.Z3_probe_lt(nCtx, p1.NativeObject, p2.NativeObject));
4332 }
4333
4338 public Probe Gt(Probe p1, Probe p2)
4339 {
4340 Debug.Assert(p1 != null);
4341 Debug.Assert(p2 != null);
4342
4343 CheckContextMatch(p1);
4344 CheckContextMatch(p2);
4345 return new Probe(this, Native.Z3_probe_gt(nCtx, p1.NativeObject, p2.NativeObject));
4346 }
4347
4352 public Probe Le(Probe p1, Probe p2)
4353 {
4354 Debug.Assert(p1 != null);
4355 Debug.Assert(p2 != null);
4356
4357 CheckContextMatch(p1);
4358 CheckContextMatch(p2);
4359 return new Probe(this, Native.Z3_probe_le(nCtx, p1.NativeObject, p2.NativeObject));
4360 }
4361
4366 public Probe Ge(Probe p1, Probe p2)
4367 {
4368 Debug.Assert(p1 != null);
4369 Debug.Assert(p2 != null);
4370
4371 CheckContextMatch(p1);
4372 CheckContextMatch(p2);
4373 return new Probe(this, Native.Z3_probe_ge(nCtx, p1.NativeObject, p2.NativeObject));
4374 }
4375
4380 public Probe Eq(Probe p1, Probe p2)
4381 {
4382 Debug.Assert(p1 != null);
4383 Debug.Assert(p2 != null);
4384
4385 CheckContextMatch(p1);
4386 CheckContextMatch(p2);
4387 return new Probe(this, Native.Z3_probe_eq(nCtx, p1.NativeObject, p2.NativeObject));
4388 }
4389
4394 public Probe And(Probe p1, Probe p2)
4395 {
4396 Debug.Assert(p1 != null);
4397 Debug.Assert(p2 != null);
4398
4399 CheckContextMatch(p1);
4400 CheckContextMatch(p2);
4401 return new Probe(this, Native.Z3_probe_and(nCtx, p1.NativeObject, p2.NativeObject));
4402 }
4403
4408 public Probe Or(Probe p1, Probe p2)
4409 {
4410 Debug.Assert(p1 != null);
4411 Debug.Assert(p2 != null);
4412
4413 CheckContextMatch(p1);
4414 CheckContextMatch(p2);
4415 return new Probe(this, Native.Z3_probe_or(nCtx, p1.NativeObject, p2.NativeObject));
4416 }
4417
4422 public Probe Not(Probe p)
4423 {
4424 Debug.Assert(p != null);
4425
4426 CheckContextMatch(p);
4427 return new Probe(this, Native.Z3_probe_not(nCtx, p.NativeObject));
4428 }
4429 #endregion
4430
4431 #region Solvers
4440 public Solver MkSolver(Symbol logic = null)
4441 {
4442
4443 if (logic == null)
4444 return new Solver(this, Native.Z3_mk_solver(nCtx));
4445 else
4446 return new Solver(this, Native.Z3_mk_solver_for_logic(nCtx, logic.NativeObject));
4447 }
4448
4453 public Solver MkSolver(string logic)
4454 {
4455 using var symbol = MkSymbol(logic);
4456 return MkSolver(symbol);
4457 }
4458
4463 {
4464
4465 return new Solver(this, Native.Z3_mk_simple_solver(nCtx));
4466 }
4467
4472 {
4473 Debug.Assert(t != null);
4474 Debug.Assert(s != null);
4475 return new Solver(this, Native.Z3_solver_add_simplifier(nCtx, s.NativeObject, t.NativeObject));
4476 }
4477
4486 {
4487 Debug.Assert(t != null);
4488
4489 return new Solver(this, Native.Z3_mk_solver_from_tactic(nCtx, t.NativeObject));
4490 }
4491
4492
4493 #endregion
4494
4495 #region Fixedpoints
4500 {
4501
4502 return new Fixedpoint(this);
4503 }
4504 #endregion
4505
4506 #region Optimization
4511 {
4512
4513 return new Optimize(this);
4514 }
4515 #endregion
4516
4517 #region Floating-Point Arithmetic
4518
4519 #region Rounding Modes
4520 #region RoundingMode Sort
4525 {
4526 return new FPRMSort(this);
4527 }
4528 #endregion
4529
4530 #region Numerals
4535 {
4536 return new FPRMExpr(this, Native.Z3_mk_fpa_round_nearest_ties_to_even(nCtx));
4537 }
4538
4543 {
4544 return new FPRMNum(this, Native.Z3_mk_fpa_rne(nCtx));
4545 }
4546
4551 {
4552 return new FPRMNum(this, Native.Z3_mk_fpa_round_nearest_ties_to_away(nCtx));
4553 }
4554
4559 {
4560 return new FPRMNum(this, Native.Z3_mk_fpa_rna(nCtx));
4561 }
4562
4567 {
4568 return new FPRMNum(this, Native.Z3_mk_fpa_round_toward_positive(nCtx));
4569 }
4570
4575 {
4576 return new FPRMNum(this, Native.Z3_mk_fpa_rtp(nCtx));
4577 }
4578
4583 {
4584 return new FPRMNum(this, Native.Z3_mk_fpa_round_toward_negative(nCtx));
4585 }
4586
4591 {
4592 return new FPRMNum(this, Native.Z3_mk_fpa_rtn(nCtx));
4593 }
4594
4599 {
4600 return new FPRMNum(this, Native.Z3_mk_fpa_round_toward_zero(nCtx));
4601 }
4602
4607 {
4608 return new FPRMNum(this, Native.Z3_mk_fpa_rtz(nCtx));
4609 }
4610 #endregion
4611 #endregion
4612
4613 #region FloatingPoint Sorts
4619 public FPSort MkFPSort(uint ebits, uint sbits)
4620 {
4621 return new FPSort(this, ebits, sbits);
4622 }
4623
4628 {
4629 return new FPSort(this, Native.Z3_mk_fpa_sort_half(nCtx));
4630 }
4631
4636 {
4637 return new FPSort(this, Native.Z3_mk_fpa_sort_16(nCtx));
4638 }
4639
4644 {
4645 return new FPSort(this, Native.Z3_mk_fpa_sort_single(nCtx));
4646 }
4647
4652 {
4653 return new FPSort(this, Native.Z3_mk_fpa_sort_32(nCtx));
4654 }
4655
4660 {
4661 return new FPSort(this, Native.Z3_mk_fpa_sort_double(nCtx));
4662 }
4663
4668 {
4669 return new FPSort(this, Native.Z3_mk_fpa_sort_64(nCtx));
4670 }
4671
4676 {
4677 return new FPSort(this, Native.Z3_mk_fpa_sort_quadruple(nCtx));
4678 }
4679
4684 {
4685 return new FPSort(this, Native.Z3_mk_fpa_sort_128(nCtx));
4686 }
4687 #endregion
4688
4689 #region Numerals
4695 {
4696 return new FPNum(this, Native.Z3_mk_fpa_nan(nCtx, s.NativeObject));
4697 }
4698
4704 public FPNum MkFPInf(FPSort s, bool negative)
4705 {
4706 return new FPNum(this, Native.Z3_mk_fpa_inf(nCtx, s.NativeObject, (byte)(negative ? 1 : 0)));
4707 }
4708
4714 public FPNum MkFPZero(FPSort s, bool negative)
4715 {
4716 return new FPNum(this, Native.Z3_mk_fpa_zero(nCtx, s.NativeObject, (byte)(negative ? 1 : 0)));
4717 }
4718
4724 public FPNum MkFPNumeral(float v, FPSort s)
4725 {
4726 return new FPNum(this, Native.Z3_mk_fpa_numeral_float(nCtx, v, s.NativeObject));
4727 }
4728
4734 public FPNum MkFPNumeral(double v, FPSort s)
4735 {
4736 return new FPNum(this, Native.Z3_mk_fpa_numeral_double(nCtx, v, s.NativeObject));
4737 }
4738
4744 public FPNum MkFPNumeral(int v, FPSort s)
4745 {
4746 return new FPNum(this, Native.Z3_mk_fpa_numeral_int(nCtx, v, s.NativeObject));
4747 }
4748
4756 public FPNum MkFPNumeral(bool sgn, uint sig, int exp, FPSort s)
4757 {
4758 return new FPNum(this, Native.Z3_mk_fpa_numeral_int_uint(nCtx, (byte)(sgn ? 1 : 0), exp, sig, s.NativeObject));
4759 }
4760
4768 public FPNum MkFPNumeral(bool sgn, Int64 exp, UInt64 sig, FPSort s)
4769 {
4770 return new FPNum(this, Native.Z3_mk_fpa_numeral_int64_uint64(nCtx, (byte)(sgn ? 1 : 0), exp, sig, s.NativeObject));
4771 }
4772
4778 public FPNum MkFP(float v, FPSort s)
4779 {
4780 return MkFPNumeral(v, s);
4781 }
4782
4788 public FPNum MkFP(double v, FPSort s)
4789 {
4790 return MkFPNumeral(v, s);
4791 }
4792
4798 public FPNum MkFP(int v, FPSort s)
4799 {
4800 return MkFPNumeral(v, s);
4801 }
4802
4810 public FPNum MkFP(bool sgn, int exp, uint sig, FPSort s)
4811 {
4812 return MkFPNumeral(sgn, exp, sig, s);
4813 }
4814
4822 public FPNum MkFP(bool sgn, Int64 exp, UInt64 sig, FPSort s)
4823 {
4824 return MkFPNumeral(sgn, exp, sig, s);
4825 }
4826
4827 #endregion
4828
4829 #region Operators
4835 {
4836 return new FPExpr(this, Native.Z3_mk_fpa_abs(this.nCtx, t.NativeObject));
4837 }
4838
4844 {
4845 return new FPExpr(this, Native.Z3_mk_fpa_neg(this.nCtx, t.NativeObject));
4846 }
4847
4855 {
4856 return new FPExpr(this, Native.Z3_mk_fpa_add(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4857 }
4858
4866 {
4867 return new FPExpr(this, Native.Z3_mk_fpa_sub(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4868 }
4869
4877 {
4878 return new FPExpr(this, Native.Z3_mk_fpa_mul(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4879 }
4880
4888 {
4889 return new FPExpr(this, Native.Z3_mk_fpa_div(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4890 }
4891
4903 {
4904 return new FPExpr(this, Native.Z3_mk_fpa_fma(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject, t3.NativeObject));
4905 }
4906
4913 {
4914 return new FPExpr(this, Native.Z3_mk_fpa_sqrt(this.nCtx, rm.NativeObject, t.NativeObject));
4915 }
4916
4923 {
4924 return new FPExpr(this, Native.Z3_mk_fpa_rem(this.nCtx, t1.NativeObject, t2.NativeObject));
4925 }
4926
4934 {
4935 return new FPExpr(this, Native.Z3_mk_fpa_round_to_integral(this.nCtx, rm.NativeObject, t.NativeObject));
4936 }
4937
4944 {
4945 return new FPExpr(this, Native.Z3_mk_fpa_min(this.nCtx, t1.NativeObject, t2.NativeObject));
4946 }
4947
4954 {
4955 return new FPExpr(this, Native.Z3_mk_fpa_max(this.nCtx, t1.NativeObject, t2.NativeObject));
4956 }
4957
4964 {
4965 return new BoolExpr(this, Native.Z3_mk_fpa_leq(this.nCtx, t1.NativeObject, t2.NativeObject));
4966 }
4967
4974 {
4975 return new BoolExpr(this, Native.Z3_mk_fpa_lt(this.nCtx, t1.NativeObject, t2.NativeObject));
4976 }
4977
4984 {
4985 return new BoolExpr(this, Native.Z3_mk_fpa_geq(this.nCtx, t1.NativeObject, t2.NativeObject));
4986 }
4987
4994 {
4995 return new BoolExpr(this, Native.Z3_mk_fpa_gt(this.nCtx, t1.NativeObject, t2.NativeObject));
4996 }
4997
5007 {
5008 return new BoolExpr(this, Native.Z3_mk_fpa_eq(this.nCtx, t1.NativeObject, t2.NativeObject));
5009 }
5010
5016 {
5017 return new BoolExpr(this, Native.Z3_mk_fpa_is_normal(this.nCtx, t.NativeObject));
5018 }
5019
5025 {
5026 return new BoolExpr(this, Native.Z3_mk_fpa_is_subnormal(this.nCtx, t.NativeObject));
5027 }
5028
5034 {
5035 return new BoolExpr(this, Native.Z3_mk_fpa_is_zero(this.nCtx, t.NativeObject));
5036 }
5037
5043 {
5044 return new BoolExpr(this, Native.Z3_mk_fpa_is_infinite(this.nCtx, t.NativeObject));
5045 }
5046
5052 {
5053 return new BoolExpr(this, Native.Z3_mk_fpa_is_nan(this.nCtx, t.NativeObject));
5054 }
5055
5061 {
5062 return new BoolExpr(this, Native.Z3_mk_fpa_is_negative(this.nCtx, t.NativeObject));
5063 }
5064
5070 {
5071 return new BoolExpr(this, Native.Z3_mk_fpa_is_positive(this.nCtx, t.NativeObject));
5072 }
5073 #endregion
5074
5075 #region Conversions to FloatingPoint terms
5090 {
5091 return new FPExpr(this, Native.Z3_mk_fpa_fp(this.nCtx, sgn.NativeObject, sig.NativeObject, exp.NativeObject));
5092 }
5093
5106 {
5107 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_bv(this.nCtx, bv.NativeObject, s.NativeObject));
5108 }
5109
5122 {
5123 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_float(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5124 }
5125
5138 {
5139 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_real(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5140 }
5141
5155 public FPExpr MkFPToFP(FPRMExpr rm, BitVecExpr t, FPSort s, bool signed)
5156 {
5157 if (signed)
5158 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_signed(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5159 else
5160 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_unsigned(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
5161 }
5162
5174 {
5175 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_float(this.nCtx, s.NativeObject, rm.NativeObject, t.NativeObject));
5176 }
5177 #endregion
5178
5179 #region Conversions from FloatingPoint terms
5192 public BitVecExpr MkFPToBV(FPRMExpr rm, FPExpr t, uint sz, bool sign)
5193 {
5194 if (sign)
5195 return new BitVecExpr(this, Native.Z3_mk_fpa_to_sbv(this.nCtx, rm.NativeObject, t.NativeObject, sz));
5196 else
5197 return new BitVecExpr(this, Native.Z3_mk_fpa_to_ubv(this.nCtx, rm.NativeObject, t.NativeObject, sz));
5198 }
5199
5210 {
5211 return new RealExpr(this, Native.Z3_mk_fpa_to_real(this.nCtx, t.NativeObject));
5212 }
5213 #endregion
5214
5215 #region Z3-specific extensions
5227 {
5228 return new BitVecExpr(this, Native.Z3_mk_fpa_to_ieee_bv(this.nCtx, t.NativeObject));
5229 }
5230
5244 {
5245 return new BitVecExpr(this, Native.Z3_mk_fpa_to_fp_int_real(this.nCtx, rm.NativeObject, exp.NativeObject, sig.NativeObject, s.NativeObject));
5246 }
5247 #endregion
5248 #endregion // Floating-point Arithmetic
5249
5250 #region Miscellaneous
5261 public AST WrapAST(IntPtr nativeObject)
5262 {
5263 return AST.Create(this, nativeObject);
5264 }
5265
5277 public IntPtr UnwrapAST(AST a)
5278 {
5279 return a.NativeObject;
5280 }
5281
5287 public FuncDecl MkPartialOrder(Sort a, uint index)
5288 {
5289 return new FuncDecl(this, Native.Z3_mk_partial_order(this.nCtx, a.NativeObject, index));
5290 }
5291
5298 {
5299 return new FuncDecl(this, Native.Z3_mk_transitive_closure(this.nCtx, f.NativeObject));
5300 }
5301
5313 {
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));
5318 }
5319
5323 public string SimplifyHelp()
5324 {
5325
5326 return Native.Z3_simplify_get_help(nCtx);
5327 }
5328
5333 {
5334 get { return new ParamDescrs(this, Native.Z3_simplify_get_param_descrs(nCtx)); }
5335 }
5336 #endregion
5337
5338 #region Error Handling
5346 //public delegate void ErrorHandler(Context ctx, Z3_error_code errorCode, string errorString);
5347
5351 //public event ErrorHandler OnError = null;
5352 #endregion
5353
5354 #region Parameters
5364 public void UpdateParamValue(string id, string value)
5365 {
5366 Native.Z3_update_param_value(nCtx, id, value);
5367 }
5368
5369 #endregion
5370
5371 #region Internal
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; } }
5376 private Z3_ast_print_mode m_print_mode = Z3_ast_print_mode.Z3_PRINT_SMTLIB2_COMPLIANT;
5377
5378 // Estimated native memory used per context, for GC memory pressure hints.
5379 // The value is a conservative lower bound; actual usage may exceed this.
5380 private const long NativeMemoryPressureEstimate = 8 * 1024 * 1024; // 8 MB
5381 private bool m_memPressureAdded = false;
5382
5383 internal void NativeErrorHandler(IntPtr ctx, Z3_error_code errorCode)
5384 {
5385 // Do-nothing error handler. The wrappers in Z3.Native will throw exceptions upon errors.
5386 }
5387
5388 internal void InitContext()
5389 {
5390 PrintMode = Z3_ast_print_mode.Z3_PRINT_SMTLIB2_COMPLIANT;
5391 m_n_err_handler = new Native.Z3_error_handler(NativeErrorHandler); // keep reference so it doesn't get collected.
5392 Native.Z3_set_error_handler(m_ctx, m_n_err_handler);
5393 if (!is_external)
5394 {
5395 GC.AddMemoryPressure(NativeMemoryPressureEstimate);
5396 m_memPressureAdded = true;
5397 }
5398 }
5399
5400 internal void CheckContextMatch(Z3Object other)
5401 {
5402 Debug.Assert(other != null);
5403
5404 if (!ReferenceEquals(this, other.Context))
5405 throw new Z3Exception("Context mismatch");
5406 }
5407
5408 internal void CheckContextMatch(Z3Object other1, Z3Object other2)
5409 {
5410 Debug.Assert(other1 != null);
5411 Debug.Assert(other2 != null);
5412 CheckContextMatch(other1);
5413 CheckContextMatch(other2);
5414 }
5415
5416 internal void CheckContextMatch(Z3Object other1, Z3Object other2, Z3Object other3)
5417 {
5418 Debug.Assert(other1 != null);
5419 Debug.Assert(other2 != null);
5420 Debug.Assert(other3 != null);
5421 CheckContextMatch(other1);
5422 CheckContextMatch(other2);
5423 CheckContextMatch(other3);
5424 }
5425
5426 internal void CheckContextMatch(Z3Object[] arr)
5427 {
5428 Debug.Assert(arr == null || arr.All(a => a != null));
5429
5430 if (arr != null)
5431 {
5432 foreach (Z3Object a in arr)
5433 {
5434 Debug.Assert(a != null); // It was an assume, now we added the precondition, and we made it into an assert
5435 CheckContextMatch(a);
5436 }
5437 }
5438 }
5439
5440 internal void CheckContextMatch<T>(IEnumerable<T> arr) where T : Z3Object
5441 {
5442 Debug.Assert(arr == null || arr.All(a => a != null));
5443
5444 if (arr != null)
5445 {
5446 foreach (Z3Object a in arr)
5447 {
5448 Debug.Assert(a != null); // It was an assume, now we added the precondition, and we made it into an assert
5449 CheckContextMatch(a);
5450 }
5451 }
5452 }
5453
5454 private void ObjectInvariant()
5455 {
5456 // none
5457 }
5458
5462 ~Context()
5463 {
5464 // Console.WriteLine("Context Finalizer from " + System.Threading.Thread.CurrentThread.ManagedThreadId);
5465 Dispose();
5466 }
5467
5471 public void Dispose()
5472 {
5473 // Console.WriteLine("Context Dispose from " + System.Threading.Thread.CurrentThread.ManagedThreadId);
5474
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();
5481 m_boolSort = null;
5482 m_intSort = null;
5483 m_realSort = null;
5484 m_complexSort = null;
5485 m_stringSort = null;
5486 m_charSort = null;
5487 if (m_ctx != IntPtr.Zero)
5488 {
5489 // Suppress the finalizer before performing cleanup so that it cannot
5490 // run concurrently or redundantly if cleanup raises an exception.
5491 GC.SuppressFinalize(this);
5492 IntPtr ctx;
5493 // Keep a local reference to the error handler delegate to ensure it stays
5494 // alive throughout Z3_del_context. Setting m_n_err_handler = null releases
5495 // the field reference; without the local variable the GC could collect the
5496 // delegate before the native destructor finishes using the handler.
5497 Native.Z3_error_handler errHandler;
5498 lock (this)
5499 {
5500 ctx = m_ctx;
5501 errHandler = m_n_err_handler;
5502 m_n_err_handler = null;
5503 m_ctx = IntPtr.Zero;
5504 }
5505 // ctx is non-zero only for the thread that wins the lock and zeros m_ctx,
5506 // preventing double-free when Dispose() is called concurrently.
5507 if (ctx != IntPtr.Zero)
5508 {
5509 if (!is_external)
5510 {
5511 Native.Z3_del_context(ctx);
5512 GC.KeepAlive(errHandler);
5513 }
5514 if (m_memPressureAdded)
5515 {
5516 GC.RemoveMemoryPressure(NativeMemoryPressureEstimate);
5517 m_memPressureAdded = false;
5518 }
5519 }
5520 }
5521 }
5522
5523
5524 #endregion
5525 }
5526}
The abstract syntax tree (AST) class.
Definition AST.cs:31
Map from AST to AST.
Definition ASTMap.cs:29
Vectors of ASTs.
Definition ASTVector.cs:29
Arithmetic expressions (Int, Real, or Complex). Ordering requires Int or Real.
Definition ArithExpr.cs:31
Array expressions.
Definition ArrayExpr.cs:32
Bit-vector expressions.
Definition BitVecExpr.cs:32
Bit-vector numerals.
Definition BitVecNum.cs:32
Bit-vector sorts.
Definition BitVecSort.cs:29
Boolean expressions.
Definition BoolExpr.cs:32
A Boolean sort.
Definition BoolSort.cs:29
A Character sort.
Definition CharSort.cs:29
A Complex expression. Complex numbers have no ordering.
Definition ComplexExpr.cs:8
A Complex sort, representing pairs of Reals.
Definition ComplexSort.cs:8
Constructors are used for datatype sorts.
Lists of constructors.
The main interaction with Z3 happens via the Context.
Definition Context.cs:34
FPExpr MkFPToFP(FPRMExpr rm, RealExpr t, FPSort s)
Conversion of a term of real sort into a term of FloatingPoint sort.
Definition Context.cs:5137
BitVecExpr MkBVNAND(BitVecExpr t1, BitVecExpr t2)
Bitwise NAND.
Definition Context.cs:1509
FPNum MkFP(float v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
Definition Context.cs:4778
RealExpr MkInt2Real(IntExpr t)
Coerce an integer to a real.
Definition Context.cs:1391
FPSort MkFPSort16()
Create the half-precision (16-bit) FloatingPoint sort.
Definition Context.cs:4635
ArithExpr MkAdd(IEnumerable< ArithExpr > ts)
Create an expression representing t[0] + t[1] + ....
Definition Context.cs:1225
BoolExpr MkCharLe(Expr ch1, Expr ch2)
Create less than or equal to between two characters.
Definition Context.cs:3139
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...
Definition Context.cs:3291
ArrayExpr MkArrayConst(string name, Sort domain, Sort range)
Create an array constant.
Definition Context.cs:2227
BoolExpr MkAtLeast(IEnumerable< BoolExpr > args, uint k)
Create an at-least-k constraint.
Definition Context.cs:3201
BitVecExpr MkBVSHL(BitVecExpr t1, BitVecExpr t2)
Shift left.
Definition Context.cs:1922
Expr MkFiniteSetMap(Expr f, Expr set)
Map a function over all elements in a finite set.
Definition Context.cs:2688
Tactic Skip()
Create a tactic that just returns the given goal.
Definition Context.cs:4010
Constructor MkConstructor(string name, string recognizer, string[] fieldNames=null, Sort[] sorts=null, uint[] sortRefs=null)
Create a datatype constructor.
Definition Context.cs:449
Simplifier Then(Simplifier t1, Simplifier t2, params Simplifier[] ts)
Create a simplifier that applies t1 and then then t2 .
Definition Context.cs:4245
ComplexExpr MkComplexConst(string name)
Creates a Complex constant.
Definition Context.cs:952
DatatypeSort MkPolymorphicDatatypeSort(Symbol name, Sort[] typeParams, Constructor[] constructors)
Create a polymorphic datatype sort with explicit type parameters. Type parameters should be sorts cre...
Definition Context.cs:610
BoolSort BoolSort
Retrieves the Boolean sort of the context.
Definition Context.cs:148
Expr MkFiniteSetUnion(Expr s1, Expr s2)
Create the union of two finite sets.
Definition Context.cs:2612
BitVecNum MkBV(bool[] bits)
Create a bit-vector numeral.
Definition Context.cs:3518
FiniteDomainSort MkFiniteDomainSort(Symbol name, ulong size)
Create a new finite domain sort. The result is a sort
Definition Context.cs:398
BoolExpr MkStringLe(SeqExpr s1, SeqExpr s2)
Check if the string s1 is lexicographically less or equal to s2.
Definition Context.cs:2876
FPSort MkFPSort(uint ebits, uint sbits)
Create a FloatingPoint sort.
Definition Context.cs:4619
Tactic With(Tactic t, Params p)
Create a tactic that applies t using the given set of parameters p .
Definition Context.cs:4063
string[] TacticNames
The names of all supported tactics.
Definition Context.cs:3857
BoolExpr MkIsDigit(Expr ch)
Create a check if the character is a digit.
Definition Context.cs:3176
ArithExpr MkAdd(params ArithExpr[] ts)
Create an expression representing t[0] + t[1] + ....
Definition Context.cs:1213
FPExpr MkFPAdd(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point addition.
Definition Context.cs:4854
BitVecExpr MkBVRotateLeft(BitVecExpr t1, BitVecExpr t2)
Rotate Left.
Definition Context.cs:2015
RealExpr MkRealConst(string name)
Creates a real constant.
Definition Context.cs:939
RatNum MkReal(uint v)
Create a real numeral.
Definition Context.cs:3373
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...
Definition Context.cs:4338
BitVecExpr MkBVLSHR(BitVecExpr t1, BitVecExpr t2)
Logical shift right.
Definition Context.cs:1944
FPRMSort MkFPRoundingModeSort()
Create the floating-point RoundingMode sort.
Definition Context.cs:4524
RealExpr MkFPToReal(FPExpr t)
Conversion of a floating-point term into a real-numbered term.
Definition Context.cs:5209
FiniteSetSort MkFiniteSetSort(Sort elemSort)
Create a finite set sort over the given element sort.
Definition Context.cs:2557
TupleSort MkTupleSort(Symbol name, Symbol[] fieldNames, Sort[] fieldSorts)
Create a new tuple sort.
Definition Context.cs:319
Lambda MkLambda(Expr[] boundConstants, Expr body)
Create a lambda expression.
Definition Context.cs:3708
BitVecSort MkBitVecSort(uint size)
Create a new bit-vector sort.
Definition Context.cs:267
BoolExpr MkBVMulNoUnderflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise multiplication does not underflow.
Definition Context.cs:2199
Expr MkFiniteSetSingleton(Expr elem)
Create a singleton finite set.
Definition Context.cs:2601
ReExpr MkDiff(ReExpr a, ReExpr b)
Create a difference regular expression.
Definition Context.cs:3096
ArrayExpr MkFullSet(Sort domain)
Create the full set.
Definition Context.cs:2441
FPSort MkFPSortQuadruple()
Create the quadruple-precision (128-bit) FloatingPoint sort.
Definition Context.cs:4675
BoolExpr MkLe(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 <= t2
Definition Context.cs:1345
Probe ConstProbe(double val)
Create a probe that always evaluates to val .
Definition Context.cs:4314
Expr MkFreshConst(string prefix, Sort range)
Creates a fresh Constant of sort range and a name prefixed with prefix .
Definition Context.cs:868
BoolExpr MkOr(params BoolExpr[] ts)
Create an expression representing t[0] or t[1] or ....
Definition Context.cs:1188
IntExpr MkReal2Int(RealExpr t)
Coerce a real to an integer.
Definition Context.cs:1406
UninterpretedSort MkUninterpretedSort(Symbol s)
Create a new uninterpreted sort.
Definition Context.cs:224
FPSort MkFPSortHalf()
Create the half-precision (16-bit) FloatingPoint sort.
Definition Context.cs:4627
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.
Definition Context.cs:3579
ArrayExpr MkSetDifference(ArrayExpr arg1, ArrayExpr arg2)
Take the difference between two sets.
Definition Context.cs:2503
BoolExpr MkXor(BoolExpr t1, BoolExpr t2)
Create an expression representing t1 xor t2.
Definition Context.cs:1137
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...
Definition Context.cs:3306
Expr MkITE(BoolExpr t1, Expr t2, Expr t3)
Create an expression representing an if-then-else: ite(t1, t2, t3).
Definition Context.cs:1096
IntNum MkInt(uint v)
Create an integer numeral.
Definition Context.cs:3429
Expr QeLite(ASTVector vars, Expr body)
Performs best-effort quantifier elimination for the variables in vars .
Definition Context.cs:4118
IntExpr MkIntConst(Symbol name)
Creates an integer constant.
Definition Context.cs:909
AST WrapAST(IntPtr nativeObject)
Wraps an AST.
Definition Context.cs:5261
FuncDecl MkPartialOrder(Sort a, uint index)
Create a partial order relation over a sort.
Definition Context.cs:5287
SeqExpr IntToString(Expr e)
Convert an integer expression to a string.
Definition Context.cs:2758
FPExpr MkFPMax(FPExpr t1, FPExpr t2)
Maximum of floating-point numbers.
Definition Context.cs:4953
ArithExpr MkUnaryMinus(ArithExpr t)
Create an expression representing -t.
Definition Context.cs:1267
BitVecExpr MkFPToIEEEBV(FPExpr t)
Conversion of a floating-point term into a bit-vector term in IEEE 754-2008 format.
Definition Context.cs:5226
Constructor MkConstructor(Symbol name, Symbol recognizer, Symbol[] fieldNames=null, Sort[] sorts=null, uint[] sortRefs=null)
Create a datatype constructor.
Definition Context.cs:432
IntSort IntSort
Retrieves the Integer sort of the context.
Definition Context.cs:159
BoolExpr MkSuffixOf(SeqExpr s1, SeqExpr s2)
Check for sequence suffix.
Definition Context.cs:2843
SeqExpr MkConcat(params SeqExpr[] t)
Concatenate sequences.
Definition Context.cs:2799
FuncDecl MkFuncDecl(string name, Sort domain, Sort range)
Creates a new function declaration.
Definition Context.cs:733
BoolExpr MkNot(BoolExpr a)
Mk an expression representing not(a).
Definition Context.cs:1083
FuncDecl MkFuncDecl(string name, Sort[] domain, Sort range)
Creates a new function declaration.
Definition Context.cs:690
FuncDecl MkUserPropagatorFuncDecl(string name, Sort[] domain, Sort range)
Declare a function to be processed by the user propagator plugin.
Definition Context.cs:801
Expr MkTermArray(ArrayExpr array)
Access the array default value.
Definition Context.cs:2392
BitVecExpr MkBVSRem(BitVecExpr t1, BitVecExpr t2)
Signed remainder.
Definition Context.cs:1671
Simplifier UsingParams(Simplifier t, Params p)
Create a tactic that applies t using the given set of parameters p .
Definition Context.cs:4257
BitVecExpr MkBVRedOR(BitVecExpr t)
Take disjunction of bits in a vector, return vector of length 1.
Definition Context.cs:1455
Tactic MkTactic(string name)
Creates a new Tactic.
Definition Context.cs:3881
BoolExpr MkFPLEq(FPExpr t1, FPExpr t2)
Floating-point less than or equal.
Definition Context.cs:4963
string BenchmarkToSmtlibString(string name, string logic, string status, string attributes, BoolExpr[] assumptions, BoolExpr formula)
Convert a benchmark into SMT-LIB2 formatted string.
Definition Context.cs:3798
ComplexExpr MkComplexConst(Symbol name)
Creates a Complex constant.
Definition Context.cs:946
Expr MkFiniteSetEmpty(Sort setSort)
Create an empty finite set.
Definition Context.cs:2590
ReExpr MkOption(ReExpr re)
Create the optional regular expression.
Definition Context.cs:3042
BoolExpr MkFPEq(FPExpr t1, FPExpr t2)
Floating-point equality.
Definition Context.cs:5006
DatatypeSort[] MkDatatypeSorts(Symbol[] names, Constructor[][] c)
Create mutually recursive datatypes.
Definition Context.cs:529
SeqExpr MkExtract(SeqExpr s, IntExpr offset, IntExpr length)
Extract subsequence.
Definition Context.cs:2909
RatNum MkReal(string v)
Create a real numeral.
Definition Context.cs:3351
FPExpr MkFPToFP(FPRMExpr rm, FPExpr t, FPSort s)
Conversion of a FloatingPoint term into another term of different FloatingPoint sort.
Definition Context.cs:5121
DatatypeSort MkDatatypeSort(string name, Constructor[] constructors)
Create a new datatype sort.
Definition Context.cs:484
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.
Definition Context.cs:5155
Tactic UsingParams(Tactic t, Params p)
Create a tactic that applies t using the given set of parameters p .
Definition Context.cs:4049
ComplexSort ComplexSort
Retrieves the Complex sort of the context.
Definition Context.cs:182
string[] SimplifierNames
The names of all supported tactics.
Definition Context.cs:4177
BoolExpr MkBVNegNoOverflow(BitVecExpr t)
Create a predicate that checks that the bit-wise negation does not overflow.
Definition Context.cs:2169
ListSort MkListSort(string name, Sort elemSort)
Create a new list sort.
Definition Context.cs:383
uint NumTactics
The number of supported tactics.
Definition Context.cs:3849
SeqExpr UbvToString(Expr e)
Convert a bit-vector expression, represented as an unsigned number, to a string.
Definition Context.cs:2768
ReExpr MkConcat(params ReExpr[] t)
Create the concatenation of regular languages.
Definition Context.cs:3060
BoolExpr MkBVULT(BitVecExpr t1, BitVecExpr t2)
Unsigned less-than.
Definition Context.cs:1704
BoolExpr MkBVMulNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
Create a predicate that checks that the bit-wise multiplication does not overflow.
Definition Context.cs:2183
FuncDecl MkConstDecl(Symbol name, Sort range)
Creates a new constant function declaration.
Definition Context.cs:763
BoolExpr MkXor(IEnumerable< BoolExpr > args)
Create an expression representing t1 xor t2 xor t3 ... .
Definition Context.cs:1150
BitVecExpr MkBVSDiv(BitVecExpr t1, BitVecExpr t2)
Signed division.
Definition Context.cs:1633
ParamDescrs SimplifyParameterDescriptions
Retrieves parameter descriptions for simplifier.
Definition Context.cs:5333
BitVecNum MkBV(ulong v, uint size)
Create a bit-vector numeral.
Definition Context.cs:3508
FPExpr MkFPFMA(FPRMExpr rm, FPExpr t1, FPExpr t2, FPExpr t3)
Floating-point fused multiply-add.
Definition Context.cs:4902
BoolExpr MkFPIsInfinite(FPExpr t)
Predicate indicating whether t is a floating-point number representing +oo or -oo.
Definition Context.cs:5042
BitVecExpr MkInt2BV(uint n, IntExpr t)
Create an n bit bit-vector from the integer argument t .
Definition Context.cs:2052
BoolExpr MkTrue()
The true Term.
Definition Context.cs:1025
FPExpr MkFPSub(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point subtraction.
Definition Context.cs:4865
FPNum MkFPNumeral(double v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
Definition Context.cs:4734
FPExpr MkFPToFP(BitVecExpr bv, FPSort s)
Conversion of a single IEEE 754-2008 bit-vector into a floating-point number.
Definition Context.cs:5105
ReExpr MkUnion(params ReExpr[] t)
Create the union of regular languages.
Definition Context.cs:3072
RatNum MkReal(ulong v)
Create a real numeral.
Definition Context.cs:3395
BoolExpr MkBoolConst(Symbol name)
Create a Boolean constant.
Definition Context.cs:890
ReExpr MkEmptyRe(Sort s)
Create the empty regular expression. The sort s should be a regular expression.
Definition Context.cs:3108
FuncDecl MkTransitiveClosure(FuncDecl f)
Create the transitive closure of a binary relation.
Definition Context.cs:5297
Expr MkNth(SeqExpr s, Expr index)
Retrieve element at index.
Definition Context.cs:2898
Expr MkSeqMap(Expr f, SeqExpr s)
Map function f over the sequence s.
Definition Context.cs:2945
FPSort MkFPSortSingle()
Create the single-precision (32-bit) FloatingPoint sort.
Definition Context.cs:4643
IntPtr UnwrapAST(AST a)
Unwraps an AST.
Definition Context.cs:5277
IntExpr MkMod(IntExpr t1, IntExpr t2)
Create an expression representing t1 mod t2.
Definition Context.cs:1292
BoolExpr MkPBLe(int[] coeffs, BoolExpr[] args, int k)
Create a pseudo-Boolean less-or-equal constraint.
Definition Context.cs:3213
IntNum MkInt(string v)
Create an integer numeral.
Definition Context.cs:3407
Expr MkConst(FuncDecl f)
Creates a fresh constant from the FuncDecl f .
Definition Context.cs:880
FPRMNum MkFPRTZ()
Create a numeral of RoundingMode sort which represents the RoundTowardZero rounding mode.
Definition Context.cs:4606
Tactic TryFor(Tactic t, uint ms)
Create a tactic that applies t to a goal for ms milliseconds.
Definition Context.cs:3954
BoolExpr MkImplies(BoolExpr t1, BoolExpr t2)
Create an expression representing t1 -> t2.
Definition Context.cs:1124
BoolExpr MkBVSubNoUnderflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
Create a predicate that checks that the bit-wise subtraction does not underflow.
Definition Context.cs:2137
Expr MkSelect(ArrayExpr a, Expr i)
Array read.
Definition Context.cs:2251
ArrayExpr MkSetUnion(params ArrayExpr[] args)
Take the union of a list of sets.
Definition Context.cs:2479
IntExpr MkIndexOf(SeqExpr s, SeqExpr substr, ArithExpr offset)
Extract index of sub-string starting at offset.
Definition Context.cs:2921
Expr MkFiniteSetDifference(Expr s1, Expr s2)
Create the difference of two finite sets.
Definition Context.cs:2638
BoolExpr MkBoolConst(string name)
Create a Boolean constant.
Definition Context.cs:900
Expr MkApp(FuncDecl f, params Expr[] args)
Create a new function application.
Definition Context.cs:1003
BitVecExpr MkBVSMod(BitVecExpr t1, BitVecExpr t2)
Two's complement signed remainder (sign follows divisor).
Definition Context.cs:1688
Probe Or(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value p1 or p2 evaluate to "true".
Definition Context.cs:4408
BitVecExpr MkRepeat(uint i, BitVecExpr t)
Bit-vector repetition.
Definition Context.cs:1902
BoolExpr MkDistinct(IEnumerable< Expr > args)
Creates a distinct term.
Definition Context.cs:1074
FuncDecl MkFuncDecl(Symbol name, Sort domain, Sort range)
Creates a new function declaration.
Definition Context.cs:674
BoolExpr MkFPGt(FPExpr t1, FPExpr t2)
Floating-point greater than.
Definition Context.cs:4993
BoolExpr MkAtMost(IEnumerable< BoolExpr > args, uint k)
Create an at-most-k constraint.
Definition Context.cs:3189
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 ....
Definition Context.cs:4086
Solver MkSolver(string logic)
Creates a new (incremental) solver.
Definition Context.cs:4453
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.
Definition Context.cs:3657
ArrayExpr MkSetDel(ArrayExpr set, Expr element)
Remove an element from a set.
Definition Context.cs:2466
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....
Definition Context.cs:645
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...
Definition Context.cs:4324
ReExpr MkRange(SeqExpr lo, SeqExpr hi)
Create a range expression.
Definition Context.cs:3128
BitVecNum MkBV(long v, uint size)
Create a bit-vector numeral.
Definition Context.cs:3497
Expr QeModelProjectSkolem(Model model, Expr[] bounds, Expr body, ASTMap map)
Projects bound applications and records Skolem terms in map .
Definition Context.cs:4140
BoolExpr MkBVSGT(BitVecExpr t1, BitVecExpr t2)
Two's complement signed greater-than.
Definition Context.cs:1816
Params MkParams()
Creates a new ParameterSet.
Definition Context.cs:3837
ArrayExpr MkSetIntersection(params ArrayExpr[] args)
Take the intersection of a list of sets.
Definition Context.cs:2491
FPNum MkFPNaN(FPSort s)
Create a NaN of sort s.
Definition Context.cs:4694
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.
Definition Context.cs:4822
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.
Definition Context.cs:3754
BitVecExpr MkBVNOR(BitVecExpr t1, BitVecExpr t2)
Bitwise NOR.
Definition Context.cs:1523
IntExpr CharToInt(Expr ch)
Create an integer (code point) from character.
Definition Context.cs:3149
BoolExpr MkDistinct(params Expr[] args)
Creates a distinct term.
Definition Context.cs:1062
FPExpr MkFPRoundToIntegral(FPRMExpr rm, FPExpr t)
Floating-point roundToIntegral. Rounds a floating-point number to the closest integer,...
Definition Context.cs:4933
Fixedpoint MkFixedpoint()
Create a Fixedpoint context.
Definition Context.cs:4499
RealExpr MkRealPart(ArithExpr value)
Returns the Real-valued real component of a Complex expression.
Definition Context.cs:965
Expr MkSeqMapi(Expr f, Expr i, SeqExpr s)
Map function f over the sequence s at index i.
Definition Context.cs:2956
void UpdateParamValue(string id, string value)
Update a mutable configuration parameter.
Definition Context.cs:5364
DatatypeSort MkDatatypeSort(Symbol name, Constructor[] constructors)
Create a new datatype sort.
Definition Context.cs:469
Expr QeModelProjectWithWitness(Model model, Expr[] bounds, Expr body, ASTMap map)
Projects bound applications and records witnesses in map .
Definition Context.cs:4153
void AddRecDef(FuncDecl f, Expr[] args, Expr body)
Bind a definition to a recursive function declaration. The function must have previously been created...
Definition Context.cs:721
FPNum MkFPNumeral(float v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
Definition Context.cs:4724
ArrayExpr MkConstArray(Sort domain, Expr v)
Create a constant array.
Definition Context.cs:2354
ArrayExpr MkSetComplement(ArrayExpr arg)
Take the complement of a set.
Definition Context.cs:2516
ASTMap MkASTMap()
Creates an empty map from ASTs to ASTs.
Definition Context.cs:4110
BoolExpr MkSetSubset(ArrayExpr arg1, ArrayExpr arg2)
Check for subsetness of sets.
Definition Context.cs:2540
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...
Definition Context.cs:4380
FPRMNum MkFPRoundNearestTiesToAway()
Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode.
Definition Context.cs:4550
string[] ProbeNames
The names of all supported Probes.
Definition Context.cs:4281
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 .
Definition Context.cs:3891
BitVecExpr MkZeroExt(uint i, BitVecExpr t)
Bit-vector zero extension.
Definition Context.cs:1888
Z3_ast_print_mode PrintMode
Selects the format used for pretty-printing expressions.
Definition Context.cs:3738
void Dispose()
Disposes of the context.
Definition Context.cs:5471
BitVecExpr CharToBV(Expr ch)
Create a bit-vector (code point) from character.
Definition Context.cs:3158
SeqExpr SbvToString(Expr e)
Convert a bit-vector expression, represented as an signed number, to a string.
Definition Context.cs:2778
ArithExpr MkMul(IEnumerable< ArithExpr > ts)
Create an expression representing t[0] * t[1] * ....
Definition Context.cs:1246
ArrayExpr MkEmptySet(Sort domain)
Create an empty set.
Definition Context.cs:2430
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.
Definition Context.cs:3597
UninterpretedSort MkUninterpretedSort(string str)
Create a new uninterpreted sort.
Definition Context.cs:235
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...
Definition Context.cs:3321
ReExpr MkStar(ReExpr re)
Take the Kleene star of a regular expression.
Definition Context.cs:3015
Context()
Constructor.
Definition Context.cs:39
BitVecExpr MkBVConst(string name, uint size)
Creates a bit-vector constant.
Definition Context.cs:992
BitVecNum MkBV(uint v, uint size)
Create a bit-vector numeral.
Definition Context.cs:3486
Optimize MkOptimize()
Create an Optimization context.
Definition Context.cs:4510
Expr MkFiniteSetFilter(Expr f, Expr set)
Filter a finite set with a predicate.
Definition Context.cs:2701
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.
Definition Context.cs:3634
Expr CharFromBV(BitVecExpr bv)
Create a character from a bit-vector (code point).
Definition Context.cs:3167
Expr MkArrayExt(ArrayExpr arg1, ArrayExpr arg2)
Create Extentionality index. Two arrays are equal if and only if they are equal on the index returned...
Definition Context.cs:2403
CharSort CharSort
Retrieves the character sort of the context.
Definition Context.cs:192
FPNum MkFPInf(FPSort s, bool negative)
Create a floating-point infinity of sort s.
Definition Context.cs:4704
FuncDecl MkConstDecl(string name, Sort range)
Creates a new constant function declaration.
Definition Context.cs:776
ArrayExpr MkMap(FuncDecl f, params ArrayExpr[] args)
Maps f on the argument arrays.
Definition Context.cs:2375
ReExpr MkIntersect(params ReExpr[] t)
Create the intersection of regular languages.
Definition Context.cs:3084
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...
Definition Context.cs:3999
BoolExpr MkBVSLE(BitVecExpr t1, BitVecExpr t2)
Two's complement signed less-than or equal to.
Definition Context.cs:1752
FPNum MkFP(int v, FPSort s)
Create a numeral of FloatingPoint sort from an int.
Definition Context.cs:4798
uint NumSimplifiers
The number of supported simplifiers.
Definition Context.cs:4169
RealExpr MkImagPart(ArithExpr value)
Returns the Real-valued imaginary component of a Complex expression.
Definition Context.cs:972
BoolExpr MkLt(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 < t2
Definition Context.cs:1332
FPNum MkFP(bool sgn, int exp, uint sig, FPSort s)
Create a numeral of FloatingPoint sort from a sign bit and two integers.
Definition Context.cs:4810
ListSort MkListSort(Symbol name, Sort elemSort)
Create a new list sort.
Definition Context.cs:370
SeqExpr MkAt(SeqExpr s, Expr index)
Retrieve sequence of length one at index.
Definition Context.cs:2887
FPExpr MkFPToFP(FPSort s, FPRMExpr rm, FPExpr t)
Conversion of a floating-point number to another FloatingPoint sort s.
Definition Context.cs:5173
BoolExpr MkSetMembership(Expr elem, ArrayExpr set)
Check for set membership.
Definition Context.cs:2527
BitVecExpr MkBVRotateRight(BitVecExpr t1, BitVecExpr t2)
Rotate Right.
Definition Context.cs:2032
SeqExpr MkReplace(SeqExpr s, SeqExpr src, SeqExpr dst)
Replace the first occurrence of src by dst in s.
Definition Context.cs:2933
FPRMExpr MkFPRoundNearestTiesToEven()
Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
Definition Context.cs:4534
string ProbeDescription(string name)
Returns a string containing a description of the probe with the given name.
Definition Context.cs:4296
Pattern MkPattern(params Expr[] terms)
Create a quantifier pattern.
Definition Context.cs:827
Probe And(Probe p1, Probe p2)
Create a probe that evaluates to "true" when the value p1 and p2 evaluate to "true".
Definition Context.cs:4394
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...
Definition Context.cs:4352
Expr QeModelProject(Model model, Expr[] bounds, Expr body)
Projects the bound applications from body using model .
Definition Context.cs:4128
FPExpr MkFPNeg(FPExpr t)
Floating-point negation.
Definition Context.cs:4843
FPSort MkFPSort32()
Create the single-precision (32-bit) FloatingPoint sort.
Definition Context.cs:4651
Expr MkConst(Symbol name, Sort range)
Creates a new Constant of sort range and named name .
Definition Context.cs:842
BoolExpr MkAnd(params BoolExpr[] ts)
Create an expression representing t[0] and t[1] and ....
Definition Context.cs:1167
RealSort RealSort
Retrieves the Real sort of the context.
Definition Context.cs:171
BoolExpr MkIsInteger(RealExpr t)
Creates an expression that checks whether a real number is an integer.
Definition Context.cs:1417
BitVecExpr MkBVXNOR(BitVecExpr t1, BitVecExpr t2)
Bitwise XNOR.
Definition Context.cs:1537
BoolExpr MkBVULE(BitVecExpr t1, BitVecExpr t2)
Unsigned less-than or equal to.
Definition Context.cs:1736
BoolExpr MkGe(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 >= t2
Definition Context.cs:1371
ASTVector PolynomialSubresultants(Expr p, Expr q, Expr x)
Return the nonzero subresultants of p and q with respect to the "variable" x.
Definition Context.cs:5312
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.
Definition Context.cs:4768
BitVecExpr MkFPToBV(FPRMExpr rm, FPExpr t, uint sz, bool sign)
Conversion of a floating-point term into a bit-vector.
Definition Context.cs:5192
BoolExpr MkBVAddNoUnderflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise addition does not underflow.
Definition Context.cs:2105
BitVecNum MkBV(string v, uint size)
Create a bit-vector numeral.
Definition Context.cs:3464
ReExpr MkFullRe(Sort s)
Create the full regular expression. The sort s should be a regular expression.
Definition Context.cs:3118
Expr MkSeqFoldLeft(Expr f, Expr a, SeqExpr s)
Fold left the function f over the sequence s with initial value a.
Definition Context.cs:2968
BoolExpr MkFPIsSubnormal(FPExpr t)
Predicate indicating whether t is a subnormal floating-point number.
Definition Context.cs:5024
ArrayExpr MkArrayConst(Symbol name, Sort domain, Sort range)
Create an array constant.
Definition Context.cs:2214
BoolExpr MkFPIsZero(FPExpr t)
Predicate indicating whether t is a floating-point number with zero value, i.e., +0 or -0.
Definition Context.cs:5033
ReSort MkReSort(SeqSort s)
Create a new regular expression sort.
Definition Context.cs:284
FPSort MkFPSortDouble()
Create the double-precision (64-bit) FloatingPoint sort.
Definition Context.cs:4659
string SimplifierDescription(string name)
Returns a string containing a description of the simplifier with the given name.
Definition Context.cs:4192
FPRMNum MkFPRoundTowardZero()
Create a numeral of RoundingMode sort which represents the RoundTowardZero rounding mode.
Definition Context.cs:4598
ArithExpr MkSub(params ArithExpr[] ts)
Create an expression representing t[0] - t[1] - ....
Definition Context.cs:1255
Goal MkGoal(bool models=true, bool unsatCores=false, bool proofs=false)
Creates a new Goal.
Definition Context.cs:3826
IntExpr MkBV2Int(BitVecExpr t, bool signed)
Create an integer from the bit-vector argument t .
Definition Context.cs:2075
BoolExpr MkInRe(SeqExpr s, ReExpr re)
Check for regular expression membership.
Definition Context.cs:3004
ArrayExpr MkSetAdd(ArrayExpr set, Expr element)
Add an element to the set.
Definition Context.cs:2452
BitVecExpr MkBVRedAND(BitVecExpr t)
Take conjunction of bits in a vector, return vector of length 1.
Definition Context.cs:1443
SeqExpr MkSeqPower(SeqExpr s, Expr n)
Retrieve the sequence s concatenated n times with itself.
Definition Context.cs:2821
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...
Definition Context.cs:4366
DatatypeSort MkDatatypeSortRef(string name, Sort[] parameters=null)
Create a forward reference to a datatype sort. This is useful for creating recursive datatypes or par...
Definition Context.cs:518
ReExpr MkLoop(ReExpr re, uint lo, uint hi=0)
Take the bounded Kleene star of a regular expression.
Definition Context.cs:3024
FPRMNum MkFPRoundTowardNegative()
Create a numeral of RoundingMode sort which represents the RoundTowardNegative rounding mode.
Definition Context.cs:4582
Probe MkProbe(string name)
Creates a new Probe.
Definition Context.cs:4305
Expr MkFiniteSetRange(Expr low, Expr high)
Create a finite set containing integers in the range [low, high].
Definition Context.cs:2714
FPNum MkFPNumeral(bool sgn, uint sig, int exp, FPSort s)
Create a numeral of FloatingPoint sort from a sign bit and two integers.
Definition Context.cs:4756
SeqSort MkSeqSort(Sort s)
Create a new sequence sort.
Definition Context.cs:275
Sort MkTypeVariable(Symbol name)
Create a type variable sort for use as a parameter in polymorphic datatypes.
Definition Context.cs:586
DatatypeSort[] MkDatatypeSorts(string[] names, Constructor[][] c)
Create mutually recursive data-types.
Definition Context.cs:562
Tactic FailIf(Probe p)
Create a tactic that fails if the probe p evaluates to false.
Definition Context.cs:4028
Expr MkBound(uint index, Sort ty)
Creates a new bound variable.
Definition Context.cs:815
FPRMNum MkFPRTN()
Create a numeral of RoundingMode sort which represents the RoundTowardNegative rounding mode.
Definition Context.cs:4590
FPSort MkFPSort128()
Create the quadruple-precision (128-bit) FloatingPoint sort.
Definition Context.cs:4683
BoolExpr MkBVUGE(BitVecExpr t1, BitVecExpr t2)
Unsigned greater than or equal to.
Definition Context.cs:1768
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...
Definition Context.cs:3276
FPRMNum MkFPRTP()
Create a numeral of RoundingMode sort which represents the RoundTowardPositive rounding mode.
Definition Context.cs:4574
BoolSort MkBoolSort()
Create a new Boolean sort.
Definition Context.cs:216
BoolExpr MkFiniteSetMember(Expr elem, Expr set)
Check for membership in a finite set.
Definition Context.cs:2651
BitVecExpr MkConcat(BitVecExpr t1, BitVecExpr t2)
Bit-vector concatenation.
Definition Context.cs:1836
ArithExpr MkPower(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 ^ t2.
Definition Context.cs:1319
SeqExpr MkEmptySeq(Sort s)
Create the empty sequence.
Definition Context.cs:2731
Expr MkFiniteSetSize(Expr set)
Get the cardinality of a finite set.
Definition Context.cs:2664
BitVecExpr MkBVNot(BitVecExpr t)
Bitwise negation.
Definition Context.cs:1431
FPExpr MkFPRem(FPExpr t1, FPExpr t2)
Floating-point remainder.
Definition Context.cs:4922
RealSort MkRealSort()
Create a real sort.
Definition Context.cs:253
BoolExpr MkBVAddNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
Create a predicate that checks that the bit-wise addition does not overflow.
Definition Context.cs:2089
ArithExpr MkDiv(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 / t2.
Definition Context.cs:1278
Expr MkSelect(ArrayExpr a, params Expr[] args)
Array read.
Definition Context.cs:2274
FPNum MkFPNumeral(int v, FPSort s)
Create a numeral of FloatingPoint sort from an int.
Definition Context.cs:4744
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.
Definition Context.cs:3773
BoolExpr MkFPLt(FPExpr t1, FPExpr t2)
Floating-point less than.
Definition Context.cs:4973
Simplifier MkSimplifier(string name)
Creates a new Tactic.
Definition Context.cs:4201
BoolExpr MkFPGEq(FPExpr t1, FPExpr t2)
Floating-point greater than or equal.
Definition Context.cs:4983
BitVecExpr MkSignExt(uint i, BitVecExpr t)
Bit-vector sign extension.
Definition Context.cs:1871
Tactic ParOr(params Tactic[] t)
Create a tactic that applies the given tactics in parallel until one of them succeeds (i....
Definition Context.cs:4074
IntSort MkIntSort()
Create a new integer sort.
Definition Context.cs:244
BoolExpr MkFiniteSetSubset(Expr s1, Expr s2)
Check if one finite set is a subset of another.
Definition Context.cs:2675
BoolExpr MkAnd(IEnumerable< BoolExpr > t)
Create an expression representing t[0] and t[1] and ....
Definition Context.cs:1179
BitVecExpr MkBVMul(BitVecExpr t1, BitVecExpr t2)
Two's complement multiplication.
Definition Context.cs:1591
IntExpr StringToInt(Expr e)
Convert an integer expression to a string.
Definition Context.cs:2788
BoolExpr MkBVSDivNoOverflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise signed division does not overflow.
Definition Context.cs:2153
BoolExpr MkContains(SeqExpr s1, SeqExpr s2)
Check for sequence containment of s2 in s1.
Definition Context.cs:2854
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...
Definition Context.cs:3938
SeqSort StringSort
Retrieves the String sort of the context.
Definition Context.cs:204
BoolExpr MkEq(Expr x, Expr y)
Creates the equality x = y .
Definition Context.cs:1049
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.
Definition Context.cs:3983
BitVecExpr MkBVSub(BitVecExpr t1, BitVecExpr t2)
Two's complement subtraction.
Definition Context.cs:1577
BitVecExpr MkBVUDiv(BitVecExpr t1, BitVecExpr t2)
Unsigned division.
Definition Context.cs:1610
void Interrupt()
Interrupt the execution of a Z3 procedure.
Definition Context.cs:4100
BoolExpr MkBVUGT(BitVecExpr t1, BitVecExpr t2)
Unsigned greater-than.
Definition Context.cs:1800
ArraySort MkArraySort(Sort domain, Sort range)
Create a new array sort.
Definition Context.cs:293
BitVecExpr MkBVConst(Symbol name, uint size)
Creates a bit-vector constant.
Definition Context.cs:981
BitVecExpr MkBVASHR(BitVecExpr t1, BitVecExpr t2)
Arithmetic shift right.
Definition Context.cs:1968
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 .
Definition Context.cs:3925
FPNum MkFPZero(FPSort s, bool negative)
Create a floating-point zero of sort s.
Definition Context.cs:4714
BoolExpr MkPBGe(int[] coeffs, BoolExpr[] args, int k)
Create a pseudo-Boolean greater-or-equal constraint.
Definition Context.cs:3227
IntNum MkInt(long v)
Create an integer numeral.
Definition Context.cs:3440
RatNum MkReal(long v)
Create a real numeral.
Definition Context.cs:3384
ReExpr MkPlus(ReExpr re)
Take the Kleene plus of a regular expression.
Definition Context.cs:3033
FPExpr MkFPSqrt(FPRMExpr rm, FPExpr t)
Floating-point square root.
Definition Context.cs:4912
BoolExpr MkIff(BoolExpr t1, BoolExpr t2)
Create an expression representing t1 iff t2.
Definition Context.cs:1111
FiniteDomainSort MkFiniteDomainSort(string name, ulong size)
Create a new finite domain sort. The result is a sortElements of the sort are created using MkNumeral...
Definition Context.cs:414
Expr MkNumeral(string v, Sort ty)
Create a Term of a given sort.
Definition Context.cs:3261
FuncDecl MkRecFuncDecl(string name, Sort[] domain, Sort range)
Creates a new recursive function declaration.
Definition Context.cs:704
BitVecExpr MkBVAdd(BitVecExpr t1, BitVecExpr t2)
Two's complement addition.
Definition Context.cs:1563
BoolExpr MkGt(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 > t2
Definition Context.cs:1358
Solver MkSimpleSolver()
Creates a new (incremental) solver.
Definition Context.cs:4462
ArraySort MkArraySort(Sort[] domain, Sort range)
Create a new n-ary array sort.
Definition Context.cs:306
DatatypeSort MkDatatypeSortRef(Symbol name, Sort[] parameters=null)
Create a forward reference to a datatype sort. This is useful for creating recursive datatypes or par...
Definition Context.cs:500
Probe Not(Probe p)
Create a probe that evaluates to "true" when the value p does not evaluate to "true".
Definition Context.cs:4422
BoolExpr MkBool(bool value)
Creates a Boolean value.
Definition Context.cs:1041
BitVecExpr MkBVAND(BitVecExpr t1, BitVecExpr t2)
Bitwise conjunction.
Definition Context.cs:1467
Solver MkSolver(Tactic t)
Creates a solver that is implemented using the given tactic.
Definition Context.cs:4485
RealExpr MkRealConst(Symbol name)
Creates a real constant.
Definition Context.cs:929
IntNum MkInt(ulong v)
Create an integer numeral.
Definition Context.cs:3451
Expr MkApp(FuncDecl f, IEnumerable< Expr > args)
Create a new function application.
Definition Context.cs:1015
ReExpr MkToRe(SeqExpr s)
Convert a regular expression that accepts sequence s.
Definition Context.cs:2994
BoolExpr MkFPIsNaN(FPExpr t)
Predicate indicating whether t is a NaN.
Definition Context.cs:5051
BitVecExpr MkBVRotateRight(uint i, BitVecExpr t)
Rotate Right.
Definition Context.cs:2000
string SimplifyHelp()
Return a string describing all available parameters to Expr.Simplify.
Definition Context.cs:5323
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.
Definition Context.cs:3619
Lambda MkLambda(Sort[] sorts, Symbol[] names, Expr body)
Create a lambda expression.
Definition Context.cs:3689
FuncDecl MkFuncDecl(Symbol name, Sort[] domain, Sort range)
Creates a new function declaration.
Definition Context.cs:659
BoolExpr MkBVSLT(BitVecExpr t1, BitVecExpr t2)
Two's complement signed less-than.
Definition Context.cs:1720
SetSort MkSetSort(Sort ty)
Create a set type.
Definition Context.cs:2419
EnumSort MkEnumSort(string name, params string[] enumNames)
Create a new enumeration sort.
Definition Context.cs:350
ComplexSort MkComplexSort()
Creates the Complex sort.
Definition Context.cs:259
Simplifier AndThen(Simplifier t1, Simplifier t2, params Simplifier[] ts)
Create a simplifier that applies t1 and then t2 .
Definition Context.cs:4211
Sort MkTypeVariable(string name)
Create a type variable sort for use as a parameter in polymorphic datatypes.
Definition Context.cs:597
BitVecNum MkBV(int v, uint size)
Create a bit-vector numeral.
Definition Context.cs:3475
RatNum MkReal(int num, int den)
Create a real from a fraction.
Definition Context.cs:3338
EnumSort MkEnumSort(Symbol name, params Symbol[] enumNames)
Create a new enumeration sort.
Definition Context.cs:335
Solver MkSolver(Solver s, Simplifier t)
Creates a solver that uses an incremental simplifier.
Definition Context.cs:4471
BoolExpr MkFPIsNegative(FPExpr t)
Predicate indicating whether t is a negative floating-point number.
Definition Context.cs:5060
FuncDecl MkFreshFuncDecl(string prefix, Sort[] domain, Sort range)
Creates a fresh function declaration with a name prefixed with prefix .
Definition Context.cs:750
IntExpr MkIntConst(string name)
Creates an integer constant.
Definition Context.cs:919
Tactic When(Probe p, Tactic t)
Create a tactic that applies t to a given goal if the probe p evaluates to true.
Definition Context.cs:3969
BitVecExpr MkBVNeg(BitVecExpr t)
Standard two's complement unary minus.
Definition Context.cs:1551
FuncDecl MkFreshConstDecl(string prefix, Sort range)
Creates a fresh constant function declaration with a name prefixed with prefix .
Definition Context.cs:790
Tactic Fail()
Create a tactic always fails.
Definition Context.cs:4019
Tactic FailIfNotDecided()
Create a tactic that fails if the goal is not trivially satisfiable (i.e., empty) or trivially unsati...
Definition Context.cs:4040
FPRMNum MkFPRoundTowardPositive()
Create a numeral of RoundingMode sort which represents the RoundTowardPositive rounding mode.
Definition Context.cs:4566
BitVecExpr MkBVOR(BitVecExpr t1, BitVecExpr t2)
Bitwise disjunction.
Definition Context.cs:1481
Expr MkConst(string name, Sort range)
Creates a new Constant of sort range and named name .
Definition Context.cs:856
IntExpr MkRem(IntExpr t1, IntExpr t2)
Create an expression representing t1 rem t2.
Definition Context.cs:1306
FPExpr MkFPMul(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point multiplication.
Definition Context.cs:4876
BoolExpr MkStringLt(SeqExpr s1, SeqExpr s2)
Check if the string s1 is lexicographically strictly less than s2.
Definition Context.cs:2865
BoolExpr MkBVSubNoOverflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise subtraction does not overflow.
Definition Context.cs:2121
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...
Definition Context.cs:5243
DatatypeSort MkPolymorphicDatatypeSort(string name, Sort[] typeParams, Constructor[] constructors)
Create a polymorphic datatype sort with explicit type parameters. Type parameters should be sorts cre...
Definition Context.cs:633
FPSort MkFPSort64()
Create the double-precision (64-bit) FloatingPoint sort.
Definition Context.cs:4667
BoolExpr MkOr(IEnumerable< BoolExpr > ts)
Create an expression representing t[0] or t[1] or ....
Definition Context.cs:1201
bool IsFiniteSetSort(Sort s)
Check if a sort is a finite set sort.
Definition Context.cs:2568
FPRMNum MkFPRNA()
Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode.
Definition Context.cs:4558
Context(Dictionary< string, string > settings)
Constructor.
Definition Context.cs:68
BitVecExpr MkBVRotateLeft(uint i, BitVecExpr t)
Rotate Left.
Definition Context.cs:1985
string TacticDescription(string name)
Returns a string containing a description of the tactic with the given name.
Definition Context.cs:3872
FPRMNum MkFPRNE()
Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
Definition Context.cs:4542
SeqExpr MkUnit(Expr elem)
Create the singleton sequence.
Definition Context.cs:2740
uint NumProbes
The number of supported Probes.
Definition Context.cs:4273
Sort GetFiniteSetSortBasis(Sort s)
Get the element sort (basis) of a finite set sort.
Definition Context.cs:2579
BoolExpr MkPBEq(int[] coeffs, BoolExpr[] args, int k)
Create a pseudo-Boolean equal constraint.
Definition Context.cs:3240
IntNum MkInt(int v)
Create an integer numeral.
Definition Context.cs:3418
BitVecExpr MkBVXOR(BitVecExpr t1, BitVecExpr t2)
Bitwise XOR.
Definition Context.cs:1495
ArrayExpr MkStore(ArrayExpr a, Expr[] args, Expr v)
Array update.
Definition Context.cs:2333
Solver MkSolver(Symbol logic=null)
Creates a new (incremental) solver.
Definition Context.cs:4440
FPExpr MkFPAbs(FPExpr t)
Floating-point absolute value.
Definition Context.cs:4834
FPExpr MkFPMin(FPExpr t1, FPExpr t2)
Minimum of floating-point numbers.
Definition Context.cs:4943
FPExpr MkFPDiv(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point division.
Definition Context.cs:4887
ReExpr MkComplement(ReExpr re)
Create the complement regular expression.
Definition Context.cs:3051
BitVecExpr MkExtract(uint high, uint low, BitVecExpr t)
Bit-vector extraction.
Definition Context.cs:1855
StringSymbol MkSymbol(string name)
Create a symbol using a string.
Definition Context.cs:119
BitVecExpr MkBVURem(BitVecExpr t1, BitVecExpr t2)
Unsigned remainder.
Definition Context.cs:1651
BoolExpr MkFalse()
The false Term.
Definition Context.cs:1033
IntExpr MkLength(SeqExpr s)
Retrieve the length of a given sequence.
Definition Context.cs:2812
RatNum MkReal(int v)
Create a real numeral.
Definition Context.cs:3362
IntSymbol MkSymbol(int i)
Creates a new symbol using an integer.
Definition Context.cs:111
SeqExpr MkString(string s)
Create a string constant.
Definition Context.cs:2749
ArrayExpr MkStore(ArrayExpr a, Expr i, Expr v)
Array update.
Definition Context.cs:2303
Expr MkFiniteSetIntersect(Expr s1, Expr s2)
Create the intersection of two finite sets.
Definition Context.cs:2625
FPExpr MkFP(BitVecExpr sgn, BitVecExpr sig, BitVecExpr exp)
Create an expression of FloatingPoint sort from three bit-vector expressions.
Definition Context.cs:5089
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.
Definition Context.cs:2980
ArithExpr MkMul(params ArithExpr[] ts)
Create an expression representing t[0] * t[1] * ....
Definition Context.cs:1234
BoolExpr MkBVSGE(BitVecExpr t1, BitVecExpr t2)
Two's complement signed greater than or equal to.
Definition Context.cs:1784
ComplexExpr MkComplex(ArithExpr real, ArithExpr imag)
Constructs a Complex expression from Int or Real components.
Definition Context.cs:958
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.
Definition Context.cs:3555
FPNum MkFP(double v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
Definition Context.cs:4788
BoolExpr MkFPIsNormal(FPExpr t)
Predicate indicating whether t is a normal floating-point number.
Definition Context.cs:5015
BoolExpr MkPrefixOf(SeqExpr s1, SeqExpr s2)
Check for sequence prefix.
Definition Context.cs:2832
BoolExpr MkFPIsPositive(FPExpr t)
Predicate indicating whether t is a positive floating-point number.
Definition Context.cs:5069
Enumeration sorts.
Definition EnumSort.cs:29
Expressions are terms.
Definition Expr.cs:31
FloatingPoint Expressions.
Definition FPExpr.cs:32
FloatiungPoint Numerals.
Definition FPNum.cs:28
FloatingPoint RoundingMode Expressions.
Definition FPRMExpr.cs:32
Floating-point rounding mode numerals.
Definition FPRMNum.cs:32
The FloatingPoint RoundingMode sort.
Definition FPRMSort.cs:29
FloatingPoint sort.
Definition FPSort.cs:28
Object for managing fixedpoints.
Definition Fixedpoint.cs:30
Function declarations.
Definition FuncDecl.cs:31
A goal (aka problem). A goal is essentially a set of formulas, that can be solved and/or transformed ...
Definition Goal.cs:32
Int expressions.
Definition IntExpr.cs:32
Integer Numerals.
Definition IntNum.cs:32
An Integer sort.
Definition IntSort.cs:29
Numbered symbols.
Definition IntSymbol.cs:30
Lambda expressions.
Definition Lambda.cs:30
A Model contains interpretations (assignments) of constants and functions.
Definition Model.cs:30
Object for managing optimization context.
Definition Optimize.cs:31
A ParamDescrs describes a set of parameters.
A Params objects represents a configuration in the form of Symbol/value pairs.
Definition Params.cs:29
Patterns comprise a list of terms. The list should be non-empty. If the list comprises of more than o...
Definition Pattern.cs:32
Probes are used to inspect a goal (aka problem) and collect information that may be used to decide wh...
Definition Probe.cs:34
Quantifier expressions.
Definition Quantifier.cs:30
Rational Numerals.
Definition RatNum.cs:32
Regular expression expressions.
Definition ReExpr.cs:32
A regular expression sort.
Definition ReSort.cs:29
Real expressions.
Definition RealExpr.cs:32
Sequence expressions.
Definition SeqExpr.cs:32
A Sequence sort.
Definition SeqSort.cs:29
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.
Definition Solver.cs:200
The Sort class implements type information for ASTs.
Definition Sort.cs:29
Symbols are used to name several term and type constructors.
Definition Symbol.cs:30
Tactics are the basic building block for creating custom solvers for specific problem domains....
Definition Tactic.cs:32
The exception base class for error reporting from Z3.
Internal base class for interfacing with native Z3 objects. Should not be used externally.
Definition Z3Object.cs:33
Z3_ast_print_mode
Z3 pretty printing modes (See Z3_set_ast_print_mode).
Definition z3_api.h:1386
Z3_error_code
Z3 error codes (See Z3_get_error_code).
Definition z3_api.h:1411
System.IntPtr Z3_context
Definition Context.cs:29