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 SeqSort m_stringSort = null;
141 private CharSort m_charSort = null;
142
147 {
148 get
149 {
150 if (m_boolSort == null) m_boolSort = new BoolSort(this); return m_boolSort;
151 }
152 }
153
158 {
159 get
160 {
161 if (m_intSort == null) m_intSort = new IntSort(this); return m_intSort;
162 }
163 }
164
165
170 {
171 get
172 {
173 if (m_realSort == null) m_realSort = new RealSort(this); return m_realSort;
174 }
175 }
176
181 {
182 get
183 {
184 if (m_charSort == null) m_charSort = new CharSort(this); return m_charSort;
185 }
186 }
187
188
193 {
194 get
195 {
196 if (m_stringSort == null) m_stringSort = new SeqSort(this, Native.Z3_mk_string_sort(nCtx));
197 return m_stringSort;
198 }
199 }
200
201
206 {
207 return new BoolSort(this);
208 }
209
214 {
215 Debug.Assert(s != null);
216
217 CheckContextMatch(s);
218 return new UninterpretedSort(this, s);
219 }
220
225 {
226 using var sym = MkSymbol(str);
227 return MkUninterpretedSort(sym);
228 }
229
234 {
235
236 return new IntSort(this);
237 }
238
243 {
244 return new RealSort(this);
245 }
246
250 public BitVecSort MkBitVecSort(uint size)
251 {
252 return new BitVecSort(this, Native.Z3_mk_bv_sort(nCtx, size));
253 }
254
259 {
260 Debug.Assert(s != null);
261 return new SeqSort(this, Native.Z3_mk_seq_sort(nCtx, s.NativeObject));
262 }
263
268 {
269 Debug.Assert(s != null);
270 return new ReSort(this, Native.Z3_mk_re_sort(nCtx, s.NativeObject));
271 }
272
276 public ArraySort MkArraySort(Sort domain, Sort range)
277 {
278 Debug.Assert(domain != null);
279 Debug.Assert(range != null);
280
281 CheckContextMatch(domain);
282 CheckContextMatch(range);
283 return new ArraySort(this, domain, range);
284 }
285
289 public ArraySort MkArraySort(Sort[] domain, Sort range)
290 {
291 Debug.Assert(domain != null);
292 Debug.Assert(range != null);
293
294 CheckContextMatch<Sort>(domain);
295 CheckContextMatch(range);
296 return new ArraySort(this, domain, range);
297 }
298
302 public TupleSort MkTupleSort(Symbol name, Symbol[] fieldNames, Sort[] fieldSorts)
303 {
304 Debug.Assert(name != null);
305 Debug.Assert(fieldNames != null);
306 Debug.Assert(fieldNames.All(fn => fn != null));
307 Debug.Assert(fieldSorts == null || fieldSorts.All(fs => fs != null));
308
309 CheckContextMatch(name);
310 CheckContextMatch<Symbol>(fieldNames);
311 CheckContextMatch<Sort>(fieldSorts);
312 return new TupleSort(this, name, (uint)fieldNames.Length, fieldNames, fieldSorts);
313 }
314
318 public EnumSort MkEnumSort(Symbol name, params Symbol[] enumNames)
319 {
320 Debug.Assert(name != null);
321 Debug.Assert(enumNames != null);
322 Debug.Assert(enumNames.All(f => f != null));
323
324
325 CheckContextMatch(name);
326 CheckContextMatch<Symbol>(enumNames);
327 return new EnumSort(this, name, enumNames);
328 }
329
333 public EnumSort MkEnumSort(string name, params string[] enumNames)
334 {
335 Debug.Assert(enumNames != null);
336
337 var enumSymbols = MkSymbols(enumNames);
338 try
339 {
340 using var symbol = MkSymbol(name);
341 return new EnumSort(this, symbol, enumSymbols);
342 }
343 finally
344 {
345 foreach (var enumSymbol in enumSymbols)
346 enumSymbol.Dispose();
347 }
348 }
349
353 public ListSort MkListSort(Symbol name, Sort elemSort)
354 {
355 Debug.Assert(name != null);
356 Debug.Assert(elemSort != null);
357
358 CheckContextMatch(name);
359 CheckContextMatch(elemSort);
360 return new ListSort(this, name, elemSort);
361 }
362
366 public ListSort MkListSort(string name, Sort elemSort)
367 {
368 Debug.Assert(elemSort != null);
369
370 CheckContextMatch(elemSort);
371 using var symbol = MkSymbol(name);
372 return new ListSort(this, symbol, elemSort);
373 }
374
382 {
383 Debug.Assert(name != null);
384
385 CheckContextMatch(name);
386 return new FiniteDomainSort(this, name, size);
387 }
388
397 public FiniteDomainSort MkFiniteDomainSort(string name, ulong size)
398 {
399 using var symbol = MkSymbol(name);
400 return new FiniteDomainSort(this, symbol, size);
401 }
402
403
404 #region Datatypes
415 public Constructor MkConstructor(Symbol name, Symbol recognizer, Symbol[] fieldNames = null, Sort[] sorts = null, uint[] sortRefs = null)
416 {
417 Debug.Assert(name != null);
418 Debug.Assert(recognizer != null);
419
420 return new Constructor(this, name, recognizer, fieldNames, sorts, sortRefs);
421 }
422
432 public Constructor MkConstructor(string name, string recognizer, string[] fieldNames = null, Sort[] sorts = null, uint[] sortRefs = null)
433 {
434
435 using var nameSymbol = MkSymbol(name);
436 using var recognizerSymbol = MkSymbol(recognizer);
437 var fieldSymbols = MkSymbols(fieldNames);
438 try
439 {
440 return new Constructor(this, nameSymbol, recognizerSymbol, fieldSymbols, sorts, sortRefs);
441 }
442 finally
443 {
444 foreach (var fieldSymbol in fieldSymbols)
445 fieldSymbol.Dispose();
446 }
447 }
448
452 public DatatypeSort MkDatatypeSort(Symbol name, Constructor[] constructors)
453 {
454 Debug.Assert(name != null);
455 Debug.Assert(constructors != null);
456 Debug.Assert(constructors.All(c => c != null));
457
458
459 CheckContextMatch(name);
460 CheckContextMatch<Constructor>(constructors);
461 return new DatatypeSort(this, name, constructors);
462 }
463
467 public DatatypeSort MkDatatypeSort(string name, Constructor[] constructors)
468 {
469 Debug.Assert(constructors != null);
470 Debug.Assert(constructors.All(c => c != null));
471
472 CheckContextMatch<Constructor>(constructors);
473 using var symbol = MkSymbol(name);
474 return new DatatypeSort(this, symbol, constructors);
475 }
476
483 public DatatypeSort MkDatatypeSortRef(Symbol name, Sort[] parameters = null)
484 {
485 Debug.Assert(name != null);
486 CheckContextMatch(name);
487 if (parameters != null)
488 CheckContextMatch<Sort>(parameters);
489
490 var numParams = (parameters == null) ? 0 : (uint)parameters.Length;
491 var paramsNative = (parameters == null) ? null : AST.ArrayToNative(parameters);
492 return new DatatypeSort(this, Native.Z3_mk_datatype_sort(nCtx, name.NativeObject, numParams, paramsNative));
493 }
494
501 public DatatypeSort MkDatatypeSortRef(string name, Sort[] parameters = null)
502 {
503 using var symbol = MkSymbol(name);
504 return MkDatatypeSortRef(symbol, parameters);
505 }
506
513 {
514 Debug.Assert(names != null);
515 Debug.Assert(c != null);
516 Debug.Assert(names.Length == c.Length);
517 //Debug.Assert(Contract.ForAll(0, c.Length, j => c[j] != null));
518 Debug.Assert(names.All(name => name != null));
519
520 CheckContextMatch<Symbol>(names);
521 uint n = (uint)names.Length;
522 ConstructorList[] cla = new ConstructorList[n];
523 IntPtr[] n_constr = new IntPtr[n];
524 for (uint i = 0; i < n; i++)
525 {
526 Constructor[] constructor = c[i];
527 CheckContextMatch<Constructor>(constructor);
528 cla[i] = new ConstructorList(this, constructor);
529 n_constr[i] = cla[i].NativeObject;
530 }
531 IntPtr[] n_res = new IntPtr[n];
532 Native.Z3_mk_datatypes(nCtx, n, Symbol.ArrayToNative(names), n_res, n_constr);
533 DatatypeSort[] res = new DatatypeSort[n];
534 for (uint i = 0; i < n; i++)
535 res[i] = new DatatypeSort(this, n_res[i]);
536 return res;
537 }
538
545 public DatatypeSort[] MkDatatypeSorts(string[] names, Constructor[][] c)
546 {
547 Debug.Assert(names != null);
548 Debug.Assert(c != null);
549 Debug.Assert(names.Length == c.Length);
550 //Debug.Assert(Contract.ForAll(0, c.Length, j => c[j] != null));
551 //Debug.Assert(names.All(name => name != null));
552
553 var symbols = MkSymbols(names);
554 try
555 {
556 return MkDatatypeSorts(symbols, c);
557 }
558 finally
559 {
560 foreach (var symbol in symbols)
561 symbol.Dispose();
562 }
563 }
564
571 public Expr MkUpdateField(FuncDecl field, Expr t, Expr v)
572 {
573 return Expr.Create(this, Native.Z3_datatype_update_field(
574 nCtx, field.NativeObject,
575 t.NativeObject, v.NativeObject));
576 }
577
578 #endregion
579 #endregion
580
581 #region Function Declarations
585 public FuncDecl MkFuncDecl(Symbol name, Sort[] domain, Sort range)
586 {
587 Debug.Assert(name != null);
588 Debug.Assert(range != null);
589 Debug.Assert(domain.All(d => d != null));
590
591 CheckContextMatch(name);
592 CheckContextMatch<Sort>(domain);
593 CheckContextMatch(range);
594 return new FuncDecl(this, name, domain, range);
595 }
596
600 public FuncDecl MkFuncDecl(Symbol name, Sort domain, Sort range)
601 {
602 Debug.Assert(name != null);
603 Debug.Assert(domain != null);
604 Debug.Assert(range != null);
605
606 CheckContextMatch(name);
607 CheckContextMatch(domain);
608 CheckContextMatch(range);
609 Sort[] q = new Sort[] { domain };
610 return new FuncDecl(this, name, q, range);
611 }
612
616 public FuncDecl MkFuncDecl(string name, Sort[] domain, Sort range)
617 {
618 Debug.Assert(range != null);
619 Debug.Assert(domain.All(d => d != null));
620
621 CheckContextMatch<Sort>(domain);
622 CheckContextMatch(range);
623 using var symbol = MkSymbol(name);
624 return new FuncDecl(this, symbol, domain, range);
625 }
626
630 public FuncDecl MkRecFuncDecl(string name, Sort[] domain, Sort range)
631 {
632 Debug.Assert(range != null);
633 Debug.Assert(domain.All(d => d != null));
634
635 CheckContextMatch<Sort>(domain);
636 CheckContextMatch(range);
637 using var symbol = MkSymbol(name);
638 return new FuncDecl(this, symbol, domain, range, true);
639 }
640
647 public void AddRecDef(FuncDecl f, Expr[] args, Expr body)
648 {
649 CheckContextMatch(f);
650 CheckContextMatch<Expr>(args);
651 CheckContextMatch(body);
652 IntPtr[] argsNative = AST.ArrayToNative(args);
653 Native.Z3_add_rec_def(nCtx, f.NativeObject, (uint)args.Length, argsNative, body.NativeObject);
654 }
655
659 public FuncDecl MkFuncDecl(string name, Sort domain, Sort range)
660 {
661 Debug.Assert(range != null);
662 Debug.Assert(domain != null);
663
664 CheckContextMatch(domain);
665 CheckContextMatch(range);
666 using var symbol = MkSymbol(name);
667 Sort[] q = new Sort[] { domain };
668 return new FuncDecl(this, symbol, q, range);
669 }
670
676 public FuncDecl MkFreshFuncDecl(string prefix, Sort[] domain, Sort range)
677 {
678 Debug.Assert(range != null);
679 Debug.Assert(domain.All(d => d != null));
680
681 CheckContextMatch<Sort>(domain);
682 CheckContextMatch(range);
683 return new FuncDecl(this, prefix, domain, range);
684 }
685
689 public FuncDecl MkConstDecl(Symbol name, Sort range)
690 {
691 Debug.Assert(name != null);
692 Debug.Assert(range != null);
693
694 CheckContextMatch(name);
695 CheckContextMatch(range);
696 return new FuncDecl(this, name, null, range);
697 }
698
702 public FuncDecl MkConstDecl(string name, Sort range)
703 {
704 Debug.Assert(range != null);
705
706 CheckContextMatch(range);
707 using var symbol = MkSymbol(name);
708 return new FuncDecl(this, symbol, null, range);
709 }
710
716 public FuncDecl MkFreshConstDecl(string prefix, Sort range)
717 {
718 Debug.Assert(range != null);
719
720 CheckContextMatch(range);
721 return new FuncDecl(this, prefix, null, range);
722 }
723
727 public FuncDecl MkUserPropagatorFuncDecl(string name, Sort[] domain, Sort range)
728 {
729 using var _name = MkSymbol(name);
730 var fn = Native.Z3_solver_propagate_declare(nCtx, _name.NativeObject, AST.ArrayLength(domain), AST.ArrayToNative(domain), range.NativeObject);
731 return new FuncDecl(this, fn);
732 }
733 #endregion
734
735 #region Bound Variables
741 public Expr MkBound(uint index, Sort ty)
742 {
743 Debug.Assert(ty != null);
744
745 return Expr.Create(this, Native.Z3_mk_bound(nCtx, index, ty.NativeObject));
746 }
747 #endregion
748
749 #region Quantifier Patterns
753 public Pattern MkPattern(params Expr[] terms)
754 {
755 Debug.Assert(terms != null);
756 if (terms.Length == 0)
757 throw new Z3Exception("Cannot create a pattern from zero terms");
758
759 IntPtr[] termsNative = AST.ArrayToNative(terms);
760 return new Pattern(this, Native.Z3_mk_pattern(nCtx, (uint)terms.Length, termsNative));
761 }
762 #endregion
763
764 #region Constants
768 public Expr MkConst(Symbol name, Sort range)
769 {
770 Debug.Assert(name != null);
771 Debug.Assert(range != null);
772
773 CheckContextMatch(name);
774 CheckContextMatch(range);
775
776 return Expr.Create(this, Native.Z3_mk_const(nCtx, name.NativeObject, range.NativeObject));
777 }
778
782 public Expr MkConst(string name, Sort range)
783 {
784 Debug.Assert(range != null);
785
786 using var symbol = MkSymbol(name);
787 return MkConst(symbol, range);
788 }
789
794 public Expr MkFreshConst(string prefix, Sort range)
795 {
796 Debug.Assert(range != null);
797
798 CheckContextMatch(range);
799 return Expr.Create(this, Native.Z3_mk_fresh_const(nCtx, prefix, range.NativeObject));
800 }
801
807 {
808 Debug.Assert(f != null);
809
810 return MkApp(f);
811 }
812
817 {
818 Debug.Assert(name != null);
819
820 return (BoolExpr)MkConst(name, BoolSort);
821 }
822
826 public BoolExpr MkBoolConst(string name)
827 {
828 using var symbol = MkSymbol(name);
829 return (BoolExpr)MkConst(symbol, BoolSort);
830 }
831
836 {
837 Debug.Assert(name != null);
838
839 return (IntExpr)MkConst(name, IntSort);
840 }
841
845 public IntExpr MkIntConst(string name)
846 {
847 Debug.Assert(name != null);
848
849 return (IntExpr)MkConst(name, IntSort);
850 }
851
856 {
857 Debug.Assert(name != null);
858
859 return (RealExpr)MkConst(name, RealSort);
860 }
861
865 public RealExpr MkRealConst(string name)
866 {
867
868 return (RealExpr)MkConst(name, RealSort);
869 }
870
874 public BitVecExpr MkBVConst(Symbol name, uint size)
875 {
876 Debug.Assert(name != null);
877
878 using var sort = MkBitVecSort(size);
879 return (BitVecExpr)MkConst(name, sort);
880 }
881
885 public BitVecExpr MkBVConst(string name, uint size)
886 {
887 using var sort = MkBitVecSort(size);
888 return (BitVecExpr)MkConst(name, sort);
889 }
890 #endregion
891
892 #region Terms
896 public Expr MkApp(FuncDecl f, params Expr[] args)
897 {
898 Debug.Assert(f != null);
899 Debug.Assert(args == null || args.All(a => a != null));
900 CheckContextMatch(f);
901 CheckContextMatch<Expr>(args);
902 return Expr.Create(this, f, args);
903 }
904
908 public Expr MkApp(FuncDecl f, IEnumerable<Expr> args)
909 {
910 Debug.Assert(f != null);
911 return MkApp(f, args?.ToArray());
912 }
913
914 #region Propositional
919 {
920 return new BoolExpr(this, Native.Z3_mk_true(nCtx));
921 }
922
927 {
928 return new BoolExpr(this, Native.Z3_mk_false(nCtx));
929 }
930
934 public BoolExpr MkBool(bool value)
935 {
936 return value ? MkTrue() : MkFalse();
937 }
938
942 public BoolExpr MkEq(Expr x, Expr y)
943 {
944 Debug.Assert(x != null);
945 Debug.Assert(y != null);
946
947 CheckContextMatch(x);
948 CheckContextMatch(y);
949 return new BoolExpr(this, Native.Z3_mk_eq(nCtx, x.NativeObject, y.NativeObject));
950 }
951
955 public BoolExpr MkDistinct(params Expr[] args)
956 {
957 Debug.Assert(args != null);
958 Debug.Assert(args.All(a => a != null));
959
960 CheckContextMatch<Expr>(args);
961 return new BoolExpr(this, Native.Z3_mk_distinct(nCtx, (uint)args.Length, AST.ArrayToNative(args)));
962 }
963
967 public BoolExpr MkDistinct(IEnumerable<Expr> args)
968 {
969 Debug.Assert(args != null);
970 return MkDistinct(args.ToArray());
971 }
972
977 {
978 Debug.Assert(a != null);
979 CheckContextMatch(a);
980 return new BoolExpr(this, Native.Z3_mk_not(nCtx, a.NativeObject));
981 }
982
989 public Expr MkITE(BoolExpr t1, Expr t2, Expr t3)
990 {
991 Debug.Assert(t1 != null);
992 Debug.Assert(t2 != null);
993 Debug.Assert(t3 != null);
994
995 CheckContextMatch(t1);
996 CheckContextMatch(t2);
997 CheckContextMatch(t3);
998 return Expr.Create(this, Native.Z3_mk_ite(nCtx, t1.NativeObject, t2.NativeObject, t3.NativeObject));
999 }
1000
1005 {
1006 Debug.Assert(t1 != null);
1007 Debug.Assert(t2 != null);
1008
1009 CheckContextMatch(t1);
1010 CheckContextMatch(t2);
1011 return new BoolExpr(this, Native.Z3_mk_iff(nCtx, t1.NativeObject, t2.NativeObject));
1012 }
1013
1018 {
1019 Debug.Assert(t1 != null);
1020 Debug.Assert(t2 != null);
1021
1022 CheckContextMatch(t1);
1023 CheckContextMatch(t2);
1024 return new BoolExpr(this, Native.Z3_mk_implies(nCtx, t1.NativeObject, t2.NativeObject));
1025 }
1026
1031 {
1032 Debug.Assert(t1 != null);
1033 Debug.Assert(t2 != null);
1034
1035 CheckContextMatch(t1);
1036 CheckContextMatch(t2);
1037 return new BoolExpr(this, Native.Z3_mk_xor(nCtx, t1.NativeObject, t2.NativeObject));
1038 }
1039
1043 public BoolExpr MkXor(IEnumerable<BoolExpr> args)
1044 {
1045 Debug.Assert(args != null);
1046 var ts = args.ToArray();
1047 Debug.Assert(ts.All(a => a != null));
1048 CheckContextMatch<BoolExpr>(ts);
1049
1050 return ts.Aggregate(MkFalse(), (r, t) =>
1051 {
1052 using (r)
1053 return MkXor(r, t);
1054 });
1055 }
1056
1060 public BoolExpr MkAnd(params BoolExpr[] ts)
1061 {
1062 Debug.Assert(ts != null);
1063 Debug.Assert(ts.All(a => a != null));
1064
1065 CheckContextMatch<BoolExpr>(ts);
1066 return new BoolExpr(this, Native.Z3_mk_and(nCtx, (uint)ts.Length, AST.ArrayToNative(ts)));
1067 }
1068
1072 public BoolExpr MkAnd(IEnumerable<BoolExpr> t)
1073 {
1074 Debug.Assert(t != null);
1075 return MkAnd(t.ToArray());
1076 }
1077
1081 public BoolExpr MkOr(params BoolExpr[] ts)
1082 {
1083 Debug.Assert(ts != null);
1084 Debug.Assert(ts.All(a => a != null));
1085
1086 CheckContextMatch<BoolExpr>(ts);
1087 return new BoolExpr(this, Native.Z3_mk_or(nCtx, (uint)ts.Length, AST.ArrayToNative(ts)));
1088 }
1089
1090
1094 public BoolExpr MkOr(IEnumerable<BoolExpr> ts)
1095 {
1096 Debug.Assert(ts != null);
1097 return MkOr(ts.ToArray());
1098 }
1099
1100 #endregion
1101
1102 #region Arithmetic
1106 public ArithExpr MkAdd(params ArithExpr[] ts)
1107 {
1108 Debug.Assert(ts != null);
1109 Debug.Assert(ts.All(a => a != null));
1110
1111 CheckContextMatch<ArithExpr>(ts);
1112 return (ArithExpr)Expr.Create(this, Native.Z3_mk_add(nCtx, (uint)ts.Length, AST.ArrayToNative(ts)));
1113 }
1114
1118 public ArithExpr MkAdd(IEnumerable<ArithExpr> ts)
1119 {
1120 Debug.Assert(ts != null);
1121 return MkAdd(ts.ToArray());
1122 }
1123
1127 public ArithExpr MkMul(params ArithExpr[] ts)
1128 {
1129 Debug.Assert(ts != null);
1130 Debug.Assert(ts.All(a => a != null));
1131
1132 CheckContextMatch<ArithExpr>(ts);
1133 return (ArithExpr)Expr.Create(this, Native.Z3_mk_mul(nCtx, (uint)ts.Length, AST.ArrayToNative(ts)));
1134 }
1135
1139 public ArithExpr MkMul(IEnumerable<ArithExpr> ts)
1140 {
1141 Debug.Assert(ts != null);
1142 return MkMul(ts.ToArray());
1143 }
1144
1148 public ArithExpr MkSub(params ArithExpr[] ts)
1149 {
1150 Debug.Assert(ts != null);
1151 Debug.Assert(ts.All(a => a != null));
1152
1153 CheckContextMatch<ArithExpr>(ts);
1154 return (ArithExpr)Expr.Create(this, Native.Z3_mk_sub(nCtx, (uint)ts.Length, AST.ArrayToNative(ts)));
1155 }
1156
1161 {
1162 Debug.Assert(t != null);
1163
1164 CheckContextMatch(t);
1165 return (ArithExpr)Expr.Create(this, Native.Z3_mk_unary_minus(nCtx, t.NativeObject));
1166 }
1167
1172 {
1173 Debug.Assert(t1 != null);
1174 Debug.Assert(t2 != null);
1175
1176 CheckContextMatch(t1);
1177 CheckContextMatch(t2);
1178 return (ArithExpr)Expr.Create(this, Native.Z3_mk_div(nCtx, t1.NativeObject, t2.NativeObject));
1179 }
1180
1186 {
1187 Debug.Assert(t1 != null);
1188 Debug.Assert(t2 != null);
1189
1190 CheckContextMatch(t1);
1191 CheckContextMatch(t2);
1192 return new IntExpr(this, Native.Z3_mk_mod(nCtx, t1.NativeObject, t2.NativeObject));
1193 }
1194
1200 {
1201 Debug.Assert(t1 != null);
1202 Debug.Assert(t2 != null);
1203
1204 CheckContextMatch(t1);
1205 CheckContextMatch(t2);
1206 return new IntExpr(this, Native.Z3_mk_rem(nCtx, t1.NativeObject, t2.NativeObject));
1207 }
1208
1213 {
1214 Debug.Assert(t1 != null);
1215 Debug.Assert(t2 != null);
1216
1217 CheckContextMatch(t1);
1218 CheckContextMatch(t2);
1219 return (ArithExpr)Expr.Create(this, Native.Z3_mk_power(nCtx, t1.NativeObject, t2.NativeObject));
1220 }
1221
1226 {
1227 Debug.Assert(t1 != null);
1228 Debug.Assert(t2 != null);
1229
1230 CheckContextMatch(t1);
1231 CheckContextMatch(t2);
1232 return new BoolExpr(this, Native.Z3_mk_lt(nCtx, t1.NativeObject, t2.NativeObject));
1233 }
1234
1239 {
1240 Debug.Assert(t1 != null);
1241 Debug.Assert(t2 != null);
1242
1243 CheckContextMatch(t1);
1244 CheckContextMatch(t2);
1245 return new BoolExpr(this, Native.Z3_mk_le(nCtx, t1.NativeObject, t2.NativeObject));
1246 }
1247
1252 {
1253 Debug.Assert(t1 != null);
1254 Debug.Assert(t2 != null);
1255
1256 CheckContextMatch(t1);
1257 CheckContextMatch(t2);
1258 return new BoolExpr(this, Native.Z3_mk_gt(nCtx, t1.NativeObject, t2.NativeObject));
1259 }
1260
1265 {
1266 Debug.Assert(t1 != null);
1267 Debug.Assert(t2 != null);
1268
1269 CheckContextMatch(t1);
1270 CheckContextMatch(t2);
1271 return new BoolExpr(this, Native.Z3_mk_ge(nCtx, t1.NativeObject, t2.NativeObject));
1272 }
1273
1285 {
1286 Debug.Assert(t != null);
1287
1288 CheckContextMatch(t);
1289 return new RealExpr(this, Native.Z3_mk_int2real(nCtx, t.NativeObject));
1290 }
1291
1300 {
1301 Debug.Assert(t != null);
1302
1303 CheckContextMatch(t);
1304 return new IntExpr(this, Native.Z3_mk_real2int(nCtx, t.NativeObject));
1305 }
1306
1311 {
1312 Debug.Assert(t != null);
1313
1314 CheckContextMatch(t);
1315 return new BoolExpr(this, Native.Z3_mk_is_int(nCtx, t.NativeObject));
1316 }
1317 #endregion
1318
1319 #region Bit-vectors
1325 {
1326 Debug.Assert(t != null);
1327
1328 CheckContextMatch(t);
1329 return new BitVecExpr(this, Native.Z3_mk_bvnot(nCtx, t.NativeObject));
1330 }
1331
1337 {
1338 Debug.Assert(t != null);
1339
1340 CheckContextMatch(t);
1341 return new BitVecExpr(this, Native.Z3_mk_bvredand(nCtx, t.NativeObject));
1342 }
1343
1349 {
1350 Debug.Assert(t != null);
1351
1352 CheckContextMatch(t);
1353 return new BitVecExpr(this, Native.Z3_mk_bvredor(nCtx, t.NativeObject));
1354 }
1355
1361 {
1362 Debug.Assert(t1 != null);
1363 Debug.Assert(t2 != null);
1364
1365 CheckContextMatch(t1);
1366 CheckContextMatch(t2);
1367 return new BitVecExpr(this, Native.Z3_mk_bvand(nCtx, t1.NativeObject, t2.NativeObject));
1368 }
1369
1375 {
1376 Debug.Assert(t1 != null);
1377 Debug.Assert(t2 != null);
1378
1379 CheckContextMatch(t1);
1380 CheckContextMatch(t2);
1381 return new BitVecExpr(this, Native.Z3_mk_bvor(nCtx, t1.NativeObject, t2.NativeObject));
1382 }
1383
1389 {
1390 Debug.Assert(t1 != null);
1391 Debug.Assert(t2 != null);
1392
1393 CheckContextMatch(t1);
1394 CheckContextMatch(t2);
1395 return new BitVecExpr(this, Native.Z3_mk_bvxor(nCtx, t1.NativeObject, t2.NativeObject));
1396 }
1397
1403 {
1404 Debug.Assert(t1 != null);
1405 Debug.Assert(t2 != null);
1406
1407 CheckContextMatch(t1);
1408 CheckContextMatch(t2);
1409 return new BitVecExpr(this, Native.Z3_mk_bvnand(nCtx, t1.NativeObject, t2.NativeObject));
1410 }
1411
1417 {
1418 Debug.Assert(t1 != null);
1419 Debug.Assert(t2 != null);
1420
1421 CheckContextMatch(t1);
1422 CheckContextMatch(t2);
1423 return new BitVecExpr(this, Native.Z3_mk_bvnor(nCtx, t1.NativeObject, t2.NativeObject));
1424 }
1425
1431 {
1432 Debug.Assert(t1 != null);
1433 Debug.Assert(t2 != null);
1434
1435 CheckContextMatch(t1);
1436 CheckContextMatch(t2);
1437 return new BitVecExpr(this, Native.Z3_mk_bvxnor(nCtx, t1.NativeObject, t2.NativeObject));
1438 }
1439
1445 {
1446 Debug.Assert(t != null);
1447
1448 CheckContextMatch(t);
1449 return new BitVecExpr(this, Native.Z3_mk_bvneg(nCtx, t.NativeObject));
1450 }
1451
1457 {
1458 Debug.Assert(t1 != null);
1459 Debug.Assert(t2 != null);
1460
1461 CheckContextMatch(t1);
1462 CheckContextMatch(t2);
1463 return new BitVecExpr(this, Native.Z3_mk_bvadd(nCtx, t1.NativeObject, t2.NativeObject));
1464 }
1465
1471 {
1472 Debug.Assert(t1 != null);
1473 Debug.Assert(t2 != null);
1474
1475 CheckContextMatch(t1);
1476 CheckContextMatch(t2);
1477 return new BitVecExpr(this, Native.Z3_mk_bvsub(nCtx, t1.NativeObject, t2.NativeObject));
1478 }
1479
1485 {
1486 Debug.Assert(t1 != null);
1487 Debug.Assert(t2 != null);
1488
1489 CheckContextMatch(t1);
1490 CheckContextMatch(t2);
1491 return new BitVecExpr(this, Native.Z3_mk_bvmul(nCtx, t1.NativeObject, t2.NativeObject));
1492 }
1493
1504 {
1505 Debug.Assert(t1 != null);
1506 Debug.Assert(t2 != null);
1507
1508 CheckContextMatch(t1);
1509 CheckContextMatch(t2);
1510 return new BitVecExpr(this, Native.Z3_mk_bvudiv(nCtx, t1.NativeObject, t2.NativeObject));
1511 }
1512
1527 {
1528 Debug.Assert(t1 != null);
1529 Debug.Assert(t2 != null);
1530
1531 CheckContextMatch(t1);
1532 CheckContextMatch(t2);
1533 return new BitVecExpr(this, Native.Z3_mk_bvsdiv(nCtx, t1.NativeObject, t2.NativeObject));
1534 }
1535
1545 {
1546 Debug.Assert(t1 != null);
1547 Debug.Assert(t2 != null);
1548
1549 CheckContextMatch(t1);
1550 CheckContextMatch(t2);
1551 return new BitVecExpr(this, Native.Z3_mk_bvurem(nCtx, t1.NativeObject, t2.NativeObject));
1552 }
1553
1565 {
1566 Debug.Assert(t1 != null);
1567 Debug.Assert(t2 != null);
1568
1569 CheckContextMatch(t1);
1570 CheckContextMatch(t2);
1571 return new BitVecExpr(this, Native.Z3_mk_bvsrem(nCtx, t1.NativeObject, t2.NativeObject));
1572 }
1573
1582 {
1583 Debug.Assert(t1 != null);
1584 Debug.Assert(t2 != null);
1585
1586 CheckContextMatch(t1);
1587 CheckContextMatch(t2);
1588 return new BitVecExpr(this, Native.Z3_mk_bvsmod(nCtx, t1.NativeObject, t2.NativeObject));
1589 }
1590
1598 {
1599 Debug.Assert(t1 != null);
1600 Debug.Assert(t2 != null);
1601
1602 CheckContextMatch(t1);
1603 CheckContextMatch(t2);
1604 return new BoolExpr(this, Native.Z3_mk_bvult(nCtx, t1.NativeObject, t2.NativeObject));
1605 }
1606
1614 {
1615 Debug.Assert(t1 != null);
1616 Debug.Assert(t2 != null);
1617
1618 CheckContextMatch(t1);
1619 CheckContextMatch(t2);
1620 return new BoolExpr(this, Native.Z3_mk_bvslt(nCtx, t1.NativeObject, t2.NativeObject));
1621 }
1622
1630 {
1631 Debug.Assert(t1 != null);
1632 Debug.Assert(t2 != null);
1633
1634 CheckContextMatch(t1);
1635 CheckContextMatch(t2);
1636 return new BoolExpr(this, Native.Z3_mk_bvule(nCtx, t1.NativeObject, t2.NativeObject));
1637 }
1638
1646 {
1647 Debug.Assert(t1 != null);
1648 Debug.Assert(t2 != null);
1649
1650 CheckContextMatch(t1);
1651 CheckContextMatch(t2);
1652 return new BoolExpr(this, Native.Z3_mk_bvsle(nCtx, t1.NativeObject, t2.NativeObject));
1653 }
1654
1662 {
1663 Debug.Assert(t1 != null);
1664 Debug.Assert(t2 != null);
1665
1666 CheckContextMatch(t1);
1667 CheckContextMatch(t2);
1668 return new BoolExpr(this, Native.Z3_mk_bvuge(nCtx, t1.NativeObject, t2.NativeObject));
1669 }
1670
1678 {
1679 Debug.Assert(t1 != null);
1680 Debug.Assert(t2 != null);
1681
1682 CheckContextMatch(t1);
1683 CheckContextMatch(t2);
1684 return new BoolExpr(this, Native.Z3_mk_bvsge(nCtx, t1.NativeObject, t2.NativeObject));
1685 }
1686
1694 {
1695 Debug.Assert(t1 != null);
1696 Debug.Assert(t2 != null);
1697
1698 CheckContextMatch(t1);
1699 CheckContextMatch(t2);
1700 return new BoolExpr(this, Native.Z3_mk_bvugt(nCtx, t1.NativeObject, t2.NativeObject));
1701 }
1702
1710 {
1711 Debug.Assert(t1 != null);
1712 Debug.Assert(t2 != null);
1713
1714 CheckContextMatch(t1);
1715 CheckContextMatch(t2);
1716 return new BoolExpr(this, Native.Z3_mk_bvsgt(nCtx, t1.NativeObject, t2.NativeObject));
1717 }
1718
1730 {
1731 Debug.Assert(t1 != null);
1732 Debug.Assert(t2 != null);
1733
1734 CheckContextMatch(t1);
1735 CheckContextMatch(t2);
1736 return new BitVecExpr(this, Native.Z3_mk_concat(nCtx, t1.NativeObject, t2.NativeObject));
1737 }
1738
1748 public BitVecExpr MkExtract(uint high, uint low, BitVecExpr t)
1749 {
1750 Debug.Assert(t != null);
1751
1752 CheckContextMatch(t);
1753 return new BitVecExpr(this, Native.Z3_mk_extract(nCtx, high, low, t.NativeObject));
1754 }
1755
1765 {
1766 Debug.Assert(t != null);
1767
1768 CheckContextMatch(t);
1769 return new BitVecExpr(this, Native.Z3_mk_sign_ext(nCtx, i, t.NativeObject));
1770 }
1771
1782 {
1783 Debug.Assert(t != null);
1784
1785 CheckContextMatch(t);
1786 return new BitVecExpr(this, Native.Z3_mk_zero_ext(nCtx, i, t.NativeObject));
1787 }
1788
1796 {
1797 Debug.Assert(t != null);
1798
1799 CheckContextMatch(t);
1800 return new BitVecExpr(this, Native.Z3_mk_repeat(nCtx, i, t.NativeObject));
1801 }
1802
1816 {
1817 Debug.Assert(t1 != null);
1818 Debug.Assert(t2 != null);
1819
1820 CheckContextMatch(t1);
1821 CheckContextMatch(t2);
1822 return new BitVecExpr(this, Native.Z3_mk_bvshl(nCtx, t1.NativeObject, t2.NativeObject));
1823 }
1824
1838 {
1839 Debug.Assert(t1 != null);
1840 Debug.Assert(t2 != null);
1841
1842 CheckContextMatch(t1);
1843 CheckContextMatch(t2);
1844 return new BitVecExpr(this, Native.Z3_mk_bvlshr(nCtx, t1.NativeObject, t2.NativeObject));
1845 }
1846
1862 {
1863 Debug.Assert(t1 != null);
1864 Debug.Assert(t2 != null);
1865
1866 CheckContextMatch(t1);
1867 CheckContextMatch(t2);
1868 return new BitVecExpr(this, Native.Z3_mk_bvashr(nCtx, t1.NativeObject, t2.NativeObject));
1869 }
1870
1879 {
1880 Debug.Assert(t != null);
1881
1882 CheckContextMatch(t);
1883 return new BitVecExpr(this, Native.Z3_mk_rotate_left(nCtx, i, t.NativeObject));
1884 }
1885
1894 {
1895 Debug.Assert(t != null);
1896
1897 CheckContextMatch(t);
1898 return new BitVecExpr(this, Native.Z3_mk_rotate_right(nCtx, i, t.NativeObject));
1899 }
1900
1909 {
1910 Debug.Assert(t1 != null);
1911 Debug.Assert(t2 != null);
1912
1913 CheckContextMatch(t1);
1914 CheckContextMatch(t2);
1915 return new BitVecExpr(this, Native.Z3_mk_ext_rotate_left(nCtx, t1.NativeObject, t2.NativeObject));
1916 }
1917
1926 {
1927 Debug.Assert(t1 != null);
1928 Debug.Assert(t2 != null);
1929
1930 CheckContextMatch(t1);
1931 CheckContextMatch(t2);
1932 return new BitVecExpr(this, Native.Z3_mk_ext_rotate_right(nCtx, t1.NativeObject, t2.NativeObject));
1933 }
1934
1945 public BitVecExpr MkInt2BV(uint n, IntExpr t)
1946 {
1947 Debug.Assert(t != null);
1948
1949 CheckContextMatch(t);
1950 return new BitVecExpr(this, Native.Z3_mk_int2bv(nCtx, n, t.NativeObject));
1951 }
1952
1968 public IntExpr MkBV2Int(BitVecExpr t, bool signed)
1969 {
1970 Debug.Assert(t != null);
1971
1972 CheckContextMatch(t);
1973 return new IntExpr(this, Native.Z3_mk_bv2int(nCtx, t.NativeObject, (byte)(signed ? 1 : 0)));
1974 }
1975
1982 public BoolExpr MkBVAddNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
1983 {
1984 Debug.Assert(t1 != null);
1985 Debug.Assert(t2 != null);
1986
1987 CheckContextMatch(t1);
1988 CheckContextMatch(t2);
1989 return new BoolExpr(this, Native.Z3_mk_bvadd_no_overflow(nCtx, t1.NativeObject, t2.NativeObject, (byte)(isSigned ? 1 : 0)));
1990 }
1991
1999 {
2000 Debug.Assert(t1 != null);
2001 Debug.Assert(t2 != null);
2002
2003 CheckContextMatch(t1);
2004 CheckContextMatch(t2);
2005 return new BoolExpr(this, Native.Z3_mk_bvadd_no_underflow(nCtx, t1.NativeObject, t2.NativeObject));
2006 }
2007
2015 {
2016 Debug.Assert(t1 != null);
2017 Debug.Assert(t2 != null);
2018
2019 CheckContextMatch(t1);
2020 CheckContextMatch(t2);
2021 return new BoolExpr(this, Native.Z3_mk_bvsub_no_overflow(nCtx, t1.NativeObject, t2.NativeObject));
2022 }
2023
2030 public BoolExpr MkBVSubNoUnderflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
2031 {
2032 Debug.Assert(t1 != null);
2033 Debug.Assert(t2 != null);
2034
2035 CheckContextMatch(t1);
2036 CheckContextMatch(t2);
2037 return new BoolExpr(this, Native.Z3_mk_bvsub_no_underflow(nCtx, t1.NativeObject, t2.NativeObject, (byte)(isSigned ? 1 : 0)));
2038 }
2039
2047 {
2048 Debug.Assert(t1 != null);
2049 Debug.Assert(t2 != null);
2050
2051 CheckContextMatch(t1);
2052 CheckContextMatch(t2);
2053 return new BoolExpr(this, Native.Z3_mk_bvsdiv_no_overflow(nCtx, t1.NativeObject, t2.NativeObject));
2054 }
2055
2063 {
2064 Debug.Assert(t != null);
2065
2066 CheckContextMatch(t);
2067 return new BoolExpr(this, Native.Z3_mk_bvneg_no_overflow(nCtx, t.NativeObject));
2068 }
2069
2076 public BoolExpr MkBVMulNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
2077 {
2078 Debug.Assert(t1 != null);
2079 Debug.Assert(t2 != null);
2080
2081 CheckContextMatch(t1);
2082 CheckContextMatch(t2);
2083 return new BoolExpr(this, Native.Z3_mk_bvmul_no_overflow(nCtx, t1.NativeObject, t2.NativeObject, (byte)(isSigned ? 1 : 0)));
2084 }
2085
2093 {
2094 Debug.Assert(t1 != null);
2095 Debug.Assert(t2 != null);
2096
2097 CheckContextMatch(t1);
2098 CheckContextMatch(t2);
2099 return new BoolExpr(this, Native.Z3_mk_bvmul_no_underflow(nCtx, t1.NativeObject, t2.NativeObject));
2100 }
2101 #endregion
2102
2103 #region Arrays
2107 public ArrayExpr MkArrayConst(Symbol name, Sort domain, Sort range)
2108 {
2109 Debug.Assert(name != null);
2110 Debug.Assert(domain != null);
2111 Debug.Assert(range != null);
2112
2113 using var sort = MkArraySort(domain, range);
2114 return (ArrayExpr)MkConst(name, sort);
2115 }
2116
2120 public ArrayExpr MkArrayConst(string name, Sort domain, Sort range)
2121 {
2122 Debug.Assert(domain != null);
2123 Debug.Assert(range != null);
2124
2125 using var symbol = MkSymbol(name);
2126 using var sort = MkArraySort(domain, range);
2127 return (ArrayExpr)MkConst(symbol, sort);
2128 }
2129
2130
2145 {
2146 Debug.Assert(a != null);
2147 Debug.Assert(i != null);
2148
2149 CheckContextMatch(a);
2150 CheckContextMatch(i);
2151 return Expr.Create(this, Native.Z3_mk_select(nCtx, a.NativeObject, i.NativeObject));
2152 }
2153
2167 public Expr MkSelect(ArrayExpr a, params Expr[] args)
2168 {
2169 Debug.Assert(a != null);
2170 Debug.Assert(args != null && args.All(n => n != null));
2171
2172 CheckContextMatch(a);
2173 CheckContextMatch<Expr>(args);
2174 return Expr.Create(this, Native.Z3_mk_select_n(nCtx, a.NativeObject, AST.ArrayLength(args), AST.ArrayToNative(args)));
2175 }
2176
2177
2197 {
2198 Debug.Assert(a != null);
2199 Debug.Assert(i != null);
2200 Debug.Assert(v != null);
2201
2202 CheckContextMatch(a);
2203 CheckContextMatch(i);
2204 CheckContextMatch(v);
2205 return new ArrayExpr(this, Native.Z3_mk_store(nCtx, a.NativeObject, i.NativeObject, v.NativeObject));
2206 }
2207
2226 public ArrayExpr MkStore(ArrayExpr a, Expr[] args, Expr v)
2227 {
2228 Debug.Assert(a != null);
2229 Debug.Assert(args != null);
2230 Debug.Assert(v != null);
2231
2232 CheckContextMatch<Expr>(args);
2233 CheckContextMatch(a);
2234 CheckContextMatch(v);
2235 return new ArrayExpr(this, Native.Z3_mk_store_n(nCtx, a.NativeObject, AST.ArrayLength(args), AST.ArrayToNative(args), v.NativeObject));
2236 }
2237
2248 {
2249 Debug.Assert(domain != null);
2250 Debug.Assert(v != null);
2251
2252 CheckContextMatch(domain);
2253 CheckContextMatch(v);
2254 return new ArrayExpr(this, Native.Z3_mk_const_array(nCtx, domain.NativeObject, v.NativeObject));
2255 }
2256
2268 public ArrayExpr MkMap(FuncDecl f, params ArrayExpr[] args)
2269 {
2270 Debug.Assert(f != null);
2271 Debug.Assert(args == null || args.All(a => a != null));
2272
2273 CheckContextMatch(f);
2274 CheckContextMatch<ArrayExpr>(args);
2275 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_map(nCtx, f.NativeObject, AST.ArrayLength(args), AST.ArrayToNative(args)));
2276 }
2277
2286 {
2287 Debug.Assert(array != null);
2288
2289 CheckContextMatch(array);
2290 return Expr.Create(this, Native.Z3_mk_array_default(nCtx, array.NativeObject));
2291 }
2292
2297 {
2298 Debug.Assert(arg1 != null);
2299 Debug.Assert(arg2 != null);
2300
2301 CheckContextMatch(arg1);
2302 CheckContextMatch(arg2);
2303 return Expr.Create(this, Native.Z3_mk_array_ext(nCtx, arg1.NativeObject, arg2.NativeObject));
2304 }
2305
2306 #endregion
2307
2308 #region Sets
2313 {
2314 Debug.Assert(ty != null);
2315
2316 CheckContextMatch(ty);
2317 return new SetSort(this, ty);
2318 }
2319
2324 {
2325 Debug.Assert(domain != null);
2326
2327 CheckContextMatch(domain);
2328 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_empty_set(nCtx, domain.NativeObject));
2329 }
2330
2334 public ArrayExpr MkFullSet(Sort domain)
2335 {
2336 Debug.Assert(domain != null);
2337
2338 CheckContextMatch(domain);
2339 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_full_set(nCtx, domain.NativeObject));
2340 }
2341
2345 public ArrayExpr MkSetAdd(ArrayExpr set, Expr element)
2346 {
2347 Debug.Assert(set != null);
2348 Debug.Assert(element != null);
2349
2350 CheckContextMatch(set);
2351 CheckContextMatch(element);
2352 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_add(nCtx, set.NativeObject, element.NativeObject));
2353 }
2354
2355
2359 public ArrayExpr MkSetDel(ArrayExpr set, Expr element)
2360 {
2361 Debug.Assert(set != null);
2362 Debug.Assert(element != null);
2363
2364 CheckContextMatch(set);
2365 CheckContextMatch(element);
2366 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_del(nCtx, set.NativeObject, element.NativeObject));
2367 }
2368
2372 public ArrayExpr MkSetUnion(params ArrayExpr[] args)
2373 {
2374 Debug.Assert(args != null);
2375 Debug.Assert(args.All(a => a != null));
2376
2377 CheckContextMatch<ArrayExpr>(args);
2378 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_union(nCtx, (uint)args.Length, AST.ArrayToNative(args)));
2379 }
2380
2385 {
2386 Debug.Assert(args != null);
2387 Debug.Assert(args.All(a => a != null));
2388
2389 CheckContextMatch<ArrayExpr>(args);
2390 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_intersect(nCtx, (uint)args.Length, AST.ArrayToNative(args)));
2391 }
2392
2397 {
2398 Debug.Assert(arg1 != null);
2399 Debug.Assert(arg2 != null);
2400
2401 CheckContextMatch(arg1);
2402 CheckContextMatch(arg2);
2403 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_difference(nCtx, arg1.NativeObject, arg2.NativeObject));
2404 }
2405
2410 {
2411 Debug.Assert(arg != null);
2412
2413 CheckContextMatch(arg);
2414 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_complement(nCtx, arg.NativeObject));
2415 }
2416
2421 {
2422 Debug.Assert(elem != null);
2423 Debug.Assert(set != null);
2424
2425 CheckContextMatch(elem);
2426 CheckContextMatch(set);
2427 return (BoolExpr)Expr.Create(this, Native.Z3_mk_set_member(nCtx, elem.NativeObject, set.NativeObject));
2428 }
2429
2434 {
2435 Debug.Assert(arg1 != null);
2436 Debug.Assert(arg2 != null);
2437
2438 CheckContextMatch(arg1);
2439 CheckContextMatch(arg2);
2440 return (BoolExpr)Expr.Create(this, Native.Z3_mk_set_subset(nCtx, arg1.NativeObject, arg2.NativeObject));
2441 }
2442
2443 #endregion
2444
2445 #region Sequence, string and regular expressions
2446
2451 {
2452 Debug.Assert(s != null);
2453 return new SeqExpr(this, Native.Z3_mk_seq_empty(nCtx, s.NativeObject));
2454 }
2455
2459 public SeqExpr MkUnit(Expr elem)
2460 {
2461 Debug.Assert(elem != null);
2462 return new SeqExpr(this, Native.Z3_mk_seq_unit(nCtx, elem.NativeObject));
2463 }
2464
2468 public SeqExpr MkString(string s)
2469 {
2470 Debug.Assert(s != null);
2471 return new SeqExpr(this, Native.Z3_mk_string(nCtx, s));
2472 }
2473
2478 {
2479 Debug.Assert(e != null);
2480 Debug.Assert(e is ArithExpr);
2481 return new SeqExpr(this, Native.Z3_mk_int_to_str(nCtx, e.NativeObject));
2482 }
2483
2488 {
2489 Debug.Assert(e != null);
2490 Debug.Assert(e is ArithExpr);
2491 return new SeqExpr(this, Native.Z3_mk_ubv_to_str(nCtx, e.NativeObject));
2492 }
2493
2498 {
2499 Debug.Assert(e != null);
2500 Debug.Assert(e is ArithExpr);
2501 return new SeqExpr(this, Native.Z3_mk_sbv_to_str(nCtx, e.NativeObject));
2502 }
2503
2508 {
2509 Debug.Assert(e != null);
2510 Debug.Assert(e is SeqExpr);
2511 return new IntExpr(this, Native.Z3_mk_str_to_int(nCtx, e.NativeObject));
2512 }
2513
2514
2518 public SeqExpr MkConcat(params SeqExpr[] t)
2519 {
2520 Debug.Assert(t != null);
2521 Debug.Assert(t.All(a => a != null));
2522
2523 CheckContextMatch<SeqExpr>(t);
2524 return new SeqExpr(this, Native.Z3_mk_seq_concat(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
2525 }
2526
2527
2532 {
2533 Debug.Assert(s != null);
2534 return (IntExpr)Expr.Create(this, Native.Z3_mk_seq_length(nCtx, s.NativeObject));
2535 }
2536
2541 {
2542 Debug.Assert(s1 != null);
2543 Debug.Assert(s2 != null);
2544 CheckContextMatch(s1, s2);
2545 return new BoolExpr(this, Native.Z3_mk_seq_prefix(nCtx, s1.NativeObject, s2.NativeObject));
2546 }
2547
2552 {
2553 Debug.Assert(s1 != null);
2554 Debug.Assert(s2 != null);
2555 CheckContextMatch(s1, s2);
2556 return new BoolExpr(this, Native.Z3_mk_seq_suffix(nCtx, s1.NativeObject, s2.NativeObject));
2557 }
2558
2563 {
2564 Debug.Assert(s1 != null);
2565 Debug.Assert(s2 != null);
2566 CheckContextMatch(s1, s2);
2567 return new BoolExpr(this, Native.Z3_mk_seq_contains(nCtx, s1.NativeObject, s2.NativeObject));
2568 }
2569
2574 {
2575 Debug.Assert(s1 != null);
2576 Debug.Assert(s2 != null);
2577 CheckContextMatch(s1, s2);
2578 return new BoolExpr(this, Native.Z3_mk_str_lt(nCtx, s1.NativeObject, s2.NativeObject));
2579 }
2580
2585 {
2586 Debug.Assert(s1 != null);
2587 Debug.Assert(s2 != null);
2588 CheckContextMatch(s1, s2);
2589 return new BoolExpr(this, Native.Z3_mk_str_le(nCtx, s1.NativeObject, s2.NativeObject));
2590 }
2591
2595 public SeqExpr MkAt(SeqExpr s, Expr index)
2596 {
2597 Debug.Assert(s != null);
2598 Debug.Assert(index != null);
2599 CheckContextMatch(s, index);
2600 return new SeqExpr(this, Native.Z3_mk_seq_at(nCtx, s.NativeObject, index.NativeObject));
2601 }
2602
2606 public Expr MkNth(SeqExpr s, Expr index)
2607 {
2608 Debug.Assert(s != null);
2609 Debug.Assert(index != null);
2610 CheckContextMatch(s, index);
2611 return Expr.Create(this, Native.Z3_mk_seq_nth(nCtx, s.NativeObject, index.NativeObject));
2612 }
2613
2617 public SeqExpr MkExtract(SeqExpr s, IntExpr offset, IntExpr length)
2618 {
2619 Debug.Assert(s != null);
2620 Debug.Assert(offset != null);
2621 Debug.Assert(length != null);
2622 CheckContextMatch(s, offset, length);
2623 return new SeqExpr(this, Native.Z3_mk_seq_extract(nCtx, s.NativeObject, offset.NativeObject, length.NativeObject));
2624 }
2625
2629 public IntExpr MkIndexOf(SeqExpr s, SeqExpr substr, ArithExpr offset)
2630 {
2631 Debug.Assert(s != null);
2632 Debug.Assert(offset != null);
2633 Debug.Assert(substr != null);
2634 CheckContextMatch(s, substr, offset);
2635 return new IntExpr(this, Native.Z3_mk_seq_index(nCtx, s.NativeObject, substr.NativeObject, offset.NativeObject));
2636 }
2637
2642 {
2643 Debug.Assert(s != null);
2644 Debug.Assert(src != null);
2645 Debug.Assert(dst != null);
2646 CheckContextMatch(s, src, dst);
2647 return new SeqExpr(this, Native.Z3_mk_seq_replace(nCtx, s.NativeObject, src.NativeObject, dst.NativeObject));
2648 }
2649
2654 {
2655 Debug.Assert(s != null);
2656 return new ReExpr(this, Native.Z3_mk_seq_to_re(nCtx, s.NativeObject));
2657 }
2658
2659
2664 {
2665 Debug.Assert(s != null);
2666 Debug.Assert(re != null);
2667 CheckContextMatch(s, re);
2668 return new BoolExpr(this, Native.Z3_mk_seq_in_re(nCtx, s.NativeObject, re.NativeObject));
2669 }
2670
2675 {
2676 Debug.Assert(re != null);
2677 return new ReExpr(this, Native.Z3_mk_re_star(nCtx, re.NativeObject));
2678 }
2679
2683 public ReExpr MkLoop(ReExpr re, uint lo, uint hi = 0)
2684 {
2685 Debug.Assert(re != null);
2686 return new ReExpr(this, Native.Z3_mk_re_loop(nCtx, re.NativeObject, lo, hi));
2687 }
2688
2693 {
2694 Debug.Assert(re != null);
2695 return new ReExpr(this, Native.Z3_mk_re_plus(nCtx, re.NativeObject));
2696 }
2697
2702 {
2703 Debug.Assert(re != null);
2704 return new ReExpr(this, Native.Z3_mk_re_option(nCtx, re.NativeObject));
2705 }
2706
2711 {
2712 Debug.Assert(re != null);
2713 return new ReExpr(this, Native.Z3_mk_re_complement(nCtx, re.NativeObject));
2714 }
2715
2719 public ReExpr MkConcat(params ReExpr[] t)
2720 {
2721 Debug.Assert(t != null);
2722 Debug.Assert(t.All(a => a != null));
2723
2724 CheckContextMatch<ReExpr>(t);
2725 return new ReExpr(this, Native.Z3_mk_re_concat(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
2726 }
2727
2731 public ReExpr MkUnion(params ReExpr[] t)
2732 {
2733 Debug.Assert(t != null);
2734 Debug.Assert(t.All(a => a != null));
2735
2736 CheckContextMatch<ReExpr>(t);
2737 return new ReExpr(this, Native.Z3_mk_re_union(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
2738 }
2739
2743 public ReExpr MkIntersect(params ReExpr[] t)
2744 {
2745 Debug.Assert(t != null);
2746 Debug.Assert(t.All(a => a != null));
2747
2748 CheckContextMatch<ReExpr>(t);
2749 return new ReExpr(this, Native.Z3_mk_re_intersect(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
2750 }
2751
2756 {
2757 Debug.Assert(a != null);
2758 Debug.Assert(b != null);
2759 CheckContextMatch(a, b);
2760 return new ReExpr(this, Native.Z3_mk_re_diff(nCtx, a.NativeObject, b.NativeObject));
2761 }
2762
2768 {
2769 Debug.Assert(s != null);
2770 return new ReExpr(this, Native.Z3_mk_re_empty(nCtx, s.NativeObject));
2771 }
2772
2778 {
2779 Debug.Assert(s != null);
2780 return new ReExpr(this, Native.Z3_mk_re_full(nCtx, s.NativeObject));
2781 }
2782
2783
2788 {
2789 Debug.Assert(lo != null);
2790 Debug.Assert(hi != null);
2791 CheckContextMatch(lo, hi);
2792 return new ReExpr(this, Native.Z3_mk_re_range(nCtx, lo.NativeObject, hi.NativeObject));
2793 }
2794
2798 public BoolExpr MkCharLe(Expr ch1, Expr ch2)
2799 {
2800 Debug.Assert(ch1 != null);
2801 Debug.Assert(ch2 != null);
2802 return new BoolExpr(this, Native.Z3_mk_char_le(nCtx, ch1.NativeObject, ch2.NativeObject));
2803 }
2804
2809 {
2810 Debug.Assert(ch != null);
2811 return new IntExpr(this, Native.Z3_mk_char_to_int(nCtx, ch.NativeObject));
2812 }
2813
2818 {
2819 Debug.Assert(ch != null);
2820 return new BitVecExpr(this, Native.Z3_mk_char_to_bv(nCtx, ch.NativeObject));
2821 }
2822
2827 {
2828 Debug.Assert(bv != null);
2829 return new Expr(this, Native.Z3_mk_char_from_bv(nCtx, bv.NativeObject));
2830 }
2831
2836 {
2837 Debug.Assert(ch != null);
2838 return new BoolExpr(this, Native.Z3_mk_char_is_digit(nCtx, ch.NativeObject));
2839 }
2840
2841 #endregion
2842
2843 #region Pseudo-Boolean constraints
2844
2848 public BoolExpr MkAtMost(IEnumerable<BoolExpr> args, uint k)
2849 {
2850 Debug.Assert(args != null);
2851 var ts = args.ToArray();
2852 CheckContextMatch<BoolExpr>(ts);
2853 return new BoolExpr(this, Native.Z3_mk_atmost(nCtx, (uint)ts.Length,
2854 AST.ArrayToNative(ts), k));
2855 }
2856
2860 public BoolExpr MkAtLeast(IEnumerable<BoolExpr> args, uint k)
2861 {
2862 Debug.Assert(args != null);
2863 var ts = args.ToArray();
2864 CheckContextMatch<BoolExpr>(ts);
2865 return new BoolExpr(this, Native.Z3_mk_atleast(nCtx, (uint)ts.Length,
2866 AST.ArrayToNative(ts), k));
2867 }
2868
2872 public BoolExpr MkPBLe(int[] coeffs, BoolExpr[] args, int k)
2873 {
2874 Debug.Assert(args != null);
2875 Debug.Assert(coeffs != null);
2876 Debug.Assert(args.Length == coeffs.Length);
2877 CheckContextMatch<BoolExpr>(args);
2878 return new BoolExpr(this, Native.Z3_mk_pble(nCtx, (uint)args.Length,
2879 AST.ArrayToNative(args),
2880 coeffs, k));
2881 }
2882
2886 public BoolExpr MkPBGe(int[] coeffs, BoolExpr[] args, int k)
2887 {
2888 Debug.Assert(args != null);
2889 Debug.Assert(coeffs != null);
2890 Debug.Assert(args.Length == coeffs.Length);
2891 CheckContextMatch<BoolExpr>(args);
2892 return new BoolExpr(this, Native.Z3_mk_pbge(nCtx, (uint)args.Length,
2893 AST.ArrayToNative(args),
2894 coeffs, k));
2895 }
2899 public BoolExpr MkPBEq(int[] coeffs, BoolExpr[] args, int k)
2900 {
2901 Debug.Assert(args != null);
2902 Debug.Assert(coeffs != null);
2903 Debug.Assert(args.Length == coeffs.Length);
2904 CheckContextMatch<BoolExpr>(args);
2905 return new BoolExpr(this, Native.Z3_mk_pbeq(nCtx, (uint)args.Length,
2906 AST.ArrayToNative(args),
2907 coeffs, k));
2908 }
2909 #endregion
2910
2911 #region Numerals
2912
2913 #region General Numerals
2920 public Expr MkNumeral(string v, Sort ty)
2921 {
2922 Debug.Assert(ty != null);
2923
2924 CheckContextMatch(ty);
2925 return Expr.Create(this, Native.Z3_mk_numeral(nCtx, v, ty.NativeObject));
2926 }
2927
2935 public Expr MkNumeral(int v, Sort ty)
2936 {
2937 Debug.Assert(ty != null);
2938
2939 CheckContextMatch(ty);
2940 return Expr.Create(this, Native.Z3_mk_int(nCtx, v, ty.NativeObject));
2941 }
2942
2950 public Expr MkNumeral(uint v, Sort ty)
2951 {
2952 Debug.Assert(ty != null);
2953
2954 CheckContextMatch(ty);
2955 return Expr.Create(this, Native.Z3_mk_unsigned_int(nCtx, v, ty.NativeObject));
2956 }
2957
2965 public Expr MkNumeral(long v, Sort ty)
2966 {
2967 Debug.Assert(ty != null);
2968
2969 CheckContextMatch(ty);
2970 return Expr.Create(this, Native.Z3_mk_int64(nCtx, v, ty.NativeObject));
2971 }
2972
2980 public Expr MkNumeral(ulong v, Sort ty)
2981 {
2982 Debug.Assert(ty != null);
2983
2984 CheckContextMatch(ty);
2985 return Expr.Create(this, Native.Z3_mk_unsigned_int64(nCtx, v, ty.NativeObject));
2986 }
2987 #endregion
2988
2989 #region Reals
2997 public RatNum MkReal(int num, int den)
2998 {
2999 if (den == 0)
3000 throw new Z3Exception("Denominator is zero");
3001
3002 return new RatNum(this, Native.Z3_mk_real(nCtx, num, den));
3003 }
3004
3010 public RatNum MkReal(string v)
3011 {
3012
3013 return new RatNum(this, Native.Z3_mk_numeral(nCtx, v, RealSort.NativeObject));
3014 }
3015
3021 public RatNum MkReal(int v)
3022 {
3023
3024 return new RatNum(this, Native.Z3_mk_int(nCtx, v, RealSort.NativeObject));
3025 }
3026
3032 public RatNum MkReal(uint v)
3033 {
3034
3035 return new RatNum(this, Native.Z3_mk_unsigned_int(nCtx, v, RealSort.NativeObject));
3036 }
3037
3043 public RatNum MkReal(long v)
3044 {
3045
3046 return new RatNum(this, Native.Z3_mk_int64(nCtx, v, RealSort.NativeObject));
3047 }
3048
3054 public RatNum MkReal(ulong v)
3055 {
3056
3057 return new RatNum(this, Native.Z3_mk_unsigned_int64(nCtx, v, RealSort.NativeObject));
3058 }
3059 #endregion
3060
3061 #region Integers
3066 public IntNum MkInt(string v)
3067 {
3068
3069 return new IntNum(this, Native.Z3_mk_numeral(nCtx, v, IntSort.NativeObject));
3070 }
3071
3077 public IntNum MkInt(int v)
3078 {
3079
3080 return new IntNum(this, Native.Z3_mk_int(nCtx, v, IntSort.NativeObject));
3081 }
3082
3088 public IntNum MkInt(uint v)
3089 {
3090
3091 return new IntNum(this, Native.Z3_mk_unsigned_int(nCtx, v, IntSort.NativeObject));
3092 }
3093
3099 public IntNum MkInt(long v)
3100 {
3101
3102 return new IntNum(this, Native.Z3_mk_int64(nCtx, v, IntSort.NativeObject));
3103 }
3104
3110 public IntNum MkInt(ulong v)
3111 {
3112
3113 return new IntNum(this, Native.Z3_mk_unsigned_int64(nCtx, v, IntSort.NativeObject));
3114 }
3115 #endregion
3116
3117 #region Bit-vectors
3123 public BitVecNum MkBV(string v, uint size)
3124 {
3125 using var sort = MkBitVecSort(size);
3126 return (BitVecNum)MkNumeral(v, sort);
3127 }
3128
3134 public BitVecNum MkBV(int v, uint size)
3135 {
3136 using var sort = MkBitVecSort(size);
3137 return (BitVecNum)MkNumeral(v, sort);
3138 }
3139
3145 public BitVecNum MkBV(uint v, uint size)
3146 {
3147 using var sort = MkBitVecSort(size);
3148 return (BitVecNum)MkNumeral(v, sort);
3149 }
3150
3156 public BitVecNum MkBV(long v, uint size)
3157 {
3158 using var sort = MkBitVecSort(size);
3159 return (BitVecNum)MkNumeral(v, sort);
3160 }
3161
3167 public BitVecNum MkBV(ulong v, uint size)
3168 {
3169 using var sort = MkBitVecSort(size);
3170 return (BitVecNum)MkNumeral(v, sort);
3171 }
3172
3177 public BitVecNum MkBV(bool[] bits)
3178 {
3179 byte[] _bits = new byte[bits.Length];
3180 for (int i = 0; i < bits.Length; ++i) _bits[i] = (byte)(bits[i] ? 1 : 0);
3181 return (BitVecNum)Expr.Create(this, Native.Z3_mk_bv_numeral(nCtx, (uint)bits.Length, _bits));
3182 }
3183
3184
3185 #endregion
3186
3187 #endregion // Numerals
3188
3189 #region Quantifiers
3214 public Quantifier MkForall(Sort[] sorts, Symbol[] names, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
3215 {
3216 Debug.Assert(sorts != null);
3217 Debug.Assert(names != null);
3218 Debug.Assert(body != null);
3219 Debug.Assert(sorts.Length == names.Length);
3220 Debug.Assert(sorts.All(s => s != null));
3221 Debug.Assert(names.All(n => n != null));
3222 Debug.Assert(patterns == null || patterns.All(p => p != null));
3223 Debug.Assert(noPatterns == null || noPatterns.All(np => np != null));
3224
3225
3226 return new Quantifier(this, true, sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3227 }
3228
3229
3238 public Quantifier MkForall(Expr[] boundConstants, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
3239 {
3240 Debug.Assert(body != null);
3241 Debug.Assert(boundConstants == null || boundConstants.All(b => b != null));
3242 Debug.Assert(patterns == null || patterns.All(p => p != null));
3243 Debug.Assert(noPatterns == null || noPatterns.All(np => np != null));
3244
3245
3246 return new Quantifier(this, true, boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3247 }
3248
3256 public Quantifier MkExists(Sort[] sorts, Symbol[] names, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
3257 {
3258 Debug.Assert(sorts != null);
3259 Debug.Assert(names != null);
3260 Debug.Assert(body != null);
3261 Debug.Assert(sorts.Length == names.Length);
3262 Debug.Assert(sorts.All(s => s != null));
3263 Debug.Assert(names.All(n => n != null));
3264 Debug.Assert(patterns == null || patterns.All(p => p != null));
3265 Debug.Assert(noPatterns == null || noPatterns.All(np => np != null));
3266
3267 return new Quantifier(this, false, sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3268 }
3269
3278 public Quantifier MkExists(Expr[] boundConstants, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
3279 {
3280 Debug.Assert(body != null);
3281 Debug.Assert(boundConstants == null || boundConstants.All(n => n != null));
3282 Debug.Assert(patterns == null || patterns.All(p => p != null));
3283 Debug.Assert(noPatterns == null || noPatterns.All(np => np != null));
3284
3285 return new Quantifier(this, false, boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3286 }
3287
3288
3293 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)
3294 {
3295 Debug.Assert(body != null);
3296 Debug.Assert(names != null);
3297 Debug.Assert(sorts != null);
3298 Debug.Assert(sorts.Length == names.Length);
3299 Debug.Assert(sorts.All(s => s != null));
3300 Debug.Assert(names.All(n => n != null));
3301 Debug.Assert(patterns == null || patterns.All(p => p != null));
3302 Debug.Assert(noPatterns == null || noPatterns.All(np => np != null));
3303
3304
3305 if (universal)
3306 return MkForall(sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3307 else
3308 return MkExists(sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
3309 }
3310
3311
3316 public Quantifier MkQuantifier(bool universal, Expr[] boundConstants, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
3317 {
3318 Debug.Assert(body != null);
3319 Debug.Assert(boundConstants == null || boundConstants.All(n => n != null));
3320 Debug.Assert(patterns == null || patterns.All(p => p != null));
3321 Debug.Assert(noPatterns == null || noPatterns.All(np => np != null));
3322
3323
3324 if (universal)
3325 return MkForall(boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3326 else
3327 return MkExists(boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
3328 }
3329
3348 public Lambda MkLambda(Sort[] sorts, Symbol[] names, Expr body)
3349 {
3350 Debug.Assert(sorts != null);
3351 Debug.Assert(names != null);
3352 Debug.Assert(body != null);
3353 Debug.Assert(sorts.Length == names.Length);
3354 Debug.Assert(sorts.All(s => s != null));
3355 Debug.Assert(names.All(n => n != null));
3356 return new Lambda(this, sorts, names, body);
3357 }
3358
3367 public Lambda MkLambda(Expr[] boundConstants, Expr body)
3368 {
3369 Debug.Assert(body != null);
3370 Debug.Assert(boundConstants != null && boundConstants.All(b => b != null));
3371 return new Lambda(this, boundConstants, body);
3372 }
3373
3374
3375 #endregion
3376
3377 #endregion // Expr
3378
3379 #region Options
3397 {
3398 set { Native.Z3_set_ast_print_mode(nCtx, (uint)value); }
3399 }
3400 #endregion
3401
3402 #region SMT Files & Strings
3403
3408 public BoolExpr[] ParseSMTLIB2String(string str, Symbol[] sortNames = null, Sort[] sorts = null, Symbol[] declNames = null, FuncDecl[] decls = null)
3409 {
3410
3411 uint csn = Symbol.ArrayLength(sortNames);
3412 uint cs = Sort.ArrayLength(sorts);
3413 uint cdn = Symbol.ArrayLength(declNames);
3414 uint cd = AST.ArrayLength(decls);
3415 if (csn != cs || cdn != cd)
3416 throw new Z3Exception("Argument size mismatch");
3417 using ASTVector assertions = new ASTVector(this, Native.Z3_parse_smtlib2_string(nCtx, str,
3418 AST.ArrayLength(sorts), Symbol.ArrayToNative(sortNames), AST.ArrayToNative(sorts),
3419 AST.ArrayLength(decls), Symbol.ArrayToNative(declNames), AST.ArrayToNative(decls)));
3420 return assertions.ToBoolExprArray();
3421 }
3422
3427 public BoolExpr[] ParseSMTLIB2File(string fileName, Symbol[] sortNames = null, Sort[] sorts = null, Symbol[] declNames = null, FuncDecl[] decls = null)
3428 {
3429
3430 uint csn = Symbol.ArrayLength(sortNames);
3431 uint cs = Sort.ArrayLength(sorts);
3432 uint cdn = Symbol.ArrayLength(declNames);
3433 uint cd = AST.ArrayLength(decls);
3434 if (csn != cs || cdn != cd)
3435 throw new Z3Exception("Argument size mismatch");
3436 using ASTVector assertions = new ASTVector(this, Native.Z3_parse_smtlib2_file(nCtx, fileName,
3437 AST.ArrayLength(sorts), Symbol.ArrayToNative(sortNames), AST.ArrayToNative(sorts),
3438 AST.ArrayLength(decls), Symbol.ArrayToNative(declNames), AST.ArrayToNative(decls)));
3439 return assertions.ToBoolExprArray();
3440 }
3441 #endregion
3442
3443 #region Goals
3454 public Goal MkGoal(bool models = true, bool unsatCores = false, bool proofs = false)
3455 {
3456
3457 return new Goal(this, models, unsatCores, proofs);
3458 }
3459 #endregion
3460
3461 #region ParameterSets
3466 {
3467
3468 return new Params(this);
3469 }
3470 #endregion
3471
3472 #region Tactics
3476 public uint NumTactics
3477 {
3478 get { return Native.Z3_get_num_tactics(nCtx); }
3479 }
3480
3484 public string[] TacticNames
3485 {
3486 get
3487 {
3488
3489 uint n = NumTactics;
3490 string[] res = new string[n];
3491 for (uint i = 0; i < n; i++)
3492 res[i] = Native.Z3_get_tactic_name(nCtx, i);
3493 return res;
3494 }
3495 }
3496
3500 public string TacticDescription(string name)
3501 {
3502
3503 return Native.Z3_tactic_get_descr(nCtx, name);
3504 }
3505
3509 public Tactic MkTactic(string name)
3510 {
3511
3512 return new Tactic(this, name);
3513 }
3514
3519 public Tactic AndThen(Tactic t1, Tactic t2, params Tactic[] ts)
3520 {
3521 Debug.Assert(t1 != null);
3522 Debug.Assert(t2 != null);
3523 // Debug.Assert(ts == null || Contract.ForAll(0, ts.Length, j => ts[j] != null));
3524
3525
3526 CheckContextMatch(t1);
3527 CheckContextMatch(t2);
3528 CheckContextMatch<Tactic>(ts);
3529
3530 IntPtr last = IntPtr.Zero;
3531 if (ts != null && ts.Length > 0)
3532 {
3533 last = ts[ts.Length - 1].NativeObject;
3534 for (int i = ts.Length - 2; i >= 0; i--)
3535 last = Native.Z3_tactic_and_then(nCtx, ts[i].NativeObject, last);
3536 }
3537 if (last != IntPtr.Zero)
3538 {
3539 last = Native.Z3_tactic_and_then(nCtx, t2.NativeObject, last);
3540 return new Tactic(this, Native.Z3_tactic_and_then(nCtx, t1.NativeObject, last));
3541 }
3542 else
3543 return new Tactic(this, Native.Z3_tactic_and_then(nCtx, t1.NativeObject, t2.NativeObject));
3544 }
3545
3553 public Tactic Then(Tactic t1, Tactic t2, params Tactic[] ts)
3554 {
3555 Debug.Assert(t1 != null);
3556 Debug.Assert(t2 != null);
3557 // Debug.Assert(ts == null || Contract.ForAll(0, ts.Length, j => ts[j] != null));
3558
3559 return AndThen(t1, t2, ts);
3560 }
3561
3567 {
3568 Debug.Assert(t1 != null);
3569 Debug.Assert(t2 != null);
3570
3571 CheckContextMatch(t1);
3572 CheckContextMatch(t2);
3573 return new Tactic(this, Native.Z3_tactic_or_else(nCtx, t1.NativeObject, t2.NativeObject));
3574 }
3575
3582 public Tactic TryFor(Tactic t, uint ms)
3583 {
3584 Debug.Assert(t != null);
3585
3586 CheckContextMatch(t);
3587 return new Tactic(this, Native.Z3_tactic_try_for(nCtx, t.NativeObject, ms));
3588 }
3589
3598 {
3599 Debug.Assert(p != null);
3600 Debug.Assert(t != null);
3601
3602 CheckContextMatch(t);
3603 CheckContextMatch(p);
3604 return new Tactic(this, Native.Z3_tactic_when(nCtx, p.NativeObject, t.NativeObject));
3605 }
3606
3611 public Tactic Cond(Probe p, Tactic t1, Tactic t2)
3612 {
3613 Debug.Assert(p != null);
3614 Debug.Assert(t1 != null);
3615 Debug.Assert(t2 != null);
3616
3617 CheckContextMatch(p);
3618 CheckContextMatch(t1);
3619 CheckContextMatch(t2);
3620 return new Tactic(this, Native.Z3_tactic_cond(nCtx, p.NativeObject, t1.NativeObject, t2.NativeObject));
3621 }
3622
3627 public Tactic Repeat(Tactic t, uint max = uint.MaxValue)
3628 {
3629 Debug.Assert(t != null);
3630
3631 CheckContextMatch(t);
3632 return new Tactic(this, Native.Z3_tactic_repeat(nCtx, t.NativeObject, max));
3633 }
3634
3638 public Tactic Skip()
3639 {
3640
3641 return new Tactic(this, Native.Z3_tactic_skip(nCtx));
3642 }
3643
3647 public Tactic Fail()
3648 {
3649
3650 return new Tactic(this, Native.Z3_tactic_fail(nCtx));
3651 }
3652
3657 {
3658 Debug.Assert(p != null);
3659
3660 CheckContextMatch(p);
3661 return new Tactic(this, Native.Z3_tactic_fail_if(nCtx, p.NativeObject));
3662 }
3663
3669 {
3670
3671 return new Tactic(this, Native.Z3_tactic_fail_if_not_decided(nCtx));
3672 }
3673
3678 {
3679 Debug.Assert(t != null);
3680 Debug.Assert(p != null);
3681
3682 CheckContextMatch(t);
3683 CheckContextMatch(p);
3684 return new Tactic(this, Native.Z3_tactic_using_params(nCtx, t.NativeObject, p.NativeObject));
3685 }
3686
3692 {
3693 Debug.Assert(t != null);
3694 Debug.Assert(p != null);
3695
3696 return UsingParams(t, p);
3697 }
3698
3702 public Tactic ParOr(params Tactic[] t)
3703 {
3704 Debug.Assert(t == null || t.All(tactic => tactic != null));
3705
3706 CheckContextMatch<Tactic>(t);
3707 return new Tactic(this, Native.Z3_tactic_par_or(nCtx, Tactic.ArrayLength(t), Tactic.ArrayToNative(t)));
3708 }
3709
3715 {
3716 Debug.Assert(t1 != null);
3717 Debug.Assert(t2 != null);
3718
3719 CheckContextMatch(t1);
3720 CheckContextMatch(t2);
3721 return new Tactic(this, Native.Z3_tactic_par_and_then(nCtx, t1.NativeObject, t2.NativeObject));
3722 }
3723
3728 public void Interrupt()
3729 {
3730 Native.Z3_interrupt(nCtx);
3731 }
3732 #endregion
3733
3734 #region Simplifiers
3738 public uint NumSimplifiers
3739 {
3740 get { return Native.Z3_get_num_simplifiers(nCtx); }
3741 }
3742
3746 public string[] SimplifierNames
3747 {
3748 get
3749 {
3750
3751 uint n = NumSimplifiers;
3752 string[] res = new string[n];
3753 for (uint i = 0; i < n; i++)
3754 res[i] = Native.Z3_get_simplifier_name(nCtx, i);
3755 return res;
3756 }
3757 }
3758
3762 public string SimplifierDescription(string name)
3763 {
3764
3765 return Native.Z3_simplifier_get_descr(nCtx, name);
3766 }
3767
3771 public Simplifier MkSimplifier(string name)
3772 {
3773
3774 return new Simplifier(this, name);
3775 }
3776
3782 {
3783 Debug.Assert(t1 != null);
3784 Debug.Assert(t2 != null);
3785 // Debug.Assert(ts == null || Contract.ForAll(0, ts.Length, j => ts[j] != null));
3786
3787
3788 CheckContextMatch(t1);
3789 CheckContextMatch(t2);
3790 CheckContextMatch<Simplifier>(ts);
3791
3792 IntPtr last = IntPtr.Zero;
3793 if (ts != null && ts.Length > 0)
3794 {
3795 last = ts[ts.Length - 1].NativeObject;
3796 for (int i = ts.Length - 2; i >= 0; i--)
3797 last = Native.Z3_simplifier_and_then(nCtx, ts[i].NativeObject, last);
3798 }
3799 if (last != IntPtr.Zero)
3800 {
3801 last = Native.Z3_simplifier_and_then(nCtx, t2.NativeObject, last);
3802 return new Simplifier(this, Native.Z3_simplifier_and_then(nCtx, t1.NativeObject, last));
3803 }
3804 else
3805 return new Simplifier(this, Native.Z3_simplifier_and_then(nCtx, t1.NativeObject, t2.NativeObject));
3806 }
3807
3815 public Simplifier Then(Simplifier t1, Simplifier t2, params Simplifier[] ts)
3816 {
3817 Debug.Assert(t1 != null);
3818 Debug.Assert(t2 != null);
3819 // Debug.Assert(ts == null || Contract.ForAll(0, ts.Length, j => ts[j] != null));
3820
3821 return AndThen(t1, t2, ts);
3822 }
3823
3828 {
3829 Debug.Assert(t != null);
3830 Debug.Assert(p != null);
3831
3832 CheckContextMatch(t);
3833 CheckContextMatch(p);
3834 return new Simplifier(this, Native.Z3_simplifier_using_params(nCtx, t.NativeObject, p.NativeObject));
3835 }
3836 #endregion
3837
3838 #region Probes
3842 public uint NumProbes
3843 {
3844 get { return Native.Z3_get_num_probes(nCtx); }
3845 }
3846
3850 public string[] ProbeNames
3851 {
3852 get
3853 {
3854
3855 uint n = NumProbes;
3856 string[] res = new string[n];
3857 for (uint i = 0; i < n; i++)
3858 res[i] = Native.Z3_get_probe_name(nCtx, i);
3859 return res;
3860 }
3861 }
3862
3866 public string ProbeDescription(string name)
3867 {
3868
3869 return Native.Z3_probe_get_descr(nCtx, name);
3870 }
3871
3875 public Probe MkProbe(string name)
3876 {
3877
3878 return new Probe(this, name);
3879 }
3880
3884 public Probe ConstProbe(double val)
3885 {
3886
3887 return new Probe(this, Native.Z3_probe_const(nCtx, val));
3888 }
3889
3894 public Probe Lt(Probe p1, Probe p2)
3895 {
3896 Debug.Assert(p1 != null);
3897 Debug.Assert(p2 != null);
3898
3899 CheckContextMatch(p1);
3900 CheckContextMatch(p2);
3901 return new Probe(this, Native.Z3_probe_lt(nCtx, p1.NativeObject, p2.NativeObject));
3902 }
3903
3908 public Probe Gt(Probe p1, Probe p2)
3909 {
3910 Debug.Assert(p1 != null);
3911 Debug.Assert(p2 != null);
3912
3913 CheckContextMatch(p1);
3914 CheckContextMatch(p2);
3915 return new Probe(this, Native.Z3_probe_gt(nCtx, p1.NativeObject, p2.NativeObject));
3916 }
3917
3922 public Probe Le(Probe p1, Probe p2)
3923 {
3924 Debug.Assert(p1 != null);
3925 Debug.Assert(p2 != null);
3926
3927 CheckContextMatch(p1);
3928 CheckContextMatch(p2);
3929 return new Probe(this, Native.Z3_probe_le(nCtx, p1.NativeObject, p2.NativeObject));
3930 }
3931
3936 public Probe Ge(Probe p1, Probe p2)
3937 {
3938 Debug.Assert(p1 != null);
3939 Debug.Assert(p2 != null);
3940
3941 CheckContextMatch(p1);
3942 CheckContextMatch(p2);
3943 return new Probe(this, Native.Z3_probe_ge(nCtx, p1.NativeObject, p2.NativeObject));
3944 }
3945
3950 public Probe Eq(Probe p1, Probe p2)
3951 {
3952 Debug.Assert(p1 != null);
3953 Debug.Assert(p2 != null);
3954
3955 CheckContextMatch(p1);
3956 CheckContextMatch(p2);
3957 return new Probe(this, Native.Z3_probe_eq(nCtx, p1.NativeObject, p2.NativeObject));
3958 }
3959
3964 public Probe And(Probe p1, Probe p2)
3965 {
3966 Debug.Assert(p1 != null);
3967 Debug.Assert(p2 != null);
3968
3969 CheckContextMatch(p1);
3970 CheckContextMatch(p2);
3971 return new Probe(this, Native.Z3_probe_and(nCtx, p1.NativeObject, p2.NativeObject));
3972 }
3973
3978 public Probe Or(Probe p1, Probe p2)
3979 {
3980 Debug.Assert(p1 != null);
3981 Debug.Assert(p2 != null);
3982
3983 CheckContextMatch(p1);
3984 CheckContextMatch(p2);
3985 return new Probe(this, Native.Z3_probe_or(nCtx, p1.NativeObject, p2.NativeObject));
3986 }
3987
3992 public Probe Not(Probe p)
3993 {
3994 Debug.Assert(p != null);
3995
3996 CheckContextMatch(p);
3997 return new Probe(this, Native.Z3_probe_not(nCtx, p.NativeObject));
3998 }
3999 #endregion
4000
4001 #region Solvers
4010 public Solver MkSolver(Symbol logic = null)
4011 {
4012
4013 if (logic == null)
4014 return new Solver(this, Native.Z3_mk_solver(nCtx));
4015 else
4016 return new Solver(this, Native.Z3_mk_solver_for_logic(nCtx, logic.NativeObject));
4017 }
4018
4023 public Solver MkSolver(string logic)
4024 {
4025 using var symbol = MkSymbol(logic);
4026 return MkSolver(symbol);
4027 }
4028
4033 {
4034
4035 return new Solver(this, Native.Z3_mk_simple_solver(nCtx));
4036 }
4037
4042 {
4043 Debug.Assert(t != null);
4044 Debug.Assert(s != null);
4045 return new Solver(this, Native.Z3_solver_add_simplifier(nCtx, s.NativeObject, t.NativeObject));
4046 }
4047
4056 {
4057 Debug.Assert(t != null);
4058
4059 return new Solver(this, Native.Z3_mk_solver_from_tactic(nCtx, t.NativeObject));
4060 }
4061
4062
4063 #endregion
4064
4065 #region Fixedpoints
4070 {
4071
4072 return new Fixedpoint(this);
4073 }
4074 #endregion
4075
4076 #region Optimization
4081 {
4082
4083 return new Optimize(this);
4084 }
4085 #endregion
4086
4087 #region Floating-Point Arithmetic
4088
4089 #region Rounding Modes
4090 #region RoundingMode Sort
4095 {
4096 return new FPRMSort(this);
4097 }
4098 #endregion
4099
4100 #region Numerals
4105 {
4106 return new FPRMExpr(this, Native.Z3_mk_fpa_round_nearest_ties_to_even(nCtx));
4107 }
4108
4113 {
4114 return new FPRMNum(this, Native.Z3_mk_fpa_rne(nCtx));
4115 }
4116
4121 {
4122 return new FPRMNum(this, Native.Z3_mk_fpa_round_nearest_ties_to_away(nCtx));
4123 }
4124
4129 {
4130 return new FPRMNum(this, Native.Z3_mk_fpa_rna(nCtx));
4131 }
4132
4137 {
4138 return new FPRMNum(this, Native.Z3_mk_fpa_round_toward_positive(nCtx));
4139 }
4140
4145 {
4146 return new FPRMNum(this, Native.Z3_mk_fpa_rtp(nCtx));
4147 }
4148
4153 {
4154 return new FPRMNum(this, Native.Z3_mk_fpa_round_toward_negative(nCtx));
4155 }
4156
4161 {
4162 return new FPRMNum(this, Native.Z3_mk_fpa_rtn(nCtx));
4163 }
4164
4169 {
4170 return new FPRMNum(this, Native.Z3_mk_fpa_round_toward_zero(nCtx));
4171 }
4172
4177 {
4178 return new FPRMNum(this, Native.Z3_mk_fpa_rtz(nCtx));
4179 }
4180 #endregion
4181 #endregion
4182
4183 #region FloatingPoint Sorts
4189 public FPSort MkFPSort(uint ebits, uint sbits)
4190 {
4191 return new FPSort(this, ebits, sbits);
4192 }
4193
4198 {
4199 return new FPSort(this, Native.Z3_mk_fpa_sort_half(nCtx));
4200 }
4201
4206 {
4207 return new FPSort(this, Native.Z3_mk_fpa_sort_16(nCtx));
4208 }
4209
4214 {
4215 return new FPSort(this, Native.Z3_mk_fpa_sort_single(nCtx));
4216 }
4217
4222 {
4223 return new FPSort(this, Native.Z3_mk_fpa_sort_32(nCtx));
4224 }
4225
4230 {
4231 return new FPSort(this, Native.Z3_mk_fpa_sort_double(nCtx));
4232 }
4233
4238 {
4239 return new FPSort(this, Native.Z3_mk_fpa_sort_64(nCtx));
4240 }
4241
4246 {
4247 return new FPSort(this, Native.Z3_mk_fpa_sort_quadruple(nCtx));
4248 }
4249
4254 {
4255 return new FPSort(this, Native.Z3_mk_fpa_sort_128(nCtx));
4256 }
4257 #endregion
4258
4259 #region Numerals
4265 {
4266 return new FPNum(this, Native.Z3_mk_fpa_nan(nCtx, s.NativeObject));
4267 }
4268
4274 public FPNum MkFPInf(FPSort s, bool negative)
4275 {
4276 return new FPNum(this, Native.Z3_mk_fpa_inf(nCtx, s.NativeObject, (byte)(negative ? 1 : 0)));
4277 }
4278
4284 public FPNum MkFPZero(FPSort s, bool negative)
4285 {
4286 return new FPNum(this, Native.Z3_mk_fpa_zero(nCtx, s.NativeObject, (byte)(negative ? 1 : 0)));
4287 }
4288
4294 public FPNum MkFPNumeral(float v, FPSort s)
4295 {
4296 return new FPNum(this, Native.Z3_mk_fpa_numeral_float(nCtx, v, s.NativeObject));
4297 }
4298
4304 public FPNum MkFPNumeral(double v, FPSort s)
4305 {
4306 return new FPNum(this, Native.Z3_mk_fpa_numeral_double(nCtx, v, s.NativeObject));
4307 }
4308
4314 public FPNum MkFPNumeral(int v, FPSort s)
4315 {
4316 return new FPNum(this, Native.Z3_mk_fpa_numeral_int(nCtx, v, s.NativeObject));
4317 }
4318
4326 public FPNum MkFPNumeral(bool sgn, uint sig, int exp, FPSort s)
4327 {
4328 return new FPNum(this, Native.Z3_mk_fpa_numeral_int_uint(nCtx, (byte)(sgn ? 1 : 0), exp, sig, s.NativeObject));
4329 }
4330
4338 public FPNum MkFPNumeral(bool sgn, Int64 exp, UInt64 sig, FPSort s)
4339 {
4340 return new FPNum(this, Native.Z3_mk_fpa_numeral_int64_uint64(nCtx, (byte)(sgn ? 1 : 0), exp, sig, s.NativeObject));
4341 }
4342
4348 public FPNum MkFP(float v, FPSort s)
4349 {
4350 return MkFPNumeral(v, s);
4351 }
4352
4358 public FPNum MkFP(double v, FPSort s)
4359 {
4360 return MkFPNumeral(v, s);
4361 }
4362
4368 public FPNum MkFP(int v, FPSort s)
4369 {
4370 return MkFPNumeral(v, s);
4371 }
4372
4380 public FPNum MkFP(bool sgn, int exp, uint sig, FPSort s)
4381 {
4382 return MkFPNumeral(sgn, exp, sig, s);
4383 }
4384
4392 public FPNum MkFP(bool sgn, Int64 exp, UInt64 sig, FPSort s)
4393 {
4394 return MkFPNumeral(sgn, exp, sig, s);
4395 }
4396
4397 #endregion
4398
4399 #region Operators
4405 {
4406 return new FPExpr(this, Native.Z3_mk_fpa_abs(this.nCtx, t.NativeObject));
4407 }
4408
4414 {
4415 return new FPExpr(this, Native.Z3_mk_fpa_neg(this.nCtx, t.NativeObject));
4416 }
4417
4425 {
4426 return new FPExpr(this, Native.Z3_mk_fpa_add(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4427 }
4428
4436 {
4437 return new FPExpr(this, Native.Z3_mk_fpa_sub(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4438 }
4439
4447 {
4448 return new FPExpr(this, Native.Z3_mk_fpa_mul(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4449 }
4450
4458 {
4459 return new FPExpr(this, Native.Z3_mk_fpa_div(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
4460 }
4461
4473 {
4474 return new FPExpr(this, Native.Z3_mk_fpa_fma(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject, t3.NativeObject));
4475 }
4476
4483 {
4484 return new FPExpr(this, Native.Z3_mk_fpa_sqrt(this.nCtx, rm.NativeObject, t.NativeObject));
4485 }
4486
4493 {
4494 return new FPExpr(this, Native.Z3_mk_fpa_rem(this.nCtx, t1.NativeObject, t2.NativeObject));
4495 }
4496
4504 {
4505 return new FPExpr(this, Native.Z3_mk_fpa_round_to_integral(this.nCtx, rm.NativeObject, t.NativeObject));
4506 }
4507
4514 {
4515 return new FPExpr(this, Native.Z3_mk_fpa_min(this.nCtx, t1.NativeObject, t2.NativeObject));
4516 }
4517
4524 {
4525 return new FPExpr(this, Native.Z3_mk_fpa_max(this.nCtx, t1.NativeObject, t2.NativeObject));
4526 }
4527
4534 {
4535 return new BoolExpr(this, Native.Z3_mk_fpa_leq(this.nCtx, t1.NativeObject, t2.NativeObject));
4536 }
4537
4544 {
4545 return new BoolExpr(this, Native.Z3_mk_fpa_lt(this.nCtx, t1.NativeObject, t2.NativeObject));
4546 }
4547
4554 {
4555 return new BoolExpr(this, Native.Z3_mk_fpa_geq(this.nCtx, t1.NativeObject, t2.NativeObject));
4556 }
4557
4564 {
4565 return new BoolExpr(this, Native.Z3_mk_fpa_gt(this.nCtx, t1.NativeObject, t2.NativeObject));
4566 }
4567
4577 {
4578 return new BoolExpr(this, Native.Z3_mk_fpa_eq(this.nCtx, t1.NativeObject, t2.NativeObject));
4579 }
4580
4586 {
4587 return new BoolExpr(this, Native.Z3_mk_fpa_is_normal(this.nCtx, t.NativeObject));
4588 }
4589
4595 {
4596 return new BoolExpr(this, Native.Z3_mk_fpa_is_subnormal(this.nCtx, t.NativeObject));
4597 }
4598
4604 {
4605 return new BoolExpr(this, Native.Z3_mk_fpa_is_zero(this.nCtx, t.NativeObject));
4606 }
4607
4613 {
4614 return new BoolExpr(this, Native.Z3_mk_fpa_is_infinite(this.nCtx, t.NativeObject));
4615 }
4616
4622 {
4623 return new BoolExpr(this, Native.Z3_mk_fpa_is_nan(this.nCtx, t.NativeObject));
4624 }
4625
4631 {
4632 return new BoolExpr(this, Native.Z3_mk_fpa_is_negative(this.nCtx, t.NativeObject));
4633 }
4634
4640 {
4641 return new BoolExpr(this, Native.Z3_mk_fpa_is_positive(this.nCtx, t.NativeObject));
4642 }
4643 #endregion
4644
4645 #region Conversions to FloatingPoint terms
4660 {
4661 return new FPExpr(this, Native.Z3_mk_fpa_fp(this.nCtx, sgn.NativeObject, sig.NativeObject, exp.NativeObject));
4662 }
4663
4676 {
4677 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_bv(this.nCtx, bv.NativeObject, s.NativeObject));
4678 }
4679
4692 {
4693 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_float(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
4694 }
4695
4708 {
4709 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_real(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
4710 }
4711
4725 public FPExpr MkFPToFP(FPRMExpr rm, BitVecExpr t, FPSort s, bool signed)
4726 {
4727 if (signed)
4728 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_signed(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
4729 else
4730 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_unsigned(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
4731 }
4732
4744 {
4745 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_float(this.nCtx, s.NativeObject, rm.NativeObject, t.NativeObject));
4746 }
4747 #endregion
4748
4749 #region Conversions from FloatingPoint terms
4762 public BitVecExpr MkFPToBV(FPRMExpr rm, FPExpr t, uint sz, bool sign)
4763 {
4764 if (sign)
4765 return new BitVecExpr(this, Native.Z3_mk_fpa_to_sbv(this.nCtx, rm.NativeObject, t.NativeObject, sz));
4766 else
4767 return new BitVecExpr(this, Native.Z3_mk_fpa_to_ubv(this.nCtx, rm.NativeObject, t.NativeObject, sz));
4768 }
4769
4780 {
4781 return new RealExpr(this, Native.Z3_mk_fpa_to_real(this.nCtx, t.NativeObject));
4782 }
4783 #endregion
4784
4785 #region Z3-specific extensions
4797 {
4798 return new BitVecExpr(this, Native.Z3_mk_fpa_to_ieee_bv(this.nCtx, t.NativeObject));
4799 }
4800
4814 {
4815 return new BitVecExpr(this, Native.Z3_mk_fpa_to_fp_int_real(this.nCtx, rm.NativeObject, exp.NativeObject, sig.NativeObject, s.NativeObject));
4816 }
4817 #endregion
4818 #endregion // Floating-point Arithmetic
4819
4820 #region Miscellaneous
4831 public AST WrapAST(IntPtr nativeObject)
4832 {
4833 return AST.Create(this, nativeObject);
4834 }
4835
4847 public IntPtr UnwrapAST(AST a)
4848 {
4849 return a.NativeObject;
4850 }
4851
4855 public string SimplifyHelp()
4856 {
4857
4858 return Native.Z3_simplify_get_help(nCtx);
4859 }
4860
4865 {
4866 get { return new ParamDescrs(this, Native.Z3_simplify_get_param_descrs(nCtx)); }
4867 }
4868 #endregion
4869
4870 #region Error Handling
4878 //public delegate void ErrorHandler(Context ctx, Z3_error_code errorCode, string errorString);
4879
4883 //public event ErrorHandler OnError = null;
4884 #endregion
4885
4886 #region Parameters
4896 public void UpdateParamValue(string id, string value)
4897 {
4898 Native.Z3_update_param_value(nCtx, id, value);
4899 }
4900
4901 #endregion
4902
4903 #region Internal
4904 internal IntPtr m_ctx = IntPtr.Zero;
4905 internal Native.Z3_error_handler m_n_err_handler = null;
4906 internal static Object creation_lock = new Object();
4907 internal IntPtr nCtx { get { return m_ctx; } }
4908
4909 internal void NativeErrorHandler(IntPtr ctx, Z3_error_code errorCode)
4910 {
4911 // Do-nothing error handler. The wrappers in Z3.Native will throw exceptions upon errors.
4912 }
4913
4914 internal void InitContext()
4915 {
4916 PrintMode = Z3_ast_print_mode.Z3_PRINT_SMTLIB2_COMPLIANT;
4917 m_n_err_handler = new Native.Z3_error_handler(NativeErrorHandler); // keep reference so it doesn't get collected.
4918 Native.Z3_set_error_handler(m_ctx, m_n_err_handler);
4919 }
4920
4921 internal void CheckContextMatch(Z3Object other)
4922 {
4923 Debug.Assert(other != null);
4924
4925 if (!ReferenceEquals(this, other.Context))
4926 throw new Z3Exception("Context mismatch");
4927 }
4928
4929 internal void CheckContextMatch(Z3Object other1, Z3Object other2)
4930 {
4931 Debug.Assert(other1 != null);
4932 Debug.Assert(other2 != null);
4933 CheckContextMatch(other1);
4934 CheckContextMatch(other2);
4935 }
4936
4937 internal void CheckContextMatch(Z3Object other1, Z3Object other2, Z3Object other3)
4938 {
4939 Debug.Assert(other1 != null);
4940 Debug.Assert(other2 != null);
4941 Debug.Assert(other3 != null);
4942 CheckContextMatch(other1);
4943 CheckContextMatch(other2);
4944 CheckContextMatch(other3);
4945 }
4946
4947 internal void CheckContextMatch(Z3Object[] arr)
4948 {
4949 Debug.Assert(arr == null || arr.All(a => a != null));
4950
4951 if (arr != null)
4952 {
4953 foreach (Z3Object a in arr)
4954 {
4955 Debug.Assert(a != null); // It was an assume, now we added the precondition, and we made it into an assert
4956 CheckContextMatch(a);
4957 }
4958 }
4959 }
4960
4961 internal void CheckContextMatch<T>(IEnumerable<T> arr) where T : Z3Object
4962 {
4963 Debug.Assert(arr == null || arr.All(a => a != null));
4964
4965 if (arr != null)
4966 {
4967 foreach (Z3Object a in arr)
4968 {
4969 Debug.Assert(a != null); // It was an assume, now we added the precondition, and we made it into an assert
4970 CheckContextMatch(a);
4971 }
4972 }
4973 }
4974
4975 private void ObjectInvariant()
4976 {
4977 // none
4978 }
4979
4983 ~Context()
4984 {
4985 // Console.WriteLine("Context Finalizer from " + System.Threading.Thread.CurrentThread.ManagedThreadId);
4986 Dispose();
4987 }
4988
4992 public void Dispose()
4993 {
4994 // Console.WriteLine("Context Dispose from " + System.Threading.Thread.CurrentThread.ManagedThreadId);
4995
4996 if (m_boolSort != null) m_boolSort.Dispose();
4997 if (m_intSort != null) m_intSort.Dispose();
4998 if (m_realSort != null) m_realSort.Dispose();
4999 if (m_stringSort != null) m_stringSort.Dispose();
5000 if (m_charSort != null) m_charSort.Dispose();
5001 m_boolSort = null;
5002 m_intSort = null;
5003 m_realSort = null;
5004 m_stringSort = null;
5005 m_charSort = null;
5006 if (m_ctx != IntPtr.Zero)
5007 {
5008 IntPtr ctx = m_ctx;
5009 lock (this)
5010 {
5011 m_n_err_handler = null;
5012 m_ctx = IntPtr.Zero;
5013 }
5014 if (!is_external)
5015 Native.Z3_del_context(ctx);
5016 }
5017
5018 GC.SuppressFinalize(this);
5019 }
5020
5021
5022 #endregion
5023 }
5024}
The abstract syntax tree (AST) class.
Definition AST.cs:31
Vectors of ASTs.
Definition ASTVector.cs:29
Arithmetic expressions (int/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
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:4707
BitVecExpr MkBVNAND(BitVecExpr t1, BitVecExpr t2)
Bitwise NAND.
Definition Context.cs:1402
FPNum MkFP(float v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
Definition Context.cs:4348
RealExpr MkInt2Real(IntExpr t)
Coerce an integer to a real.
Definition Context.cs:1284
FPSort MkFPSort16()
Create the half-precision (16-bit) FloatingPoint sort.
Definition Context.cs:4205
ArithExpr MkAdd(IEnumerable< ArithExpr > ts)
Create an expression representing t[0] + t[1] + ....
Definition Context.cs:1118
BoolExpr MkCharLe(Expr ch1, Expr ch2)
Create less than or equal to between two characters.
Definition Context.cs:2798
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:2950
ArrayExpr MkArrayConst(string name, Sort domain, Sort range)
Create an array constant.
Definition Context.cs:2120
BoolExpr MkAtLeast(IEnumerable< BoolExpr > args, uint k)
Create an at-least-k constraint.
Definition Context.cs:2860
BitVecExpr MkBVSHL(BitVecExpr t1, BitVecExpr t2)
Shift left.
Definition Context.cs:1815
Tactic Skip()
Create a tactic that just returns the given goal.
Definition Context.cs:3638
Constructor MkConstructor(string name, string recognizer, string[] fieldNames=null, Sort[] sorts=null, uint[] sortRefs=null)
Create a datatype constructor.
Definition Context.cs:432
Simplifier Then(Simplifier t1, Simplifier t2, params Simplifier[] ts)
Create a simplifier that applies t1 and then then t2 .
Definition Context.cs:3815
BoolSort BoolSort
Retrieves the Boolean sort of the context.
Definition Context.cs:147
BitVecNum MkBV(bool[] bits)
Create a bit-vector numeral.
Definition Context.cs:3177
FiniteDomainSort MkFiniteDomainSort(Symbol name, ulong size)
Create a new finite domain sort. The result is a sort
Definition Context.cs:381
BoolExpr MkStringLe(SeqExpr s1, SeqExpr s2)
Check if the string s1 is lexicographically less or equal to s2.
Definition Context.cs:2584
FPSort MkFPSort(uint ebits, uint sbits)
Create a FloatingPoint sort.
Definition Context.cs:4189
Tactic With(Tactic t, Params p)
Create a tactic that applies t using the given set of parameters p .
Definition Context.cs:3691
string[] TacticNames
The names of all supported tactics.
Definition Context.cs:3485
BoolExpr MkIsDigit(Expr ch)
Create a check if the character is a digit.
Definition Context.cs:2835
ArithExpr MkAdd(params ArithExpr[] ts)
Create an expression representing t[0] + t[1] + ....
Definition Context.cs:1106
FPExpr MkFPAdd(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point addition.
Definition Context.cs:4424
BitVecExpr MkBVRotateLeft(BitVecExpr t1, BitVecExpr t2)
Rotate Left.
Definition Context.cs:1908
RealExpr MkRealConst(string name)
Creates a real constant.
Definition Context.cs:865
RatNum MkReal(uint v)
Create a real numeral.
Definition Context.cs:3032
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:3908
BitVecExpr MkBVLSHR(BitVecExpr t1, BitVecExpr t2)
Logical shift right.
Definition Context.cs:1837
FPRMSort MkFPRoundingModeSort()
Create the floating-point RoundingMode sort.
Definition Context.cs:4094
RealExpr MkFPToReal(FPExpr t)
Conversion of a floating-point term into a real-numbered term.
Definition Context.cs:4779
TupleSort MkTupleSort(Symbol name, Symbol[] fieldNames, Sort[] fieldSorts)
Create a new tuple sort.
Definition Context.cs:302
Lambda MkLambda(Expr[] boundConstants, Expr body)
Create a lambda expression.
Definition Context.cs:3367
BitVecSort MkBitVecSort(uint size)
Create a new bit-vector sort.
Definition Context.cs:250
BoolExpr MkBVMulNoUnderflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise multiplication does not underflow.
Definition Context.cs:2092
ReExpr MkDiff(ReExpr a, ReExpr b)
Create a difference regular expression.
Definition Context.cs:2755
ArrayExpr MkFullSet(Sort domain)
Create the full set.
Definition Context.cs:2334
FPSort MkFPSortQuadruple()
Create the quadruple-precision (128-bit) FloatingPoint sort.
Definition Context.cs:4245
BoolExpr MkLe(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 <= t2
Definition Context.cs:1238
Probe ConstProbe(double val)
Create a probe that always evaluates to val .
Definition Context.cs:3884
Expr MkFreshConst(string prefix, Sort range)
Creates a fresh Constant of sort range and a name prefixed with prefix .
Definition Context.cs:794
BoolExpr MkOr(params BoolExpr[] ts)
Create an expression representing t[0] or t[1] or ....
Definition Context.cs:1081
IntExpr MkReal2Int(RealExpr t)
Coerce a real to an integer.
Definition Context.cs:1299
UninterpretedSort MkUninterpretedSort(Symbol s)
Create a new uninterpreted sort.
Definition Context.cs:213
FPSort MkFPSortHalf()
Create the half-precision (16-bit) FloatingPoint sort.
Definition Context.cs:4197
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:3238
ArrayExpr MkSetDifference(ArrayExpr arg1, ArrayExpr arg2)
Take the difference between two sets.
Definition Context.cs:2396
BoolExpr MkXor(BoolExpr t1, BoolExpr t2)
Create an expression representing t1 xor t2.
Definition Context.cs:1030
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:2965
Expr MkITE(BoolExpr t1, Expr t2, Expr t3)
Create an expression representing an if-then-else: ite(t1, t2, t3).
Definition Context.cs:989
IntNum MkInt(uint v)
Create an integer numeral.
Definition Context.cs:3088
IntExpr MkIntConst(Symbol name)
Creates an integer constant.
Definition Context.cs:835
AST WrapAST(IntPtr nativeObject)
Wraps an AST.
Definition Context.cs:4831
SeqExpr IntToString(Expr e)
Convert an integer expression to a string.
Definition Context.cs:2477
FPExpr MkFPMax(FPExpr t1, FPExpr t2)
Maximum of floating-point numbers.
Definition Context.cs:4523
ArithExpr MkUnaryMinus(ArithExpr t)
Create an expression representing -t.
Definition Context.cs:1160
BitVecExpr MkFPToIEEEBV(FPExpr t)
Conversion of a floating-point term into a bit-vector term in IEEE 754-2008 format.
Definition Context.cs:4796
Constructor MkConstructor(Symbol name, Symbol recognizer, Symbol[] fieldNames=null, Sort[] sorts=null, uint[] sortRefs=null)
Create a datatype constructor.
Definition Context.cs:415
IntSort IntSort
Retrieves the Integer sort of the context.
Definition Context.cs:158
BoolExpr MkSuffixOf(SeqExpr s1, SeqExpr s2)
Check for sequence suffix.
Definition Context.cs:2551
SeqExpr MkConcat(params SeqExpr[] t)
Concatenate sequences.
Definition Context.cs:2518
FuncDecl MkFuncDecl(string name, Sort domain, Sort range)
Creates a new function declaration.
Definition Context.cs:659
BoolExpr MkNot(BoolExpr a)
Mk an expression representing not(a).
Definition Context.cs:976
FuncDecl MkFuncDecl(string name, Sort[] domain, Sort range)
Creates a new function declaration.
Definition Context.cs:616
FuncDecl MkUserPropagatorFuncDecl(string name, Sort[] domain, Sort range)
Declare a function to be processed by the user propagator plugin.
Definition Context.cs:727
Expr MkTermArray(ArrayExpr array)
Access the array default value.
Definition Context.cs:2285
BitVecExpr MkBVSRem(BitVecExpr t1, BitVecExpr t2)
Signed remainder.
Definition Context.cs:1564
Simplifier UsingParams(Simplifier t, Params p)
Create a tactic that applies t using the given set of parameters p .
Definition Context.cs:3827
BitVecExpr MkBVRedOR(BitVecExpr t)
Take disjunction of bits in a vector, return vector of length 1.
Definition Context.cs:1348
Tactic MkTactic(string name)
Creates a new Tactic.
Definition Context.cs:3509
BoolExpr MkFPLEq(FPExpr t1, FPExpr t2)
Floating-point less than or equal.
Definition Context.cs:4533
ReExpr MkOption(ReExpr re)
Create the optional regular expression.
Definition Context.cs:2701
BoolExpr MkFPEq(FPExpr t1, FPExpr t2)
Floating-point equality.
Definition Context.cs:4576
DatatypeSort[] MkDatatypeSorts(Symbol[] names, Constructor[][] c)
Create mutually recursive datatypes.
Definition Context.cs:512
SeqExpr MkExtract(SeqExpr s, IntExpr offset, IntExpr length)
Extract subsequence.
Definition Context.cs:2617
RatNum MkReal(string v)
Create a real numeral.
Definition Context.cs:3010
FPExpr MkFPToFP(FPRMExpr rm, FPExpr t, FPSort s)
Conversion of a FloatingPoint term into another term of different FloatingPoint sort.
Definition Context.cs:4691
DatatypeSort MkDatatypeSort(string name, Constructor[] constructors)
Create a new datatype sort.
Definition Context.cs:467
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:4725
Tactic UsingParams(Tactic t, Params p)
Create a tactic that applies t using the given set of parameters p .
Definition Context.cs:3677
string[] SimplifierNames
The names of all supported tactics.
Definition Context.cs:3747
BoolExpr MkBVNegNoOverflow(BitVecExpr t)
Create a predicate that checks that the bit-wise negation does not overflow.
Definition Context.cs:2062
ListSort MkListSort(string name, Sort elemSort)
Create a new list sort.
Definition Context.cs:366
uint NumTactics
The number of supported tactics.
Definition Context.cs:3477
SeqExpr UbvToString(Expr e)
Convert a bit-vector expression, represented as an unsigned number, to a string.
Definition Context.cs:2487
ReExpr MkConcat(params ReExpr[] t)
Create the concatenation of regular languages.
Definition Context.cs:2719
BoolExpr MkBVULT(BitVecExpr t1, BitVecExpr t2)
Unsigned less-than.
Definition Context.cs:1597
BoolExpr MkBVMulNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
Create a predicate that checks that the bit-wise multiplication does not overflow.
Definition Context.cs:2076
FuncDecl MkConstDecl(Symbol name, Sort range)
Creates a new constant function declaration.
Definition Context.cs:689
BoolExpr MkXor(IEnumerable< BoolExpr > args)
Create an expression representing t1 xor t2 xor t3 ... .
Definition Context.cs:1043
BitVecExpr MkBVSDiv(BitVecExpr t1, BitVecExpr t2)
Signed division.
Definition Context.cs:1526
ParamDescrs SimplifyParameterDescriptions
Retrieves parameter descriptions for simplifier.
Definition Context.cs:4865
BitVecNum MkBV(ulong v, uint size)
Create a bit-vector numeral.
Definition Context.cs:3167
FPExpr MkFPFMA(FPRMExpr rm, FPExpr t1, FPExpr t2, FPExpr t3)
Floating-point fused multiply-add.
Definition Context.cs:4472
BoolExpr MkFPIsInfinite(FPExpr t)
Predicate indicating whether t is a floating-point number representing +oo or -oo.
Definition Context.cs:4612
BitVecExpr MkInt2BV(uint n, IntExpr t)
Create an n bit bit-vector from the integer argument t .
Definition Context.cs:1945
BoolExpr MkTrue()
The true Term.
Definition Context.cs:918
FPExpr MkFPSub(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point subtraction.
Definition Context.cs:4435
FPNum MkFPNumeral(double v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
Definition Context.cs:4304
FPExpr MkFPToFP(BitVecExpr bv, FPSort s)
Conversion of a single IEEE 754-2008 bit-vector into a floating-point number.
Definition Context.cs:4675
ReExpr MkUnion(params ReExpr[] t)
Create the union of regular languages.
Definition Context.cs:2731
RatNum MkReal(ulong v)
Create a real numeral.
Definition Context.cs:3054
BoolExpr MkBoolConst(Symbol name)
Create a Boolean constant.
Definition Context.cs:816
ReExpr MkEmptyRe(Sort s)
Create the empty regular expression. The sort s should be a regular expression.
Definition Context.cs:2767
Expr MkNth(SeqExpr s, Expr index)
Retrieve element at index.
Definition Context.cs:2606
FPSort MkFPSortSingle()
Create the single-precision (32-bit) FloatingPoint sort.
Definition Context.cs:4213
IntPtr UnwrapAST(AST a)
Unwraps an AST.
Definition Context.cs:4847
IntExpr MkMod(IntExpr t1, IntExpr t2)
Create an expression representing t1 mod t2.
Definition Context.cs:1185
BoolExpr MkPBLe(int[] coeffs, BoolExpr[] args, int k)
Create a pseudo-Boolean less-or-equal constraint.
Definition Context.cs:2872
IntNum MkInt(string v)
Create an integer numeral.
Definition Context.cs:3066
Expr MkConst(FuncDecl f)
Creates a fresh constant from the FuncDecl f .
Definition Context.cs:806
FPRMNum MkFPRTZ()
Create a numeral of RoundingMode sort which represents the RoundTowardZero rounding mode.
Definition Context.cs:4176
Tactic TryFor(Tactic t, uint ms)
Create a tactic that applies t to a goal for ms milliseconds.
Definition Context.cs:3582
BoolExpr MkImplies(BoolExpr t1, BoolExpr t2)
Create an expression representing t1 -> t2.
Definition Context.cs:1017
BoolExpr MkBVSubNoUnderflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
Create a predicate that checks that the bit-wise subtraction does not underflow.
Definition Context.cs:2030
Expr MkSelect(ArrayExpr a, Expr i)
Array read.
Definition Context.cs:2144
ArrayExpr MkSetUnion(params ArrayExpr[] args)
Take the union of a list of sets.
Definition Context.cs:2372
IntExpr MkIndexOf(SeqExpr s, SeqExpr substr, ArithExpr offset)
Extract index of sub-string starting at offset.
Definition Context.cs:2629
BoolExpr MkBoolConst(string name)
Create a Boolean constant.
Definition Context.cs:826
Expr MkApp(FuncDecl f, params Expr[] args)
Create a new function application.
Definition Context.cs:896
BitVecExpr MkBVSMod(BitVecExpr t1, BitVecExpr t2)
Two's complement signed remainder (sign follows divisor).
Definition Context.cs:1581
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:3978
BitVecExpr MkRepeat(uint i, BitVecExpr t)
Bit-vector repetition.
Definition Context.cs:1795
BoolExpr MkDistinct(IEnumerable< Expr > args)
Creates a distinct term.
Definition Context.cs:967
FuncDecl MkFuncDecl(Symbol name, Sort domain, Sort range)
Creates a new function declaration.
Definition Context.cs:600
BoolExpr MkFPGt(FPExpr t1, FPExpr t2)
Floating-point greater than.
Definition Context.cs:4563
BoolExpr MkAtMost(IEnumerable< BoolExpr > args, uint k)
Create an at-most-k constraint.
Definition Context.cs:2848
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:3714
Solver MkSolver(string logic)
Creates a new (incremental) solver.
Definition Context.cs:4023
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:3316
ArrayExpr MkSetDel(ArrayExpr set, Expr element)
Remove an element from a set.
Definition Context.cs:2359
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:571
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:3894
ReExpr MkRange(SeqExpr lo, SeqExpr hi)
Create a range expression.
Definition Context.cs:2787
BitVecNum MkBV(long v, uint size)
Create a bit-vector numeral.
Definition Context.cs:3156
BoolExpr MkBVSGT(BitVecExpr t1, BitVecExpr t2)
Two's complement signed greater-than.
Definition Context.cs:1709
Params MkParams()
Creates a new ParameterSet.
Definition Context.cs:3465
ArrayExpr MkSetIntersection(params ArrayExpr[] args)
Take the intersection of a list of sets.
Definition Context.cs:2384
FPNum MkFPNaN(FPSort s)
Create a NaN of sort s.
Definition Context.cs:4264
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:4392
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:3408
BitVecExpr MkBVNOR(BitVecExpr t1, BitVecExpr t2)
Bitwise NOR.
Definition Context.cs:1416
IntExpr CharToInt(Expr ch)
Create an integer (code point) from character.
Definition Context.cs:2808
BoolExpr MkDistinct(params Expr[] args)
Creates a distinct term.
Definition Context.cs:955
FPExpr MkFPRoundToIntegral(FPRMExpr rm, FPExpr t)
Floating-point roundToIntegral. Rounds a floating-point number to the closest integer,...
Definition Context.cs:4503
Fixedpoint MkFixedpoint()
Create a Fixedpoint context.
Definition Context.cs:4069
void UpdateParamValue(string id, string value)
Update a mutable configuration parameter.
Definition Context.cs:4896
DatatypeSort MkDatatypeSort(Symbol name, Constructor[] constructors)
Create a new datatype sort.
Definition Context.cs:452
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:647
FPNum MkFPNumeral(float v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
Definition Context.cs:4294
ArrayExpr MkConstArray(Sort domain, Expr v)
Create a constant array.
Definition Context.cs:2247
ArrayExpr MkSetComplement(ArrayExpr arg)
Take the complement of a set.
Definition Context.cs:2409
BoolExpr MkSetSubset(ArrayExpr arg1, ArrayExpr arg2)
Check for subsetness of sets.
Definition Context.cs:2433
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:3950
FPRMNum MkFPRoundNearestTiesToAway()
Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode.
Definition Context.cs:4120
string[] ProbeNames
The names of all supported Probes.
Definition Context.cs:3851
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:3519
BitVecExpr MkZeroExt(uint i, BitVecExpr t)
Bit-vector zero extension.
Definition Context.cs:1781
Z3_ast_print_mode PrintMode
Selects the format used for pretty-printing expressions.
Definition Context.cs:3397
void Dispose()
Disposes of the context.
Definition Context.cs:4992
BitVecExpr CharToBV(Expr ch)
Create a bit-vector (code point) from character.
Definition Context.cs:2817
SeqExpr SbvToString(Expr e)
Convert a bit-vector expression, represented as an signed number, to a string.
Definition Context.cs:2497
ArithExpr MkMul(IEnumerable< ArithExpr > ts)
Create an expression representing t[0] * t[1] * ....
Definition Context.cs:1139
ArrayExpr MkEmptySet(Sort domain)
Create an empty set.
Definition Context.cs:2323
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:3256
UninterpretedSort MkUninterpretedSort(string str)
Create a new uninterpreted sort.
Definition Context.cs:224
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:2980
ReExpr MkStar(ReExpr re)
Take the Kleene star of a regular expression.
Definition Context.cs:2674
Context()
Constructor.
Definition Context.cs:39
BitVecExpr MkBVConst(string name, uint size)
Creates a bit-vector constant.
Definition Context.cs:885
BitVecNum MkBV(uint v, uint size)
Create a bit-vector numeral.
Definition Context.cs:3145
Optimize MkOptimize()
Create an Optimization context.
Definition Context.cs:4080
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:3293
Expr CharFromBV(BitVecExpr bv)
Create a character from a bit-vector (code point).
Definition Context.cs:2826
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:2296
CharSort CharSort
Retrieves the String sort of the context.
Definition Context.cs:181
FPNum MkFPInf(FPSort s, bool negative)
Create a floating-point infinity of sort s.
Definition Context.cs:4274
FuncDecl MkConstDecl(string name, Sort range)
Creates a new constant function declaration.
Definition Context.cs:702
ArrayExpr MkMap(FuncDecl f, params ArrayExpr[] args)
Maps f on the argument arrays.
Definition Context.cs:2268
ReExpr MkIntersect(params ReExpr[] t)
Create the intersection of regular languages.
Definition Context.cs:2743
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:3627
BoolExpr MkBVSLE(BitVecExpr t1, BitVecExpr t2)
Two's complement signed less-than or equal to.
Definition Context.cs:1645
FPNum MkFP(int v, FPSort s)
Create a numeral of FloatingPoint sort from an int.
Definition Context.cs:4368
uint NumSimplifiers
The number of supported simplifiers.
Definition Context.cs:3739
BoolExpr MkLt(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 < t2
Definition Context.cs:1225
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:4380
ListSort MkListSort(Symbol name, Sort elemSort)
Create a new list sort.
Definition Context.cs:353
SeqExpr MkAt(SeqExpr s, Expr index)
Retrieve sequence of length one at index.
Definition Context.cs:2595
FPExpr MkFPToFP(FPSort s, FPRMExpr rm, FPExpr t)
Conversion of a floating-point number to another FloatingPoint sort s.
Definition Context.cs:4743
BoolExpr MkSetMembership(Expr elem, ArrayExpr set)
Check for set membership.
Definition Context.cs:2420
BitVecExpr MkBVRotateRight(BitVecExpr t1, BitVecExpr t2)
Rotate Right.
Definition Context.cs:1925
SeqExpr MkReplace(SeqExpr s, SeqExpr src, SeqExpr dst)
Replace the first occurrence of src by dst in s.
Definition Context.cs:2641
FPRMExpr MkFPRoundNearestTiesToEven()
Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
Definition Context.cs:4104
string ProbeDescription(string name)
Returns a string containing a description of the probe with the given name.
Definition Context.cs:3866
Pattern MkPattern(params Expr[] terms)
Create a quantifier pattern.
Definition Context.cs:753
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:3964
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:3922
FPExpr MkFPNeg(FPExpr t)
Floating-point negation.
Definition Context.cs:4413
FPSort MkFPSort32()
Create the single-precision (32-bit) FloatingPoint sort.
Definition Context.cs:4221
Expr MkConst(Symbol name, Sort range)
Creates a new Constant of sort range and named name .
Definition Context.cs:768
BoolExpr MkAnd(params BoolExpr[] ts)
Create an expression representing t[0] and t[1] and ....
Definition Context.cs:1060
RealSort RealSort
Retrieves the Real sort of the context.
Definition Context.cs:170
BoolExpr MkIsInteger(RealExpr t)
Creates an expression that checks whether a real number is an integer.
Definition Context.cs:1310
BitVecExpr MkBVXNOR(BitVecExpr t1, BitVecExpr t2)
Bitwise XNOR.
Definition Context.cs:1430
BoolExpr MkBVULE(BitVecExpr t1, BitVecExpr t2)
Unsigned less-than or equal to.
Definition Context.cs:1629
BoolExpr MkGe(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 >= t2
Definition Context.cs:1264
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:4338
BitVecExpr MkFPToBV(FPRMExpr rm, FPExpr t, uint sz, bool sign)
Conversion of a floating-point term into a bit-vector.
Definition Context.cs:4762
BoolExpr MkBVAddNoUnderflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise addition does not underflow.
Definition Context.cs:1998
BitVecNum MkBV(string v, uint size)
Create a bit-vector numeral.
Definition Context.cs:3123
ReExpr MkFullRe(Sort s)
Create the full regular expression. The sort s should be a regular expression.
Definition Context.cs:2777
BoolExpr MkFPIsSubnormal(FPExpr t)
Predicate indicating whether t is a subnormal floating-point number.
Definition Context.cs:4594
ArrayExpr MkArrayConst(Symbol name, Sort domain, Sort range)
Create an array constant.
Definition Context.cs:2107
BoolExpr MkFPIsZero(FPExpr t)
Predicate indicating whether t is a floating-point number with zero value, i.e., +0 or -0.
Definition Context.cs:4603
ReSort MkReSort(SeqSort s)
Create a new regular expression sort.
Definition Context.cs:267
FPSort MkFPSortDouble()
Create the double-precision (64-bit) FloatingPoint sort.
Definition Context.cs:4229
string SimplifierDescription(string name)
Returns a string containing a description of the simplifier with the given name.
Definition Context.cs:3762
FPRMNum MkFPRoundTowardZero()
Create a numeral of RoundingMode sort which represents the RoundTowardZero rounding mode.
Definition Context.cs:4168
ArithExpr MkSub(params ArithExpr[] ts)
Create an expression representing t[0] - t[1] - ....
Definition Context.cs:1148
Goal MkGoal(bool models=true, bool unsatCores=false, bool proofs=false)
Creates a new Goal.
Definition Context.cs:3454
IntExpr MkBV2Int(BitVecExpr t, bool signed)
Create an integer from the bit-vector argument t .
Definition Context.cs:1968
BoolExpr MkInRe(SeqExpr s, ReExpr re)
Check for regular expression membership.
Definition Context.cs:2663
ArrayExpr MkSetAdd(ArrayExpr set, Expr element)
Add an element to the set.
Definition Context.cs:2345
BitVecExpr MkBVRedAND(BitVecExpr t)
Take conjunction of bits in a vector, return vector of length 1.
Definition Context.cs:1336
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:3936
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:501
ReExpr MkLoop(ReExpr re, uint lo, uint hi=0)
Take the bounded Kleene star of a regular expression.
Definition Context.cs:2683
FPRMNum MkFPRoundTowardNegative()
Create a numeral of RoundingMode sort which represents the RoundTowardNegative rounding mode.
Definition Context.cs:4152
Probe MkProbe(string name)
Creates a new Probe.
Definition Context.cs:3875
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:4326
SeqSort MkSeqSort(Sort s)
Create a new sequence sort.
Definition Context.cs:258
DatatypeSort[] MkDatatypeSorts(string[] names, Constructor[][] c)
Create mutually recursive data-types.
Definition Context.cs:545
Tactic FailIf(Probe p)
Create a tactic that fails if the probe p evaluates to false.
Definition Context.cs:3656
Expr MkBound(uint index, Sort ty)
Creates a new bound variable.
Definition Context.cs:741
FPRMNum MkFPRTN()
Create a numeral of RoundingMode sort which represents the RoundTowardNegative rounding mode.
Definition Context.cs:4160
FPSort MkFPSort128()
Create the quadruple-precision (128-bit) FloatingPoint sort.
Definition Context.cs:4253
BoolExpr MkBVUGE(BitVecExpr t1, BitVecExpr t2)
Unsigned greater than or equal to.
Definition Context.cs:1661
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:2935
FPRMNum MkFPRTP()
Create a numeral of RoundingMode sort which represents the RoundTowardPositive rounding mode.
Definition Context.cs:4144
BoolSort MkBoolSort()
Create a new Boolean sort.
Definition Context.cs:205
BitVecExpr MkConcat(BitVecExpr t1, BitVecExpr t2)
Bit-vector concatenation.
Definition Context.cs:1729
ArithExpr MkPower(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 ^ t2.
Definition Context.cs:1212
SeqExpr MkEmptySeq(Sort s)
Create the empty sequence.
Definition Context.cs:2450
BitVecExpr MkBVNot(BitVecExpr t)
Bitwise negation.
Definition Context.cs:1324
FPExpr MkFPRem(FPExpr t1, FPExpr t2)
Floating-point remainder.
Definition Context.cs:4492
RealSort MkRealSort()
Create a real sort.
Definition Context.cs:242
BoolExpr MkBVAddNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
Create a predicate that checks that the bit-wise addition does not overflow.
Definition Context.cs:1982
ArithExpr MkDiv(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 / t2.
Definition Context.cs:1171
Expr MkSelect(ArrayExpr a, params Expr[] args)
Array read.
Definition Context.cs:2167
FPNum MkFPNumeral(int v, FPSort s)
Create a numeral of FloatingPoint sort from an int.
Definition Context.cs:4314
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:3427
BoolExpr MkFPLt(FPExpr t1, FPExpr t2)
Floating-point less than.
Definition Context.cs:4543
Simplifier MkSimplifier(string name)
Creates a new Tactic.
Definition Context.cs:3771
BoolExpr MkFPGEq(FPExpr t1, FPExpr t2)
Floating-point greater than or equal.
Definition Context.cs:4553
BitVecExpr MkSignExt(uint i, BitVecExpr t)
Bit-vector sign extension.
Definition Context.cs:1764
Tactic ParOr(params Tactic[] t)
Create a tactic that applies the given tactics in parallel until one of them succeeds (i....
Definition Context.cs:3702
IntSort MkIntSort()
Create a new integer sort.
Definition Context.cs:233
BoolExpr MkAnd(IEnumerable< BoolExpr > t)
Create an expression representing t[0] and t[1] and ....
Definition Context.cs:1072
BitVecExpr MkBVMul(BitVecExpr t1, BitVecExpr t2)
Two's complement multiplication.
Definition Context.cs:1484
IntExpr StringToInt(Expr e)
Convert an integer expression to a string.
Definition Context.cs:2507
BoolExpr MkBVSDivNoOverflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise signed division does not overflow.
Definition Context.cs:2046
BoolExpr MkContains(SeqExpr s1, SeqExpr s2)
Check for sequence containment of s2 in s1.
Definition Context.cs:2562
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:3566
SeqSort StringSort
Retrieves the String sort of the context.
Definition Context.cs:193
BoolExpr MkEq(Expr x, Expr y)
Creates the equality x = y .
Definition Context.cs:942
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:3611
BitVecExpr MkBVSub(BitVecExpr t1, BitVecExpr t2)
Two's complement subtraction.
Definition Context.cs:1470
BitVecExpr MkBVUDiv(BitVecExpr t1, BitVecExpr t2)
Unsigned division.
Definition Context.cs:1503
void Interrupt()
Interrupt the execution of a Z3 procedure.
Definition Context.cs:3728
BoolExpr MkBVUGT(BitVecExpr t1, BitVecExpr t2)
Unsigned greater-than.
Definition Context.cs:1693
ArraySort MkArraySort(Sort domain, Sort range)
Create a new array sort.
Definition Context.cs:276
BitVecExpr MkBVConst(Symbol name, uint size)
Creates a bit-vector constant.
Definition Context.cs:874
BitVecExpr MkBVASHR(BitVecExpr t1, BitVecExpr t2)
Arithmetic shift right.
Definition Context.cs:1861
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:3553
FPNum MkFPZero(FPSort s, bool negative)
Create a floating-point zero of sort s.
Definition Context.cs:4284
BoolExpr MkPBGe(int[] coeffs, BoolExpr[] args, int k)
Create a pseudo-Boolean greater-or-equal constraint.
Definition Context.cs:2886
IntNum MkInt(long v)
Create an integer numeral.
Definition Context.cs:3099
RatNum MkReal(long v)
Create a real numeral.
Definition Context.cs:3043
ReExpr MkPlus(ReExpr re)
Take the Kleene plus of a regular expression.
Definition Context.cs:2692
FPExpr MkFPSqrt(FPRMExpr rm, FPExpr t)
Floating-point square root.
Definition Context.cs:4482
BoolExpr MkIff(BoolExpr t1, BoolExpr t2)
Create an expression representing t1 iff t2.
Definition Context.cs:1004
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:397
Expr MkNumeral(string v, Sort ty)
Create a Term of a given sort.
Definition Context.cs:2920
FuncDecl MkRecFuncDecl(string name, Sort[] domain, Sort range)
Creates a new recursive function declaration.
Definition Context.cs:630
BitVecExpr MkBVAdd(BitVecExpr t1, BitVecExpr t2)
Two's complement addition.
Definition Context.cs:1456
BoolExpr MkGt(ArithExpr t1, ArithExpr t2)
Create an expression representing t1 > t2
Definition Context.cs:1251
Solver MkSimpleSolver()
Creates a new (incremental) solver.
Definition Context.cs:4032
ArraySort MkArraySort(Sort[] domain, Sort range)
Create a new n-ary array sort.
Definition Context.cs:289
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:483
Probe Not(Probe p)
Create a probe that evaluates to "true" when the value p does not evaluate to "true".
Definition Context.cs:3992
BoolExpr MkBool(bool value)
Creates a Boolean value.
Definition Context.cs:934
BitVecExpr MkBVAND(BitVecExpr t1, BitVecExpr t2)
Bitwise conjunction.
Definition Context.cs:1360
Solver MkSolver(Tactic t)
Creates a solver that is implemented using the given tactic.
Definition Context.cs:4055
RealExpr MkRealConst(Symbol name)
Creates a real constant.
Definition Context.cs:855
IntNum MkInt(ulong v)
Create an integer numeral.
Definition Context.cs:3110
Expr MkApp(FuncDecl f, IEnumerable< Expr > args)
Create a new function application.
Definition Context.cs:908
ReExpr MkToRe(SeqExpr s)
Convert a regular expression that accepts sequence s.
Definition Context.cs:2653
BoolExpr MkFPIsNaN(FPExpr t)
Predicate indicating whether t is a NaN.
Definition Context.cs:4621
BitVecExpr MkBVRotateRight(uint i, BitVecExpr t)
Rotate Right.
Definition Context.cs:1893
string SimplifyHelp()
Return a string describing all available parameters to Expr.Simplify.
Definition Context.cs:4855
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:3278
Lambda MkLambda(Sort[] sorts, Symbol[] names, Expr body)
Create a lambda expression.
Definition Context.cs:3348
FuncDecl MkFuncDecl(Symbol name, Sort[] domain, Sort range)
Creates a new function declaration.
Definition Context.cs:585
BoolExpr MkBVSLT(BitVecExpr t1, BitVecExpr t2)
Two's complement signed less-than.
Definition Context.cs:1613
SetSort MkSetSort(Sort ty)
Create a set type.
Definition Context.cs:2312
EnumSort MkEnumSort(string name, params string[] enumNames)
Create a new enumeration sort.
Definition Context.cs:333
Simplifier AndThen(Simplifier t1, Simplifier t2, params Simplifier[] ts)
Create a simplifier that applies t1 and then t2 .
Definition Context.cs:3781
BitVecNum MkBV(int v, uint size)
Create a bit-vector numeral.
Definition Context.cs:3134
RatNum MkReal(int num, int den)
Create a real from a fraction.
Definition Context.cs:2997
EnumSort MkEnumSort(Symbol name, params Symbol[] enumNames)
Create a new enumeration sort.
Definition Context.cs:318
Solver MkSolver(Solver s, Simplifier t)
Creates a solver that uses an incremental simplifier.
Definition Context.cs:4041
BoolExpr MkFPIsNegative(FPExpr t)
Predicate indicating whether t is a negative floating-point number.
Definition Context.cs:4630
FuncDecl MkFreshFuncDecl(string prefix, Sort[] domain, Sort range)
Creates a fresh function declaration with a name prefixed with prefix .
Definition Context.cs:676
IntExpr MkIntConst(string name)
Creates an integer constant.
Definition Context.cs:845
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:3597
BitVecExpr MkBVNeg(BitVecExpr t)
Standard two's complement unary minus.
Definition Context.cs:1444
FuncDecl MkFreshConstDecl(string prefix, Sort range)
Creates a fresh constant function declaration with a name prefixed with prefix .
Definition Context.cs:716
Tactic Fail()
Create a tactic always fails.
Definition Context.cs:3647
Tactic FailIfNotDecided()
Create a tactic that fails if the goal is not trivially satisfiable (i.e., empty) or trivially unsati...
Definition Context.cs:3668
FPRMNum MkFPRoundTowardPositive()
Create a numeral of RoundingMode sort which represents the RoundTowardPositive rounding mode.
Definition Context.cs:4136
BitVecExpr MkBVOR(BitVecExpr t1, BitVecExpr t2)
Bitwise disjunction.
Definition Context.cs:1374
Expr MkConst(string name, Sort range)
Creates a new Constant of sort range and named name .
Definition Context.cs:782
IntExpr MkRem(IntExpr t1, IntExpr t2)
Create an expression representing t1 rem t2.
Definition Context.cs:1199
FPExpr MkFPMul(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point multiplication.
Definition Context.cs:4446
BoolExpr MkStringLt(SeqExpr s1, SeqExpr s2)
Check if the string s1 is lexicographically strictly less than s2.
Definition Context.cs:2573
BoolExpr MkBVSubNoOverflow(BitVecExpr t1, BitVecExpr t2)
Create a predicate that checks that the bit-wise subtraction does not overflow.
Definition Context.cs:2014
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:4813
FPSort MkFPSort64()
Create the double-precision (64-bit) FloatingPoint sort.
Definition Context.cs:4237
BoolExpr MkOr(IEnumerable< BoolExpr > ts)
Create an expression representing t[0] or t[1] or ....
Definition Context.cs:1094
FPRMNum MkFPRNA()
Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode.
Definition Context.cs:4128
Context(Dictionary< string, string > settings)
Constructor.
Definition Context.cs:68
BitVecExpr MkBVRotateLeft(uint i, BitVecExpr t)
Rotate Left.
Definition Context.cs:1878
string TacticDescription(string name)
Returns a string containing a description of the tactic with the given name.
Definition Context.cs:3500
FPRMNum MkFPRNE()
Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
Definition Context.cs:4112
SeqExpr MkUnit(Expr elem)
Create the singleton sequence.
Definition Context.cs:2459
uint NumProbes
The number of supported Probes.
Definition Context.cs:3843
BoolExpr MkPBEq(int[] coeffs, BoolExpr[] args, int k)
Create a pseudo-Boolean equal constraint.
Definition Context.cs:2899
IntNum MkInt(int v)
Create an integer numeral.
Definition Context.cs:3077
BitVecExpr MkBVXOR(BitVecExpr t1, BitVecExpr t2)
Bitwise XOR.
Definition Context.cs:1388
ArrayExpr MkStore(ArrayExpr a, Expr[] args, Expr v)
Array update.
Definition Context.cs:2226
Solver MkSolver(Symbol logic=null)
Creates a new (incremental) solver.
Definition Context.cs:4010
FPExpr MkFPAbs(FPExpr t)
Floating-point absolute value.
Definition Context.cs:4404
FPExpr MkFPMin(FPExpr t1, FPExpr t2)
Minimum of floating-point numbers.
Definition Context.cs:4513
FPExpr MkFPDiv(FPRMExpr rm, FPExpr t1, FPExpr t2)
Floating-point division.
Definition Context.cs:4457
ReExpr MkComplement(ReExpr re)
Create the complement regular expression.
Definition Context.cs:2710
BitVecExpr MkExtract(uint high, uint low, BitVecExpr t)
Bit-vector extraction.
Definition Context.cs:1748
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:1544
BoolExpr MkFalse()
The false Term.
Definition Context.cs:926
IntExpr MkLength(SeqExpr s)
Retrieve the length of a given sequence.
Definition Context.cs:2531
RatNum MkReal(int v)
Create a real numeral.
Definition Context.cs:3021
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:2468
ArrayExpr MkStore(ArrayExpr a, Expr i, Expr v)
Array update.
Definition Context.cs:2196
FPExpr MkFP(BitVecExpr sgn, BitVecExpr sig, BitVecExpr exp)
Create an expression of FloatingPoint sort from three bit-vector expressions.
Definition Context.cs:4659
ArithExpr MkMul(params ArithExpr[] ts)
Create an expression representing t[0] * t[1] * ....
Definition Context.cs:1127
BoolExpr MkBVSGE(BitVecExpr t1, BitVecExpr t2)
Two's complement signed greater than or equal to.
Definition Context.cs:1677
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:3214
FPNum MkFP(double v, FPSort s)
Create a numeral of FloatingPoint sort from a float.
Definition Context.cs:4358
BoolExpr MkFPIsNormal(FPExpr t)
Predicate indicating whether t is a normal floating-point number.
Definition Context.cs:4585
BoolExpr MkPrefixOf(SeqExpr s1, SeqExpr s2)
Check for sequence prefix.
Definition Context.cs:2540
BoolExpr MkFPIsPositive(FPExpr t)
Predicate indicating whether t is a positive floating-point number.
Definition Context.cs:4639
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
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.
Z3_ast_print_mode
Z3 pretty printing modes (See Z3_set_ast_print_mode).
Definition z3_api.h:1322
Z3_error_code
Z3 error codes (See Z3_get_error_code).
Definition z3_api.h:1347
System.IntPtr Z3_context
Definition Context.cs:29