1 from collections import defaultdict, Set
2 from fractions import Fraction
5 from libc.stdint cimport int32_t, int64_t, uint32_t, uint64_t
6 from libc.stddef cimport wchar_t
8 from libcpp.pair cimport pair
9 from libcpp.set cimport set as c_set
10 from libcpp.string cimport string
11 from libcpp.vector cimport vector
13 from cvc5 cimport cout
14 from cvc5 cimport Datatype as c_Datatype
15 from cvc5 cimport DatatypeConstructor as c_DatatypeConstructor
16 from cvc5 cimport DatatypeConstructorDecl as c_DatatypeConstructorDecl
17 from cvc5 cimport DatatypeDecl as c_DatatypeDecl
18 from cvc5 cimport DatatypeSelector as c_DatatypeSelector
19 from cvc5 cimport Result as c_Result
20 from cvc5 cimport RoundingMode as c_RoundingMode
21 from cvc5 cimport UnknownExplanation as c_UnknownExplanation
22 from cvc5 cimport Op as c_Op
23 from cvc5 cimport Solver as c_Solver
24 from cvc5 cimport Grammar as c_Grammar
25 from cvc5 cimport Sort as c_Sort
26 from cvc5 cimport ROUND_NEAREST_TIES_TO_EVEN, ROUND_TOWARD_POSITIVE
27 from cvc5 cimport ROUND_TOWARD_NEGATIVE, ROUND_TOWARD_ZERO
28 from cvc5 cimport ROUND_NEAREST_TIES_TO_AWAY
29 from cvc5 cimport REQUIRES_FULL_CHECK, INCOMPLETE, TIMEOUT
30 from cvc5 cimport RESOURCEOUT, MEMOUT, INTERRUPTED
31 from cvc5 cimport NO_STATUS, UNSUPPORTED, UNKNOWN_REASON
32 from cvc5 cimport OTHER
33 from cvc5 cimport Term as c_Term
34 from cvc5 cimport hash as c_hash
35 from cvc5 cimport wstring as c_wstring
36 from cvc5 cimport tuple as c_tuple
37 from cvc5 cimport get0, get1, get2
38 from cvc5kinds cimport Kind as c_Kind
40 cdef extern from "Python.h":
41 wchar_t* PyUnicode_AsWideCharString(object, Py_ssize_t *)
42 object PyUnicode_FromWideChar(const wchar_t*, Py_ssize_t)
43 void PyMem_Free(void*)
45 ################################## DECORATORS #################################
46 def expand_list_arg(num_req_args=0):
48 Creates a decorator that looks at index num_req_args of the args,
49 if it's a list, it expands it before calling the function.
52 def wrapper(owner, *args):
53 if len(args) == num_req_args + 1 and \
54 isinstance(args[num_req_args], list):
55 args = list(args[:num_req_args]) + args[num_req_args]
56 return func(owner, *args)
59 ###############################################################################
62 ### Using PEP-8 spacing recommendations
63 ### Limit linewidth to 79 characters
64 ### Break before binary operators
65 ### surround top level functions and classes with two spaces
66 ### separate methods by one space
67 ### use spaces in functions sparingly to separate logical blocks
68 ### can omit spaces between unrelated oneliners
69 ### always use c++ default arguments
70 #### only use default args of None at python level
72 # References and pointers
73 # The Solver object holds a pointer to a c_Solver.
74 # This is because the assignment operator is deleted in the C++ API for solvers.
75 # Cython has a limitation where you can't stack allocate objects
76 # that have constructors with arguments:
77 # https://groups.google.com/forum/#!topic/cython-users/fuKd-nQLpBs.
78 # To get around that you can either have a nullary constructor and assignment
79 # or, use a pointer (which is what we chose).
80 # An additional complication of this is that to free up resources, you must
81 # know when to delete the object.
82 # Python will not follow the same scoping rules as in C++, so it must be
83 # able to reference count. To do this correctly, the solver must be a
84 # reference in the Python class for any class that keeps a pointer to
85 # the solver in C++ (to ensure the solver is not deleted before something
86 # that depends on it).
89 ## Objects for hashing
90 cdef c_hash[c_Op] cophash = c_hash[c_Op]()
91 cdef c_hash[c_Sort] csorthash = c_hash[c_Sort]()
92 cdef c_hash[c_Term] ctermhash = c_hash[c_Term]()
96 """Wrapper class for :cpp:class:`cvc5::api::Datatype`."""
99 def __cinit__(self, Solver solver):
102 def __getitem__(self, index):
103 cdef DatatypeConstructor dc = DatatypeConstructor(self.solver)
104 if isinstance(index, int) and index >= 0:
105 dc.cdc = self.cd[(<int?> index)]
106 elif isinstance(index, str):
107 dc.cdc = self.cd[(<const string &> index.encode())]
109 raise ValueError("Expecting a non-negative integer or string")
112 def getConstructor(self, str name):
114 :param name: the name of the constructor.
115 :return: a constructor by name.
117 cdef DatatypeConstructor dc = DatatypeConstructor(self.solver)
118 dc.cdc = self.cd.getConstructor(name.encode())
121 def getConstructorTerm(self, str name):
123 :param name: the name of the constructor.
124 :return: the term representing the datatype constructor with the given name (see :cpp:func:`Datatype::getConstructorTerm() <cvc5::api::Datatype::getConstructorTerm>`).
126 cdef Term term = Term(self.solver)
127 term.cterm = self.cd.getConstructorTerm(name.encode())
130 def getSelector(self, str name):
132 :param name: the name of the selector..
133 :return: a selector by name.
135 cdef DatatypeSelector ds = DatatypeSelector(self.solver)
136 ds.cds = self.cd.getSelector(name.encode())
141 :return: the name of the datatype.
143 return self.cd.getName().decode()
145 def getNumConstructors(self):
147 :return: number of constructors in this datatype.
149 return self.cd.getNumConstructors()
151 def isParametric(self):
152 """:return: whether this datatype is parametric."""
153 return self.cd.isParametric()
155 def isCodatatype(self):
156 """:return: whether this datatype corresponds to a co-datatype."""
157 return self.cd.isCodatatype()
160 """:return: whether this datatype corresponds to a tuple."""
161 return self.cd.isTuple()
164 """:return: whether this datatype corresponds to a record."""
165 return self.cd.isRecord()
168 """:return: whether this datatype is finite."""
169 return self.cd.isFinite()
171 def isWellFounded(self):
172 """:return: whether this datatype is well-founded (see :cpp:func:`Datatype::isWellFounded() <cvc5::api::Datatype::isWellFounded>`)."""
173 return self.cd.isWellFounded()
175 def hasNestedRecursion(self):
176 """:return: whether this datatype has nested recursion (see :cpp:func:`Datatype::hasNestedRecursion() <cvc5::api::Datatype::hasNestedRecursion>`)."""
177 return self.cd.hasNestedRecursion()
180 return self.cd.isNull()
183 return self.cd.toString().decode()
186 return self.cd.toString().decode()
190 dc = DatatypeConstructor(self.solver)
195 cdef class DatatypeConstructor:
196 """Wrapper class for :cpp:class:`cvc5::api::DatatypeConstructor`."""
197 cdef c_DatatypeConstructor cdc
199 def __cinit__(self, Solver solver):
200 self.cdc = c_DatatypeConstructor()
203 def __getitem__(self, index):
204 cdef DatatypeSelector ds = DatatypeSelector(self.solver)
205 if isinstance(index, int) and index >= 0:
206 ds.cds = self.cdc[(<int?> index)]
207 elif isinstance(index, str):
208 ds.cds = self.cdc[(<const string &> index.encode())]
210 raise ValueError("Expecting a non-negative integer or string")
215 :return: the name of the constructor.
217 return self.cdc.getName().decode()
219 def getConstructorTerm(self):
221 :return: the constructor operator as a term.
223 cdef Term term = Term(self.solver)
224 term.cterm = self.cdc.getConstructorTerm()
227 def getSpecializedConstructorTerm(self, Sort retSort):
229 Specialized method for parametric datatypes (see :cpp:func:`DatatypeConstructor::getSpecializedConstructorTerm() <cvc5::api::DatatypeConstructor::getSpecializedConstructorTerm>`).
231 :param retSort: the desired return sort of the constructor
232 :return: the constructor operator as a term.
234 cdef Term term = Term(self.solver)
235 term.cterm = self.cdc.getSpecializedConstructorTerm(retSort.csort)
238 def getTesterTerm(self):
240 :return: the tester operator that is related to this constructor, as a term.
242 cdef Term term = Term(self.solver)
243 term.cterm = self.cdc.getTesterTerm()
246 def getNumSelectors(self):
248 :return: the number of selecters (so far) of this Datatype constructor.
250 return self.cdc.getNumSelectors()
252 def getSelector(self, str name):
254 :param name: the name of the datatype selector.
255 :return: the first datatype selector with the given name
257 cdef DatatypeSelector ds = DatatypeSelector(self.solver)
258 ds.cds = self.cdc.getSelector(name.encode())
261 def getSelectorTerm(self, str name):
263 :param name: the name of the datatype selector.
264 :return: a term representing the firstdatatype selector with the given name.
266 cdef Term term = Term(self.solver)
267 term.cterm = self.cdc.getSelectorTerm(name.encode())
271 return self.cdc.isNull()
274 return self.cdc.toString().decode()
277 return self.cdc.toString().decode()
281 ds = DatatypeSelector(self.solver)
286 cdef class DatatypeConstructorDecl:
287 """Wrapper class for :cpp:class:`cvc5::api::DatatypeConstructorDecl`."""
288 cdef c_DatatypeConstructorDecl cddc
291 def __cinit__(self, Solver solver):
294 def addSelector(self, str name, Sort sort):
296 Add datatype selector declaration.
298 :param name: the name of the datatype selector declaration to add.
299 :param sort: the range sort of the datatype selector declaration to add.
301 self.cddc.addSelector(name.encode(), sort.csort)
303 def addSelectorSelf(self, str name):
305 Add datatype selector declaration whose range sort is the datatype itself.
307 :param name: the name of the datatype selector declaration to add.
309 self.cddc.addSelectorSelf(name.encode())
312 return self.cddc.isNull()
315 return self.cddc.toString().decode()
318 return self.cddc.toString().decode()
321 cdef class DatatypeDecl:
322 """Wrapper class for :cpp:class:`cvc5::api::DatatypeDecl`."""
323 cdef c_DatatypeDecl cdd
325 def __cinit__(self, Solver solver):
328 def addConstructor(self, DatatypeConstructorDecl ctor):
330 Add a datatype constructor declaration.
332 :param ctor: the datatype constructor declaration to add.
334 self.cdd.addConstructor(ctor.cddc)
336 def getNumConstructors(self):
338 :return: number of constructors (so far) for this datatype declaration.
340 return self.cdd.getNumConstructors()
342 def isParametric(self):
344 :return: is this datatype declaration parametric?
346 return self.cdd.isParametric()
350 :return: the name of this datatype declaration.
352 return self.cdd.getName().decode()
355 return self.cdd.isNull()
358 return self.cdd.toString().decode()
361 return self.cdd.toString().decode()
364 cdef class DatatypeSelector:
365 """Wrapper class for :cpp:class:`cvc5::api::DatatypeSelector`."""
366 cdef c_DatatypeSelector cds
368 def __cinit__(self, Solver solver):
369 self.cds = c_DatatypeSelector()
374 :return: the name of this datatype selector.
376 return self.cds.getName().decode()
378 def getSelectorTerm(self):
380 :return: the selector opeartor of this datatype selector as a term.
382 cdef Term term = Term(self.solver)
383 term.cterm = self.cds.getSelectorTerm()
386 def getUpdaterTerm(self):
388 :return: the updater opeartor of this datatype selector as a term.
390 cdef Term term = Term(self.solver)
391 term.cterm = self.cds.getUpdaterTerm()
394 def getRangeSort(self):
396 :return: the range sort of this selector.
398 cdef Sort sort = Sort(self.solver)
399 sort.csort = self.cds.getRangeSort()
403 return self.cds.isNull()
406 return self.cds.toString().decode()
409 return self.cds.toString().decode()
415 def __cinit__(self, Solver solver):
419 def __eq__(self, Op other):
420 return self.cop == other.cop
422 def __ne__(self, Op other):
423 return self.cop != other.cop
426 return self.cop.toString().decode()
429 return self.cop.toString().decode()
432 return cophash(self.cop)
435 return kind(<int> self.cop.getKind())
438 return self.cop.isIndexed()
441 return self.cop.isNull()
443 def getNumIndices(self):
444 return self.cop.getNumIndices()
446 def getIndices(self):
449 indices = self.cop.getIndices[string]().decode()
454 indices = self.cop.getIndices[uint32_t]()
459 indices = self.cop.getIndices[pair[uint32_t, uint32_t]]()
464 raise RuntimeError("Unable to retrieve indices from {}".format(self))
469 cdef c_Grammar cgrammar
471 def __cinit__(self, Solver solver):
473 self.cgrammar = c_Grammar()
475 def addRule(self, Term ntSymbol, Term rule):
476 self.cgrammar.addRule(ntSymbol.cterm, rule.cterm)
478 def addAnyConstant(self, Term ntSymbol):
479 self.cgrammar.addAnyConstant(ntSymbol.cterm)
481 def addAnyVariable(self, Term ntSymbol):
482 self.cgrammar.addAnyVariable(ntSymbol.cterm)
484 def addRules(self, Term ntSymbol, rules):
485 cdef vector[c_Term] crules
487 crules.push_back((<Term?> r).cterm)
488 self.cgrammar.addRules(ntSymbol.cterm, crules)
493 # gets populated by solver
497 return self.cr.isNull()
500 return self.cr.isSat()
503 return self.cr.isUnsat()
505 def isSatUnknown(self):
506 return self.cr.isSatUnknown()
508 def isEntailed(self):
509 return self.cr.isEntailed()
511 def isNotEntailed(self):
512 return self.cr.isNotEntailed()
514 def isEntailmentUnknown(self):
515 return self.cr.isEntailmentUnknown()
517 def __eq__(self, Result other):
518 return self.cr == other.cr
520 def __ne__(self, Result other):
521 return self.cr != other.cr
523 def getUnknownExplanation(self):
524 return UnknownExplanation(<int> self.cr.getUnknownExplanation())
527 return self.cr.toString().decode()
530 return self.cr.toString().decode()
533 cdef class RoundingMode:
534 cdef c_RoundingMode crm
536 def __cinit__(self, int rm):
537 # crm always assigned externally
538 self.crm = <c_RoundingMode> rm
539 self.name = __rounding_modes[rm]
541 def __eq__(self, RoundingMode other):
542 return (<int> self.crm) == (<int> other.crm)
544 def __ne__(self, RoundingMode other):
545 return not self.__eq__(other)
548 return hash((<int> self.crm, self.name))
557 cdef class UnknownExplanation:
558 cdef c_UnknownExplanation cue
560 def __cinit__(self, int ue):
561 # crm always assigned externally
562 self.cue = <c_UnknownExplanation> ue
563 self.name = __unknown_explanations[ue]
565 def __eq__(self, UnknownExplanation other):
566 return (<int> self.cue) == (<int> other.cue)
568 def __ne__(self, UnknownExplanation other):
569 return not self.__eq__(other)
572 return hash((<int> self.crm, self.name))
582 cdef c_Solver* csolver
585 self.csolver = new c_Solver()
587 def __dealloc__(self):
590 def getBooleanSort(self):
591 cdef Sort sort = Sort(self)
592 sort.csort = self.csolver.getBooleanSort()
595 def getIntegerSort(self):
596 cdef Sort sort = Sort(self)
597 sort.csort = self.csolver.getIntegerSort()
600 def getNullSort(self):
601 cdef Sort sort = Sort(self)
602 sort.csort = self.csolver.getNullSort()
605 def getRealSort(self):
606 cdef Sort sort = Sort(self)
607 sort.csort = self.csolver.getRealSort()
610 def getRegExpSort(self):
611 cdef Sort sort = Sort(self)
612 sort.csort = self.csolver.getRegExpSort()
615 def getRoundingModeSort(self):
616 cdef Sort sort = Sort(self)
617 sort.csort = self.csolver.getRoundingModeSort()
620 def getStringSort(self):
621 cdef Sort sort = Sort(self)
622 sort.csort = self.csolver.getStringSort()
625 def mkArraySort(self, Sort indexSort, Sort elemSort):
626 cdef Sort sort = Sort(self)
627 sort.csort = self.csolver.mkArraySort(indexSort.csort, elemSort.csort)
630 def mkBitVectorSort(self, uint32_t size):
631 cdef Sort sort = Sort(self)
632 sort.csort = self.csolver.mkBitVectorSort(size)
635 def mkFloatingPointSort(self, uint32_t exp, uint32_t sig):
636 cdef Sort sort = Sort(self)
637 sort.csort = self.csolver.mkFloatingPointSort(exp, sig)
640 def mkDatatypeSort(self, DatatypeDecl dtypedecl):
641 cdef Sort sort = Sort(self)
642 sort.csort = self.csolver.mkDatatypeSort(dtypedecl.cdd)
645 def mkDatatypeSorts(self, list dtypedecls, unresolvedSorts = None):
646 """:return: A list of datatype sorts that correspond to dtypedecls and unresolvedSorts"""
647 if unresolvedSorts == None:
648 unresolvedSorts = set([])
650 assert isinstance(unresolvedSorts, Set)
653 cdef vector[c_DatatypeDecl] decls
654 for decl in dtypedecls:
655 decls.push_back((<DatatypeDecl?> decl).cdd)
657 cdef c_set[c_Sort] usorts
658 for usort in unresolvedSorts:
659 usorts.insert((<Sort?> usort).csort)
661 csorts = self.csolver.mkDatatypeSorts(
662 <const vector[c_DatatypeDecl]&> decls, <const c_set[c_Sort]&> usorts)
670 def mkFunctionSort(self, sorts, Sort codomain):
672 cdef Sort sort = Sort(self)
673 # populate a vector with dereferenced c_Sorts
674 cdef vector[c_Sort] v
676 if isinstance(sorts, Sort):
677 sort.csort = self.csolver.mkFunctionSort((<Sort?> sorts).csort,
679 elif isinstance(sorts, list):
681 v.push_back((<Sort?>s).csort)
683 sort.csort = self.csolver.mkFunctionSort(<const vector[c_Sort]&> v,
687 def mkParamSort(self, symbolname):
688 cdef Sort sort = Sort(self)
689 sort.csort = self.csolver.mkParamSort(symbolname.encode())
692 @expand_list_arg(num_req_args=0)
693 def mkPredicateSort(self, *sorts):
695 Supports the following arguments:
696 Sort mkPredicateSort(List[Sort] sorts)
698 where sorts can also be comma-separated arguments of
701 cdef Sort sort = Sort(self)
702 cdef vector[c_Sort] v
704 v.push_back((<Sort?> s).csort)
705 sort.csort = self.csolver.mkPredicateSort(<const vector[c_Sort]&> v)
708 @expand_list_arg(num_req_args=0)
709 def mkRecordSort(self, *fields):
711 Supports the following arguments:
712 Sort mkRecordSort(List[Tuple[str, Sort]] fields)
714 where fields can also be comma-separated arguments of
715 type Tuple[str, Sort]
717 cdef Sort sort = Sort(self)
718 cdef vector[pair[string, c_Sort]] v
719 cdef pair[string, c_Sort] p
723 p = pair[string, c_Sort](<string?> name, (<Sort?> sortarg).csort)
725 sort.csort = self.csolver.mkRecordSort(
726 <const vector[pair[string, c_Sort]] &> v)
729 def mkSetSort(self, Sort elemSort):
730 cdef Sort sort = Sort(self)
731 sort.csort = self.csolver.mkSetSort(elemSort.csort)
734 def mkBagSort(self, Sort elemSort):
735 cdef Sort sort = Sort(self)
736 sort.csort = self.csolver.mkBagSort(elemSort.csort)
739 def mkSequenceSort(self, Sort elemSort):
740 cdef Sort sort = Sort(self)
741 sort.csort = self.csolver.mkSequenceSort(elemSort.csort)
744 def mkUninterpretedSort(self, str name):
745 cdef Sort sort = Sort(self)
746 sort.csort = self.csolver.mkUninterpretedSort(name.encode())
749 def mkSortConstructorSort(self, str symbol, size_t arity):
750 cdef Sort sort = Sort(self)
751 sort.csort =self.csolver.mkSortConstructorSort(symbol.encode(), arity)
754 @expand_list_arg(num_req_args=0)
755 def mkTupleSort(self, *sorts):
757 Supports the following arguments:
758 Sort mkTupleSort(List[Sort] sorts)
760 where sorts can also be comma-separated arguments of
763 cdef Sort sort = Sort(self)
764 cdef vector[c_Sort] v
766 v.push_back((<Sort?> s).csort)
767 sort.csort = self.csolver.mkTupleSort(v)
770 @expand_list_arg(num_req_args=1)
771 def mkTerm(self, kind_or_op, *args):
773 Supports the following arguments:
774 Term mkTerm(Kind kind)
775 Term mkTerm(Kind kind, Op child1, List[Term] children)
776 Term mkTerm(Kind kind, List[Term] children)
778 where List[Term] can also be comma-separated arguments
780 cdef Term term = Term(self)
781 cdef vector[c_Term] v
784 if isinstance(kind_or_op, kind):
785 op = self.mkOp(kind_or_op)
788 term.cterm = self.csolver.mkTerm((<Op?> op).cop)
791 v.push_back((<Term?> a).cterm)
792 term.cterm = self.csolver.mkTerm((<Op?> op).cop, v)
795 def mkTuple(self, sorts, terms):
796 cdef vector[c_Sort] csorts
797 cdef vector[c_Term] cterms
800 csorts.push_back((<Sort?> s).csort)
802 cterms.push_back((<Term?> s).cterm)
803 cdef Term result = Term(self)
804 result.cterm = self.csolver.mkTuple(csorts, cterms)
807 @expand_list_arg(num_req_args=0)
808 def mkOp(self, kind k, *args):
810 Supports the following uses:
812 Op mkOp(Kind kind, Kind k)
813 Op mkOp(Kind kind, const string& arg)
814 Op mkOp(Kind kind, uint32_t arg)
815 Op mkOp(Kind kind, uint32_t arg0, uint32_t arg1)
817 cdef Op op = Op(self)
821 op.cop = self.csolver.mkOp(k.k)
823 if isinstance(args[0], str):
824 op.cop = self.csolver.mkOp(k.k,
827 elif isinstance(args[0], int):
828 op.cop = self.csolver.mkOp(k.k, <int?> args[0])
829 elif isinstance(args[0], list):
831 v.push_back((<int?> a))
832 op.cop = self.csolver.mkOp(k.k, <const vector[uint32_t]&> v)
834 raise ValueError("Unsupported signature"
835 " mkOp: {}".format(" X ".join([str(k), str(args[0])])))
837 if isinstance(args[0], int) and isinstance(args[1], int):
838 op.cop = self.csolver.mkOp(k.k, <int> args[0], <int> args[1])
840 raise ValueError("Unsupported signature"
841 " mkOp: {}".format(" X ".join([k, args[0], args[1]])))
845 cdef Term term = Term(self)
846 term.cterm = self.csolver.mkTrue()
850 cdef Term term = Term(self)
851 term.cterm = self.csolver.mkFalse()
854 def mkBoolean(self, bint val):
855 cdef Term term = Term(self)
856 term.cterm = self.csolver.mkBoolean(val)
860 cdef Term term = Term(self)
861 term.cterm = self.csolver.mkPi()
864 def mkInteger(self, val):
865 cdef Term term = Term(self)
866 if isinstance(val, str):
867 term.cterm = self.csolver.mkInteger(<const string &> str(val).encode())
869 assert(isinstance(val, int))
870 term.cterm = self.csolver.mkInteger((<int?> val))
873 def mkReal(self, val, den=None):
875 Make a real number term.
877 Really, makes a rational term.
879 Can be used in various forms.
880 * Given a string "N/D" constructs the corresponding rational.
881 * Given a string "W.D" constructs the reduction of (W * P + D)/P, where
882 P is the appropriate power of 10.
883 * Given a float f, constructs the rational matching f's string
884 representation. This means that mkReal(0.3) gives 3/10 and not the
885 IEEE-754 approximation of 3/10.
886 * Given a string "W" or an integer, constructs that integer.
887 * Given two strings and/or integers N and D, constructs N/D.
889 cdef Term term = Term(self)
891 term.cterm = self.csolver.mkReal(str(val).encode())
893 if not isinstance(val, int) or not isinstance(den, int):
894 raise ValueError("Expecting integers when"
895 " constructing a rational"
896 " but got: {}".format((val, den)))
897 term.cterm = self.csolver.mkReal("{}/{}".format(val, den).encode())
900 def mkRegexpEmpty(self):
901 cdef Term term = Term(self)
902 term.cterm = self.csolver.mkRegexpEmpty()
905 def mkRegexpSigma(self):
906 cdef Term term = Term(self)
907 term.cterm = self.csolver.mkRegexpSigma()
910 def mkEmptySet(self, Sort s):
911 cdef Term term = Term(self)
912 term.cterm = self.csolver.mkEmptySet(s.csort)
915 def mkEmptyBag(self, Sort s):
916 cdef Term term = Term(self)
917 term.cterm = self.csolver.mkEmptyBag(s.csort)
920 def mkSepNil(self, Sort sort):
921 cdef Term term = Term(self)
922 term.cterm = self.csolver.mkSepNil(sort.csort)
925 def mkString(self, str s, useEscSequences = None):
926 cdef Term term = Term(self)
928 cdef wchar_t* tmp = PyUnicode_AsWideCharString(s, &size)
929 if isinstance(useEscSequences, bool):
930 term.cterm = self.csolver.mkString(
931 s.encode(), <bint> useEscSequences)
933 term.cterm = self.csolver.mkString(c_wstring(tmp, size))
937 def mkEmptySequence(self, Sort sort):
938 cdef Term term = Term(self)
939 term.cterm = self.csolver.mkEmptySequence(sort.csort)
942 def mkUniverseSet(self, Sort sort):
943 cdef Term term = Term(self)
944 term.cterm = self.csolver.mkUniverseSet(sort.csort)
947 @expand_list_arg(num_req_args=0)
948 def mkBitVector(self, *args):
950 Supports the following arguments:
951 Term mkBitVector(int size, int val=0)
952 Term mkBitVector(int size, string val, int base)
954 cdef Term term = Term(self)
956 raise ValueError("Missing arguments to mkBitVector")
958 if not isinstance(size, int):
960 "Invalid first argument to mkBitVector '{}', "
961 "expected bit-vector size".format(size))
963 term.cterm = self.csolver.mkBitVector(<uint32_t> size)
966 if not isinstance(val, int):
968 "Invalid second argument to mkBitVector '{}', "
969 "expected integer value".format(size))
970 term.cterm = self.csolver.mkBitVector(
971 <uint32_t> size, <uint32_t> val)
975 if not isinstance(val, str):
977 "Invalid second argument to mkBitVector '{}', "
978 "expected value string".format(size))
979 if not isinstance(base, int):
981 "Invalid third argument to mkBitVector '{}', "
982 "expected base given as integer".format(size))
983 term.cterm = self.csolver.mkBitVector(
985 <const string&> str(val).encode(),
988 raise ValueError("Unexpected inputs to mkBitVector")
991 def mkConstArray(self, Sort sort, Term val):
992 cdef Term term = Term(self)
993 term.cterm = self.csolver.mkConstArray(sort.csort, val.cterm)
996 def mkPosInf(self, int exp, int sig):
997 cdef Term term = Term(self)
998 term.cterm = self.csolver.mkPosInf(exp, sig)
1001 def mkNegInf(self, int exp, int sig):
1002 cdef Term term = Term(self)
1003 term.cterm = self.csolver.mkNegInf(exp, sig)
1006 def mkNaN(self, int exp, int sig):
1007 cdef Term term = Term(self)
1008 term.cterm = self.csolver.mkNaN(exp, sig)
1011 def mkPosZero(self, int exp, int sig):
1012 cdef Term term = Term(self)
1013 term.cterm = self.csolver.mkPosZero(exp, sig)
1016 def mkNegZero(self, int exp, int sig):
1017 cdef Term term = Term(self)
1018 term.cterm = self.csolver.mkNegZero(exp, sig)
1021 def mkRoundingMode(self, RoundingMode rm):
1022 cdef Term term = Term(self)
1023 term.cterm = self.csolver.mkRoundingMode(<c_RoundingMode> rm.crm)
1026 def mkUninterpretedConst(self, Sort sort, int index):
1027 cdef Term term = Term(self)
1028 term.cterm = self.csolver.mkUninterpretedConst(sort.csort, index)
1031 def mkAbstractValue(self, index):
1032 cdef Term term = Term(self)
1034 term.cterm = self.csolver.mkAbstractValue(str(index).encode())
1037 "mkAbstractValue expects a str representing a number"
1038 " or an int, but got{}".format(index))
1041 def mkFloatingPoint(self, int exp, int sig, Term val):
1042 cdef Term term = Term(self)
1043 term.cterm = self.csolver.mkFloatingPoint(exp, sig, val.cterm)
1046 def mkConst(self, Sort sort, symbol=None):
1047 cdef Term term = Term(self)
1049 term.cterm = self.csolver.mkConst(sort.csort)
1051 term.cterm = self.csolver.mkConst(sort.csort,
1052 (<str?> symbol).encode())
1055 def mkVar(self, Sort sort, symbol=None):
1056 cdef Term term = Term(self)
1058 term.cterm = self.csolver.mkVar(sort.csort)
1060 term.cterm = self.csolver.mkVar(sort.csort,
1061 (<str?> symbol).encode())
1064 def mkDatatypeConstructorDecl(self, str name):
1065 cdef DatatypeConstructorDecl ddc = DatatypeConstructorDecl(self)
1066 ddc.cddc = self.csolver.mkDatatypeConstructorDecl(name.encode())
1069 def mkDatatypeDecl(self, str name, sorts_or_bool=None, isCoDatatype=None):
1070 cdef DatatypeDecl dd = DatatypeDecl(self)
1071 cdef vector[c_Sort] v
1074 if sorts_or_bool is None and isCoDatatype is None:
1075 dd.cdd = self.csolver.mkDatatypeDecl(name.encode())
1076 elif sorts_or_bool is not None and isCoDatatype is None:
1077 if isinstance(sorts_or_bool, bool):
1078 dd.cdd = self.csolver.mkDatatypeDecl(<const string &> name.encode(),
1079 <bint> sorts_or_bool)
1080 elif isinstance(sorts_or_bool, Sort):
1081 dd.cdd = self.csolver.mkDatatypeDecl(<const string &> name.encode(),
1082 (<Sort> sorts_or_bool).csort)
1083 elif isinstance(sorts_or_bool, list):
1084 for s in sorts_or_bool:
1085 v.push_back((<Sort?> s).csort)
1086 dd.cdd = self.csolver.mkDatatypeDecl(<const string &> name.encode(),
1087 <const vector[c_Sort]&> v)
1089 raise ValueError("Unhandled second argument type {}"
1090 .format(type(sorts_or_bool)))
1091 elif sorts_or_bool is not None and isCoDatatype is not None:
1092 if isinstance(sorts_or_bool, Sort):
1093 dd.cdd = self.csolver.mkDatatypeDecl(<const string &> name.encode(),
1094 (<Sort> sorts_or_bool).csort,
1095 <bint> isCoDatatype)
1096 elif isinstance(sorts_or_bool, list):
1097 for s in sorts_or_bool:
1098 v.push_back((<Sort?> s).csort)
1099 dd.cdd = self.csolver.mkDatatypeDecl(<const string &> name.encode(),
1100 <const vector[c_Sort]&> v,
1101 <bint> isCoDatatype)
1103 raise ValueError("Unhandled second argument type {}"
1104 .format(type(sorts_or_bool)))
1106 raise ValueError("Can't create DatatypeDecl with {}".format([type(a)
1113 def simplify(self, Term t):
1114 cdef Term term = Term(self)
1115 term.cterm = self.csolver.simplify(t.cterm)
1118 def assertFormula(self, Term term):
1119 self.csolver.assertFormula(term.cterm)
1122 cdef Result r = Result()
1123 r.cr = self.csolver.checkSat()
1126 def mkSygusGrammar(self, boundVars, ntSymbols):
1127 cdef Grammar grammar = Grammar(self)
1128 cdef vector[c_Term] bvc
1129 cdef vector[c_Term] ntc
1130 for bv in boundVars:
1131 bvc.push_back((<Term?> bv).cterm)
1132 for nt in ntSymbols:
1133 ntc.push_back((<Term?> nt).cterm)
1134 grammar.cgrammar = self.csolver.mkSygusGrammar(<const vector[c_Term]&> bvc, <const vector[c_Term]&> ntc)
1137 def mkSygusVar(self, Sort sort, str symbol=""):
1138 cdef Term term = Term(self)
1139 term.cterm = self.csolver.mkSygusVar(sort.csort, symbol.encode())
1142 def addSygusConstraint(self, Term t):
1143 self.csolver.addSygusConstraint(t.cterm)
1145 def addSygusInvConstraint(self, Term inv_f, Term pre_f, Term trans_f, Term post_f):
1146 self.csolver.addSygusInvConstraint(inv_f.cterm, pre_f.cterm, trans_f.cterm, post_f.cterm)
1148 def synthFun(self, str symbol, bound_vars, Sort sort, Grammar grammar=None):
1149 cdef Term term = Term(self)
1150 cdef vector[c_Term] v
1151 for bv in bound_vars:
1152 v.push_back((<Term?> bv).cterm)
1154 term.cterm = self.csolver.synthFun(symbol.encode(), <const vector[c_Term]&> v, sort.csort)
1156 term.cterm = self.csolver.synthFun(symbol.encode(), <const vector[c_Term]&> v, sort.csort, grammar.cgrammar)
1159 def checkSynth(self):
1160 cdef Result r = Result()
1161 r.cr = self.csolver.checkSynth()
1164 def getSynthSolution(self, Term term):
1165 cdef Term t = Term(self)
1166 t.cterm = self.csolver.getSynthSolution(term.cterm)
1169 def getSynthSolutions(self, list terms):
1171 cdef vector[c_Term] vec
1173 vec.push_back((<Term?> t).cterm)
1174 cresult = self.csolver.getSynthSolutions(vec)
1182 def synthInv(self, symbol, bound_vars, Grammar grammar=None):
1183 cdef Term term = Term(self)
1184 cdef vector[c_Term] v
1185 for bv in bound_vars:
1186 v.push_back((<Term?> bv).cterm)
1188 term.cterm = self.csolver.synthInv(symbol.encode(), <const vector[c_Term]&> v)
1190 term.cterm = self.csolver.synthInv(symbol.encode(), <const vector[c_Term]&> v, grammar.cgrammar)
1193 @expand_list_arg(num_req_args=0)
1194 def checkSatAssuming(self, *assumptions):
1196 Supports the following arguments:
1197 Result checkSatAssuming(List[Term] assumptions)
1199 where assumptions can also be comma-separated arguments of
1202 cdef Result r = Result()
1203 # used if assumptions is a list of terms
1204 cdef vector[c_Term] v
1205 for a in assumptions:
1206 v.push_back((<Term?> a).cterm)
1207 r.cr = self.csolver.checkSatAssuming(<const vector[c_Term]&> v)
1210 @expand_list_arg(num_req_args=0)
1211 def checkEntailed(self, *assumptions):
1213 Supports the following arguments:
1214 Result checkEntailed(List[Term] assumptions)
1216 where assumptions can also be comma-separated arguments of
1219 cdef Result r = Result()
1220 # used if assumptions is a list of terms
1221 cdef vector[c_Term] v
1222 for a in assumptions:
1223 v.push_back((<Term?> a).cterm)
1224 r.cr = self.csolver.checkEntailed(<const vector[c_Term]&> v)
1227 @expand_list_arg(num_req_args=1)
1228 def declareDatatype(self, str symbol, *ctors):
1230 Supports the following arguments:
1231 Sort declareDatatype(str symbol, List[Term] ctors)
1233 where ctors can also be comma-separated arguments of
1234 type DatatypeConstructorDecl
1236 cdef Sort sort = Sort(self)
1237 cdef vector[c_DatatypeConstructorDecl] v
1240 v.push_back((<DatatypeConstructorDecl?> c).cddc)
1241 sort.csort = self.csolver.declareDatatype(symbol.encode(), v)
1244 def declareFun(self, str symbol, list sorts, Sort sort):
1245 cdef Term term = Term(self)
1246 cdef vector[c_Sort] v
1248 v.push_back((<Sort?> s).csort)
1249 term.cterm = self.csolver.declareFun(symbol.encode(),
1250 <const vector[c_Sort]&> v,
1254 def declareSort(self, str symbol, int arity):
1255 cdef Sort sort = Sort(self)
1256 sort.csort = self.csolver.declareSort(symbol.encode(), arity)
1259 def defineFun(self, sym_or_fun, bound_vars, sort_or_term, t=None, glbl=False):
1262 Term defineFun(str symbol, List[Term] bound_vars,
1263 Sort sort, Term term, bool glbl)
1264 Term defineFun(Term fun, List[Term] bound_vars,
1265 Term term, bool glbl)
1267 cdef Term term = Term(self)
1268 cdef vector[c_Term] v
1269 for bv in bound_vars:
1270 v.push_back((<Term?> bv).cterm)
1273 term.cterm = self.csolver.defineFun((<str?> sym_or_fun).encode(),
1274 <const vector[c_Term] &> v,
1275 (<Sort?> sort_or_term).csort,
1279 term.cterm = self.csolver.defineFun((<Term?> sym_or_fun).cterm,
1280 <const vector[c_Term]&> v,
1281 (<Term?> sort_or_term).cterm,
1286 def defineFunRec(self, sym_or_fun, bound_vars, sort_or_term, t=None, glbl=False):
1289 Term defineFunRec(str symbol, List[Term] bound_vars,
1290 Sort sort, Term term, bool glbl)
1291 Term defineFunRec(Term fun, List[Term] bound_vars,
1292 Term term, bool glbl)
1294 cdef Term term = Term(self)
1295 cdef vector[c_Term] v
1296 for bv in bound_vars:
1297 v.push_back((<Term?> bv).cterm)
1300 term.cterm = self.csolver.defineFunRec((<str?> sym_or_fun).encode(),
1301 <const vector[c_Term] &> v,
1302 (<Sort?> sort_or_term).csort,
1306 term.cterm = self.csolver.defineFunRec((<Term?> sym_or_fun).cterm,
1307 <const vector[c_Term]&> v,
1308 (<Term?> sort_or_term).cterm,
1313 def defineFunsRec(self, funs, bound_vars, terms):
1314 cdef vector[c_Term] vf
1315 cdef vector[vector[c_Term]] vbv
1316 cdef vector[c_Term] vt
1319 vf.push_back((<Term?> f).cterm)
1321 cdef vector[c_Term] temp
1322 for v in bound_vars:
1324 temp.push_back((<Term?> t).cterm)
1329 vf.push_back((<Term?> t).cterm)
1331 def getAssertions(self):
1333 for a in self.csolver.getAssertions():
1336 assertions.append(term)
1339 def getInfo(self, str flag):
1340 return self.csolver.getInfo(flag.encode())
1342 def getOption(self, str option):
1343 return self.csolver.getOption(option.encode())
1345 def getUnsatAssumptions(self):
1347 for a in self.csolver.getUnsatAssumptions():
1350 assumptions.append(term)
1353 def getUnsatCore(self):
1355 for a in self.csolver.getUnsatCore():
1361 def getValue(self, Term t):
1362 cdef Term term = Term(self)
1363 term.cterm = self.csolver.getValue(t.cterm)
1366 def getModelDomainElements(self, Sort s):
1368 cresult = self.csolver.getModelDomainElements(s.csort)
1375 def isModelCoreSymbol(self, Term v):
1376 return self.csolver.isModelCoreSymbol(v.cterm)
1378 def getSeparationHeap(self):
1379 cdef Term term = Term(self)
1380 term.cterm = self.csolver.getSeparationHeap()
1383 def declareSeparationHeap(self, Sort locType, Sort dataType):
1384 self.csolver.declareSeparationHeap(locType.csort, dataType.csort)
1386 def getSeparationNilTerm(self):
1387 cdef Term term = Term(self)
1388 term.cterm = self.csolver.getSeparationNilTerm()
1391 def declarePool(self, str symbol, Sort sort, initValue):
1392 cdef Term term = Term(self)
1393 cdef vector[c_Term] niv
1395 niv.push_back((<Term?> v).cterm)
1396 term.cterm = self.csolver.declarePool(symbol.encode(), sort.csort, niv)
1399 def pop(self, nscopes=1):
1400 self.csolver.pop(nscopes)
1402 def push(self, nscopes=1):
1403 self.csolver.push(nscopes)
1405 def resetAssertions(self):
1406 self.csolver.resetAssertions()
1408 def setInfo(self, str keyword, str value):
1409 self.csolver.setInfo(keyword.encode(), value.encode())
1411 def setLogic(self, str logic):
1412 self.csolver.setLogic(logic.encode())
1414 def setOption(self, str option, str value):
1415 self.csolver.setOption(option.encode(), value.encode())
1421 def __cinit__(self, Solver solver):
1422 # csort always set by Solver
1423 self.solver = solver
1425 def __eq__(self, Sort other):
1426 return self.csort == other.csort
1428 def __ne__(self, Sort other):
1429 return self.csort != other.csort
1431 def __lt__(self, Sort other):
1432 return self.csort < other.csort
1434 def __gt__(self, Sort other):
1435 return self.csort > other.csort
1437 def __le__(self, Sort other):
1438 return self.csort <= other.csort
1440 def __ge__(self, Sort other):
1441 return self.csort >= other.csort
1444 return self.csort.toString().decode()
1447 return self.csort.toString().decode()
1450 return csorthash(self.csort)
1452 def isBoolean(self):
1453 return self.csort.isBoolean()
1455 def isInteger(self):
1456 return self.csort.isInteger()
1459 return self.csort.isReal()
1462 return self.csort.isString()
1465 return self.csort.isRegExp()
1467 def isRoundingMode(self):
1468 return self.csort.isRoundingMode()
1470 def isBitVector(self):
1471 return self.csort.isBitVector()
1473 def isFloatingPoint(self):
1474 return self.csort.isFloatingPoint()
1476 def isDatatype(self):
1477 return self.csort.isDatatype()
1479 def isParametricDatatype(self):
1480 return self.csort.isParametricDatatype()
1482 def isConstructor(self):
1483 return self.csort.isConstructor()
1485 def isSelector(self):
1486 return self.csort.isSelector()
1489 return self.csort.isTester()
1491 def isFunction(self):
1492 return self.csort.isFunction()
1494 def isPredicate(self):
1495 return self.csort.isPredicate()
1498 return self.csort.isTuple()
1501 return self.csort.isRecord()
1504 return self.csort.isArray()
1507 return self.csort.isSet()
1510 return self.csort.isBag()
1512 def isSequence(self):
1513 return self.csort.isSequence()
1515 def isUninterpretedSort(self):
1516 return self.csort.isUninterpretedSort()
1518 def isSortConstructor(self):
1519 return self.csort.isSortConstructor()
1521 def isFirstClass(self):
1522 return self.csort.isFirstClass()
1524 def isFunctionLike(self):
1525 return self.csort.isFunctionLike()
1527 def isSubsortOf(self, Sort sort):
1528 return self.csort.isSubsortOf(sort.csort)
1530 def isComparableTo(self, Sort sort):
1531 return self.csort.isComparableTo(sort.csort)
1533 def getDatatype(self):
1534 cdef Datatype d = Datatype(self.solver)
1535 d.cd = self.csort.getDatatype()
1538 def instantiate(self, params):
1539 cdef Sort sort = Sort(self.solver)
1540 cdef vector[c_Sort] v
1542 v.push_back((<Sort?> s).csort)
1543 sort.csort = self.csort.instantiate(v)
1546 def getConstructorArity(self):
1547 return self.csort.getConstructorArity()
1549 def getConstructorDomainSorts(self):
1551 for s in self.csort.getConstructorDomainSorts():
1552 sort = Sort(self.solver)
1554 domain_sorts.append(sort)
1557 def getConstructorCodomainSort(self):
1558 cdef Sort sort = Sort(self.solver)
1559 sort.csort = self.csort.getConstructorCodomainSort()
1562 def getSelectorDomainSort(self):
1563 cdef Sort sort = Sort(self.solver)
1564 sort.csort = self.csort.getSelectorDomainSort()
1567 def getSelectorCodomainSort(self):
1568 cdef Sort sort = Sort(self.solver)
1569 sort.csort = self.csort.getSelectorCodomainSort()
1572 def getTesterDomainSort(self):
1573 cdef Sort sort = Sort(self.solver)
1574 sort.csort = self.csort.getTesterDomainSort()
1577 def getTesterCodomainSort(self):
1578 cdef Sort sort = Sort(self.solver)
1579 sort.csort = self.csort.getTesterCodomainSort()
1582 def getFunctionArity(self):
1583 return self.csort.getFunctionArity()
1585 def getFunctionDomainSorts(self):
1587 for s in self.csort.getFunctionDomainSorts():
1588 sort = Sort(self.solver)
1590 domain_sorts.append(sort)
1593 def getFunctionCodomainSort(self):
1594 cdef Sort sort = Sort(self.solver)
1595 sort.csort = self.csort.getFunctionCodomainSort()
1598 def getArrayIndexSort(self):
1599 cdef Sort sort = Sort(self.solver)
1600 sort.csort = self.csort.getArrayIndexSort()
1603 def getArrayElementSort(self):
1604 cdef Sort sort = Sort(self.solver)
1605 sort.csort = self.csort.getArrayElementSort()
1608 def getSetElementSort(self):
1609 cdef Sort sort = Sort(self.solver)
1610 sort.csort = self.csort.getSetElementSort()
1613 def getBagElementSort(self):
1614 cdef Sort sort = Sort(self.solver)
1615 sort.csort = self.csort.getBagElementSort()
1618 def getSequenceElementSort(self):
1619 cdef Sort sort = Sort(self.solver)
1620 sort.csort = self.csort.getSequenceElementSort()
1623 def getUninterpretedSortName(self):
1624 return self.csort.getUninterpretedSortName().decode()
1626 def isUninterpretedSortParameterized(self):
1627 return self.csort.isUninterpretedSortParameterized()
1629 def getUninterpretedSortParamSorts(self):
1631 for s in self.csort.getUninterpretedSortParamSorts():
1632 sort = Sort(self.solver)
1634 param_sorts.append(sort)
1637 def getSortConstructorName(self):
1638 return self.csort.getSortConstructorName().decode()
1640 def getSortConstructorArity(self):
1641 return self.csort.getSortConstructorArity()
1643 def getBVSize(self):
1644 return self.csort.getBVSize()
1646 def getFPExponentSize(self):
1647 return self.csort.getFPExponentSize()
1649 def getFPSignificandSize(self):
1650 return self.csort.getFPSignificandSize()
1652 def getDatatypeParamSorts(self):
1654 for s in self.csort.getDatatypeParamSorts():
1655 sort = Sort(self.solver)
1657 param_sorts.append(sort)
1660 def getDatatypeArity(self):
1661 return self.csort.getDatatypeArity()
1663 def getTupleLength(self):
1664 return self.csort.getTupleLength()
1666 def getTupleSorts(self):
1668 for s in self.csort.getTupleSorts():
1669 sort = Sort(self.solver)
1671 tuple_sorts.append(sort)
1678 def __cinit__(self, Solver solver):
1679 # cterm always set in the Solver object
1680 self.solver = solver
1682 def __eq__(self, Term other):
1683 return self.cterm == other.cterm
1685 def __ne__(self, Term other):
1686 return self.cterm != other.cterm
1688 def __lt__(self, Term other):
1689 return self.cterm < other.cterm
1691 def __gt__(self, Term other):
1692 return self.cterm > other.cterm
1694 def __le__(self, Term other):
1695 return self.cterm <= other.cterm
1697 def __ge__(self, Term other):
1698 return self.cterm >= other.cterm
1700 def __getitem__(self, int index):
1701 cdef Term term = Term(self.solver)
1703 term.cterm = self.cterm[index]
1705 raise ValueError("Expecting a non-negative integer or string")
1709 return self.cterm.toString().decode()
1712 return self.cterm.toString().decode()
1715 for ci in self.cterm:
1716 term = Term(self.solver)
1721 return ctermhash(self.cterm)
1723 def getNumChildren(self):
1724 return self.cterm.getNumChildren()
1727 return self.cterm.getId()
1730 return kind(<int> self.cterm.getKind())
1733 cdef Sort sort = Sort(self.solver)
1734 sort.csort = self.cterm.getSort()
1737 def substitute(self, term_or_list_1, term_or_list_2):
1738 # The resulting term after substitution
1739 cdef Term term = Term(self.solver)
1740 # lists for substitutions
1741 cdef vector[c_Term] ces
1742 cdef vector[c_Term] creplacements
1744 # normalize the input parameters to be lists
1745 if isinstance(term_or_list_1, list):
1746 assert isinstance(term_or_list_2, list)
1748 replacements = term_or_list_2
1749 if len(es) != len(replacements):
1750 raise RuntimeError("Expecting list inputs to substitute to "
1751 "have the same length but got: "
1752 "{} and {}".format(len(es), len(replacements)))
1754 for e, r in zip(es, replacements):
1755 ces.push_back((<Term?> e).cterm)
1756 creplacements.push_back((<Term?> r).cterm)
1759 # add the single elements to the vectors
1760 ces.push_back((<Term?> term_or_list_1).cterm)
1761 creplacements.push_back((<Term?> term_or_list_2).cterm)
1763 # call the API substitute method with lists
1764 term.cterm = self.cterm.substitute(ces, creplacements)
1768 return self.cterm.hasOp()
1771 cdef Op op = Op(self.solver)
1772 op.cop = self.cterm.getOp()
1776 return self.cterm.isNull()
1779 cdef Term term = Term(self.solver)
1780 term.cterm = self.cterm.notTerm()
1783 def andTerm(self, Term t):
1784 cdef Term term = Term(self.solver)
1785 term.cterm = self.cterm.andTerm((<Term> t).cterm)
1788 def orTerm(self, Term t):
1789 cdef Term term = Term(self.solver)
1790 term.cterm = self.cterm.orTerm(t.cterm)
1793 def xorTerm(self, Term t):
1794 cdef Term term = Term(self.solver)
1795 term.cterm = self.cterm.xorTerm(t.cterm)
1798 def eqTerm(self, Term t):
1799 cdef Term term = Term(self.solver)
1800 term.cterm = self.cterm.eqTerm(t.cterm)
1803 def impTerm(self, Term t):
1804 cdef Term term = Term(self.solver)
1805 term.cterm = self.cterm.impTerm(t.cterm)
1808 def iteTerm(self, Term then_t, Term else_t):
1809 cdef Term term = Term(self.solver)
1810 term.cterm = self.cterm.iteTerm(then_t.cterm, else_t.cterm)
1813 def isConstArray(self):
1814 return self.cterm.isConstArray()
1816 def getConstArrayBase(self):
1817 cdef Term term = Term(self.solver)
1818 term.cterm = self.cterm.getConstArrayBase()
1821 def isBooleanValue(self):
1822 return self.cterm.isBooleanValue()
1824 def getBooleanValue(self):
1825 return self.cterm.getBooleanValue()
1827 def isStringValue(self):
1828 return self.cterm.isStringValue()
1830 def getStringValue(self):
1831 cdef Py_ssize_t size
1832 cdef c_wstring s = self.cterm.getStringValue()
1833 return PyUnicode_FromWideChar(s.data(), s.size())
1835 def isIntegerValue(self):
1836 return self.cterm.isIntegerValue()
1837 def isAbstractValue(self):
1838 return self.cterm.isAbstractValue()
1840 def getAbstractValue(self):
1841 return self.cterm.getAbstractValue().decode()
1843 def isFloatingPointPosZero(self):
1844 return self.cterm.isFloatingPointPosZero()
1846 def isFloatingPointNegZero(self):
1847 return self.cterm.isFloatingPointNegZero()
1849 def isFloatingPointPosInf(self):
1850 return self.cterm.isFloatingPointPosInf()
1852 def isFloatingPointNegInf(self):
1853 return self.cterm.isFloatingPointNegInf()
1855 def isFloatingPointNaN(self):
1856 return self.cterm.isFloatingPointNaN()
1858 def isFloatingPointValue(self):
1859 return self.cterm.isFloatingPointValue()
1861 def getFloatingPointValue(self):
1862 cdef c_tuple[uint32_t, uint32_t, c_Term] t = self.cterm.getFloatingPointValue()
1863 cdef Term term = Term(self.solver)
1864 term.cterm = get2(t)
1865 return (get0(t), get1(t), term)
1867 def isSetValue(self):
1868 return self.cterm.isSetValue()
1870 def getSetValue(self):
1872 for e in self.cterm.getSetValue():
1873 term = Term(self.solver)
1878 def isSequenceValue(self):
1879 return self.cterm.isSequenceValue()
1881 def getSequenceValue(self):
1883 for e in self.cterm.getSequenceValue():
1884 term = Term(self.solver)
1889 def isUninterpretedValue(self):
1890 return self.cterm.isUninterpretedValue()
1892 def getUninterpretedValue(self):
1893 cdef pair[c_Sort, int32_t] p = self.cterm.getUninterpretedValue()
1894 cdef Sort sort = Sort(self.solver)
1895 sort.csort = p.first
1899 def isTupleValue(self):
1900 return self.cterm.isTupleValue()
1902 def getTupleValue(self):
1904 for e in self.cterm.getTupleValue():
1905 term = Term(self.solver)
1910 def getIntegerValue(self):
1911 return int(self.cterm.getIntegerValue().decode())
1913 def isRealValue(self):
1914 return self.cterm.isRealValue()
1916 def getRealValue(self):
1917 '''Returns the value of a real term as a Fraction'''
1918 return Fraction(self.cterm.getRealValue().decode())
1920 def isBitVectorValue(self):
1921 return self.cterm.isBitVectorValue()
1923 def getBitVectorValue(self, base = 2):
1924 '''Returns the value of a bit-vector term as a 0/1 string'''
1925 return self.cterm.getBitVectorValue(base).decode()
1927 def toPythonObj(self):
1929 Converts a constant value Term to a Python object.
1932 Boolean -- returns a Python bool
1933 Int -- returns a Python int
1934 Real -- returns a Python Fraction
1935 BV -- returns a Python int (treats BV as unsigned)
1936 String -- returns a Python Unicode string
1937 Array -- returns a Python dict mapping indices to values
1938 -- the constant base is returned as the default value
1941 if self.isBooleanValue():
1942 return self.getBooleanValue()
1943 elif self.isIntegerValue():
1944 return self.getIntegerValue()
1945 elif self.isRealValue():
1946 return self.getRealValue()
1947 elif self.isBitVectorValue():
1948 return int(self.getBitVectorValue(), 2)
1949 elif self.isStringValue():
1950 return self.getStringValue()
1951 elif self.getSort().isArray():
1957 # Array models are represented as a series of store operations
1958 # on a constant array
1961 if t.getKind() == kinds.Store:
1963 keys.append(t[1].toPythonObj())
1964 values.append(t[2].toPythonObj())
1965 to_visit.append(t[0])
1967 assert t.getKind() == kinds.ConstArray
1968 base_value = t.getConstArrayBase().toPythonObj()
1970 assert len(keys) == len(values)
1971 assert base_value is not None
1973 # put everything in a dictionary with the constant
1974 # base as the result for any index not included in the stores
1975 res = defaultdict(lambda : base_value)
1976 for k, v in zip(keys, values):
1982 # Generate rounding modes
1983 cdef __rounding_modes = {
1984 <int> ROUND_NEAREST_TIES_TO_EVEN: "RoundNearestTiesToEven",
1985 <int> ROUND_TOWARD_POSITIVE: "RoundTowardPositive",
1986 <int> ROUND_TOWARD_NEGATIVE: "RoundTowardNegative",
1987 <int> ROUND_TOWARD_ZERO: "RoundTowardZero",
1988 <int> ROUND_NEAREST_TIES_TO_AWAY: "RoundNearestTiesToAway"
1991 mod_ref = sys.modules[__name__]
1992 for rm_int, name in __rounding_modes.items():
1993 r = RoundingMode(rm_int)
1995 if name in dir(mod_ref):
1996 raise RuntimeError("Redefinition of Python RoundingMode %s."%name)
1998 setattr(mod_ref, name, r)
2005 # Generate unknown explanations
2006 cdef __unknown_explanations = {
2007 <int> REQUIRES_FULL_CHECK: "RequiresFullCheck",
2008 <int> INCOMPLETE: "Incomplete",
2009 <int> TIMEOUT: "Timeout",
2010 <int> RESOURCEOUT: "Resourceout",
2011 <int> MEMOUT: "Memout",
2012 <int> INTERRUPTED: "Interrupted",
2013 <int> NO_STATUS: "NoStatus",
2014 <int> UNSUPPORTED: "Unsupported",
2015 <int> OTHER: "Other",
2016 <int> UNKNOWN_REASON: "UnknownReason"
2019 for ue_int, name in __unknown_explanations.items():
2020 u = UnknownExplanation(ue_int)
2022 if name in dir(mod_ref):
2023 raise RuntimeError("Redefinition of Python UnknownExplanation %s."%name)
2025 setattr(mod_ref, name, u)