1 /******************************************************************************
2 * Top contributors (to current version):
3 * Aina Niemetz, Andrew Reynolds, Makai Mann
5 * This file is part of the cvc5 project.
7 * Copyright (c) 2009-2021 by the authors listed in the file AUTHORS
8 * in the top-level source directory and their institutional affiliations.
9 * All rights reserved. See the file COPYING in the top-level source
10 * directory for licensing information.
11 * ****************************************************************************
13 * The term kinds of the cvc5 C++ API.
16 #include "cvc5_export.h"
18 #ifndef CVC5__API__CVC5_KIND_H
19 #define CVC5__API__CVC5_KIND_H
26 /* -------------------------------------------------------------------------- */
28 /* -------------------------------------------------------------------------- */
30 // TODO(Gereon): Fix links that involve std::vector. See
31 // https://github.com/doxygen/doxygen/issues/8503
34 * The kind of a cvc5 term.
36 * Note that the underlying type of Kind must be signed (to enable range
37 * checks for validity). The size of this type depends on the size of
38 * cvc5::Kind (NodeValue::NBITS_KIND, currently 10 bits, see expr/node_value.h).
40 enum CVC5_EXPORT Kind
: int32_t
44 * Should never be exposed or created via the API.
49 * Should never be exposed or created via the API.
53 * Null kind (kind of null term `Term::Term()`).
54 * Do not explicitly create via API functions other than `Term::Term()`.
58 /* Builtin --------------------------------------------------------------- */
61 * Uninterpreted constant.
64 * - 1: Sort of the constant
65 * - 2: Index of the constant
68 * - `Solver::mkUninterpretedConst(const Sort& sort, int32_t index) const`
70 UNINTERPRETED_CONSTANT
,
72 * Abstract value (other than uninterpreted sort constants).
75 * - 1: Index of the abstract value
78 * - `Solver::mkAbstractValue(const std::string& index) const`
79 * - `Solver::mkAbstractValue(uint64_t index) const`
83 /* Built-in operator */
87 * Equality, chainable.
90 * - 1..n: Terms with same sorts
93 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
94 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
95 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
102 * - 1..n: Terms with same sorts
105 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
106 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
107 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
111 * First-order constant.
113 * Not permitted in bindings (forall, exists, ...).
116 * - See @ref cvc5::api::Solver::mkConst() "mkConst()".
119 * - `Solver::mkConst(const Sort& sort, const std::string& symbol) const`
120 * - `Solver::mkConst(const Sort& sort) const`
126 * Permitted in bindings and in the lambda and quantifier bodies only.
129 * - See @ref cvc5::api::Solver::mkVar() "mkVar()".
132 * - `Solver::mkVar(const Sort& sort, const std::string& symbol) const`
136 /* Skolem variable (internal only) */
140 * Symbolic expression.
146 * - `Solver::mkTerm(Kind kind, const Term& child) const`
147 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
148 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
149 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
156 * - 1: BOUND_VAR_LIST
160 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
161 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
165 * The syntax of a witness term is similar to a quantified formula except that
166 * only one bound variable is allowed.
167 * The term `(witness ((x T)) F)` returns an element `x` of type `T`
170 * The witness operator behaves like the description operator
171 * (see https://planetmath.org/hilbertsvarepsilonoperator) if there is no x
172 * that satisfies F. But if such x exists, the witness operator does not
173 * enforce the axiom that ensures uniqueness up to logical equivalence:
176 * \forall x. F \equiv G \Rightarrow witness~x. F = witness~x. G
179 * For example if there are 2 elements of type T that satisfy F, then the
180 * following formula is satisfiable:
183 * (witness ((x Int)) F)
184 * (witness ((x Int)) F))
186 * This kind is primarily used internally, but may be returned in models
187 * (e.g. for arithmetic terms in non-linear queries). However, it is not
188 * supported by the parser. Moreover, the user of the API should be cautious
189 * when using this operator. In general, all witness terms
190 * `(witness ((x Int)) F)` should be such that `(exists ((x Int)) F)` is a
191 * valid formula. If this is not the case, then the semantics in formulas that
192 * use witness terms may be unintuitive. For example, the following formula is
194 * `(or (= (witness ((x Int)) false) 0) (not (= (witness ((x Int)) false) 0))`
195 * whereas notice that `(or (= z 0) (not (= z 0)))` is true for any `z`.
198 * - 1: BOUND_VAR_LIST
202 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
203 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
207 /* Boolean --------------------------------------------------------------- */
213 * - 1: Boolean value of the constant
216 * - `Solver::mkTrue() const`
217 * - `Solver::mkFalse() const`
218 * - `Solver::mkBoolean(bool val) const`
225 * - 1: Boolean Term to negate
228 * - `Solver::mkTerm(Kind kind, const Term& child) const`
232 * Logical conjunction.
235 * - 1..n: Boolean Term of the conjunction
238 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
239 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
240 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
244 * Logical implication.
247 * - 1..n: Boolean Terms, right associative
250 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
251 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
252 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
256 * Logical disjunction.
259 * - 1..n: Boolean Term of the disjunction
262 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
263 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
264 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
268 * Logical exclusive disjunction, left associative.
271 * - 1..n: Boolean Terms, `[1] xor ... xor [n]`
274 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
275 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
276 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
283 * - 1: is a Boolean condition Term
284 * - 2: the 'then' Term
285 * - 3: the 'else' Term
287 * 'then' and 'else' term must have same base sort.
290 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
291 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
295 /* UF -------------------------------------------------------------------- */
298 * Application of an uninterpreted function.
302 * - 2..n: Function argument instantiation Terms
305 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
306 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
307 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
311 /* Boolean term variable */
312 BOOLEAN_TERM_VARIABLE
,
315 * Cardinality constraint on uninterpreted sort S.
316 * Interpreted as a predicate that is true when the cardinality of S
317 * is less than or equal to the value of the second argument.
320 * - 1: Term of sort S
321 * - 2: Positive integer constant that bounds the cardinality of sort S
324 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
325 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
327 CARDINALITY_CONSTRAINT
,
329 * Cardinality value for uninterpreted sort S.
330 * An operator that returns an integer indicating the value of the cardinality
334 * - 1: Term of sort S
337 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
338 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
342 /* Combined cardinality constraint. */
343 COMBINED_CARDINALITY_CONSTRAINT
,
344 /* Partial uninterpreted function application. */
348 * Higher-order applicative encoding of function application, left
352 * - 1: Function to apply
353 * - 2..n: Arguments of the function
356 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
357 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
358 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
362 /* Arithmetic ------------------------------------------------------------ */
365 * Arithmetic addition.
368 * - 1..n: Terms of sort Integer, Real (sorts must match)
371 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
372 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
373 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
377 * Arithmetic multiplication.
380 * - 1..n: Terms of sort Integer, Real (sorts must match)
383 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
384 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
385 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
389 * Operator for Integer AND
392 * - 1: Size of the bit-vector that determines the semantics of the IAND
395 * - `Solver::mkOp(Kind kind, uint32_t param) const`
397 * Apply integer conversion to bit-vector.
400 * - 1: Op of kind IAND
405 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
406 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
410 /* Synonym for MULT. */
414 * Arithmetic subtraction, left associative.
417 * - 1..n: Terms of sort Integer, Real (sorts must match)
420 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
421 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
422 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
426 * Arithmetic negation.
429 * - 1: Term of sort Integer, Real
432 * - `Solver::mkTerm(Kind kind, const Term& child) const`
436 * Real division, division by 0 undefined, left associative.
439 * - 1..n: Terms of sort Integer, Real
442 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
443 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
444 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
448 * Integer division, division by 0 undefined, left associative.
451 * - 1..n: Terms of sort Integer
454 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
455 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
456 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
460 * Integer modulus, division by 0 undefined.
463 * - 1: Term of sort Integer
464 * - 2: Term of sort Integer
467 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
468 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
475 * - 1: Term of sort Integer
478 * - `Solver::mkTerm(Kind kind, const Term& child) const`
485 * - 1: Term of sort Integer, Real
486 * - 2: Term of sort Integer, Real
489 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
490 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
494 * Exponential function.
497 * - 1: Term of sort Integer, Real
500 * - `Solver::mkTerm(Kind kind, const Term& child) const`
507 * - 1: Term of sort Integer, Real
510 * - `Solver::mkTerm(Kind kind, const Term& child) const`
517 * - 1: Term of sort Integer, Real
520 * - `Solver::mkTerm(Kind kind, const Term& child) const`
527 * - 1: Term of sort Integer, Real
530 * - `Solver::mkTerm(Kind kind, const Term& child) const`
537 * - 1: Term of sort Integer, Real
540 * - `Solver::mkTerm(Kind kind, const Term& child) const`
547 * - 1: Term of sort Integer, Real
550 * - `Solver::mkTerm(Kind kind, const Term& child) const`
554 * Cotangent function.
557 * - 1: Term of sort Integer, Real
560 * - `Solver::mkTerm(Kind kind, const Term& child) const`
567 * - 1: Term of sort Integer, Real
570 * - `Solver::mkTerm(Kind kind, const Term& child) const`
574 * Arc cosine function.
577 * - 1: Term of sort Integer, Real
580 * - `Solver::mkTerm(Kind kind, const Term& child) const`
584 * Arc tangent function.
587 * - 1: Term of sort Integer, Real
590 * - `Solver::mkTerm(Kind kind, const Term& child) const`
594 * Arc cosecant function.
597 * - 1: Term of sort Integer, Real
600 * - `Solver::mkTerm(Kind kind, const Term& child) const`
604 * Arc secant function.
607 * - 1: Term of sort Integer, Real
610 * - `Solver::mkTerm(Kind kind, const Term& child) const`
614 * Arc cotangent function.
617 * - 1: Term of sort Integer, Real
620 * - `Solver::mkTerm(Kind kind, const Term& child) const`
627 * - 1: Term of sort Integer, Real
630 * - `Solver::mkTerm(Kind kind, const Term& child) const`
634 * Operator for the divisibility-by-k predicate.
637 * - 1: The k to divide by (sort Integer)
640 * - `Solver::mkOp(Kind kind, uint32_t param) const`
642 * Apply divisibility-by-k predicate.
645 * - 1: Op of kind DIVISIBLE
649 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
650 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
654 * Multiple-precision rational constant.
657 * See @ref cvc5::api::Solver::mkInteger() "mkInteger()", @ref cvc5::api::Solver::mkReal() "mkReal()".
660 * - `Solver::mkInteger(const std::string& s) const`
661 * - `Solver::mkInteger(int64_t val) const`
662 * - `Solver::mkReal(const std::string& s) const`
663 * - `Solver::mkReal(int64_t val) const`
664 * - `Solver::mkReal(int64_t num, int64_t den) const`
668 * Less than, chainable.
671 * - 1..n: Terms of sort Integer, Real; [1] < ... < [n]
674 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
675 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
676 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
680 * Less than or equal, chainable.
683 * - 1..n: Terms of sort Integer, Real; [1] <= ... <= [n]
686 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
687 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
691 * Greater than, chainable.
694 * - 1..n: Terms of sort Integer, Real, [1] > ... > [n]
697 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
698 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
699 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
703 * Greater than or equal, chainable.
706 * - 1..n: Terms of sort Integer, Real; [1] >= ... >= [n]
709 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
710 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
711 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
715 * Is-integer predicate.
718 * - 1: Term of sort Integer, Real
721 * - `Solver::mkTerm(Kind kind, const Term& child) const`
725 * Convert Term to Integer by the floor function.
728 * - 1: Term of sort Integer, Real
731 * - `Solver::mkTerm(Kind kind, const Term& child) const`
735 * Convert Term to Real.
739 * - 1: Term of sort Integer, Real
741 * This is a no-op in cvc5, as Integer is a subtype of Real.
748 * - `Solver::mkPi() const`
749 * - `Solver::mkTerm(Kind kind) const`
753 /* BV -------------------------------------------------------------------- */
756 * Fixed-size bit-vector constant.
759 * See @ref cvc5::api::Solver::mkBitVector() "mkBitVector()".
762 * - `Solver::mkBitVector(uint32_t size, uint64_t val) const`
763 * - `Solver::mkBitVector(const std::string& s, uint32_t base) const`
764 * - `Solver::mkBitVector(uint32_t size, const std::string& s, uint32_t base) const`
768 * Concatenation of two or more bit-vectors.
771 * - 1..n: Terms of bit-vector sort
774 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
775 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
776 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
783 * - 1..n: Terms of bit-vector sort (sorts must match)
786 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
787 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
788 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
795 * - 1..n: Terms of bit-vector sort (sorts must match)
798 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
799 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
800 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
807 * - 1..n: Terms of bit-vector sort (sorts must match)
810 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
811 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
812 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
819 * - 1: Term of bit-vector sort
822 * - `Solver::mkTerm(Kind kind, const Term& child) const`
829 * - 1..2: Terms of bit-vector sort (sorts must match)
832 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
833 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
840 * - 1..2: Terms of bit-vector sort (sorts must match)
843 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
844 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
848 * Bit-wise xnor, left associative.
851 * - 1..n: Terms of bit-vector sort (sorts must match)
854 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
855 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
859 * Equality comparison (returns bit-vector of size 1).
862 * - 1..2: Terms of bit-vector sort (sorts must match)
865 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
866 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
867 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
871 * Multiplication of two or more bit-vectors.
874 * - 1..n: Terms of bit-vector sort (sorts must match)
877 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
878 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
879 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
883 * Addition of two or more bit-vectors.
886 * - 1..n: Terms of bit-vector sort (sorts must match)
889 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
890 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
891 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
895 * Subtraction of two bit-vectors.
898 * - 1..2: Terms of bit-vector sort (sorts must match)
901 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
902 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
906 * Negation of a bit-vector (two's complement).
909 * - 1: Term of bit-vector sort
912 * - `Solver::mkTerm(Kind kind, const Term& child) const`
916 * Unsigned division of two bit-vectors, truncating towards 0.
918 * Note: The semantics of this operator depends on `bv-div-zero-const`
919 * (default is true). Depending on the setting, a division by zero is
920 * treated as all ones (default, corresponds to SMT-LIB >=2.6) or an
921 * uninterpreted value (corresponds to SMT-LIB <2.6).
924 * - 1..2: Terms of bit-vector sort (sorts must match)
927 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
928 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
932 * Unsigned remainder from truncating division of two bit-vectors.
934 * Note: The semantics of this operator depends on `bv-div-zero-const`
935 * (default is true). Depending on the setting, if the modulus is zero, the
936 * result is either the dividend (default, corresponds to SMT-LIB >=2.6) or
937 * an uninterpreted value (corresponds to SMT-LIB <2.6).
940 * - 1..2: Terms of bit-vector sort (sorts must match)
943 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
944 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
948 * Two's complement signed division of two bit-vectors.
950 * Note: The semantics of this operator depends on `bv-div-zero-const`
951 * (default is true). By default, the function returns all ones if the
952 * dividend is positive and one if the dividend is negative (corresponds to
953 * SMT-LIB >=2.6). If the option is disabled, a division by zero is treated
954 * as an uninterpreted value (corresponds to SMT-LIB <2.6).
957 * - 1..2: Terms of bit-vector sort (sorts must match)
960 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
961 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
965 * Two's complement signed remainder of two bit-vectors
966 * (sign follows dividend).
968 * Note: The semantics of this operator depends on `bv-div-zero-const`
969 * (default is true, corresponds to SMT-LIB >=2.6). Depending on the setting,
970 * if the modulus is zero, the result is either the dividend (default) or an
971 * uninterpreted value (corresponds to SMT-LIB <2.6).
974 * - 1..2: Terms of bit-vector sort (sorts must match)
977 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
978 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
982 * Two's complement signed remainder
983 * (sign follows divisor).
985 * Note: The semantics of this operator depends on `bv-div-zero-const`
986 * (default is on). Depending on the setting, if the modulus is zero, the
987 * result is either the dividend (default, corresponds to SMT-LIB >=2.6) or
988 * an uninterpreted value (corresponds to SMT-LIB <2.6).
991 * - 1..2: Terms of bit-vector sort (sorts must match)
994 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
995 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
999 * Bit-vector shift left.
1000 * The two bit-vector parameters must have same width.
1003 * - 1..2: Terms of bit-vector sort (sorts must match)
1006 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1007 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1011 * Bit-vector logical shift right.
1012 * The two bit-vector parameters must have same width.
1015 * - 1..2: Terms of bit-vector sort (sorts must match)
1018 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1019 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1023 * Bit-vector arithmetic shift right.
1024 * The two bit-vector parameters must have same width.
1027 * - 1..2: Terms of bit-vector sort (sorts must match)
1030 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1031 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1035 * Bit-vector unsigned less than.
1036 * The two bit-vector parameters must have same width.
1039 * - 1..2: Terms of bit-vector sort (sorts must match)
1042 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1043 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1047 * Bit-vector unsigned less than or equal.
1048 * The two bit-vector parameters must have same width.
1051 * - 1..2: Terms of bit-vector sort (sorts must match)
1054 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1055 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1059 * Bit-vector unsigned greater than.
1060 * The two bit-vector parameters must have same width.
1063 * - 1..2: Terms of bit-vector sort (sorts must match)
1066 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1067 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1071 * Bit-vector unsigned greater than or equal.
1072 * The two bit-vector parameters must have same width.
1075 * - 1..2: Terms of bit-vector sort (sorts must match)
1078 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1079 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1083 * Bit-vector signed less than.
1084 * The two bit-vector parameters must have same width.
1087 * - 1..2: Terms of bit-vector sort (sorts must match)
1090 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1091 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1095 * Bit-vector signed less than or equal.
1096 * The two bit-vector parameters must have same width.
1099 * - 1..2: Terms of bit-vector sort (sorts must match)
1102 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1103 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1107 * Bit-vector signed greater than.
1108 * The two bit-vector parameters must have same width.
1111 * - 1..2: Terms of bit-vector sort (sorts must match)
1114 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1115 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1119 * Bit-vector signed greater than or equal.
1120 * The two bit-vector parameters must have same width.
1123 * - 1..2: Terms of bit-vector sort (sorts must match)
1126 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1127 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1131 * Bit-vector unsigned less than, returns bit-vector of size 1.
1134 * - 1..2: Terms of bit-vector sort (sorts must match)
1137 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1138 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1142 * Bit-vector signed less than. returns bit-vector of size 1.
1145 * - 1..2: Terms of bit-vector sort (sorts must match)
1148 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1149 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1153 * Same semantics as regular ITE, but condition is bit-vector of size 1.
1156 * - 1: Term of bit-vector sort of size 1, representing the condition
1157 * - 2: Term reprsenting the 'then' branch
1158 * - 3: Term representing the 'else' branch
1160 * 'then' and 'else' term must have same base sort.
1163 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1164 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1171 * - 1: Term of bit-vector sort
1174 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1178 * Bit-vector redand.
1181 * - 1: Term of bit-vector sort
1184 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1188 /* formula to be treated as a bv atom via eager bit-blasting
1189 * (internal-only symbol) */
1190 BITVECTOR_EAGER_ATOM
,
1191 /* term to be treated as a variable. used for eager bit-blasting Ackermann
1192 * expansion of bvudiv (internal-only symbol) */
1193 BITVECTOR_ACKERMANIZE_UDIV
,
1194 /* term to be treated as a variable. used for eager bit-blasting Ackermann
1195 * expansion of bvurem (internal-only symbol) */
1196 BITVECTOR_ACKERMANIZE_UREM
,
1199 * Operator for bit-vector extract (from index 'high' to 'low').
1202 * - 1: The 'high' index
1203 * - 2: The 'low' index
1206 * - `Solver::mkOp(Kind kind, uint32_t param, uint32_t param) const`
1208 * Apply bit-vector extract.
1211 * - 1: Op of kind BITVECTOR_EXTRACT
1212 * - 2: Term of bit-vector sort
1215 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1216 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1220 * Operator for bit-vector repeat.
1223 * - 1: Number of times to repeat a given bit-vector
1226 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1228 * Apply bit-vector repeat.
1231 * - 1: Op of kind BITVECTOR_REPEAT
1232 * - 2: Term of bit-vector sort
1235 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1236 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1240 * Operator for bit-vector zero-extend.
1243 * - 1: Number of bits by which a given bit-vector is to be extended
1246 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1248 * Apply bit-vector zero-extend.
1251 * - 1: Op of kind BITVECTOR_ZERO_EXTEND
1252 * - 2: Term of bit-vector sort
1255 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1256 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1258 BITVECTOR_ZERO_EXTEND
,
1260 * Operator for bit-vector sign-extend.
1263 * - 1: Number of bits by which a given bit-vector is to be extended
1266 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1268 * Apply bit-vector sign-extend.
1271 * - 1: Op of kind BITVECTOR_SIGN_EXTEND
1272 * - 2: Term of bit-vector sort
1275 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1276 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1278 BITVECTOR_SIGN_EXTEND
,
1280 * Operator for bit-vector rotate left.
1283 * - 1: Number of bits by which a given bit-vector is to be rotated
1286 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1288 * Apply bit-vector rotate left.
1291 * - 1: Op of kind BITVECTOR_ROTATE_LEFT
1292 * - 2: Term of bit-vector sort
1295 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1296 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1298 BITVECTOR_ROTATE_LEFT
,
1300 * Operator for bit-vector rotate right.
1303 * - 1: Number of bits by which a given bit-vector is to be rotated
1306 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1308 * Apply bit-vector rotate right.
1311 * - 1: Op of kind BITVECTOR_ROTATE_RIGHT
1312 * - 2: Term of bit-vector sort
1315 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1316 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1318 BITVECTOR_ROTATE_RIGHT
,
1320 /* bit-vector boolean bit extract. */
1324 * Operator for the conversion from Integer to bit-vector.
1327 * - 1: Size of the bit-vector to convert to
1330 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1332 * Apply integer conversion to bit-vector.
1335 * - 1: Op of kind INT_TO_BITVECTOR
1339 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1340 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1344 * Bit-vector conversion to (nonnegative) integer.
1347 * - 1: Term of bit-vector sort
1350 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1354 /* FP -------------------------------------------------------------------- */
1357 * Floating-point constant, constructed from a double or string.
1360 * - 1: Size of the exponent
1361 * - 2: Size of the significand
1362 * - 3: Value of the floating-point constant as a bit-vector term
1365 * - `Solver::mkFloatingPoint(uint32_t exp, uint32_t sig, Term val) const`
1367 CONST_FLOATINGPOINT
,
1369 * Floating-point rounding mode term.
1372 * - `Solver::mkRoundingMode(RoundingMode rm) const`
1376 * Create floating-point literal from bit-vector triple.
1379 * - 1: Sign bit as a bit-vector term
1380 * - 2: Exponent bits as a bit-vector term
1381 * - 3: Significand bits as a bit-vector term (without hidden bit)
1384 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1385 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1389 * Floating-point equality.
1392 * - 1..2: Terms of floating point sort
1395 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1396 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1400 * Floating-point absolute value.
1403 * - 1: Term of floating point sort
1406 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1410 * Floating-point negation.
1413 * - 1: Term of floating point sort
1416 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1420 * Floating-point addition.
1423 * - 1: CONST_ROUNDINGMODE
1424 * - 2: Term of sort FloatingPoint
1425 * - 3: Term of sort FloatingPoint
1428 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1429 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1433 * Floating-point sutraction.
1436 * - 1: CONST_ROUNDINGMODE
1437 * - 2: Term of sort FloatingPoint
1438 * - 3: Term of sort FloatingPoint
1441 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1442 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1446 * Floating-point multiply.
1449 * - 1: CONST_ROUNDINGMODE
1450 * - 2: Term of sort FloatingPoint
1451 * - 3: Term of sort FloatingPoint
1454 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1455 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1459 * Floating-point division.
1462 * - 1: CONST_ROUNDINGMODE
1463 * - 2: Term of sort FloatingPoint
1464 * - 3: Term of sort FloatingPoint
1467 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1468 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1472 * Floating-point fused multiply and add.
1475 * - 1: CONST_ROUNDINGMODE
1476 * - 2: Term of sort FloatingPoint
1477 * - 3: Term of sort FloatingPoint
1478 * - 4: Term of sort FloatingPoint
1481 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1485 * Floating-point square root.
1488 * - 1: CONST_ROUNDINGMODE
1489 * - 2: Term of sort FloatingPoint
1492 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1493 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1497 * Floating-point remainder.
1500 * - 1..2: Terms of floating point sort
1503 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1504 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1508 * Floating-point round to integral.
1511 * -1..2: Terms of floating point sort
1514 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1515 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1519 * Floating-point minimum.
1522 * - 1..2: Terms of floating point sort
1525 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1526 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1530 * Floating-point maximum.
1533 * - 1..2: Terms of floating point sort
1536 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1537 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1541 * Floating-point less than or equal.
1544 * - 1..2: Terms of floating point sort
1547 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1548 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1552 * Floating-point less than.
1555 * - 1..2: Terms of floating point sort
1558 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1559 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1563 * Floating-point greater than or equal.
1566 * - 1..2: Terms of floating point sort
1569 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1570 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1574 * Floating-point greater than.
1577 * - 1..2: Terms of floating point sort
1580 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1581 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1585 * Floating-point is normal.
1588 * - 1: Term of floating point sort
1591 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1595 * Floating-point is sub-normal.
1598 * - 1: Term of floating point sort
1601 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1605 * Floating-point is zero.
1608 * - 1: Term of floating point sort
1611 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1615 * Floating-point is infinite.
1618 * - 1: Term of floating point sort
1621 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1623 FLOATINGPOINT_ISINF
,
1625 * Floating-point is NaN.
1628 * - 1: Term of floating point sort
1631 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1633 FLOATINGPOINT_ISNAN
,
1635 * Floating-point is negative.
1638 * - 1: Term of floating point sort
1641 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1643 FLOATINGPOINT_ISNEG
,
1645 * Floating-point is positive.
1648 * - 1: Term of floating point sort
1651 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1653 FLOATINGPOINT_ISPOS
,
1655 * Operator for to_fp from bit vector.
1658 * - 1: Exponent size
1659 * - 2: Significand size
1662 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1664 * Conversion from an IEEE-754 bit vector to floating-point.
1667 * - 1: Op of kind FLOATINGPOINT_TO_FP_IEEE_BITVECTOR
1668 * - 2: Term of sort FloatingPoint
1671 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1672 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1674 FLOATINGPOINT_TO_FP_IEEE_BITVECTOR
,
1676 * Operator for to_fp from floating point.
1679 * - 1: Exponent size
1680 * - 2: Significand size
1683 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1685 * Conversion between floating-point sorts.
1688 * - 1: Op of kind FLOATINGPOINT_TO_FP_FLOATINGPOINT
1689 * - 2: Term of sort FloatingPoint
1692 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1693 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1695 FLOATINGPOINT_TO_FP_FLOATINGPOINT
,
1697 * Operator for to_fp from real.
1700 * - 1: Exponent size
1701 * - 2: Significand size
1704 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1706 * Conversion from a real to floating-point.
1709 * - 1: Op of kind FLOATINGPOINT_TO_FP_REAL
1710 * - 2: Term of sort FloatingPoint
1713 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1714 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1716 FLOATINGPOINT_TO_FP_REAL
,
1718 * Operator for to_fp from signed bit vector
1721 * - 1: Exponent size
1722 * - 2: Significand size
1725 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1727 * Conversion from a signed bit vector to floating-point.
1730 * - 1: Op of kind FLOATINGPOINT_TO_FP_SIGNED_BITVECTOR
1731 * - 2: Term of sort FloatingPoint
1734 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1735 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1737 FLOATINGPOINT_TO_FP_SIGNED_BITVECTOR
,
1739 * Operator for to_fp from unsigned bit vector.
1742 * - 1: Exponent size
1743 * - 2: Significand size
1746 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1748 * Converting an unsigned bit vector to floating-point.
1751 * - 1: Op of kind FLOATINGPOINT_TO_FP_UNSIGNED_BITVECTOR
1752 * - 2: Term of sort FloatingPoint
1755 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1756 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1758 FLOATINGPOINT_TO_FP_UNSIGNED_BITVECTOR
,
1760 * Operator for a generic to_fp.
1763 * - 1: exponent size
1764 * - 2: Significand size
1767 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1769 * Generic conversion to floating-point, used in parsing only.
1772 * - 1: Op of kind FLOATINGPOINT_TO_FP_GENERIC
1773 * - 2: Term of sort FloatingPoint
1776 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1777 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1779 FLOATINGPOINT_TO_FP_GENERIC
,
1781 * Operator for to_ubv.
1784 * - 1: Size of the bit-vector to convert to
1787 * - `Solver::mkOp(Kind kind, uint32_t param) const`
1789 * Conversion from a floating-point value to an unsigned bit vector.
1792 * - 1: Op of kind FLOATINGPOINT_TO_FP_TO_UBV
1793 * - 2: Term of sort FloatingPoint
1796 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1797 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1799 FLOATINGPOINT_TO_UBV
,
1801 * Operator for to_sbv.
1804 * - 1: Size of the bit-vector to convert to
1807 * - `Solver::mkOp(Kind kind, uint32_t param) const`
1809 * Conversion from a floating-point value to a signed bit vector.
1812 * - 1: Op of kind FLOATINGPOINT_TO_FP_TO_SBV
1813 * - 2: Term of sort FloatingPoint
1816 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1817 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1819 FLOATINGPOINT_TO_SBV
,
1821 * Floating-point to real.
1824 * - 1: Term of sort FloatingPoint
1827 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1829 FLOATINGPOINT_TO_REAL
,
1831 /* Arrays ---------------------------------------------------------------- */
1837 * - 1: Term of array sort
1838 * - 2: Selection index
1841 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1842 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1849 * - 1: Term of array sort
1851 * - 3: Term to store at the index
1854 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2, const Term& child3) const`
1855 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1863 * - 2: Term representing a constant
1866 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1867 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1869 * Note: We currently support the creation of constant arrays, but under some
1870 * conditions when there is a chain of equalities connecting two constant
1871 * arrays, the solver doesn't know what to do and aborts (Issue <a href="https://github.com/CVC4/CVC4/issues/1667">#1667</a>).
1875 * Equality over arrays a and b over a given range [i,j], i.e.,
1877 * \forall k . i \leq k \leq j \Rightarrow a[k] = b[k]
1883 * - 3: Lower bound of range (inclusive)
1884 * - 4: Uppper bound of range (inclusive)
1887 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1889 * Note: We currently support the creation of array equalities over index
1890 * types bit-vector, floating-point, integer and real. Option --arrays-exp is
1891 * required to support this operator.
1895 /* array table function (internal-only symbol) */
1897 /* array lambda (internal-only symbol) */
1899 /* partial array select, for internal use only */
1901 /* partial array select, for internal use only */
1905 /* Datatypes ------------------------------------------------------------- */
1908 * Constructor application.
1911 * - 1: Constructor (operator)
1912 * - 2..n: Parameters to the constructor
1915 * - `Solver::mkTerm(const Op& op) const`
1916 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1917 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1918 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2, const Term& child3) const`
1919 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1923 * Datatype selector application, which is undefined if misapplied.
1926 * - 1: Selector (operator)
1927 * - 2: Datatype term
1930 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1934 * Datatype tester application.
1938 * - 2: Datatype term
1941 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1942 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1946 * Datatype update application, which does not change the argument if
1950 * - 1: Updater (operator)
1951 * - 2: Datatype term
1952 * - 3: Value to update a field of the datatype term with
1955 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1956 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1960 * Match expressions.
1961 * For example, the smt2 syntax match term
1962 * `(match l (((cons h t) h) (nil 0)))`
1963 * is represented by the AST
1966 * (MATCH_BIND_CASE (BOUND_VAR_LIST h t) (cons h t) h)
1967 * (MATCH_CASE nil 0))
1969 * The type of the last argument of each case term could be equal.
1972 * - 1..n: Terms of kind MATCH_CASE or MATCH_BIND_CASE
1975 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1976 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1977 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1983 * A (constant) case expression to be used within a match expression.
1986 * - 1: Term denoting the pattern expression
1987 * - 2: Term denoting the return value
1990 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1991 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1996 * A (non-constant) case expression to be used within a match expression.
1999 * - 1: a BOUND_VAR_LIST Term containing the free variables of the case
2000 * - 2: Term denoting the pattern expression
2001 * - 3: Term denoting the return value
2004 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2005 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2010 * An operator mapping datatypes to an integer denoting the number of
2011 * non-nullary applications of constructors they contain.
2014 * - 1: Datatype term
2017 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
2018 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2022 * Operator for tuple projection indices
2025 * - 1: The tuple projection indices
2028 * - `Solver::mkOp(Kind TUPLE_PROJECT, std::vector<uint32_t> param) const`
2030 * Constructs a new tuple from an existing one using the elements at the
2034 * - 1: a term of tuple sort
2037 * - `Solver::mkTerm(const Op& op, const Term& child) const`
2038 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
2042 /* datatypes height bound */
2044 /* datatypes height bound */
2046 /* datatypes sygus bound */
2048 /* datatypes sygus term order */
2049 DT_SYGUS_TERM_ORDER
,
2050 /* datatypes sygus is constant */
2054 /* Separation Logic ------------------------------------------------------ */
2057 * Separation logic nil term.
2062 * - `Solver::mkSepNil(const Sort& sort) const`
2066 * Separation logic empty heap.
2069 * - 1: Term of the same sort as the sort of the location of the heap
2070 * that is constrained to be empty
2071 * - 2: Term of the same sort as the data sort of the heap that is
2072 * that is constrained to be empty
2075 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2076 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2080 * Separation logic points-to relation.
2083 * - 1: Location of the points-to constraint
2084 * - 2: Data of the points-to constraint
2087 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2088 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2092 * Separation logic star.
2095 * - 1..n: Child constraints that hold in disjoint (separated) heaps
2098 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2099 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2100 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2104 * Separation logic magic wand.
2107 * - 1: Antecendant of the magic wand constraint
2108 * - 2: Conclusion of the magic wand constraint, which is asserted to
2109 * hold in all heaps that are disjoint extensions of the antecedent.
2112 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2113 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2117 /* separation label (internal use only) */
2121 /* Sets ------------------------------------------------------------------ */
2124 * Empty set constant.
2127 * - 1: Sort of the set elements
2130 * - `Solver::mkEmptySet(const Sort& sort) const`
2137 * - 1..2: Terms of set sort
2140 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2141 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2148 * - 1..2: Terms of set sort
2151 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2152 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2159 * - 1..2: Terms of set sort
2162 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2163 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2170 * - 1..2: Terms of set sort, [1] a subset of set [2]?
2173 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2174 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2178 * Set membership predicate.
2181 * - 1..2: Terms of set sort, [1] a member of set [2]?
2184 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2185 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2189 * Construct a singleton set from an element given as a parameter.
2190 * The returned set has same type of the element.
2193 * - 1: Single element
2196 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2200 * The set obtained by inserting elements;
2203 * - 1..n-1: Elements inserted into set [n]
2207 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2208 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2209 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2210 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2217 * - 1: Set to determine the cardinality of
2220 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2224 * Set complement with respect to finite universe.
2227 * - 1: Set to complement
2230 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2234 * Finite universe set.
2235 * All set variables must be interpreted as subsets of it.
2238 * - `Solver::mkUniverseSet(const Sort& sort) const`
2245 * - 1..2: Terms of set sort
2248 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2249 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2253 * Set cartesian product.
2256 * - 1..2: Terms of set sort
2259 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2260 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2267 * - 1: Term of set sort
2270 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2274 * Set transitive closure.
2277 * - 1: Term of set sort
2280 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2287 * - 1..2: Terms of set sort
2290 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2291 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2298 * - 1: Term of set sort
2301 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2306 * A set comprehension is specified by a bound variable list x1 ... xn,
2307 * a predicate P[x1...xn], and a term t[x1...xn]. A comprehension C with the
2308 * above form has members given by the following semantics:
2310 * \forall y. ( \exists x_1...x_n. P[x_1...x_n] \hat{} t[x_1...x_n] = y )
2311 * \Leftrightarrow (member y C)
2313 * where y ranges over the element type of the (set) type of the
2314 * comprehension. If @f$ t[x_1..x_n] @f$ is not provided, it is equivalent to
2315 * y in the above formula.
2318 * - 1: Term BOUND_VAR_LIST
2319 * - 2: Term denoting the predicate of the comprehension
2320 * - 3: (optional) a Term denoting the generator for the comprehension
2323 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2324 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2325 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2329 * Returns an element from a given set.
2330 * If a set A = {x}, then the term (choose A) is equivalent to the term x.
2331 * If the set is empty, then (choose A) is an arbitrary value.
2332 * If the set has cardinality > 1, then (choose A) will deterministically
2333 * return an element in A.
2336 * - 1: Term of set sort
2339 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2343 * Set is_singleton predicate.
2346 * - 1: Term of set sort, is [1] a singleton set?
2349 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2352 /* Bags ------------------------------------------------------------------ */
2354 * Empty bag constant.
2357 * - 1: Sort of the bag elements
2360 * mkEmptyBag(const Sort& sort)
2366 * - 1..2: Terms of bag sort
2369 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2370 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2374 * Bag disjoint union (sum).
2377 * -1..2: Terms of bag sort
2380 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2381 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2385 * Bag intersection (min).
2388 * - 1..2: Terms of bag sort
2391 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2392 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2396 * Bag difference subtract (subtracts multiplicities of the second from the
2400 * - 1..2: Terms of bag sort
2403 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2404 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2406 DIFFERENCE_SUBTRACT
,
2408 * Bag difference 2 (removes shared elements in the two bags).
2411 * - 1..2: Terms of bag sort
2414 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2415 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2419 * Inclusion predicate for bags
2420 * (multiplicities of the first bag <= multiplicities of the second bag).
2423 * - 1..2: Terms of bag sort
2426 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2427 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2431 * Element multiplicity in a bag
2434 * - 1..2: Terms of bag sort (Bag E), [1] an element of sort E
2437 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2438 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2442 * Eliminate duplicates in a given bag. The returned bag contains exactly the
2443 * same elements in the given bag, but with multiplicity one.
2446 * - 1: a term of bag sort
2449 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2450 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2454 * The bag of the single element given as a parameter.
2457 * - 1: Single element
2460 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2467 * - 1: Bag to determine the cardinality of
2470 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2474 * Returns an element from a given bag.
2475 * If a bag A = {(x,n)} where n is the multiplicity, then the term (choose A)
2476 * is equivalent to the term x.
2477 * If the bag is empty, then (choose A) is an arbitrary value.
2478 * If the bag contains distinct elements, then (choose A) will
2479 * deterministically return an element in A.
2482 * - 1: Term of bag sort
2485 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2489 * Bag is_singleton predicate (single element with multiplicity exactly one).
2491 * - 1: Term of bag sort, is [1] a singleton bag?
2494 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2498 * Bag.from_set converts a set to a bag.
2501 * - 1: Term of set sort
2504 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2508 * Bag.to_set converts a bag to a set.
2511 * - 1: Term of bag sort
2514 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2518 /* Strings --------------------------------------------------------------- */
2524 * - 1..n: Terms of String sort
2527 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2528 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2529 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2533 * String membership.
2536 * - 1: Term of String sort
2537 * - 2: Term of RegExp sort
2540 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2541 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2548 * - 1: Term of String sort
2551 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2556 * Extracts a substring, starting at index i and of length l, from a string
2557 * s. If the start index is negative, the start index is greater than the
2558 * length of the string, or the length is negative, the result is the empty
2562 * - 1: Term of sort String
2563 * - 2: Term of sort Integer (index i)
2564 * - 3: Term of sort Integer (length l)
2567 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2568 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2573 * Updates a string s by replacing its context starting at an index with t.
2574 * If the start index is negative, the start index is greater than the
2575 * length of the string, the result is s. Otherwise, the length of the
2576 * original string is preserved.
2579 * - 1: Term of sort String
2580 * - 2: Term of sort Integer (index i)
2581 * - 3: Term of sort String (replacement string t)
2584 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2585 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2589 * String character at.
2590 * Returns the character at index i from a string s. If the index is negative
2591 * or the index is greater than the length of the string, the result is the
2592 * empty string. Otherwise the result is a string of length 1.
2595 * - 1: Term of sort String (string s)
2596 * - 2: Term of sort Integer (index i)
2599 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2600 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2605 * Checks whether a string s1 contains another string s2. If s2 is empty, the
2606 * result is always true.
2609 * - 1: Term of sort String (the string s1)
2610 * - 2: Term of sort String (the string s2)
2613 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2614 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2619 * Returns the index of a substring s2 in a string s1 starting at index i. If
2620 * the index is negative or greater than the length of string s1 or the
2621 * substring s2 does not appear in string s1 after index i, the result is -1.
2624 * - 1: Term of sort String (substring s1)
2625 * - 2: Term of sort String (substring s2)
2626 * - 3: Term of sort Integer (index i)
2629 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2630 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2635 * Replaces a string s2 in a string s1 with string s3. If s2 does not appear
2636 * in s1, s1 is returned unmodified.
2639 * - 1: Term of sort String (string s1)
2640 * - 2: Term of sort String (string s2)
2641 * - 3: Term of sort String (string s3)
2644 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2645 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2649 * String replace all.
2650 * Replaces all occurrences of a string s2 in a string s1 with string s3.
2651 * If s2 does not appear in s1, s1 is returned unmodified.
2654 * - 1: Term of sort String (string s1)
2655 * - 2: Term of sort String (string s2)
2656 * - 3: Term of sort String (string s3)
2659 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2660 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2664 * String replace regular expression match.
2665 * Replaces the first match of a regular expression r in string s1 with
2666 * string s2. If r does not match a substring of s1, s1 is returned
2670 * - 1: Term of sort String (string s1)
2671 * - 2: Term of sort Regexp (regexp r)
2672 * - 3: Term of sort String (string s2)
2675 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2676 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2680 * String replace all regular expression matches.
2681 * Replaces all matches of a regular expression r in string s1 with string
2682 * s2. If r does not match a substring of s1, s1 is returned unmodified.
2685 * - 1: Term of sort String (string s1)
2686 * - 2: Term of sort Regexp (regexp r)
2687 * - 3: Term of sort String (string s2)
2690 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2691 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2693 STRING_REPLACE_RE_ALL
,
2695 * String to lower case.
2698 * - 1: Term of String sort
2701 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2705 * String to upper case.
2708 * - 1: Term of String sort
2711 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2718 * - 1: Term of String sort
2721 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2726 * Returns the code point of a string if it has length one, or returns -1
2730 * - 1: Term of String sort
2733 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2738 * Returns a string containing a single character whose code point matches
2739 * the argument to this function, or the empty string if the argument is
2743 * - 1: Term of Integer sort
2746 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2751 * Returns true if string s1 is (strictly) less than s2 based on a
2752 * lexiographic ordering over code points.
2755 * - 1: Term of sort String (the string s1)
2756 * - 2: Term of sort String (the string s2)
2759 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2760 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2764 * String less than or equal.
2765 * Returns true if string s1 is less than or equal to s2 based on a
2766 * lexiographic ordering over code points.
2769 * - 1: Term of sort String (the string s1)
2770 * - 2: Term of sort String (the string s2)
2773 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2774 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2779 * Checks whether a string s1 is a prefix of string s2. If string s1 is
2780 * empty, this operator returns true.
2783 * - 1: Term of sort String (string s1)
2784 * - 2: Term of sort String (string s2)
2787 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2788 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2793 * Checks whether a string s1 is a suffix of string 2. If string s1 is empty,
2794 * this operator returns true.
2797 * - 1: Term of sort String (string s1)
2798 * - 2: Term of sort String (string s2)
2801 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2802 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2807 * Returns true if string s is digit (it is one of "0", ..., "9").
2810 * - 1: Term of sort String
2813 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
2814 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2818 * Integer to string.
2819 * If the integer is negative this operator returns the empty string.
2822 * - 1: Term of sort Integer
2825 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2829 * String to integer (total function).
2830 * If the string does not contain an integer or the integer is negative, the
2831 * operator returns -1.
2834 * - 1: Term of sort String
2837 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2844 * - See @ref cvc5::api::Solver::mkString() "mkString()".
2847 * - `Solver::mkString(const std::string& s, bool useEscSequences) const`
2848 * - `Solver::mkString(const unsigned char c) const`
2849 * - `Solver::mkString(const std::vector<uint32_t>& s) const`
2853 * Conversion from string to regexp.
2856 * - 1: Term of sort String
2859 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2863 * Regexp Concatenation.
2866 * - 1..2: Terms of Regexp sort
2869 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2870 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2877 * - 1..2: Terms of Regexp sort
2880 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2881 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2885 * Regexp intersection.
2888 * - 1..2: Terms of Regexp sort
2891 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2892 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2896 * Regexp difference.
2899 * - 1..2: Terms of Regexp sort
2902 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2903 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2910 * - 1: Term of sort Regexp
2913 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2920 * - 1: Term of sort Regexp
2923 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2930 * - 1: Term of sort Regexp
2933 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2940 * - 1: Lower bound character for the range
2941 * - 2: Upper bound character for the range
2944 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2945 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2949 * Operator for regular expression repeat.
2952 * - 1: The number of repetitions
2955 * - `Solver::mkOp(Kind kind, uint32_t param) const`
2957 * Apply regular expression loop.
2960 * - 1: Op of kind REGEXP_REPEAT
2961 * - 2: Term of regular expression sort
2964 * - `Solver::mkTerm(const Op& op, const Term& child) const`
2965 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
2969 * Operator for regular expression loop, from lower bound to upper bound
2970 * number of repetitions.
2973 * - 1: The lower bound
2974 * - 2: The upper bound
2977 * - `Solver::mkOp(Kind kind, uint32_t param, uint32_t param) const`
2979 * Apply regular expression loop.
2982 * - 1: Op of kind REGEXP_LOOP
2983 * - 2: Term of regular expression sort
2986 * - `Solver::mkTerm(const Op& op, const Term& child) const`
2987 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
2996 * - `Solver::mkRegexpEmpty() const`
2997 * - `Solver::mkTerm(Kind kind) const`
3001 * Regexp all characters.
3006 * - `Solver::mkRegexpSigma() const`
3007 * - `Solver::mkTerm(Kind kind) const`
3011 * Regexp complement.
3014 * - 1: Term of sort RegExp
3017 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
3025 * - 1..n: Terms of Sequence sort
3028 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3029 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3030 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3037 * - 1: Term of Sequence sort
3040 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3045 * Extracts a subsequence, starting at index i and of length l, from a
3046 * sequence s. If the start index is negative, the start index is greater
3047 * than the length of the sequence, or the length is negative, the result is
3048 * the empty sequence.
3051 * - 1: Term of sort Sequence
3052 * - 2: Term of sort Integer (index i)
3053 * - 3: Term of sort Integer (length l)
3056 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3057 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3062 * Updates a sequence s by replacing its context starting at an index with t.
3063 * If the start index is negative, the start index is greater than the
3064 * length of the sequence, the result is s. Otherwise, the length of the
3065 * original sequence is preserved.
3068 * - 1: Term of sort Sequence
3069 * - 2: Term of sort Integer (index i)
3070 * - 3: Term of sort Sequence (replacement sequence t)
3073 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3074 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3078 * Sequence element at.
3079 * Returns the element at index i from a sequence s. If the index is negative
3080 * or the index is greater or equal to the length of the sequence, the result
3081 * is the empty sequence. Otherwise the result is a sequence of length 1.
3084 * - 1: Term of sequence sort (string s)
3085 * - 2: Term of sort Integer (index i)
3088 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3089 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3093 * Sequence contains.
3094 * Checks whether a sequence s1 contains another sequence s2. If s2 is empty,
3095 * the result is always true.
3098 * - 1: Term of sort Sequence (the sequence s1)
3099 * - 2: Term of sort Sequence (the sequence s2)
3102 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3103 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3107 * Sequence index-of.
3108 * Returns the index of a subsequence s2 in a sequence s1 starting at index i.
3109 * If the index is negative or greater than the length of sequence s1 or the
3110 * subsequence s2 does not appear in sequence s1 after index i, the result is
3114 * - 1: Term of sort Sequence (subsequence s1)
3115 * - 2: Term of sort Sequence (subsequence s2)
3116 * - 3: Term of sort Integer (index i)
3119 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3120 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3125 * Replaces the first occurrence of a sequence s2 in a sequence s1 with
3126 * sequence s3. If s2 does not appear in s1, s1 is returned unmodified.
3129 * - 1: Term of sort Sequence (sequence s1)
3130 * - 2: Term of sort Sequence (sequence s2)
3131 * - 3: Term of sort Sequence (sequence s3)
3134 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3135 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3139 * Sequence replace all.
3140 * Replaces all occurrences of a sequence s2 in a sequence s1 with sequence
3141 * s3. If s2 does not appear in s1, s1 is returned unmodified.
3144 * - 1: Term of sort Sequence (sequence s1)
3145 * - 2: Term of sort Sequence (sequence s2)
3146 * - 3: Term of sort Sequence (sequence s3)
3149 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3150 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3157 * - 1: Term of Sequence sort
3160 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3164 * Sequence prefix-of.
3165 * Checks whether a sequence s1 is a prefix of sequence s2. If sequence s1 is
3166 * empty, this operator returns true.
3169 * - 1: Term of sort Sequence (sequence s1)
3170 * - 2: Term of sort Sequence (sequence s2)
3173 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3174 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3178 * Sequence suffix-of.
3179 * Checks whether a sequence s1 is a suffix of sequence s2. If sequence s1 is
3180 * empty, this operator returns true.
3183 * - 1: Term of sort Sequence (sequence s1)
3184 * - 2: Term of sort Sequence (sequence s2)
3187 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3188 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3192 * Constant sequence.
3195 * - See @ref cvc5::api::Solver::mkEmptySequence() "mkEmptySequence()".
3198 * - `Solver::mkEmptySequence(const Sort& sort) const`
3200 * Note that a constant sequence is a term that is equivalent to:
3202 * (seq.++ (seq.unit c1) ... (seq.unit cn))
3204 * where n>=0 and c1, ..., cn are constants of some sort. The elements
3205 * can be extracted by `Term::getSequenceValue()`.
3209 * Sequence unit, corresponding to a sequence of length one with the given
3213 * - 1: Element term.
3216 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
3220 * Sequence nth, corresponding to the nth element of a sequence.
3223 * - 1: Sequence term.
3224 * - 2: Integer term.
3227 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3231 /* Quantifiers ----------------------------------------------------------- */
3234 * Universally quantified formula.
3237 * - 1: BOUND_VAR_LIST Term
3238 * - 2: Quantifier body
3239 * - 3: (optional) INST_PATTERN_LIST Term
3242 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3243 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3244 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3248 * Existentially quantified formula.
3251 * - 1: BOUND_VAR_LIST Term
3252 * - 2: Quantifier body
3253 * - 3: (optional) INST_PATTERN_LIST Term
3256 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3257 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3258 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3262 * A list of bound variables (used to bind variables under a quantifier)
3265 * - 1..n: Terms with kind BOUND_VARIABLE
3268 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3269 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3270 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3274 * An instantiation pattern.
3275 * Specifies a (list of) terms to be used as a pattern for quantifier
3279 * - 1..n: Terms with kind BOUND_VARIABLE
3282 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3283 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3284 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3288 * An instantiation no-pattern.
3289 * Specifies a (list of) terms that should not be used as a pattern for
3290 * quantifier instantiation.
3293 * - 1..n: Terms with kind BOUND_VARIABLE
3296 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3297 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3298 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3302 * An instantiation pool.
3303 * Specifies an annotation for pool based instantiation.
3305 * - 1..n: Terms that comprise the pools, which are one-to-one with
3306 * the variables of the quantified formula to be instantiated.
3308 * - `mkTerm(Kind kind, Term child1, Term child2)
3309 * - `mkTerm(Kind kind, Term child1, Term child2, Term child3)
3310 * - `mkTerm(Kind kind, const std::vector<Term>& children)
3314 * A instantantiation-add-to-pool annotation.
3316 * - 1: The pool to add to.
3318 * - `mkTerm(Kind kind, Term child)
3322 * A skolemization-add-to-pool annotation.
3324 * - 1: The pool to add to.
3326 * - `mkTerm(Kind kind, Term child)
3330 * An instantiation attribute
3331 * Specifies a custom property for a quantified formula given by a
3332 * term that is ascribed a user attribute.
3335 * - 1: Term with a user attribute.
3338 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3342 * A list of instantiation patterns and/or attributes.
3345 * - 1..n: Terms with kind INST_PATTERN, INST_NO_PATTERN, or
3349 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3350 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3351 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3356 /* Sort Kinds ------------------------------------------------------------ */
3360 /* a type parameter for type ascription */
3364 /* a datatype type index */
3368 /* set type, takes as parameter the type of the elements */
3370 /* bag type, takes as parameter the type of the elements */
3374 /* specifies types of user-declared 'uninterpreted' sorts */
3378 /* a representation for basic types */
3380 /* a function type */
3382 /* the type of a symbolic expression */
3384 /* bit-vector type */
3386 /* floating-point type */
3390 /* ----------------------------------------------------------------------- */
3391 /** Marks the upper-bound of this enumeration. */
3397 * Get the string representation of a given kind.
3399 * @return the string representation of kind k
3401 std::string
kindToString(Kind k
) CVC5_EXPORT
;
3404 * Serialize a kind to given stream.
3405 * @param out the output stream
3406 * @param k the kind to be serialized to the given output stream
3407 * @return the output stream
3409 std::ostream
& operator<<(std::ostream
& out
, Kind k
) CVC5_EXPORT
;
3417 * Hash function for Kinds.
3420 struct CVC5_EXPORT hash
<cvc5::api::Kind
>
3423 * Hashes a Kind to a size_t.
3425 size_t operator()(cvc5::api::Kind k
) const;