################################## DECORATORS #################################
def expand_list_arg(num_req_args=0):
"""
- Creates a decorator that looks at index num_req_args of the args,
- if it's a list, it expands it before calling the function.
+ Creates a decorator that looks at index num_req_args of the args,
+ if it's a list, it expands it before calling the function.
"""
def decorator(func):
@wraps(func)
cdef class Datatype:
"""
A cvc5 datatype.
- Wrapper class for :cpp:class:`cvc5::Datatype`.
+
+ Wrapper class for the C++ class :cpp:class:`cvc5::Datatype`.
"""
cdef c_Datatype cd
cdef Solver solver
def getConstructor(self, str name):
"""
- :param name: the name of the constructor.
- :return: a constructor by name.
+ :param name: The name of the constructor.
+ :return: A constructor by name.
"""
cdef DatatypeConstructor dc = DatatypeConstructor(self.solver)
dc.cdc = self.cd.getConstructor(name.encode())
def getConstructorTerm(self, str name):
"""
- :param name: the name of the constructor.
- :return: the term representing the datatype constructor with the given name (see :cpp:func:`Datatype::getConstructorTerm() <cvc5::Datatype::getConstructorTerm>`).
+ :param name: The name of the constructor.
+ :return: The term representing the datatype constructor with the
+ given name.
"""
cdef Term term = Term(self.solver)
term.cterm = self.cd.getConstructorTerm(name.encode())
def getSelector(self, str name):
"""
- :param name: the name of the selector..
- :return: a selector by name.
+ :param name: The name of the selector..
+ :return: A selector by name.
"""
cdef DatatypeSelector ds = DatatypeSelector(self.solver)
ds.cds = self.cd.getSelector(name.encode())
def getName(self):
"""
- :return: the name of the datatype.
+ :return: The name of the datatype.
"""
return self.cd.getName().decode()
def getNumConstructors(self):
"""
- :return: number of constructors in this datatype.
+ :return: The number of constructors in this datatype.
"""
return self.cd.getNumConstructors()
def getParameters(self):
"""
- :return: the parameters of this datatype, if it is parametric. An exception is thrown if this datatype is not parametric.
+ :return: The parameters of this datatype, if it is parametric. An
+ exception is thrown if this datatype is not parametric.
"""
param_sorts = []
for s in self.cd.getParameters():
return self.cd.isParametric()
def isCodatatype(self):
- """:return: True if this datatype corresponds to a co-datatype."""
+ """
+ :return: True if this datatype corresponds to a co-datatype.
+ """
return self.cd.isCodatatype()
def isTuple(self):
- """:return: True if this datatype corresponds to a tuple."""
+ """
+ :return: True if this datatype corresponds to a tuple.
+ """
return self.cd.isTuple()
def isRecord(self):
return self.cd.isRecord()
def isFinite(self):
- """:return: True if this datatype is finite."""
+ """
+ :return: True if this datatype is finite.
+ """
return self.cd.isFinite()
def isWellFounded(self):
- """:return: True if this datatype is well-founded (see :cpp:func:`Datatype::isWellFounded() <cvc5::Datatype::isWellFounded>`)."""
+ """
+ Is this datatype well-founded?
+
+ If this datatype is not a codatatype, this returns false if there
+ are no values of this datatype that are of finite size.
+
+ :return: True if this datatype is well-founded
+ """
return self.cd.isWellFounded()
def isNull(self):
- """:return: True if this Datatype is a null object."""
+ """
+ :return: True if this Datatype is a null object.
+ """
return self.cd.isNull()
def __str__(self):
cdef class DatatypeConstructor:
"""
A cvc5 datatype constructor.
+
Wrapper class for :cpp:class:`cvc5::DatatypeConstructor`.
"""
cdef c_DatatypeConstructor cdc
def getName(self):
"""
- :return: the name of the constructor.
+ :return: The name of the constructor.
"""
return self.cdc.getName().decode()
def getConstructorTerm(self):
"""
- :return: the constructor operator as a term.
+ :return: The constructor operator as a term.
"""
cdef Term term = Term(self.solver)
term.cterm = self.cdc.getConstructorTerm()
def getInstantiatedConstructorTerm(self, Sort retSort):
"""
- Specialized method for parametric datatypes (see
- :cpp:func:`DatatypeConstructor::getInstantiatedConstructorTerm()
- <cvc5::DatatypeConstructor::getInstantiatedConstructorTerm>`).
+ Get the constructor operator of this datatype constructor whose
+ return type is retSort. This method is intended to be used on
+ constructors of parametric datatypes and can be seen as returning
+ the constructor term that has been explicitly cast to the given
+ sort.
+
+ This method is required for constructors of parametric datatypes
+ whose return type cannot be determined by type inference. For
+ example, given:
+
+ .. code:: smtlib
+
+ (declare-datatype List
+ (par (T) ((nil) (cons (head T) (tail (List T))))))
+
+ The type of nil terms must be provided by the user. In SMT version
+ 2.6, this is done via the syntax for qualified identifiers:
+
+ .. code:: smtlib
+
+ (as nil (List Int))
+
+ This method is equivalent of applying the above, where this
+ DatatypeConstructor is the one corresponding to nil, and retSort is
+ ``(List Int)``.
+
+ .. note::
+
+ The returned constructor term ``t`` is an operator, while
+ ``Solver.mkTerm(APPLY_CONSTRUCTOR, [t])`` is used to construct
+ the above (nullary) application of nil.
.. warning:: This method is experimental and may change in future
versions.
- :param retSort: the desired return sort of the constructor
- :return: the constructor operator as a term.
+ :param retSort: The desired return sort of the constructor.
+ :return: The constructor operator as a term.
"""
cdef Term term = Term(self.solver)
term.cterm = self.cdc.getInstantiatedConstructorTerm(retSort.csort)
def getTesterTerm(self):
"""
- :return: the tester operator that is related to this constructor, as a term.
+ :return: The tester operator that is related to this constructor,
+ as a term.
"""
cdef Term term = Term(self.solver)
term.cterm = self.cdc.getTesterTerm()
def getNumSelectors(self):
"""
- :return: the number of selecters (so far) of this Datatype constructor.
+ :return: The number of selecters (so far) of this Datatype
+ constructor.
"""
return self.cdc.getNumSelectors()
def getSelector(self, str name):
"""
- :param name: the name of the datatype selector.
- :return: the first datatype selector with the given name
+ :param name: The name of the datatype selector.
+ :return: The first datatype selector with the given name.
"""
cdef DatatypeSelector ds = DatatypeSelector(self.solver)
ds.cds = self.cdc.getSelector(name.encode())
def getSelectorTerm(self, str name):
"""
- :param name: the name of the datatype selector.
- :return: a term representing the firstdatatype selector with the given name.
+ :param name: The name of the datatype selector.
+ :return: A term representing the firstdatatype selector with the
+ given name.
"""
cdef Term term = Term(self.solver)
term.cterm = self.cdc.getSelectorTerm(name.encode())
return term
def isNull(self):
- """:return: True if this DatatypeConstructor is a null object."""
+ """
+ :return: True if this DatatypeConstructor is a null object.
+ """
return self.cdc.isNull()
def __str__(self):
cdef class DatatypeConstructorDecl:
"""
A cvc5 datatype constructor declaration.
+
Wrapper class for :cpp:class:`cvc5::DatatypeConstructorDecl`.
"""
cdef c_DatatypeConstructorDecl cddc
"""
Add datatype selector declaration.
- :param name: the name of the datatype selector declaration to add.
- :param sort: the codomain sort of the datatype selector declaration
+ :param name: The name of the datatype selector declaration to add.
+ :param sort: The codomain sort of the datatype selector declaration
to add.
"""
self.cddc.addSelector(name.encode(), sort.csort)
Add datatype selector declaration whose codomain sort is the
datatype itself.
- :param name: the name of the datatype selector declaration to add.
+ :param name: The name of the datatype selector declaration to add.
"""
self.cddc.addSelectorSelf(name.encode())
def isNull(self):
- """:return: True if this DatatypeConstructorDecl is a null object."""
+ """
+ :return: True if this DatatypeConstructorDecl is a null object.
+ """
return self.cddc.isNull()
def __str__(self):
cdef class DatatypeDecl:
"""
A cvc5 datatype declaration.
+
Wrapper class for :cpp:class:`cvc5::DatatypeDecl`.
"""
cdef c_DatatypeDecl cdd
"""
Add a datatype constructor declaration.
- :param ctor: the datatype constructor declaration to add.
+ :param ctor: The datatype constructor declaration to add.
"""
self.cdd.addConstructor(ctor.cddc)
def getNumConstructors(self):
"""
- :return: number of constructors (so far) for this datatype declaration.
+ :return: The number of constructors (so far) for this datatype
+ declaration.
"""
return self.cdd.getNumConstructors()
def isParametric(self):
"""
- :return: is this datatype declaration parametric?
+ :return: True if this datatype declaration is parametric.
"""
return self.cdd.isParametric()
def getName(self):
"""
- :return: the name of this datatype declaration.
+ :return: The name of this datatype declaration.
"""
return self.cdd.getName().decode()
def isNull(self):
- """:return: True if this DatatypeDecl is a null object."""
+ """
+ :return: True if this DatatypeDecl is a null object.
+ """
return self.cdd.isNull()
def __str__(self):
cdef class DatatypeSelector:
"""
A cvc5 datatype selector.
+
Wrapper class for :cpp:class:`cvc5::DatatypeSelector`.
"""
cdef c_DatatypeSelector cds
def getName(self):
"""
- :return: the name of this datatype selector.
+ :return: The name of this datatype selector.
"""
return self.cds.getName().decode()
def getSelectorTerm(self):
"""
- :return: the selector opeartor of this datatype selector as a term.
+ :return: The selector opeartor of this datatype selector as a term.
"""
cdef Term term = Term(self.solver)
term.cterm = self.cds.getSelectorTerm()
def getUpdaterTerm(self):
"""
- :return: the updater opeartor of this datatype selector as a term.
+ :return: The updater opeartor of this datatype selector as a term.
"""
cdef Term term = Term(self.solver)
term.cterm = self.cds.getUpdaterTerm()
def getCodomainSort(self):
"""
- :return: the codomain sort of this selector.
+ :return: The codomain sort of this selector.
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.cds.getCodomainSort()
return sort
def isNull(self):
- """:return: True if this DatatypeSelector is a null object."""
+ """
+ :return: True if this DatatypeSelector is a null object.
+ """
return self.cds.isNull()
def __str__(self):
cdef class Op:
"""
A cvc5 operator.
+
An operator is a term that represents certain operators,
instantiated with its required parameters, e.g.,
- a term of kind :cpp:enumerator:`BITVECTOR_EXTRACT`.
+ a term of kind :py:obj:`BVExtract <cvc5.Kind.BVExtract>`.
+
Wrapper class for :cpp:class:`cvc5::Op`.
"""
cdef c_Op cop
def getKind(self):
"""
- :return: the kind of this operator.
+ :return: The kind of this operator.
"""
return Kind(<int> self.cop.getKind())
def getNumIndices(self):
"""
- :return: number of indices of this op.
+ :return: The number of indices of this op.
"""
return self.cop.getNumIndices()
def __getitem__(self, i):
"""
- Get the index at position i.
- :param i: the position of the index to return
- :return: the index at position i
+ Get the index at position ``i``.
+
+ :param i: The position of the index to return.
+ :return: The index at position ``i``.
"""
cdef Term term = Term(self.solver)
term.cterm = self.cop[i]
cdef class Grammar:
"""
A Sygus Grammar.
+
Wrapper class for :cpp:class:`cvc5::Grammar`.
"""
cdef c_Grammar cgrammar
"""
Add ``rule`` to the set of rules corresponding to ``ntSymbol``.
- :param ntSymbol: the non-terminal to which the rule is added.
- :param rule: the rule to add.
+ :param ntSymbol: The non-terminal to which the rule is added.
+ :param rule: The rule to add.
"""
self.cgrammar.addRule(ntSymbol.cterm, rule.cterm)
"""
Allow ``ntSymbol`` to be an arbitrary constant.
- :param ntSymbol: the non-terminal allowed to be constant.
+ :param ntSymbol: The non-terminal allowed to be constant.
"""
self.cgrammar.addAnyConstant(ntSymbol.cterm)
def addAnyVariable(self, Term ntSymbol):
"""
- Allow ``ntSymbol`` to be any input variable to corresponding synth-fun/synth-inv with the same sort as ``ntSymbol``.
+ Allow ``ntSymbol`` to be any input variable to corresponding
+ synth-fun/synth-inv with the same sort as ``ntSymbol``.
- :param ntSymbol: the non-terminal allowed to be any input variable.
+ :param ntSymbol: The non-terminal allowed to be any input variable.
"""
self.cgrammar.addAnyVariable(ntSymbol.cterm)
"""
Add ``ntSymbol`` to the set of rules corresponding to ``ntSymbol``.
- :param ntSymbol: the non-terminal to which the rules are added.
- :param rules: the rules to add.
+ :param ntSymbol: The non-terminal to which the rules are added.
+ :param rules: The rules to add.
"""
cdef vector[c_Term] crules
for r in rules:
cdef class Result:
"""
Encapsulation of a three-valued solver result, with explanations.
+
Wrapper class for :cpp:class:`cvc5::Result`.
"""
cdef c_Result cr
def isNull(self):
"""
- :return: True if Result is empty, i.e., a nullary Result, and not an actual result returned from a
- :cpp:func:`Solver::checkSat() <cvc5::Solver::checkSat>` (and friends) query.
+ :return: True if Result is empty, i.e., a nullary Result, and not
+ an actual result returned from a
+ :py:meth:`Solver.checkSat()` (and friends) query.
"""
return self.cr.isNull()
def isSat(self):
"""
- :return: True if query was a satisfiable :cpp:func:`Solver::checkSat() <cvc5::Solver::checkSat>` or :cpp:func:`Solver::checkSatAssuming() <cvc5::Solver::checkSatAssuming>` query.
+ :return: True if query was a satisfiable
+ :py:meth:`Solver.checkSat()` or
+ :py:meth:`Solver.checkSatAssuming()` query.
"""
return self.cr.isSat()
def isUnsat(self):
"""
- :return: True if query was an usatisfiable :cpp:func:`Solver::checkSat() <cvc5::Solver::checkSat>` or :cpp:func:`Solver::checkSatAssuming() <cvc5::Solver::checkSatAssuming>` query.
+ :return: True if query was an usatisfiable
+ :py:meth:`Solver.checkSat()` or
+ :py:meth:`Solver.checkSatAssuming()` query.
"""
return self.cr.isUnsat()
def isUnknown(self):
"""
- :return: True if query was a :cpp:func:`Solver::checkSat() <cvc5::Solver::checkSat>` or :cpp:func:`Solver::checkSatAssuming() <cvc5::Solver::checkSatAssuming>` query and cvc5 was not able to determine (un)satisfiability.
+ :return: True if query was a :py:meth:`Solver.checkSat()` or
+ :py:meth:`Solver.checkSatAssuming()` query and cvc5 was
+ not able to determine (un)satisfiability.
"""
return self.cr.isUnknown()
def getUnknownExplanation(self):
"""
- :return: an explanation for an unknown query result.
+ :return: An explanation for an unknown query result.
"""
return UnknownExplanation(<int> self.cr.getUnknownExplanation())
cdef class SynthResult:
"""
- Encapsulation of a solver synth result. This is the return value of the
- API methods:
+ Encapsulation of a solver synth result.
+
+ This is the return value of the API methods:
+
- :py:meth:`Solver.checkSynth()`
- :py:meth:`Solver.checkSynthNext()`
+
which we call synthesis queries. This class indicates whether the
synthesis query has a solution, has no solution, or is unknown.
"""
def isNull(self):
"""
- :return: True if SynthResult is null, i.e. not a SynthResult returned from a synthesis query.
+ :return: True if SynthResult is null, i.e., not a SynthResult
+ returned from a synthesis query.
"""
return self.cr.isNull()
def hasNoSolution(self):
"""
:return: True if the synthesis query has no solution.
- In this case, then it was determined there was no solution.
+ In this case, it was determined that there was no solution.
"""
return self.cr.hasNoSolution()
def isUnknown(self):
"""
- :return: True if the result of the synthesis query could not be determined.
+ :return: True if the result of the synthesis query could not be
+ determined.
"""
return self.cr.isUnknown()
cdef class Solver:
- """Wrapper class for :cpp:class:`cvc5::Solver`."""
+ """
+ A cvc5 solver.
+
+ Wrapper class for :cpp:class:`cvc5::Solver`.
+ """
cdef c_Solver* csolver
def __cinit__(self):
del self.csolver
def getBooleanSort(self):
- """:return: sort Boolean
+ """
+ :return: Sort Boolean.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.getBooleanSort()
return sort
def getIntegerSort(self):
- """:return: sort Integer
+ """
+ :return: Sort Integer.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.getIntegerSort()
return sort
def getNullSort(self):
- """:return: sort null
+ """
+ :return: A null sort object.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.getNullSort()
return sort
def getRealSort(self):
- """:return: sort Real
+ """
+ :return: Sort Real.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.getRealSort()
return sort
def getRegExpSort(self):
- """:return: sort of RegExp
+ """:return: The sort of regular expressions.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.getRegExpSort()
return sort
def getRoundingModeSort(self):
- """:return: sort RoundingMode
+ """:return: Sort RoundingMode.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.getRoundingModeSort()
return sort
def getStringSort(self):
- """:return: sort String
+ """:return: Sort String.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.getStringSort()
return sort
def mkArraySort(self, Sort indexSort, Sort elemSort):
- """Create an array sort.
+ """
+ Create an array sort.
- :param indexSort: the array index sort
- :param elemSort: the array element sort
- :return: the array sort
+ :param indexSort: The array index sort.
+ :param elemSort: The array element sort.
+ :return: The array sort.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.mkArraySort(indexSort.csort, elemSort.csort)
return sort
def mkBitVectorSort(self, uint32_t size):
- """Create a bit-vector sort.
+ """
+ Create a bit-vector sort.
- :param size: the bit-width of the bit-vector sort
- :return: the bit-vector sort
+ :param size: The bit-width of the bit-vector sort
+ :return: The bit-vector sort
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.mkBitVectorSort(size)
return sort
def mkFloatingPointSort(self, uint32_t exp, uint32_t sig):
- """Create a floating-point sort.
+ """
+ Create a floating-point sort.
- :param exp: the bit-width of the exponent of the floating-point sort.
- :param sig: the bit-width of the significand of the floating-point sort.
+ :param exp: The bit-width of the exponent of the floating-point
+ sort.
+ :param sig: The bit-width of the significand of the floating-point
+ sort.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.mkFloatingPointSort(exp, sig)
return sort
def mkDatatypeSort(self, DatatypeDecl dtypedecl):
- """Create a datatype sort.
+ """
+ Create a datatype sort.
- :param dtypedecl: the datatype declaration from which the sort is created
- :return: the datatype sort
+ :param dtypedecl: The datatype declaration from which the sort is
+ created.
+ :return: The datatype sort.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.mkDatatypeSort(dtypedecl.cdd)
def mkDatatypeSorts(self, list dtypedecls, unresolvedSorts = None):
"""
- Create a vector of datatype sorts using unresolved sorts. The names of
- the datatype declarations in dtypedecls must be distinct.
+ Create a vector of datatype sorts using unresolved sorts. The names
+ of the datatype declarations in dtypedecls must be distinct.
- This method is called when the DatatypeDecl objects dtypedecls have been
- built using "unresolved" sorts.
+ This method is called when the DatatypeDecl objects dtypedecls have
+ been built using "unresolved" sorts.
- We associate each sort in unresolvedSorts with exacly one datatype from
- dtypedecls. In particular, it must have the same name as exactly one
- datatype declaration in dtypedecls.
+ We associate each sort in unresolvedSorts with exacly one datatype
+ from dtypedecls. In particular, it must have the same name as
+ exactly one datatype declaration in dtypedecls.
- When constructing datatypes, unresolved sorts are replaced by the datatype
- sort constructed for the datatype declaration it is associated with.
+ When constructing datatypes, unresolved sorts are replaced by the
+ datatype sort constructed for the datatype declaration it is
+ associated with.
- :param dtypedecls: the datatype declarations from which the sort is created
- :param unresolvedSorts: the list of unresolved sorts
- :return: the datatype sorts
+ :param dtypedecls: The datatype declarations from which the sort is
+ created.
+ :param unresolvedSorts: The list of unresolved sorts.
+ :return: The datatype sorts.
"""
if unresolvedSorts == None:
unresolvedSorts = set([])
return sorts
def mkFunctionSort(self, sorts, Sort codomain):
- """ Create function sort.
+ """
+ Create function sort.
- :param sorts: the sort of the function arguments
- :param codomain: the sort of the function return value
- :return: the function sort
+ :param sorts: The sort of the function arguments.
+ :param codomain: The sort of the function return value.
+ :return: The function sort.
"""
cdef Sort sort = Sort(self)
return sort
def mkParamSort(self, str symbolname = None):
- """ Create a sort parameter.
+ """
+ Create a sort parameter.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :param symbol: the name of the sort
- :return: the sort parameter
+ :param symbol: The name of the sort.
+ :return: The sort parameter.
"""
cdef Sort sort = Sort(self)
if symbolname is None:
@expand_list_arg(num_req_args=0)
def mkPredicateSort(self, *sorts):
- """Create a predicate sort.
+ """
+ Create a predicate sort.
- :param sorts: the list of sorts of the predicate, as a list or as distinct arguments.
- :return: the predicate sort
+ :param sorts: The list of sorts of the predicate, as a list or as
+ distinct arguments.
+ :return: The predicate sort.
"""
cdef Sort sort = Sort(self)
cdef vector[c_Sort] v
@expand_list_arg(num_req_args=0)
def mkRecordSort(self, *fields):
- """Create a record sort
+ """
+ Create a record sort
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :param fields: the list of fields of the record, as a list or as distinct arguments
- :return: the record sort
+ :param fields: The list of fields of the record, as a list or as
+ distinct arguments.
+ :return: The record sort.
"""
cdef Sort sort = Sort(self)
cdef vector[pair[string, c_Sort]] v
return sort
def mkSetSort(self, Sort elemSort):
- """Create a set sort.
+ """
+ Create a set sort.
- :param elemSort: the sort of the set elements
- :return: the set sort
+ :param elemSort: The sort of the set elements.
+ :return: The set sort.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.mkSetSort(elemSort.csort)
return sort
def mkBagSort(self, Sort elemSort):
- """Create a bag sort.
+ """
+ Create a bag sort.
- :param elemSort: the sort of the bag elements
- :return: the bag sort
+ :param elemSort: The sort of the bag elements.
+ :return: The bag sort.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.mkBagSort(elemSort.csort)
return sort
def mkSequenceSort(self, Sort elemSort):
- """Create a sequence sort.
+ """
+ Create a sequence sort.
- :param elemSort: the sort of the sequence elements
- :return: the sequence sort
+ :param elemSort: The sort of the sequence elements
+ :return: The sequence sort.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.mkSequenceSort(elemSort.csort)
return sort
def mkUninterpretedSort(self, str name = None):
- """Create an uninterpreted sort.
+ """
+ Create an uninterpreted sort.
- :param symbol: the name of the sort
- :return: the uninterpreted sort
+ :param symbol: The name of the sort.
+ :return: The uninterpreted sort.
"""
cdef Sort sort = Sort(self)
if name is None:
return sort
def mkUnresolvedSort(self, str name, size_t arity = 0):
- """Create an unresolved sort.
+ """
+ Create an unresolved sort.
- This is for creating yet unresolved sort placeholders for mutually
- recursive datatypes.
+ This is for creating yet unresolved sort placeholders for mutually
+ recursive datatypes.
- :param symbol: the name of the sort
- :param arity: the number of sort parameters of the sort
- :return: the unresolved sort
+ :param symbol: The name of the sort.
+ :param arity: The number of sort parameters of the sort.
+ :return: The unresolved sort.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.mkUnresolvedSort(name.encode(), arity)
return sort
def mkUninterpretedSortConstructorSort(self, size_t arity, str symbol = None):
- """Create a sort constructor sort.
+ """
+ Create a sort constructor sort.
- An uninterpreted sort constructor is an uninterpreted sort with
- arity > 0.
+ An uninterpreted sort constructor is an uninterpreted sort with
+ arity > 0.
- :param symbol: the symbol of the sort
- :param arity: the arity of the sort (must be > 0)
- :return: the sort constructor sort
+ :param symbol: The symbol of the sort.
+ :param arity: The arity of the sort (must be > 0).
+ :return: The sort constructor sort.
"""
cdef Sort sort = Sort(self)
if symbol is None:
@expand_list_arg(num_req_args=0)
def mkTupleSort(self, *sorts):
- """Create a tuple sort.
+ """
+ Create a tuple sort.
- :param sorts: of the elements of the tuple, as a list or as distinct arguments
- :return: the tuple sort
+ :param sorts: Of the elements of the tuple, as a list or as
+ distinct arguments.
+ :return: The tuple sort.
"""
cdef Sort sort = Sort(self)
cdef vector[c_Sort] v
@expand_list_arg(num_req_args=1)
def mkTerm(self, kind_or_op, *args):
"""
- Supports the following arguments:
+ Create a term.
+
+ Supports the following arguments:
- - ``Term mkTerm(Kind kind)``
- - ``Term mkTerm(Kind kind, Op child1, List[Term] children)``
- - ``Term mkTerm(Kind kind, List[Term] children)``
+ - ``Term mkTerm(Kind kind)``
+ - ``Term mkTerm(Kind kind, List[Term] children)``
+ - ``Term mkTerm(Op op)``
+ - ``Term mkTerm(Op op, List[Term] children)``
- where ``List[Term]`` can also be comma-separated arguments
+ where ``List[Term]`` can also be comma-separated arguments
"""
cdef Term term = Term(self)
cdef vector[c_Term] v
return term
def mkTuple(self, sorts, terms):
- """Create a tuple term. Terms are automatically converted if sorts are compatible.
+ """
+ Create a tuple term. Terms are automatically converted if sorts are
+ compatible.
- :param sorts: The sorts of the elements in the tuple
- :param terms: The elements in the tuple
- :return: the tuple Term
+ :param sorts: The sorts of the elements in the tuple.
+ :param terms: The elements in the tuple.
+ :return: The tuple Term.
"""
cdef vector[c_Sort] csorts
cdef vector[c_Term] cterms
@expand_list_arg(num_req_args=0)
def mkOp(self, k, *args):
"""
- Supports the following uses:
+ Create operator.
+
+ Supports the following arguments:
- - ``Op mkOp(Kind kind)``
- - ``Op mkOp(Kind kind, const string& arg)``
- - ``Op mkOp(Kind kind, uint32_t arg0, ...)``
+ - ``Op mkOp(Kind kind)``
+ - ``Op mkOp(Kind kind, const string& arg)``
+ - ``Op mkOp(Kind kind, uint32_t arg0, ...)``
"""
cdef Op op = Op(self)
cdef vector[uint32_t] v
return op
def mkTrue(self):
- """Create a Boolean true constant.
+ """
+ Create a Boolean true constant.
- :return: the true constant
+ :return: The true constant.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkTrue()
return term
def mkFalse(self):
- """Create a Boolean false constant.
+ """
+ Create a Boolean false constant.
- :return: the false constant
+ :return: The false constant.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkFalse()
return term
def mkBoolean(self, bint val):
- """Create a Boolean constant.
+ """
+ Create a Boolean constant.
- :return: the Boolean constant
- :param val: the value of the constant
+ :return: The Boolean constant.
+ :param val: The value of the constant.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkBoolean(val)
return term
def mkPi(self):
- """Create a constant representing the number Pi.
+ """
+ Create a constant representing the number Pi.
- :return: a constant representing Pi
+ :return: A constant representing :py:obj:`Pi <cvc5.Kind.Pi>`.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkPi()
return term
def mkInteger(self, val):
- """Create an integer constant.
+ """
+ Create an integer constant.
- :param val: representation of the constant: either a string or integer
- :return: a constant of sort Integer
+ :param val: Representation of the constant: either a string or
+ integer.
+ :return: A constant of sort Integer.
"""
cdef Term term = Term(self)
if isinstance(val, str):
- term.cterm = self.csolver.mkInteger(<const string &> str(val).encode())
+ term.cterm = self.csolver.mkInteger(
+ <const string &> str(val).encode())
else:
assert(isinstance(val, int))
term.cterm = self.csolver.mkInteger((<int?> val))
return term
def mkReal(self, val, den=None):
- """Create a real constant.
+ """
+ Create a real constant.
- :param val: the value of the term. Can be an integer, float, or string. It will be formatted as a string before the term is built.
- :param den: if not None, the value is `val`/`den`
- :return: a real term with literal value
+ :param val: The value of the term. Can be an integer, float, or
+ string. It will be formatted as a string before the
+ term is built.
+ :param den: If not None, the value is ``val``/``den``.
+ :return: A real term with literal value.
- Can be used in various forms:
+ Can be used in various forms:
- - Given a string ``"N/D"`` constructs the corresponding rational.
- - Given a string ``"W.D"`` constructs the reduction of ``(W * P + D)/P``, where ``P`` is the appropriate power of 10.
- - Given a float ``f``, constructs the rational matching ``f``'s string representation. This means that ``mkReal(0.3)`` gives ``3/10`` and not the IEEE-754 approximation of ``3/10``.
- - Given a string ``"W"`` or an integer, constructs that integer.
- - Given two strings and/or integers ``N`` and ``D``, constructs ``N/D``.
+ - Given a string ``"N/D"`` constructs the corresponding rational.
+ - Given a string ``"W.D"`` constructs the reduction of
+ ``(W * P + D)/P``, where ``P`` is the appropriate power of 10.
+ - Given a float ``f``, constructs the rational matching ``f``'s
+ string representation. This means that ``mkReal(0.3)`` gives
+ ``3/10`` and not the IEEE-754 approximation of ``3/10``.
+ - Given a string ``"W"`` or an integer, constructs that integer.
+ - Given two strings and/or integers ``N`` and ``D``, constructs
+ ``N/D``.
"""
cdef Term term = Term(self)
if den is None:
return term
def mkRegexpAll(self):
- """Create a regular expression all (re.all) term.
+ """
+ Create a regular expression all (``re.all``) term.
- :return: the all term
+ :return: The all term.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkRegexpAll()
return term
def mkRegexpAllchar(self):
- """Create a regular expression allchar (re.allchar) term.
+ """
+ Create a regular expression allchar (``re.allchar``) term.
- :return: the allchar term
+ :return: The allchar term.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkRegexpAllchar()
return term
def mkRegexpNone(self):
- """Create a regular expression none (re.none) term.
+ """
+ Create a regular expression none (``re.none``) term.
- :return: the none term
+ :return: The none term.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkRegexpNone()
return term
def mkEmptySet(self, Sort s):
- """Create a constant representing an empty set of the given sort.
+ """
+ Create a constant representing an empty set of the given sort.
- :param sort: the sort of the set elements.
- :return: the empty set constant
+ :param sort: The sort of the set elements.
+ :return: The empty set constant.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkEmptySet(s.csort)
return term
def mkEmptyBag(self, Sort s):
- """Create a constant representing an empty bag of the given sort.
+ """
+ Create a constant representing an empty bag of the given sort.
- :param sort: the sort of the bag elements.
- :return: the empty bag constant
+ :param sort: The sort of the bag elements.
+ :return: The empty bag constant.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkEmptyBag(s.csort)
return term
def mkSepEmp(self):
- """Create a separation logic empty term.
+ """
+ Create a separation logic empty term.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :return: the separation logic empty term
+ :return: The separation logic empty term.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkSepEmp()
return term
def mkSepNil(self, Sort sort):
- """Create a separation logic nil term.
+ """
+ Create a separation logic nil term.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :param sort: the sort of the nil term
- :return: the separation logic nil term
+ :param sort: The sort of the nil term.
+ :return: The separation logic nil term.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkSepNil(sort.csort)
def mkString(self, str s, useEscSequences = None):
"""
- Create a String constant from a `str` which may contain SMT-LIB
- compatible escape sequences like ``\\u1234`` to encode unicode characters.
+ Create a String constant from a ``str`` which may contain SMT-LIB
+ compatible escape sequences like ``\\u1234`` to encode unicode
+ characters.
- :param s: the string this constant represents
- :param useEscSequences: determines whether escape sequences in `s` should be converted to the corresponding unicode character
- :return: the String constant
+ :param s: The string this constant represents.
+ :param useEscSequences: Determines whether escape sequences in `s`
+ should be converted to the corresponding
+ unicode character
+ :return: The String constant.
"""
cdef Term term = Term(self)
cdef Py_ssize_t size
return term
def mkEmptySequence(self, Sort sort):
- """Create an empty sequence of the given element sort.
+ """
+ Create an empty sequence of the given element sort.
- :param sort: The element sort of the sequence.
- :return: the empty sequence with given element sort.
+ :param sort: The element sort of the sequence.
+ :return: The empty sequence with given element sort.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkEmptySequence(sort.csort)
return term
def mkUniverseSet(self, Sort sort):
- """Create a universe set of the given sort.
+ """
+ Create a universe set of the given sort.
- :param sort: the sort of the set elements
- :return: the universe set constant
+ :param sort: The sort of the set elements
+ :return: The universe set constant
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkUniverseSet(sort.csort)
@expand_list_arg(num_req_args=0)
def mkBitVector(self, *args):
"""
- Supports the following arguments:
+ Create bit-vector value.
- - ``Term mkBitVector(int size, int val=0)``
- - ``Term mkBitVector(int size, string val, int base)``
+ Supports the following arguments:
- :return: a bit-vector literal term
- :param size: an integer size.
- :param val: an integer representating the value, in the first form. In the second form, a string representing the value.
- :param base: the base of the string representation (second form only)
+ - ``Term mkBitVector(int size, int val=0)``
+ - ``Term mkBitVector(int size, string val, int base)``
+
+ :return: A Term representing a bit-vector value.
+ :param size: The bit-width.
+ :param val: An integer representating the value, in the first form.
+ In the second form, a string representing the value.
+ :param base: The base of the string representation (second form
+ only).
"""
cdef Term term = Term(self)
if len(args) == 0:
def mkConstArray(self, Sort sort, Term val):
"""
- Create a constant array with the provided constant value stored at every
- index
+ Create a constant array with the provided constant value stored at
+ every index
- :param sort: the sort of the constant array (must be an array sort)
- :param val: the constant value to store (must match the sort's element sort)
- :return: the constant array term
- """
+ :param sort: The sort of the constant array (must be an array sort).
+ :param val: The constant value to store (must match the sort's
+ element sort).
+ :return: The constant array term.
+ """
cdef Term term = Term(self)
term.cterm = self.csolver.mkConstArray(sort.csort, val.cterm)
return term
def mkFloatingPointPosInf(self, int exp, int sig):
- """Create a positive infinity floating-point constant.
+ """
+ Create a positive infinity floating-point constant.
- :param exp: Number of bits in the exponent
- :param sig: Number of bits in the significand
- :return: the floating-point constant
+ :param exp: Number of bits in the exponent.
+ :param sig: Number of bits in the significand.
+ :return: The floating-point constant.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkFloatingPointPosInf(exp, sig)
return term
def mkFloatingPointNegInf(self, int exp, int sig):
- """Create a negative infinity floating-point constant.
+ """
+ Create a negative infinity floating-point constant.
- :param exp: Number of bits in the exponent
- :param sig: Number of bits in the significand
- :return: the floating-point constant
+ :param exp: Number of bits in the exponent.
+ :param sig: Number of bits in the significand.
+ :return: The floating-point constant.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkFloatingPointNegInf(exp, sig)
return term
def mkFloatingPointNaN(self, int exp, int sig):
- """Create a not-a-number (NaN) floating-point constant.
+ """
+ Create a not-a-number (NaN) floating-point constant.
- :param exp: Number of bits in the exponent
- :param sig: Number of bits in the significand
- :return: the floating-point constant
+ :param exp: Number of bits in the exponent.
+ :param sig: Number of bits in the significand.
+ :return: The floating-point constant.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkFloatingPointNaN(exp, sig)
return term
def mkFloatingPointPosZero(self, int exp, int sig):
- """Create a positive zero (+0.0) floating-point constant.
+ """
+ Create a positive zero (+0.0) floating-point constant.
- :param exp: Number of bits in the exponent
- :param sig: Number of bits in the significand
- :return: the floating-point constant
+ :param exp: Number of bits in the exponent.
+ :param sig: Number of bits in the significand.
+ :return: The floating-point constant.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkFloatingPointPosZero(exp, sig)
return term
def mkFloatingPointNegZero(self, int exp, int sig):
- """Create a negative zero (+0.0) floating-point constant.
+ """
+ Create a negative zero (+0.0) floating-point constant.
- :param exp: Number of bits in the exponent
- :param sig: Number of bits in the significand
- :return: the floating-point constant
+ :param exp: Number of bits in the exponent.
+ :param sig: Number of bits in the significand.
+ :return: The floating-point constant.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkFloatingPointNegZero(exp, sig)
return term
def mkRoundingMode(self, rm):
- """Create a roundingmode constant.
+ """
+ Create a roundingmode constant.
- :param rm: the floating point rounding mode this constant represents
+ :param rm: The floating point rounding mode this constant
+ represents.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkRoundingMode(<c_RoundingMode> rm.value)
return term
def mkFloatingPoint(self, int exp, int sig, Term val):
- """Create a floating-point constant.
+ """
+ Create a floating-point constant.
- :param exp: Size of the exponent
- :param sig: Size of the significand
- :param val: Value of the floating-point constant as a bit-vector term
+ :param exp: Size of the exponent.
+ :param sig: Size of the significand.
+ :param val: Value of the floating-point constant as a bit-vector
+ term.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkFloatingPoint(exp, sig, val.cterm)
return term
def mkCardinalityConstraint(self, Sort sort, int index):
- """Create cardinality constraint.
+ """
+ Create cardinality constraint.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :param sort: Sort of the constraint
- :param index: The upper bound for the cardinality of the sort
+ :param sort: Sort of the constraint.
+ :param index: The upper bound for the cardinality of the sort.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.mkCardinalityConstraint(sort.csort, index)
def mkConst(self, Sort sort, symbol=None):
"""
- Create (first-order) constant (0-arity function symbol).
+ Create (first-order) constant (0-arity function symbol).
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( declare-const <symbol> <sort> )
- ( declare-fun <symbol> ( ) <sort> )
+ ( declare-const <symbol> <sort> )
+ ( declare-fun <symbol> ( ) <sort> )
- :param sort: the sort of the constant
- :param symbol: the name of the constant. If None, a default symbol is used.
- :return: the first-order constant
+ :param sort: The sort of the constant.
+ :param symbol: The name of the constant. If None, a default symbol
+ is used.
+ :return: The first-order constant.
"""
cdef Term term = Term(self)
if symbol is None:
def mkVar(self, Sort sort, symbol=None):
"""
- Create a bound variable to be used in a binder (i.e. a quantifier, a
- lambda, or a witness binder).
+ Create a bound variable to be used in a binder (i.e. a quantifier,
+ a lambda, or a witness binder).
- :param sort: the sort of the variable
- :param symbol: the name of the variable
- :return: the variable
+ :param sort: The sort of the variable.
+ :param symbol: The name of the variable.
+ :return: The variable.
"""
cdef Term term = Term(self)
if symbol is None:
def mkDatatypeConstructorDecl(self, str name):
"""
- :param name: the constructor's name
- :return: the DatatypeConstructorDecl
+ Create datatype constructor declaration.
+
+ :param name: The name of the constructor.
+ :return: The datatype constructor declaration.
"""
cdef DatatypeConstructorDecl ddc = DatatypeConstructorDecl(self)
ddc.cddc = self.csolver.mkDatatypeConstructorDecl(name.encode())
return ddc
def mkDatatypeDecl(self, str name, sorts_or_bool=None, isCoDatatype=None):
- """Create a datatype declaration.
+ """
+ Create a datatype declaration.
- :param name: the name of the datatype
- :param isCoDatatype: true if a codatatype is to be constructed
- :return: the DatatypeDecl
+ :param name: The name of the datatype.
+ :param isCoDatatype: True if a codatatype is to be constructed.
+ :return: The datatype declaration.
"""
cdef DatatypeDecl dd = DatatypeDecl(self)
cdef vector[c_Sort] v
dd.cdd = self.csolver.mkDatatypeDecl(name.encode())
elif sorts_or_bool is not None and isCoDatatype is None:
if isinstance(sorts_or_bool, bool):
- dd.cdd = self.csolver.mkDatatypeDecl(<const string &> name.encode(),
- <bint> sorts_or_bool)
+ dd.cdd = self.csolver.mkDatatypeDecl(
+ <const string &> name.encode(), <bint> sorts_or_bool)
elif isinstance(sorts_or_bool, Sort):
- dd.cdd = self.csolver.mkDatatypeDecl(<const string &> name.encode(),
- (<Sort> sorts_or_bool).csort)
+ dd.cdd = self.csolver.mkDatatypeDecl(
+ <const string &> name.encode(),
+ (<Sort> sorts_or_bool).csort)
elif isinstance(sorts_or_bool, list):
for s in sorts_or_bool:
v.push_back((<Sort?> s).csort)
- dd.cdd = self.csolver.mkDatatypeDecl(<const string &> name.encode(),
- <const vector[c_Sort]&> v)
+ dd.cdd = self.csolver.mkDatatypeDecl(
+ <const string &> name.encode(),
+ <const vector[c_Sort]&> v)
else:
raise ValueError("Unhandled second argument type {}"
.format(type(sorts_or_bool)))
elif sorts_or_bool is not None and isCoDatatype is not None:
if isinstance(sorts_or_bool, Sort):
- dd.cdd = self.csolver.mkDatatypeDecl(<const string &> name.encode(),
- (<Sort> sorts_or_bool).csort,
- <bint> isCoDatatype)
+ dd.cdd = self.csolver.mkDatatypeDecl(
+ <const string &> name.encode(),
+ (<Sort> sorts_or_bool).csort,
+ <bint> isCoDatatype)
elif isinstance(sorts_or_bool, list):
for s in sorts_or_bool:
v.push_back((<Sort?> s).csort)
- dd.cdd = self.csolver.mkDatatypeDecl(<const string &> name.encode(),
- <const vector[c_Sort]&> v,
- <bint> isCoDatatype)
+ dd.cdd = self.csolver.mkDatatypeDecl(
+ <const string &> name.encode(),
+ <const vector[c_Sort]&> v,
+ <bint> isCoDatatype)
else:
raise ValueError("Unhandled second argument type {}"
.format(type(sorts_or_bool)))
else:
- raise ValueError("Can't create DatatypeDecl with {}".format([type(a)
- for a in [name,
- sorts_or_bool,
- isCoDatatype]]))
+ raise ValueError("Can't create DatatypeDecl with {}".format(
+ [type(a) for a in [name, sorts_or_bool, isCoDatatype]]))
return dd
def simplify(self, Term t):
"""
- Simplify a formula without doing "much" work. Does not involve the
- SAT Engine in the simplification, but uses the current definitions,
- assertions, and the current partial model, if one has been constructed.
- It also involves theory normalization.
+ Simplify a formula without doing "much" work. Does not involve the
+ SAT Engine in the simplification, but uses the current definitions,
+ assertions, and the current partial model, if one has been
+ constructed. It also involves theory normalization.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :param t: the formula to simplify
- :return: the simplified formula
+ :param t: The formula to simplify.
+ :return: The simplified formula.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.simplify(t.cterm)
return term
def assertFormula(self, Term term):
- """ Assert a formula
+ """
+ Assert a formula
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( assert <term> )
+ ( assert <term> )
- :param term: the formula to assert
+ :param term: The formula to assert.
"""
self.csolver.assertFormula(term.cterm)
def checkSat(self):
"""
- Check satisfiability.
+ Check satisfiability.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( check-sat )
+ ( check-sat )
- :return: the result of the satisfiability check.
+ :return: The result of the satisfiability check.
"""
cdef Result r = Result()
r.cr = self.csolver.checkSat()
def mkSygusGrammar(self, boundVars, ntSymbols):
"""
- Create a SyGuS grammar. The first non-terminal is treated as the
- starting non-terminal, so the order of non-terminals matters.
+ Create a SyGuS grammar. The first non-terminal is treated as the
+ starting non-terminal, so the order of non-terminals matters.
- :param boundVars: the parameters to corresponding synth-fun/synth-inv
- :param ntSymbols: the pre-declaration of the non-terminal symbols
- :return: the grammar
+ :param boundVars: The parameters to corresponding
+ synth-fun/synth-inv.
+ :param ntSymbols: The pre-declaration of the non-terminal symbols.
+ :return: The grammar.
"""
cdef Grammar grammar = Grammar(self)
cdef vector[c_Term] bvc
return grammar
def declareSygusVar(self, str symbol, Sort sort):
- """Append symbol to the current list of universal variables.
+ """
+ Append symbol to the current list of universal variables.
- SyGuS v2:
+ SyGuS v2:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( declare-var <symbol> <sort> )
+ ( declare-var <symbol> <sort> )
- :param sort: the sort of the universal variable
- :param symbol: the name of the universal variable
- :return: the universal variable
+ :param sort: The sort of the universal variable.
+ :param symbol: The name of the universal variable.
+ :return: The universal variable.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.declareSygusVar(symbol.encode(), sort.csort)
def addSygusConstraint(self, Term t):
"""
- Add a formula to the set of SyGuS constraints.
+ Add a formula to the set of SyGuS constraints.
- SyGuS v2:
+ SyGuS v2:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( constraint <term> )
+ ( constraint <term> )
- :param term: the formula to add as a constraint
+ :param term: The formula to add as a constraint.
"""
self.csolver.addSygusConstraint(t.cterm)
def addSygusAssume(self, Term t):
"""
- Add a formula to the set of Sygus assumptions.
+ Add a formula to the set of Sygus assumptions.
- SyGuS v2:
+ SyGuS v2:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( assume <term> )
+ ( assume <term> )
- :param term: the formuula to add as an assumption
+ :param term: The formuula to add as an assumption.
"""
self.csolver.addSygusAssume(t.cterm)
def addSygusInvConstraint(self, Term inv_f, Term pre_f, Term trans_f, Term post_f):
"""
- Add a set of SyGuS constraints to the current state that correspond to an
- invariant synthesis problem.
+ Add a set of SyGuS constraints to the current state that correspond
+ to an invariant synthesis problem.
- SyGuS v2:
+ SyGuS v2:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( inv-constraint <inv> <pre> <trans> <post> )
+ ( inv-constraint <inv> <pre> <trans> <post> )
- :param inv: the function-to-synthesize
- :param pre: the pre-condition
- :param trans: the transition relation
- :param post: the post-condition
+ :param inv: The function-to-synthesize.
+ :param pre: The pre-condition.
+ :param trans: The transition relation.
+ :param post: The post-condition.
"""
- self.csolver.addSygusInvConstraint(inv_f.cterm, pre_f.cterm, trans_f.cterm, post_f.cterm)
+ self.csolver.addSygusInvConstraint(
+ inv_f.cterm, pre_f.cterm, trans_f.cterm, post_f.cterm)
def synthFun(self, str symbol, bound_vars, Sort sort, Grammar grammar=None):
"""
- Synthesize n-ary function following specified syntactic constraints.
+ Synthesize n-ary function following specified syntactic constraints.
- SyGuS v2:
+ SyGuS v2:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( synth-fun <symbol> ( <boundVars>* ) <sort> <g> )
+ ( synth-fun <symbol> ( <boundVars>* ) <sort> <g> )
- :param symbol: the name of the function
- :param boundVars: the parameters to this function
- :param sort: the sort of the return value of this function
- :param grammar: the syntactic constraints
- :return: the function
+ :param symbol: The name of the function.
+ :param boundVars: The parameters to this function.
+ :param sort: The sort of the return value of this function.
+ :param grammar: The syntactic constraints.
+ :return: The function.
"""
cdef Term term = Term(self)
cdef vector[c_Term] v
def checkSynth(self):
"""
- Try to find a solution for the synthesis conjecture corresponding to the
- current list of functions-to-synthesize, universal variables and
- constraints.
+ Try to find a solution for the synthesis conjecture corresponding
+ to the current list of functions-to-synthesize, universal variables
+ and constraints.
- SyGuS v2:
+ SyGuS v2:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( check-synth )
+ ( check-synth )
- :return: the result of the check, which is "solution" if the check
- found a solution in which case solutions are available via
- getSynthSolutions, "no solution" if it was determined there is
- no solution, or "unknown" otherwise.
+ :return: The result of the check, which is "solution" if the check
+ found a solution in which case solutions are available via
+ getSynthSolutions, "no solution" if it was determined
+ there is no solution, or "unknown" otherwise.
"""
cdef SynthResult r = SynthResult()
r.cr = self.csolver.checkSynth()
def checkSynthNext(self):
"""
- Try to find a next solution for the synthesis conjecture corresponding
- to the current list of functions-to-synthesize, universal variables and
- constraints. Must be called immediately after a successful call to
- check-synth or check-synth-next. Requires incremental mode.
+ Try to find a next solution for the synthesis conjecture
+ corresponding to the current list of functions-to-synthesize,
+ universal variables and constraints. Must be called immediately
+ after a successful call to check-synth or check-synth-next.
+ Requires incremental mode.
- SyGuS v2:
+ SyGuS v2:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( check-synth )
+ ( check-synth )
- :return: the result of the check, which is "solution" if the check
- found a solution in which case solutions are available via
- getSynthSolutions, "no solution" if it was determined there is
- no solution, or "unknown" otherwise.
+ :return: The result of the check, which is "solution" if the check
+ found a solution in which case solutions are available via
+ getSynthSolutions, "no solution" if it was determined
+ there is no solution, or "unknown" otherwise.
"""
cdef SynthResult r = SynthResult()
r.cr = self.csolver.checkSynthNext()
def getSynthSolution(self, Term term):
"""
- Get the synthesis solution of the given term. This method should be
- called immediately after the solver answers unsat for sygus input.
+ Get the synthesis solution of the given term. This method should be
+ called immediately after the solver answers unsat for sygus input.
- :param term: the term for which the synthesis solution is queried
- :return: the synthesis solution of the given term
+ :param term: The term for which the synthesis solution is queried.
+ :return: The synthesis solution of the given term.
"""
cdef Term t = Term(self)
t.cterm = self.csolver.getSynthSolution(term.cterm)
def getSynthSolutions(self, list terms):
"""
- Get the synthesis solutions of the given terms. This method should be
- called immediately after the solver answers unsat for sygus input.
+ Get the synthesis solutions of the given terms. This method should
+ be called immediately after the solver answers unsat for sygus
+ input.
- :param terms: the terms for which the synthesis solutions is queried
- :return: the synthesis solutions of the given terms
+ :param terms: The terms for which the synthesis solutions is
+ queried.
+ :return: The synthesis solutions of the given terms.
"""
result = []
cdef vector[c_Term] vec
def synthInv(self, symbol, bound_vars, Grammar grammar=None):
"""
- Synthesize invariant.
+ Synthesize invariant.
- SyGuS v2:
+ SyGuS v2:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( synth-inv <symbol> ( <boundVars>* ) <grammar> )
+ ( synth-inv <symbol> ( <boundVars>* ) <grammar> )
- :param symbol: the name of the invariant
- :param boundVars: the parameters to this invariant
- :param grammar: the syntactic constraints
- :return: the invariant
+ :param symbol: The name of the invariant.
+ :param boundVars: The parameters to this invariant.
+ :param grammar: The syntactic constraints.
+ :return: The invariant.
"""
cdef Term term = Term(self)
cdef vector[c_Term] v
for bv in bound_vars:
v.push_back((<Term?> bv).cterm)
if grammar is None:
- term.cterm = self.csolver.synthInv(symbol.encode(), <const vector[c_Term]&> v)
+ term.cterm = self.csolver.synthInv(
+ symbol.encode(), <const vector[c_Term]&> v)
else:
- term.cterm = self.csolver.synthInv(symbol.encode(), <const vector[c_Term]&> v, grammar.cgrammar)
+ term.cterm = self.csolver.synthInv(
+ symbol.encode(),
+ <const vector[c_Term]&> v,
+ grammar.cgrammar)
return term
@expand_list_arg(num_req_args=0)
def checkSatAssuming(self, *assumptions):
- """ Check satisfiability assuming the given formula.
+ """
+ Check satisfiability assuming the given formula.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( check-sat-assuming ( <prop_literal> ) )
+ ( check-sat-assuming ( <prop_literal> ) )
- :param assumptions: the formulas to assume, as a list or as distinct arguments
- :return: the result of the satisfiability check.
+ :param assumptions: The formulas to assume, as a list or as
+ distinct arguments.
+ :return: The result of the satisfiability check.
"""
cdef Result r = Result()
# used if assumptions is a list of terms
@expand_list_arg(num_req_args=1)
def declareDatatype(self, str symbol, *ctors):
"""
- Create datatype sort.
+ Create datatype sort.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( declare-datatype <symbol> <datatype_decl> )
+ ( declare-datatype <symbol> <datatype_decl> )
- :param symbol: the name of the datatype sort
- :param ctors: the constructor declarations of the datatype sort, as a list or as distinct arguments
- :return: the datatype sort
+ :param symbol: The name of the datatype sort.
+ :param ctors: The constructor declarations of the datatype sort, as
+ a list or as distinct arguments.
+ :return: The datatype sort.
"""
cdef Sort sort = Sort(self)
cdef vector[c_DatatypeConstructorDecl] v
return sort
def declareFun(self, str symbol, list sorts, Sort sort):
- """Declare n-ary function symbol.
+ """
+ Declare n-ary function symbol.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( declare-fun <symbol> ( <sort>* ) <sort> )
+ ( declare-fun <symbol> ( <sort>* ) <sort> )
- :param symbol: the name of the function
- :param sorts: the sorts of the parameters to this function
- :param sort: the sort of the return value of this function
- :return: the function
+ :param symbol: The name of the function.
+ :param sorts: The sorts of the parameters to this function.
+ :param sort: The sort of the return value of this function.
+ :return: The function.
"""
cdef Term term = Term(self)
cdef vector[c_Sort] v
return term
def declareSort(self, str symbol, int arity):
- """Declare uninterpreted sort.
+ """
+ Declare uninterpreted sort.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( declare-sort <symbol> <numeral> )
+ ( declare-sort <symbol> <numeral> )
- .. note::
- This corresponds to :py:meth:`Solver.mkUninterpretedSort()` if
- arity = 0, and to
- :py:meth:`Solver.mkUninterpretedSortConstructorSort()` if arity > 0.
+ .. note::
- :param symbol: the name of the sort
- :param arity: the arity of the sort
- :return: the sort
+ This corresponds to :py:meth:`Solver.mkUninterpretedSort()` if
+ arity = 0, and to
+ :py:meth:`Solver.mkUninterpretedSortConstructorSort()` if
+ arity > 0.
+
+ :param symbol: The name of the sort.
+ :param arity: The arity of the sort.
+ :return: The sort.
"""
cdef Sort sort = Sort(self)
sort.csort = self.csolver.declareSort(symbol.encode(), arity)
return sort
def defineFun(self, str symbol, list bound_vars, Sort sort, Term term, glbl=False):
- """Define n-ary function.
+ """
+ Define n-ary function.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( define-fun <function_def> )
+ ( define-fun <function_def> )
- :param symbol: the name of the function
- :param bound_vars: the parameters to this function
- :param sort: the sort of the return value of this function
- :param term: the function body
- :param glbl: determines whether this definition is global (i.e. persists when popping the context)
- :return: the function
+ :param symbol: The name of the function.
+ :param bound_vars: The parameters to this function.
+ :param sort: The sort of the return value of this function.
+ :param term: The function body.
+ :param glbl: Determines whether this definition is global (i.e.
+ persists when popping the context).
+ :return: The function.
"""
cdef Term fun = Term(self)
cdef vector[c_Term] v
return fun
def defineFunRec(self, sym_or_fun, bound_vars, sort_or_term, t=None, glbl=False):
- """Define recursive functions.
-
- Supports two uses:
+ """
+ Define recursive functions.
- - ``Term defineFunRec(str symbol, List[Term] bound_vars, Sort sort, Term term, bool glbl)``
- - ``Term defineFunRec(Term fun, List[Term] bound_vars, Term term, bool glbl)``
+ Supports the following arguments:
+ - ``Term defineFunRec(str symbol, List[Term] bound_vars, Sort sort, Term term, bool glbl)``
+ - ``Term defineFunRec(Term fun, List[Term] bound_vars, Term term, bool glbl)``
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( define-funs-rec ( <function_decl>^n ) ( <term>^n ) )
+ ( define-funs-rec ( <function_decl>^n ) ( <term>^n ) )
- Create elements of parameter ``funs`` with mkConst().
+ Create elements of parameter ``funs`` with :py:meth:`mkConst() <cvc5.Solver.mkConst()>`.
- :param funs: the sorted functions
- :param bound_vars: the list of parameters to the functions
- :param terms: the list of function bodies of the functions
- :param global: determines whether this definition is global (i.e. persists when popping the context)
- :return: the function
+ :param funs: The sorted functions.
+ :param bound_vars: The list of parameters to the functions.
+ :param terms: The list of function bodies of the functions.
+ :param global: Determines whether this definition is global (i.e.
+ persists when popping the context).
+ :return: The function.
"""
cdef Term term = Term(self)
cdef vector[c_Term] v
return term
def defineFunsRec(self, funs, bound_vars, terms):
- """Define recursive functions.
+ """
+ Define recursive functions.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( define-funs-rec ( <function_decl>^n ) ( <term>^n ) )
+ ( define-funs-rec ( <function_decl>^n ) ( <term>^n ) )
- Create elements of parameter ``funs`` with mkConst().
+ Create elements of parameter ``funs`` with :py:meth:`mkConst() <cvc5.Solver.mkConst()>`.
- :param funs: the sorted functions
- :param bound_vars: the list of parameters to the functions
- :param terms: the list of function bodies of the functions
- :param global: determines whether this definition is global (i.e. persists when popping the context)
- :return: the function
+ :param funs: The sorted functions.
+ :param bound_vars: The list of parameters to the functions.
+ :param terms: The list of function bodies of the functions.
+ :param global: Determines whether this definition is global (i.e.
+ persists when popping the context).
+ :return: The function.
"""
cdef vector[c_Term] vf
cdef vector[vector[c_Term]] vbv
vf.push_back((<Term?> t).cterm)
def getProof(self):
- """Get the refutation proof
+ """
+ Get the refutation proof
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
-
- (get-proof)
+ .. code-block:: smtlib
- Requires to enable option
- :ref:`produce-proofs <lbl-option-produce-proofs>`.
+ (get-proof)
- .. warning:: This method is experimental and may change in future
- versions.
+ Requires to enable option
+ :ref:`produce-proofs <lbl-option-produce-proofs>`.
- :return: a string representing the proof, according to the value of
- proof-format-mode.
+ .. warning:: This method is experimental and may change in future
+ versions.
+
+ :return: A string representing the proof, according to the value of
+ :ref:`proof-format-mode <lbl-option-proof-format-mode>`.
"""
return self.csolver.getProof()
def getLearnedLiterals(self):
- """Get a list of literals that are entailed by the current set of assertions
+ """
+ Get a list of literals that are entailed by the current set of assertions
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-learned-literals )
+ ( get-learned-literals )
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :return: the list of literals
+ :return: The list of literals.
"""
lits = []
for a in self.csolver.getLearnedLiterals():
return lits
def getAssertions(self):
- """Get the list of asserted formulas.
+ """
+ Get the list of asserted formulas.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-assertions )
+ ( get-assertions )
- :return: the list of asserted formulas
+ :return: The list of asserted formulas.
"""
assertions = []
for a in self.csolver.getAssertions():
def getInfo(self, str flag):
"""
- Get info from the solver.
+ Get info from the solver.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-info <info_flag> )
+ ( get-info <info_flag> )
- :param flag: the info flag
- :return: the info
+ :param flag: The info flag.
+ :return: The info.
"""
return self.csolver.getInfo(flag.encode())
def getOption(self, str option):
- """Get the value of a given option.
+ """
+ Get the value of a given option.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-option <keyword> )
+ ( get-option <keyword> )
- :param option: the option for which the value is queried
- :return: a string representation of the option value
+ :param option: The option for which the value is queried.
+ :return: A string representation of the option value.
"""
return self.csolver.getOption(option.encode()).decode()
def getOptionNames(self):
- """Get all option names that can be used with `setOption`, `getOption` and `getOptionInfo`.
+ """
+ Get all option names that can be used with
+ :py:meth:`Solver.setOption()`, :py:meth:`Solver.getOption()`
+ and :py:meth:`Solver.getOptionInfo()`.
- :return: all option names
+ :return: All option names.
"""
return [s.decode() for s in self.csolver.getOptionNames()]
def getOptionInfo(self, str option):
- """Get some information about the given option. Check the `OptionInfo`
- class for more details on which information is available.
+ """
+ Get some information about the given option.
+ Returns the information provided by the C++
+ :cpp:func:`OptionInfo <cvc5::OptionInfo>` as a dictionary.
- :return: information about the given option
+ :return: Information about the given option.
"""
# declare all the variables we may need later
cdef c_OptionInfo.ValueInfo[c_bool] vib
nii = c_getVariant[c_OptionInfo.NumberInfo[int64_t]](oi.valueInfo)
res['current'] = nii.currentValue
res['default'] = nii.defaultValue
- res['minimum'] = nii.minimum.value() if nii.minimum.has_value() else None
- res['maximum'] = nii.maximum.value() if nii.maximum.has_value() else None
+ res['minimum'] = nii.minimum.value() \
+ if nii.minimum.has_value() else None
+ res['maximum'] = nii.maximum.value() \
+ if nii.maximum.has_value() else None
elif c_holds[c_OptionInfo.NumberInfo[uint64_t]](oi.valueInfo):
# it's a uint64_t
res['type'] = int
niu = c_getVariant[c_OptionInfo.NumberInfo[uint64_t]](oi.valueInfo)
res['current'] = niu.currentValue
res['default'] = niu.defaultValue
- res['minimum'] = niu.minimum.value() if niu.minimum.has_value() else None
- res['maximum'] = niu.maximum.value() if niu.maximum.has_value() else None
+ res['minimum'] = niu.minimum.value() \
+ if niu.minimum.has_value() else None
+ res['maximum'] = niu.maximum.value() \
+ if niu.maximum.has_value() else None
elif c_holds[c_OptionInfo.NumberInfo[double]](oi.valueInfo):
# it's a double
res['type'] = float
nid = c_getVariant[c_OptionInfo.NumberInfo[double]](oi.valueInfo)
res['current'] = nid.currentValue
res['default'] = nid.defaultValue
- res['minimum'] = nid.minimum.value() if nid.minimum.has_value() else None
- res['maximum'] = nid.maximum.value() if nid.maximum.has_value() else None
+ res['minimum'] = nid.minimum.value() \
+ if nid.minimum.has_value() else None
+ res['maximum'] = nid.maximum.value() \
+ if nid.maximum.has_value() else None
elif c_holds[c_OptionInfo.ModeInfo](oi.valueInfo):
# it's a mode
res['type'] = 'mode'
return res
def getOptionNames(self):
- """Get all option names that can be used with `setOption`, `getOption` and `getOptionInfo`.
- :return: all option names
+ """
+ Get all option names that can be used with
+ :py:meth:`Solver.setOption()`, :py:meth:`Solver.getOption()` and
+ :py:meth:`Solver.getOptionInfo()`.
+ :return: All option names.
"""
result = []
for n in self.csolver.getOptionNames():
def getUnsatAssumptions(self):
"""
- Get the set of unsat ("failed") assumptions.
+ Get the set of unsat ("failed") assumptions.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-unsat-assumptions )
+ ( get-unsat-assumptions )
- Requires to enable option :ref:`produce-unsat-assumptions <lbl-option-produce-unsat-assumptions>`.
+ Requires to enable option :ref:`produce-unsat-assumptions
+ <lbl-option-produce-unsat-assumptions>`.
- :return: the set of unsat assumptions.
+ :return: The set of unsat assumptions.
"""
assumptions = []
for a in self.csolver.getUnsatAssumptions():
return assumptions
def getUnsatCore(self):
- """Get the unsatisfiable core.
+ """
+ Get the unsatisfiable core.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- (get-unsat-core)
+ (get-unsat-core)
- Requires to enable option :ref:`produce-unsat-cores <lbl-option-produce-unsat-cores>`.
+ Requires to enable option :ref:`produce-unsat-cores
+ <lbl-option-produce-unsat-cores>`.
- .. note::
- In contrast to SMT-LIB, the API does not distinguish between named and
- unnamed assertions when producing an unsatisfiable core. Additionally,
- the API allows this option to be called after a check with assumptions.
- A subset of those assumptions may be included in the unsatisfiable core
- returned by this method.
+ .. note::
- :return: a set of terms representing the unsatisfiable core
+ In contrast to SMT-LIB, the API does not distinguish between
+ named and unnamed assertions when producing an unsatisfiable
+ core. Additionally, the API allows this option to be called after
+ a check with assumptions. A subset of those assumptions may be
+ included in the unsatisfiable core returned by this method.
+
+ :return: A set of terms representing the unsatisfiable core.
"""
core = []
for a in self.csolver.getUnsatCore():
def getDifficulty(self):
"""
- Get a difficulty estimate for an asserted formula. This method is intended to be called immediately after
- any response to a checkSat.
+ Get a difficulty estimate for an asserted formula. This method is
+ intended to be called immediately after any response to a
+ :py:meth:`Solver.checkSat()` call.
.. warning:: This method is experimental and may change in future
versions.
- :return: a map from (a subset of) the input assertions to a real value that is an estimate of how difficult each assertion was to solver. Unmentioned assertions can be assumed to have zero difficulty.
+ :return: A map from (a subset of) the input assertions to a real
+ value that is an estimate of how difficult each assertion
+ was to solver. Unmentioned assertions can be assumed to
+ have zero difficulty.
"""
diffi = {}
for p in self.csolver.getDifficulty():
return diffi
def getValue(self, Term t):
- """Get the value of the given term in the current model.
+ """
+ Get the value of the given term in the current model.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-value ( <term> ) )
+ ( get-value ( <term> ) )
- :param term: the term for which the value is queried
- :return: the value of the given term
+ :param term: The term for which the value is queried.
+ :return: The value of the given term.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.getValue(t.cterm)
def getModelDomainElements(self, Sort s):
"""
- Get the domain elements of uninterpreted sort s in the current model. The
- current model interprets s as the finite sort whose domain elements are
- given in the return value of this method.
+ Get the domain elements of uninterpreted sort s in the current
+ model. The current model interprets s as the finite sort whose
+ domain elements are given in the return value of this method.
- :param s: The uninterpreted sort in question
- :return: the domain elements of s in the current model
+ :param s: The uninterpreted sort in question.
+ :return: The domain elements of s in the current model.
"""
result = []
cresult = self.csolver.getModelDomainElements(s.csort)
def isModelCoreSymbol(self, Term v):
"""
- This returns false if the model value of free constant v was not
- essential for showing the satisfiability of the last call to checkSat
- using the current model. This method will only return false (for any v)
- if the model-cores option has been set.
+ This returns False if the model value of free constant v was not
+ essential for showing the satisfiability of the last call to
+ checkSat using the current model. This method will only return
+ false (for any v) if the model-cores option has been set.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :param v: The term in question
- :return: true if v is a model core symbol
+ :param v: The term in question.
+ :return: True if v is a model core symbol.
"""
return self.csolver.isModelCoreSymbol(v.cterm)
def getQuantifierElimination(self, Term term):
- """Do quantifier elimination.
+ """
+ Do quantifier elimination.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-qe <q> )
+ ( get-qe <q> )
- Requires a logic that supports quantifier elimination.
- Currently, the only logics supported by quantifier elimination
- are LRA and LIA.
+ Requires a logic that supports quantifier elimination.
+ Currently, the only logics supported by quantifier elimination
+ are LRA and LIA.
- .. warning:: This method is experimental and may change in future
+ .. warning:: This method is experimental and may change in future
versions.
- :param q: a quantified formula of the form
- :math:`Q\bar{x}_1... Q\bar{x}_n. P( x_1...x_i, y_1...y_j)'
- where
- :math:'Q\bar{x}' is a set of quantified variables of the form
- :math:'Q x_1...x_k' and
- :math:'P( x_1...x_i, y_1...y_j )' is a quantifier-free formula
- :return: a formula :math:'\phi' such that, given the current set of formulas
- :math:'A asserted to this solver:
- - :math:'(A \wedge q)' :math:'(A \wedge \phi)' are equivalent
- - :math:'\phi' is quantifier-free formula containing only free
- variables in :math:'y_1...y_n'.
+ :param q: A quantified formula of the form
+ :math:`Q\\bar{x_1}\\dots Q\\bar{x}_n. P( x_1 \\dots x_i, y_1 \\dots y_j)`
+ where
+ :math:`Q\\bar{x}` is a set of quantified variables of the
+ form :math:`Q x_1...x_k` and
+ :math:`P( x_1...x_i, y_1...y_j )` is a quantifier-free
+ formula
+ :return: A formula :math:`\\phi` such that, given the current set
+ of formulas :math:`A` asserted to this solver:
+
+ - :math:`(A \\wedge q)` :math:`(A \\wedge \\phi)` are
+ equivalent
+ - :math:`\\phi` is quantifier-free formula containing only
+ free variables in :math:`y_1...y_n`.
"""
cdef Term result = Term(self)
result.cterm = self.csolver.getQuantifierElimination(term.cterm)
return result
def getQuantifierEliminationDisjunct(self, Term term):
- """Do partial quantifier elimination, which can be used for incrementally computing
- the result of a quantifier elimination.
+ """
+ Do partial quantifier elimination, which can be used for
+ incrementally computing the result of a quantifier elimination.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-qe-disjunct <q> )
+ ( get-qe-disjunct <q> )
- Requires a logic that supports quantifier elimination.
- Currently, the only logics supported by quantifier elimination
- are LRA and LIA.
-
- .. warning:: This method is experimental and may change in future
+ Requires a logic that supports quantifier elimination.
+ Currently, the only logics supported by quantifier elimination
+ are LRA and LIA.
+
+ .. warning:: This method is experimental and may change in future
versions.
-
- :param q: a quantified formula of the form
- @f$Q\bar{x}_1... Q\bar{x}_n. P( x_1...x_i, y_1...y_j)@f$
- where
- @f$Q\bar{x}@f$ is a set of quantified variables of the form
- @f$Q x_1...x_k@f$ and
- @f$P( x_1...x_i, y_1...y_j )@f$ is a quantifier-free formula
- :return: a formula @f$\phi@f$ such that, given the current set of formulas
- @f$A@f$ asserted to this solver:
- - @f$(A \wedge q \implies A \wedge \phi)@f$ if @f$Q@f$ is
- @f$\forall@f$, and @f$(A \wedge \phi \implies A \wedge q)@f$ if
- @f$Q@f$ is @f$\exists@f$
- - @f$\phi@f$ is quantifier-free formula containing only free
- variables in @f$y_1...y_n@f$
- - If @f$Q@f$ is @f$\exists@f$, let @f$(A \wedge Q_n)@f$ be the
- formula
- @f$(A \wedge \neg (\phi \wedge Q_1) \wedge ... \wedge
- \neg (\phi \wedge Q_n))@f$
- where for each @f$i = 1...n@f$,
- formula @f$(\phi \wedge Q_i)@f$ is the result of calling
- Solver::getQuantifierEliminationDisjunct() for @f$q@f$ with the
- set of assertions @f$(A \wedge Q_{i-1})@f$.
- Similarly, if @f$Q@f$ is @f$\forall@f$, then let
- @f$(A \wedge Q_n)@f$ be
- @f$(A \wedge (\phi \wedge Q_1) \wedge ... \wedge (\phi \wedge
- Q_n))@f$
- where @f$(\phi \wedge Q_i)@f$ is the same as above.
- In either case, we have that @f$(\phi \wedge Q_j)@f$ will
- eventually be true or false, for some finite j.
+
+ :param q: A quantified formula of the form
+ :math:`Q\\bar{x_1} ... Q\\bar{x_n}. P( x_1...x_i, y_1...y_j)`
+ where :math:`Q\\bar{x}` is a set of quantified variables of
+ the form :math:`Q x_1...x_k` and
+ :math:`P( x_1...x_i, y_1...y_j )` is a quantifier-free formula.
+
+ :return: A formula :math:`\\phi` such that, given the current set
+ of formulas :math:`A` asserted to this solver:
+
+ - :math:`(A \\wedge q \\implies A \\wedge \\phi)` if :math:`Q`
+ is :math:`\\forall`, and
+ :math:`(A \\wedge \\phi \\implies A \\wedge q)` if
+ :math:`Q` is :math:`\\exists`
+ - :math:`\\phi` is quantifier-free formula containing only
+ free variables in :math:`y_1...y_n`
+ - If :math:`Q` is :math:`\\exists`, let :math:`(A \\wedge Q_n)`
+ be the formula
+ :math:`(A \\wedge \\neg (\\phi \wedge Q_1) \\wedge ... \\wedge \\neg (\\phi \\wedge Q_n))`
+ where for each :math:`i = 1...n`, formula
+ :math:`(\\phi \\wedge Q_i)` is the result of calling
+ :py:meth:`getQuantifierEliminationDisjunct()`
+ for :math:`q` with the set of assertions
+ :math:`(A \\wedge Q_{i-1})`.
+ Similarly, if :math:`Q` is :math:`\\forall`, then let
+ :math:`(A \\wedge Q_n)` be
+ :math:`(A \\wedge (\\phi \\wedge Q_1) \\wedge ... \\wedge (\\phi \\wedge Q_n))`
+ where :math:`(\\phi \\wedge Q_i)` is the same as above.
+ In either case, we have that :math:`(\\phi \\wedge Q_j)`
+ will eventually be true or false, for some finite :math:`j`.
"""
cdef Term result = Term(self)
result.cterm = self.csolver.getQuantifierEliminationDisjunct(term.cterm)
return result
-
+
def getModel(self, sorts, consts):
- """Get the model
+ """
+ Get the model
+
+ SMT-LIB:
- SMT-LIB:
+ .. code:: smtlib
- .. code:: smtlib
-
- (get-model)
+ (get-model)
- Requires to enable option
- :ref:`produce-models <lbl-option-produce-models>`.
+ Requires to enable option
+ :ref:`produce-models <lbl-option-produce-models>`.
- .. warning:: This method is experimental and may change in future
- versions.
-
- :param sorts: The list of uninterpreted sorts that should be printed in
- the model.
- :param vars: The list of free constants that should be printed in the
- model. A subset of these may be printed based on
- isModelCoreSymbol.
- :return: a string representing the model.
+ .. warning:: This method is experimental and may change in future
+ versions.
+
+ :param sorts: The list of uninterpreted sorts that should be
+ printed in the model.
+ :param vars: The list of free constants that should be printed in
+ the model. A subset of these may be printed based on
+ :py:meth:`Solver.isModelCoreSymbol()`.
+ :return: A string representing the model.
"""
cdef vector[c_Sort] csorts
return self.csolver.getModel(csorts, cconsts)
def getValueSepHeap(self):
- """When using separation logic, obtain the term for the heap.
+ """
+ When using separation logic, obtain the term for the heap.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :return: The term for the heap
+ :return: The term for the heap.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.getValueSepHeap()
return term
def getValueSepNil(self):
- """When using separation logic, obtain the term for nil.
+ """
+ When using separation logic, obtain the term for nil.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :return: The term for nil
+ :return: The term for nil.
"""
cdef Term term = Term(self)
term.cterm = self.csolver.getValueSepNil()
def declareSepHeap(self, Sort locType, Sort dataType):
"""
- When using separation logic, this sets the location sort and the
- datatype sort to the given ones. This method should be invoked exactly
- once, before any separation logic constraints are provided.
+ When using separation logic, this sets the location sort and the
+ datatype sort to the given ones. This method should be invoked
+ exactly once, before any separation logic constraints are provided.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :param locSort: The location sort of the heap
- :param dataSort: The data sort of the heap
+ :param locSort: The location sort of the heap.
+ :param dataSort: The data sort of the heap.
"""
self.csolver.declareSepHeap(locType.csort, dataType.csort)
def declarePool(self, str symbol, Sort sort, initValue):
- """Declare a symbolic pool of terms with the given initial value.
+ """
+ Declare a symbolic pool of terms with the given initial value.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( declare-pool <symbol> <sort> ( <term>* ) )
+ ( declare-pool <symbol> <sort> ( <term>* ) )
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :param symbol: The name of the pool
- :param sort: The sort of the elements of the pool.
- :param initValue: The initial value of the pool
+ :param symbol: The name of the pool.
+ :param sort: The sort of the elements of the pool.
+ :param initValue: The initial value of the pool.
"""
cdef Term term = Term(self)
cdef vector[c_Term] niv
return term
def pop(self, nscopes=1):
- """Pop ``nscopes`` level(s) from the assertion stack.
+ """
+ Pop ``nscopes`` level(s) from the assertion stack.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( pop <numeral> )
+ ( pop <numeral> )
- :param nscopes: the number of levels to pop
+ :param nscopes: The number of levels to pop.
"""
self.csolver.pop(nscopes)
def push(self, nscopes=1):
- """ Push ``nscopes`` level(s) to the assertion stack.
+ """
+ Push ``nscopes`` level(s) to the assertion stack.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( push <numeral> )
+ ( push <numeral> )
- :param nscopes: the number of levels to push
+ :param nscopes: The number of levels to push.
"""
self.csolver.push(nscopes)
def resetAssertions(self):
"""
- Remove all assertions.
+ Remove all assertions.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( reset-assertions )
+ ( reset-assertions )
"""
self.csolver.resetAssertions()
def setInfo(self, str keyword, str value):
- """Set info.
+ """
+ Set info.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( set-info <attribute> )
+ ( set-info <attribute> )
- :param keyword: the info flag
- :param value: the value of the info flag
+ :param keyword: The info flag.
+ :param value: The value of the info flag.
"""
self.csolver.setInfo(keyword.encode(), value.encode())
def setLogic(self, str logic):
- """Set logic.
+ """
+ Set logic.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( set-logic <symbol> )
+ ( set-logic <symbol> )
- :param logic: the logic to set
+ :param logic: The logic to set.
"""
self.csolver.setLogic(logic.encode())
def setOption(self, str option, str value):
- """Set option.
+ """
+ Set option.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( set-option <option> )
+ ( set-option <option> )
- :param option: the option name
- :param value: the option value
+ :param option: The option name.
+ :param value: The option value.
"""
self.csolver.setOption(option.encode(), value.encode())
def getInterpolant(self, Term conj, *args):
- """Get an interpolant.
+ """
+ Get an interpolant.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-interpolant <conj> )
- ( get-interpolant <conj> <grammar> )
+ ( get-interpolant <conj> )
+ ( get-interpolant <conj> <grammar> )
- Requires option :ref:`produce-interpolants <lbl-option-produce-interpolants>` to be set to a mode different from `none`.
+ Requires option :ref:`produce-interpolants
+ <lbl-option-produce-interpolants>` to be set to a mode different
+ from `none`.
- Supports the following variants:
+ Supports the following variants:
- - ``Term getInteprolant(Term conj)``
- - ``Term getInteprolant(Term conj, Grammar grammar)``
+ - ``Term getInterpolant(Term conj)``
+ - ``Term getInterpolant(Term conj, Grammar grammar)``
- .. warning:: This method is experimental and may change in future
- versions.
-
- :param conj: the conjecture term
- :param output: the term where the result will be stored
- :param grammar: a grammar for the inteprolant
- :return: True iff an interpolant was found
- """
+ .. warning:: This method is experimental and may change in future
+ versions.
+
+ :param conj: The conjecture term.
+ :param output: The term where the result will be stored.
+ :param grammar: A grammar for the inteprolant.
+ :return: True iff an interpolant was found.
+ """
cdef Term result = Term(self)
if len(args) == 0:
result.cterm = self.csolver.getInterpolant(conj.cterm)
else:
assert len(args) == 1
assert isinstance(args[0], Grammar)
- result.cterm = self.csolver.getInterpolant(conj.cterm, (<Grammar ?> args[0]).cgrammar)
+ result.cterm = self.csolver.getInterpolant(
+ conj.cterm, (<Grammar ?> args[0]).cgrammar)
return result
def getInterpolantNext(self):
"""
- Get the next interpolant. Can only be called immediately after
- a succesful call to get-interpolant or get-interpolant-next.
- Is guaranteed to produce a syntactically different interpolant wrt the
- last returned interpolant if successful.
+ Get the next interpolant. Can only be called immediately after
+ a successful call to :py:func:`Solver.getInterpolant()` or
+ :py:func:`Solver.getInterpolantNext()`.
+ Is guaranteed to produce a syntactically different interpolant wrt
+ the last returned interpolant if successful.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-interpolant-next )
+ ( get-interpolant-next )
- Requires to enable incremental mode, and
- option :ref:`produce-interpolants <lbl-option-produce-interpolants>` to be set to a mode different from `none`.
+ Requires to enable incremental mode, and option
+ :ref:`produce-interpolants <lbl-option-produce-interpolants>` to be
+ set to a mode different from ``none``.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :param output: the term where the result will be stored
- :return: True iff an interpolant was found
+ :param output: The term where the result will be stored.
+ :return: True iff an interpolant was found.
"""
cdef Term result = Term(self)
result.cterm = self.csolver.getInterpolantNext()
return result
-
+
def getAbduct(self, Term conj, *args):
- """Get an abduct.
+ """
+ Get an abduct.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-abduct <conj> )
- ( get-abduct <conj> <grammar> )
+ ( get-abduct <conj> )
+ ( get-abduct <conj> <grammar> )
- Requires to enable option :ref:`produce-abducts <lbl-option-produce-abducts>`.
+ Requires to enable option :ref:`produce-abducts
+ <lbl-option-produce-abducts>`.
- Supports the following variants:
+ Supports the following variants:
- - ``Term getAbduct(Term conj)``
- - ``Term getAbduct(Term conj, Grammar grammar)``
+ - ``Term getAbduct(Term conj)``
+ - ``Term getAbduct(Term conj, Grammar grammar)``
- .. warning:: This method is experimental and may change in future
- versions.
-
- :param conj: the conjecture term
- :param output: the term where the result will be stored
- :param grammar: a grammar for the abduct
- :return: True iff an abduct was found
+ .. warning:: This method is experimental and may change in future
+ versions.
+
+ :param conj: The conjecture term.
+ :param output: The term where the result will be stored.
+ :param grammar: A grammar for the abduct.
+ :return: True iff an abduct was found.
"""
cdef Term result = Term(self)
if len(args) == 0:
else:
assert len(args) == 1
assert isinstance(args[0], Grammar)
- result.cterm = self.csolver.getAbduct(conj.cterm, (<Grammar ?> args[0]).cgrammar)
+ result.cterm = self.csolver.getAbduct(
+ conj.cterm, (<Grammar ?> args[0]).cgrammar)
return result
def getAbductNext(self):
"""
- Get the next abduct. Can only be called immediately after
- a succesful call to get-abduct or get-abduct-next.
- Is guaranteed to produce a syntactically different abduct wrt the
- last returned abduct if successful.
+ Get the next abduct. Can only be called immediately after
+ a succesful call to :py:func:`Solver.getAbduct()` or
+ :py:func:`Solver.getAbductNext()`.
+ Is guaranteed to produce a syntactically different abduct wrt the
+ last returned abduct if successful.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- ( get-abduct-next )
+ ( get-abduct-next )
- Requires to enable incremental mode, and
- option :ref:`produce-abducts <lbl-option-produce-abducts>`.
+ Requires to enable incremental mode, and
+ option :ref:`produce-abducts <lbl-option-produce-abducts>`.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :param output: the term where the result will be stored
- :return: True iff an abduct was found
+ :param output: The term where the result will be stored.
+ :return: True iff an abduct was found.
"""
cdef Term result = Term(self)
result.cterm = self.csolver.getAbductNext()
def blockModel(self):
"""
- Block the current model. Can be called only if immediately preceded by a
- SAT or INVALID query.
+ Block the current model. Can be called only if immediately preceded
+ by a SAT or INVALID query.
+
+ SMT-LIB:
- SMT-LIB:
+ .. code-block:: smtlib
- .. code-block:: smtlib
-
- (block-model)
+ (block-model)
- Requires enabling option
- :ref:`produce-models <lbl-option-produce-models>`
- and setting option
- :ref:`block-models <lbl-option-block-models>`
- to a mode other than ``none``.
+ Requires enabling option
+ :ref:`produce-models <lbl-option-produce-models>`
+ and setting option
+ :ref:`block-models <lbl-option-block-models>`
+ to a mode other than ``none``.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
"""
self.csolver.blockModel()
def blockModelValues(self, terms):
"""
- Block the current model values of (at least) the values in terms. Can be
- called only if immediately preceded by a SAT or NOT_ENTAILED query.
+ Block the current model values of (at least) the values in terms.
+ Can be called only if immediately preceded by a SAT or NOT_ENTAILED
+ query.
- SMT-LIB:
+ SMT-LIB:
- .. code-block:: smtlib
+ .. code-block:: smtlib
- (block-model-values ( <terms>+ ))
+ (block-model-values ( <terms>+ ))
- Requires enabling option
- :ref:`produce-models <lbl-option-produce-models>`.
+ Requires enabling option
+ :ref:`produce-models <lbl-option-produce-models>`.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
"""
cdef vector[c_Term] nts
for t in terms:
def getInstantiations(self):
"""
- Return a string that contains information about all instantiations made
- by the quantifiers module.
+ Return a string that contains information about all instantiations
+ made by the quantifiers module.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
"""
return self.csolver.getInstantiations()
def getStatistics(self):
"""
- Returns a snapshot of the current state of the statistic values of this
- solver. The returned object is completely decoupled from the solver and
- will not change when the solver is used again.
+ Returns a snapshot of the current state of the statistic values of
+ this solver. The returned object is completely decoupled from the
+ solver and will not change when the solver is used again.
"""
res = Statistics()
res.cstats = self.csolver.getStatistics()
cdef class Sort:
"""
- The sort of a cvc5 term.
+ The sort of a cvc5 term.
+
+ Wrapper class for :cpp:class:`cvc5::Sort`.
"""
cdef c_Sort csort
cdef Solver solver
return csorthash(self.csort)
def hasSymbol(self):
- """:return: True iff this sort has a symbol."""
+ """
+ :return: True iff this sort has a symbol.
+ """
return self.csort.hasSymbol()
def getSymbol(self):
"""
- Asserts :py:meth:`hasSymbol()`.
+ Asserts :py:meth:`hasSymbol()`.
- :return: the raw symbol of the sort.
+ :return: The raw symbol of the sort.
"""
return self.csort.getSymbol().decode()
def isNull(self):
- """:return: True if this Sort is a null sort."""
+ """
+ :return: True if this Sort is a null sort.
+ """
return self.csort.isNull()
def isBoolean(self):
An instantiated sort is a sort that has been constructed from
instantiating a sort parameters with sort arguments
- (see Sort::instantiate()).
+ (see :py:meth:`instantiate()`).
:return: True if this is an instantiated sort.
"""
Get the associated uninterpreted sort constructor of an
instantiated uninterpreted sort.
- :return: the uninterpreted sort constructor sort
+ :return: The uninterpreted sort constructor sort
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.csort.getUninterpretedSortConstructor()
def getDatatype(self):
"""
- :return: the underlying datatype of a datatype sort
+ :return: The underlying datatype of a datatype sort
"""
cdef Datatype d = Datatype(self.solver)
d.cd = self.csort.getDatatype()
"""
Instantiate a parameterized datatype sort or uninterpreted sort
constructor sort.
+
Create sorts parameter with :py:meth:`Solver.mkParamSort()`
- :param params: the list of sort parameters to instantiate with
- :return: the instantiated sort
+ .. warning:: This method is experimental and may change in future
+ versions.
+
+ :param params: The list of sort parameters to instantiate with
+ :return: The instantiated sort
"""
cdef Sort sort = Sort(self.solver)
cdef vector[c_Sort] v
"""
Get the sorts used to instantiate the sort parameters of a
parametric sort (parametric datatype or uninterpreted sort
- constructor sort, see Sort.instantiate()).
+ constructor sort, see :py:meth:`instantiate()`).
- :return the sorts used to instantiate the sort parameters of a
- parametric sort
+ :return: The sorts used to instantiate the sort parameters of a
+ parametric sort
"""
instantiated_sorts = []
for s in self.csort.getInstantiatedParameters():
def substitute(self, sort_or_list_1, sort_or_list_2):
"""
- Substitution of Sorts.
+ Substitution of Sorts.
- Note that this replacement is applied during a pre-order traversal and
- only once to the sort. It is not run until fix point. In the case that
- sort_or_list_1 contains duplicates, the replacement earliest in the list
- takes priority.
+ Note that this replacement is applied during a pre-order traversal
+ and only once to the sort. It is not run until fix point. In the
+ case that sort_or_list_1 contains duplicates, the replacement
+ earliest in the list takes priority.
- For example,
- ``(Array A B) .substitute([A, C], [(Array C D), (Array A B)])`` will
- return ``(Array (Array C D) B)``.
+ For example,
+ ``(Array A B) .substitute([A, C], [(Array C D), (Array A B)])``
+ will return ``(Array (Array C D) B)``.
- .. warning:: This method is experimental and may change in future
- versions.
+ .. warning:: This method is experimental and may change in future
+ versions.
- :param sort_or_list_1: the subsort or subsorts to be substituted within this sort.
- :param sort_or_list_2: the sort or list of sorts replacing the substituted subsort.
+ :param sort_or_list_1: The subsort or subsorts to be substituted
+ within this sort.
+ :param sort_or_list_2: The sort or list of sorts replacing the
+ substituted subsort.
"""
# The resulting sort after substitution
if len(es) != len(replacements):
raise RuntimeError("Expecting list inputs to substitute to "
"have the same length but got: "
- "{} and {}".format(len(es), len(replacements)))
+ "{} and {}".format(
+ len(es), len(replacements)))
for e, r in zip(es, replacements):
ces.push_back((<Sort?> e).csort)
def getDatatypeConstructorArity(self):
"""
- :return: the arity of a datatype constructor sort.
+ :return: The arity of a datatype constructor sort.
"""
return self.csort.getDatatypeConstructorArity()
def getDatatypeConstructorDomainSorts(self):
"""
- :return: the domain sorts of a datatype constructor sort
+ :return: The domain sorts of a datatype constructor sort.
"""
domain_sorts = []
for s in self.csort.getDatatypeConstructorDomainSorts():
def getDatatypeConstructorCodomainSort(self):
"""
- :return: the codomain sort of a datatype constructor sort
+ :return: The codomain sort of a datatype constructor sort.
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.csort.getDatatypeConstructorCodomainSort()
def getDatatypeSelectorDomainSort(self):
"""
- :return: the domain sort of a datatype selector sort
+ :return: The domain sort of a datatype selector sort.
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.csort.getDatatypeSelectorDomainSort()
def getDatatypeSelectorCodomainSort(self):
"""
- :return: the codomain sort of a datatype selector sort
+ :return: The codomain sort of a datatype selector sort.
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.csort.getDatatypeSelectorCodomainSort()
def getDatatypeTesterDomainSort(self):
"""
- :return: the domain sort of a datatype tester sort
+ :return: The domain sort of a datatype tester sort.
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.csort.getDatatypeTesterDomainSort()
def getFunctionArity(self):
"""
- :return: the arity of a function sort
+ :return: The arity of a function sort.
"""
return self.csort.getFunctionArity()
def getFunctionDomainSorts(self):
"""
- :return: the domain sorts of a function sort
+ :return: The domain sorts of a function sort.
"""
domain_sorts = []
for s in self.csort.getFunctionDomainSorts():
def getFunctionCodomainSort(self):
"""
- :return: the codomain sort of a function sort
+ :return: The codomain sort of a function sort.
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.csort.getFunctionCodomainSort()
def getArrayIndexSort(self):
"""
- :return: the array index sort of an array sort
+ :return: The array index sort of an array sort.
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.csort.getArrayIndexSort()
def getArrayElementSort(self):
"""
- :return: the array element sort of an array sort
+ :return: The array element sort of an array sort.
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.csort.getArrayElementSort()
def getSetElementSort(self):
"""
- :return: the element sort of a set sort
+ :return: The element sort of a set sort.
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.csort.getSetElementSort()
def getBagElementSort(self):
"""
- :return: the element sort of a bag sort
+ :return: The element sort of a bag sort.
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.csort.getBagElementSort()
def getSequenceElementSort(self):
"""
- :return: the element sort of a sequence sort
+ :return: The element sort of a sequence sort.
"""
cdef Sort sort = Sort(self.solver)
sort.csort = self.csort.getSequenceElementSort()
def getUninterpretedSortConstructorArity(self):
"""
- :return: the arity of a sort constructor sort
+ :return: The arity of a sort constructor sort.
"""
return self.csort.getUninterpretedSortConstructorArity()
def getBitVectorSize(self):
"""
- :return: the bit-width of the bit-vector sort
+ :return: The bit-width of the bit-vector sort.
"""
return self.csort.getBitVectorSize()
def getFloatingPointExponentSize(self):
"""
- :return: the bit-width of the exponent of the floating-point sort
+ :return: The bit-width of the exponent of the floating-point sort.
"""
return self.csort.getFloatingPointExponentSize()
def getFloatingPointSignificandSize(self):
"""
- :return: the width of the significand of the floating-point sort
+ :return: The width of the significand of the floating-point sort.
"""
return self.csort.getFloatingPointSignificandSize()
def getDatatypeArity(self):
"""
- :return: the arity of a datatype sort
+ :return: The arity of a datatype sort.
"""
return self.csort.getDatatypeArity()
def getTupleLength(self):
"""
- :return: the length of a tuple sort
+ :return: The length of a tuple sort.
"""
return self.csort.getTupleLength()
def getTupleSorts(self):
"""
- :return: the element sorts of a tuple sort
+ :return: The element sorts of a tuple sort.
"""
tuple_sorts = []
for s in self.csort.getTupleSorts():
cdef class Statistics:
"""
- The cvc5 Statistics.
- Wrapper class for :cpp:class:`cvc5::Statistics`.
- Obtain a single statistic value using ``stats["name"]`` and a dictionary
- with all (visible) statistics using ``stats.get(internal=False, defaulted=False)``.
+ The cvc5 Statistics.
+
+ Wrapper class for :cpp:class:`cvc5::Statistics`.
+ Obtain a single statistic value using ``stats["name"]`` and a dictionary
+ with all (visible) statistics using
+ ``stats.get(internal=False, defaulted=False)``.
"""
cdef c_Statistics cstats
}
def __getitem__(self, str name):
- """Get the statistics information for the statistic called ``name``."""
+ """
+ Get the statistics information for the statistic called ``name``.
+ """
return self.__stat_to_dict(self.cstats.get(name.encode()))
def get(self, bint internal = False, bint defaulted = False):
- """Get all statistics. See :cpp:class:`cvc5::Statistics::begin()` for more information."""
+ """
+ Get all statistics as a dictionary. See :cpp:func:`cvc5::Statistics::begin()`
+ for more information on which statistics are included based on the parameters.
+
+ :return: A dictionary with all available statistics.
+ """
cdef c_Statistics.iterator it = self.cstats.begin(internal, defaulted)
cdef pair[string,c_Stat]* s
res = {}
cdef class Term:
"""
- A cvc5 Term.
- Wrapper class for :cpp:class:`cvc5::Term`.
+ A cvc5 Term.
+
+ Wrapper class for :cpp:class:`cvc5::Term`.
"""
cdef c_Term cterm
cdef Solver solver
return ctermhash(self.cterm)
def getNumChildren(self):
- """:return: the number of children of this term."""
+ """
+ :return: The number of children of this term.
+ """
return self.cterm.getNumChildren()
def getId(self):
- """:return: the id of this term."""
+ """
+ :return: The id of this term.
+ """
return self.cterm.getId()
def getKind(self):
- """:return: the :py:class:`cvc5.Kind` of this term."""
+ """
+ :return: The :py:class:`cvc5.Kind` of this term.
+ """
return Kind(<int> self.cterm.getKind())
def getSort(self):
- """:return: the :py:class:`cvc5.Sort` of this term."""
+ """
+ :return: The :py:class:`cvc5.Sort` of this term.
+ """
cdef Sort sort = Sort(self.solver)
sort.csort = self.cterm.getSort()
return sort
def substitute(self, term_or_list_1, term_or_list_2):
"""
- :return: the result of simultaneously replacing the term(s) stored in ``term_or_list_1`` by the term(s) stored in ``term_or_list_2`` in this term.
-
- Note that this replacement is applied during a pre-order traversal and
- only once to the term. It is not run until fix point. In the case that
- terms contains duplicates, the replacement earliest in the list takes
- priority. For example, calling substitute on ``f(x,y)`` with
+ :return: The result of simultaneously replacing the term(s) stored
+ in ``term_or_list_1`` by the term(s) stored in
+ ``term_or_list_2`` in this term.
+
+ .. note::
- .. code:: python
+ This replacement is applied during a pre-order traversal and
+ only once to the term. It is not run until fix point. In the
+ case that terms contains duplicates, the replacement earliest
+ in the list takes priority. For example, calling substitute on
+ ``f(x,y)`` with
- term_or_list_1 = [ x, z ], term_or_list_2 = [ g(z), w ]
-
- results in the term ``f(g(z),y)``.
+ .. code:: python
+
+ term_or_list_1 = [ x, z ], term_or_list_2 = [ g(z), w ]
+
+ results in the term ``f(g(z),y)``.
"""
# The resulting term after substitution
cdef Term term = Term(self.solver)
return term
def hasOp(self):
- """:return: True iff this term has an operator."""
+ """
+ :return: True iff this term has an operator.
+ """
return self.cterm.hasOp()
def getOp(self):
"""
- .. note:: This is safe to call when :py:meth:`hasOp()` returns True.
+ :return: The :py:class:`cvc5.Op` used to create this Term.
+
+ .. note::
+
+ This is safe to call when :py:meth:`hasOp()` returns True.
- :return: the :py:class:`cvc5.Op` used to create this Term.
"""
cdef Op op = Op(self.solver)
op.cop = self.cterm.getOp()
return op
def hasSymbol(self):
- """:return: True iff this term has a symbol."""
+ """
+ :return: True iff this term has a symbol.
+ """
return self.cterm.hasSymbol()
def getSymbol(self):
"""
- Asserts :py:meth:`hasSymbol()`.
+ Asserts :py:meth:`hasSymbol()`.
- :return: the raw symbol of the term.
+ :return: The raw symbol of the term.
"""
return self.cterm.getSymbol().decode()
def isNull(self):
- """:return: True iff this term is a null term."""
+ """
+ :return: True iff this term is a null term.
+ """
return self.cterm.isNull()
def notTerm(self):
"""
- Boolean negation.
+ Boolean negation.
- :return: the Boolean negation of this term.
- """
+ :return: The Boolean negation of this term.
+ """
cdef Term term = Term(self.solver)
term.cterm = self.cterm.notTerm()
return term
def andTerm(self, Term t):
"""
- Boolean and.
+ Boolean and.
- :param t: a Boolean term
- :return: the conjunction of this term and the given term
- """
+ :param t: A Boolean term.
+ :return: The conjunction of this term and the given term.
+ """
cdef Term term = Term(self.solver)
term.cterm = self.cterm.andTerm((<Term> t).cterm)
return term
def orTerm(self, Term t):
"""
- Boolean or.
+ Boolean or.
- :param t: a Boolean term
- :return: the disjunction of this term and the given term
- """
+ :param t: A Boolean term.
+ :return: The disjunction of this term and the given term.
+ """
cdef Term term = Term(self.solver)
term.cterm = self.cterm.orTerm(t.cterm)
return term
def xorTerm(self, Term t):
"""
- Boolean exclusive or.
+ Boolean exclusive or.
- :param t: a Boolean term
- :return: the exclusive disjunction of this term and the given term
- """
+ :param t: A Boolean term.
+ :return: The exclusive disjunction of this term and the given term.
+ """
cdef Term term = Term(self.solver)
term.cterm = self.cterm.xorTerm(t.cterm)
return term
def eqTerm(self, Term t):
"""
- Equality
+ Equality
- :param t: a Boolean term
- :return: the Boolean equivalence of this term and the given term
- """
+ :param t: A Boolean term.
+ :return: The Boolean equivalence of this term and the given term.
+ """
cdef Term term = Term(self.solver)
term.cterm = self.cterm.eqTerm(t.cterm)
return term
def impTerm(self, Term t):
"""
- Boolean Implication.
+ Boolean Implication.
- :param t: a Boolean term
- :return: the implication of this term and the given term
- """
+ :param t: A Boolean term.
+ :return: The implication of this term and the given term.
+ """
cdef Term term = Term(self.solver)
term.cterm = self.cterm.impTerm(t.cterm)
return term
def iteTerm(self, Term then_t, Term else_t):
"""
- If-then-else with this term as the Boolean condition.
+ If-then-else with this term as the Boolean condition.
- :param then_t: the `then` term
- :param else_t: the `else` term
- :return: the if-then-else term with this term as the Boolean condition
- """
+ :param then_t: The `then` term.
+ :param else_t: The `else` term.
+ :return: The if-then-else term with this term as the Boolean
+ condition.
+ """
cdef Term term = Term(self.solver)
term.cterm = self.cterm.iteTerm(then_t.cterm, else_t.cterm)
return term
def isConstArray(self):
- """:return: True iff this term is a constant array."""
+ """
+ :return: True iff this term is a constant array.
+ """
return self.cterm.isConstArray()
def getConstArrayBase(self):
"""
- Asserts :py:meth:`isConstArray()`.
+ Asserts :py:meth:`isConstArray()`.
- :return: the base (element stored at all indicies) of this constant array
- """
+ :return: The base (element stored at all indicies) of this constant
+ array.
+ """
cdef Term term = Term(self.solver)
term.cterm = self.cterm.getConstArrayBase()
return term
def isBooleanValue(self):
- """:return: True iff this term is a Boolean value."""
+ """
+ :return: True iff this term is a Boolean value.
+ """
return self.cterm.isBooleanValue()
def getBooleanValue(self):
"""
- Asserts :py:meth:`isBooleanValue()`
+ Asserts :py:meth:`isBooleanValue()`
- :return: the representation of a Boolean value as a native Boolean value.
- """
+ :return: The representation of a Boolean value as a native Boolean
+ value.
+ """
return self.cterm.getBooleanValue()
def isStringValue(self):
- """:return: True iff this term is a string value."""
+ """
+ :return: True iff this term is a string value.
+ """
return self.cterm.isStringValue()
def getStringValue(self):
"""
- Asserts :py:meth:`isStringValue()`.
+ Asserts :py:meth:`isStringValue()`.
- .. note::
- This method is not to be confused with :py:meth:`__str__()` which
- returns the term in some string representation, whatever data it
- may hold.
+ .. note::
+ This method is not to be confused with :py:meth:`__str__()`
+ which returns the term in some string representation, whatever
+ data it may hold.
- :return: the string term as a native string value.
+ :return: The string term as a native string value.
"""
cdef Py_ssize_t size
cdef c_wstring s = self.cterm.getStringValue()
def getRealOrIntegerValueSign(self):
"""
- Get integer or real value sign. Must be called on integer or real values,
- or otherwise an exception is thrown.
-
- :return: 0 if this term is zero, -1 if this term is a negative real or
- integer value, 1 if this term is a positive real or integer
- value.
+ Get integer or real value sign. Must be called on integer or real
+ values, or otherwise an exception is thrown.
+
+ :return: 0 if this term is zero, -1 if this term is a negative real
+ or integer value, 1 if this term is a positive real or
+ integer value.
"""
return self.cterm.getRealOrIntegerValueSign()
def isIntegerValue(self):
- """:return: True iff this term is an integer value."""
+ """
+ :return: True iff this term is an integer value.
+ """
return self.cterm.isIntegerValue()
-
+
def getIntegerValue(self):
"""
- Asserts :py:meth:`isIntegerValue()`.
-
- :return: the integer term as a native python integer.
- """
+ Asserts :py:meth:`isIntegerValue()`.
+
+ :return: The integer term as a native python integer.
+ """
return int(self.cterm.getIntegerValue().decode())
def isFloatingPointPosZero(self):
- """:return: True iff the term is the floating-point value for positive zero."""
+ """
+ :return: True iff the term is the floating-point value for positive
+ zero.
+ """
return self.cterm.isFloatingPointPosZero()
def isFloatingPointNegZero(self):
- """:return: True iff the term is the floating-point value for negative zero."""
+ """
+ :return: True iff the term is the floating-point value for negative
+ zero.
+ """
return self.cterm.isFloatingPointNegZero()
def isFloatingPointPosInf(self):
- """:return: True iff the term is the floating-point value for positive infinity."""
+ """
+ :return: True iff the term is the floating-point value for positive
+ infinity.
+ """
return self.cterm.isFloatingPointPosInf()
def isFloatingPointNegInf(self):
- """:return: True iff the term is the floating-point value for negative infinity."""
+ """
+ :return: True iff the term is the floating-point value for negative
+ infinity.
+ """
return self.cterm.isFloatingPointNegInf()
def isFloatingPointNaN(self):
- """:return: True iff the term is the floating-point value for not a number."""
+ """
+ :return: True iff the term is the floating-point value for not a
+ number.
+ """
return self.cterm.isFloatingPointNaN()
def isFloatingPointValue(self):
- """:return: True iff this term is a floating-point value."""
+ """
+ :return: True iff this term is a floating-point value.
+ """
return self.cterm.isFloatingPointValue()
def getFloatingPointValue(self):
"""
- Asserts :py:meth:`isFloatingPointValue()`.
+ Asserts :py:meth:`isFloatingPointValue()`.
- :return: the representation of a floating-point value as a tuple of the exponent width, the significand width and a bit-vector value.
- """
- cdef c_tuple[uint32_t, uint32_t, c_Term] t = self.cterm.getFloatingPointValue()
+ :return: The representation of a floating-point value as a tuple of
+ the exponent width, the significand width and a bit-vector
+ value.
+ """
+ cdef c_tuple[uint32_t, uint32_t, c_Term] t = \
+ self.cterm.getFloatingPointValue()
cdef Term term = Term(self.solver)
term.cterm = get2(t)
return (get0(t), get1(t), term)
def isSetValue(self):
"""
- A term is a set value if it is considered to be a (canonical) constant
- set value. A canonical set value is one whose AST is:
+ A term is a set value if it is considered to be a (canonical)
+ constant set value. A canonical set value is one whose AST is:
- .. code::
+ .. code:: smtlib
- (union
- (singleton c1) ... (union (singleton c_{n-1}) (singleton c_n))))
+ (set.union
+ (set.singleton c1) ...
+ (set.union (set.singleton c_{n-1}) (set.singleton c_n))))
- where ``c1 ... cn`` are values ordered by id such that
- ``c1 > ... > cn`` (see also :cpp:func:`cvc5::Term::operator>()`).
+ where :math:`c_1 \dots c_n` are values ordered by id such that
+ :math:`c_1 > \cdots > c_n`.
- .. note::
- A universe set term ``(kind SET_UNIVERSE)`` is not considered to be
- a set value.
+ .. note::
+ A universe set term ``(kind SET_UNIVERSE)`` is not considered
+ to be a set value.
- :return: True if the term is a set value.
+ :return: True if the term is a set value.
"""
return self.cterm.isSetValue()
def getSetValue(self):
"""
- Asserts :py:meth:`isSetValue()`.
+ Asserts :py:meth:`isSetValue()`.
- :return: the representation of a set value as a set of terms.
- """
+ :return: The representation of a set value as a set of terms.
+ """
elems = set()
for e in self.cterm.getSetValue():
term = Term(self.solver)
return elems
def isSequenceValue(self):
- """:return: True iff this term is a sequence value."""
+ """
+ :return: True iff this term is a sequence value.
+ """
return self.cterm.isSequenceValue()
def getSequenceValue(self):
"""
- Asserts :py:meth:`isSequenceValue()`.
+ Asserts :py:meth:`isSequenceValue()`.
+
+ .. note::
- .. note::
- It is usually necessary for sequences to call
- :py:meth:`Solver.simplify()` to turn a sequence that is constructed
- by, e.g., concatenation of unit sequences, into a sequence value.
+ It is usually necessary for sequences to call
+ :py:meth:`Solver.simplify()` to turn a sequence that is
+ constructed by, e.g., concatenation of unit sequences, into a
+ sequence value.
- :return: the representation of a sequence value as a vector of terms.
+ :return: The representation of a sequence value as a vector of
+ terms.
"""
elems = []
for e in self.cterm.getSequenceValue():
def isCardinalityConstraint(self):
"""
- .. warning:: This method is experimental and may change in future
- versions.
- :return: True if the term is a cardinality constraint.
- """
+ :return: True if the term is a cardinality constraint.
+
+ .. warning:: This method is experimental and may change in future
+ versions.
+ """
return self.cterm.isCardinalityConstraint()
def getCardinalityConstraint(self):
"""
- .. warning:: This method is experimental and may change in future
- versions.
- :return: the sort the cardinality constraint is for and its upper bound.
- """
+ :return: The sort the cardinality constraint is for and its upper
+ bound.
+ .. warning:: This method is experimental and may change in future
+ versions.
+ """
cdef pair[c_Sort, uint32_t] p
p = self.cterm.getCardinalityConstraint()
cdef Sort sort = Sort(self.solver)
def isUninterpretedSortValue(self):
- """:return: True iff this term is a value from an uninterpreted sort."""
+ """
+ :return: True iff this term is a value from an uninterpreted sort.
+ """
return self.cterm.isUninterpretedSortValue()
def getUninterpretedSortValue(self):
"""
- Asserts :py:meth:`isUninterpretedSortValue()`.
+ Asserts :py:meth:`isUninterpretedSortValue()`.
- :return: the representation of an uninterpreted value as a pair of its sort and its index.
- """
+ :return: The representation of an uninterpreted value as a pair of
+ its sort and its index.
+ """
return self.cterm.getUninterpretedSortValue()
def isTupleValue(self):
- """:return: True iff this term is a tuple value."""
+ """
+ :return: True iff this term is a tuple value.
+ """
return self.cterm.isTupleValue()
def isRoundingModeValue(self):
- """:return: True if the term is a floating-point rounding mode value."""
+ """
+ :return: True if the term is a floating-point rounding mode
+ value.
+ """
return self.cterm.isRoundingModeValue()
def getRoundingModeValue(self):
"""
- Asserts isRoundingModeValue().
- :return: the floating-point rounding mode value held by the term.
+ Asserts :py:meth:`isRoundingModeValue()`.
+ :return: The floating-point rounding mode value held by the term.
"""
return RoundingMode(<int> self.cterm.getRoundingModeValue())
def getTupleValue(self):
"""
- Asserts :py:meth:`isTupleValue()`.
+ Asserts :py:meth:`isTupleValue()`.
- :return: the representation of a tuple value as a vector of terms.
- """
+ :return: The representation of a tuple value as a vector of terms.
+ """
elems = []
for e in self.cterm.getTupleValue():
term = Term(self.solver)
def isRealValue(self):
"""
- .. note:: A term of kind PI is not considered to be a real value.
+ :return: True iff this term is a rational value.
+
+ .. note::
+
+ A term of kind :py:obj:`Pi <cvc5.Kind.Pi>` is not considered
+ to be a real value.
- :return: True iff this term is a rational value.
"""
return self.cterm.isRealValue()
def getRealValue(self):
"""
- Asserts :py:meth:`isRealValue()`.
+ Asserts :py:meth:`isRealValue()`.
- :return: the representation of a rational value as a python Fraction.
- """
+ :return: The representation of a rational value as a python Fraction.
+ """
return Fraction(self.cterm.getRealValue().decode())
def isBitVectorValue(self):
- """:return: True iff this term is a bit-vector value."""
+ """
+ :return: True iff this term is a bit-vector value.
+ """
return self.cterm.isBitVectorValue()
def getBitVectorValue(self, base = 2):
"""
- Asserts :py:meth:`isBitVectorValue()`.
- Supported bases are 2 (bit string), 10 (decimal string) or 16 (hexdecimal string).
+ Asserts :py:meth:`isBitVectorValue()`.
+ Supported bases are 2 (bit string), 10 (decimal string) or 16
+ (hexdecimal string).
- :return: the representation of a bit-vector value in string representation.
- """
+ :return: The representation of a bit-vector value in string
+ representation.
+ """
return self.cterm.getBitVectorValue(base).decode()
def toPythonObj(self):
"""
- Converts a constant value Term to a Python object.
+ Converts a constant value Term to a Python object.
- Currently supports:
+ Currently supports:
- - Boolean -- returns a Python bool
- - Int -- returns a Python int
- - Real -- returns a Python Fraction
- - BV -- returns a Python int (treats BV as unsigned)
- - String -- returns a Python Unicode string
- - Array -- returns a Python dict mapping indices to values. the constant base is returned as the default value
+ - **Boolean:** Returns a Python bool
+ - **Int :** Returns a Python int
+ - **Real :** Returns a Python Fraction
+ - **BV :** Returns a Python int (treats BV as unsigned)
+ - **String :** Returns a Python Unicode string
+ - **Array :** Returns a Python dict mapping indices to values. The constant base is returned as the default value.
"""
res[k] = v
return res
+
+