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.
38 * Note that the API type `cvc5::api::Kind` roughly corresponds to
39 * `cvc5::Kind`, but is a different type. It hides internal kinds that should
40 * not be exported to the API, and maps all kinds that we want to export to its
41 * corresponding internal kinds. The underlying type of `cvc5::api::Kind` must
42 * be signed (to enable range checks for validity). The size of this type
43 * depends on the size of `cvc5::Kind` (`NodeValue::NBITS_KIND`, currently 10
44 * bits, see expr/node_value.h).
50 * Should never be exposed or created via the API.
55 * Should never be exposed or created via the API.
59 * Null kind (kind of null term `Term::Term()`).
60 * Do not explicitly create via API functions other than `Term::Term()`.
64 /* Builtin --------------------------------------------------------------- */
67 * Uninterpreted constant.
70 * - 1: Sort of the constant
71 * - 2: Index of the constant
74 * - `Solver::mkUninterpretedConst(const Sort& sort, int32_t index) const`
76 UNINTERPRETED_CONSTANT
,
78 * Abstract value (other than uninterpreted sort constants).
81 * - 1: Index of the abstract value
84 * - `Solver::mkAbstractValue(const std::string& index) const`
85 * - `Solver::mkAbstractValue(uint64_t index) const`
89 /* Built-in operator */
93 * Equality, chainable.
96 * - 1..n: Terms with same sorts
99 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
100 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
101 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
108 * - 1..n: Terms with same sorts
111 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
112 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
113 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
117 * First-order constant.
119 * Not permitted in bindings (forall, exists, ...).
122 * - See @ref cvc5::api::Solver::mkConst() "mkConst()".
125 * - `Solver::mkConst(const Sort& sort, const std::string& symbol) const`
126 * - `Solver::mkConst(const Sort& sort) const`
132 * Permitted in bindings and in the lambda and quantifier bodies only.
135 * - See @ref cvc5::api::Solver::mkVar() "mkVar()".
138 * - `Solver::mkVar(const Sort& sort, const std::string& symbol) const`
142 /* Skolem variable (internal only) */
146 * Symbolic expression.
152 * - `Solver::mkTerm(Kind kind, const Term& child) const`
153 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
154 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
155 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
166 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
167 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
171 * The syntax of a witness term is similar to a quantified formula except that
172 * only one variable is allowed.
173 * The term `(witness ((x T)) F)` returns an element `x` of type `T`
176 * The witness operator behaves like the description operator
177 * (see https://planetmath.org/hilbertsvarepsilonoperator) if there is no x
178 * that satisfies F. But if such x exists, the witness operator does not
179 * enforce the axiom that ensures uniqueness up to logical equivalence:
182 * \forall x. F \equiv G \Rightarrow witness~x. F = witness~x. G
185 * For example if there are 2 elements of type T that satisfy F, then the
186 * following formula is satisfiable:
189 * (witness ((x Int)) F)
190 * (witness ((x Int)) F))
192 * This kind is primarily used internally, but may be returned in models
193 * (e.g. for arithmetic terms in non-linear queries). However, it is not
194 * supported by the parser. Moreover, the user of the API should be cautious
195 * when using this operator. In general, all witness terms
196 * `(witness ((x Int)) F)` should be such that `(exists ((x Int)) F)` is a
197 * valid formula. If this is not the case, then the semantics in formulas that
198 * use witness terms may be unintuitive. For example, the following formula is
200 * `(or (= (witness ((x Int)) false) 0) (not (= (witness ((x Int)) false) 0))`
201 * whereas notice that `(or (= z 0) (not (= z 0)))` is true for any `z`.
208 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
209 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
213 /* Boolean --------------------------------------------------------------- */
219 * - 1: Boolean value of the constant
222 * - `Solver::mkTrue() const`
223 * - `Solver::mkFalse() const`
224 * - `Solver::mkBoolean(bool val) const`
231 * - 1: Boolean Term to negate
234 * - `Solver::mkTerm(Kind kind, const Term& child) const`
238 * Logical conjunction.
241 * - 1..n: Boolean Term of the conjunction
244 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
245 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
246 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
250 * Logical implication.
253 * - 1..n: Boolean Terms, right associative
256 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
257 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
258 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
262 * Logical disjunction.
265 * - 1..n: Boolean Term of the disjunction
268 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
269 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
270 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
274 * Logical exclusive disjunction, left associative.
277 * - 1..n: Boolean Terms, `[1] xor ... xor [n]`
280 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
281 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
282 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
289 * - 1: is a Boolean condition Term
290 * - 2: the 'then' Term
291 * - 3: the 'else' Term
293 * 'then' and 'else' term must have same base sort.
296 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
297 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
301 /* UF -------------------------------------------------------------------- */
304 * Application of an uninterpreted function.
308 * - 2..n: Function argument instantiation Terms
311 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
312 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
313 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
317 /* Boolean term variable */
318 BOOLEAN_TERM_VARIABLE
,
321 * Cardinality constraint on uninterpreted sort S.
322 * Interpreted as a predicate that is true when the cardinality of S
323 * is less than or equal to the value of the second argument.
326 * - 1: Term of sort S
327 * - 2: Positive integer constant that bounds the cardinality of sort S
330 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
331 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
333 CARDINALITY_CONSTRAINT
,
335 * Higher-order applicative encoding of function application, left
339 * - 1: Function to apply
340 * - 2..n: Arguments of the function
343 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
344 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
345 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
349 /* Arithmetic ------------------------------------------------------------ */
352 * Arithmetic addition.
355 * - 1..n: Terms of sort Integer, Real (sorts must match)
358 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
359 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
360 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
364 * Arithmetic multiplication.
367 * - 1..n: Terms of sort Integer, Real (sorts must match)
370 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
371 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
372 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
376 * Operator for bit-wise AND over integers, parameterized by a (positive)
379 * ((_ iand k) i1 i2) is equivalent to:
380 * (bv2int (bvand ((_ int2bv k) i1) ((_ int2bv k) i2)))
381 * for all integers i1, i2.
384 * - 1: Size of the bit-vector that determines the semantics of the IAND
387 * - `Solver::mkOp(Kind kind, uint32_t param) const`
392 * - 1: Op of kind IAND
397 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
398 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
402 * Operator for raising 2 to a non-negative integer power.
405 * - `Solver::mkOp(Kind kind) const`
408 * - 1: Op of kind IAND
411 * Apply 2 to the power operator.
414 * - `Solver::mkTerm(const Op& op, const Term& child) const`
415 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
419 /* Synonym for MULT. */
423 * Arithmetic subtraction, left associative.
426 * - 1..n: Terms of sort Integer, Real (sorts must match)
429 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
430 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
431 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
435 * Arithmetic negation.
438 * - 1: Term of sort Integer, Real
441 * - `Solver::mkTerm(Kind kind, const Term& child) const`
445 * Real division, division by 0 undefined, left associative.
448 * - 1..n: Terms of sort Integer, Real
451 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
452 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
453 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
457 * Integer division, division by 0 undefined, left associative.
460 * - 1..n: Terms of sort Integer
463 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
464 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
465 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
469 * Integer modulus, division by 0 undefined.
472 * - 1: Term of sort Integer
473 * - 2: Term of sort Integer
476 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
477 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
484 * - 1: Term of sort Integer
487 * - `Solver::mkTerm(Kind kind, const Term& child) const`
494 * - 1: Term of sort Integer, Real
495 * - 2: Term of sort Integer, Real
498 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
499 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
503 * Exponential function.
506 * - 1: Term of sort Integer, Real
509 * - `Solver::mkTerm(Kind kind, const Term& child) const`
516 * - 1: Term of sort Integer, Real
519 * - `Solver::mkTerm(Kind kind, const Term& child) const`
526 * - 1: Term of sort Integer, Real
529 * - `Solver::mkTerm(Kind kind, const Term& child) const`
536 * - 1: Term of sort Integer, Real
539 * - `Solver::mkTerm(Kind kind, const Term& child) const`
546 * - 1: Term of sort Integer, Real
549 * - `Solver::mkTerm(Kind kind, const Term& child) const`
556 * - 1: Term of sort Integer, Real
559 * - `Solver::mkTerm(Kind kind, const Term& child) const`
563 * Cotangent function.
566 * - 1: Term of sort Integer, Real
569 * - `Solver::mkTerm(Kind kind, const Term& child) const`
576 * - 1: Term of sort Integer, Real
579 * - `Solver::mkTerm(Kind kind, const Term& child) const`
583 * Arc cosine function.
586 * - 1: Term of sort Integer, Real
589 * - `Solver::mkTerm(Kind kind, const Term& child) const`
593 * Arc tangent function.
596 * - 1: Term of sort Integer, Real
599 * - `Solver::mkTerm(Kind kind, const Term& child) const`
603 * Arc cosecant function.
606 * - 1: Term of sort Integer, Real
609 * - `Solver::mkTerm(Kind kind, const Term& child) const`
613 * Arc secant function.
616 * - 1: Term of sort Integer, Real
619 * - `Solver::mkTerm(Kind kind, const Term& child) const`
623 * Arc cotangent function.
626 * - 1: Term of sort Integer, Real
629 * - `Solver::mkTerm(Kind kind, const Term& child) const`
636 * - 1: Term of sort Integer, Real
639 * - `Solver::mkTerm(Kind kind, const Term& child) const`
643 * Operator for the divisibility-by-k predicate.
646 * - 1: The k to divide by (sort Integer)
649 * - `Solver::mkOp(Kind kind, uint32_t param) const`
651 * Apply divisibility-by-k predicate.
654 * - 1: Op of kind DIVISIBLE
658 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
659 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
663 * Multiple-precision rational constant.
666 * See @ref cvc5::api::Solver::mkInteger() "mkInteger()", @ref cvc5::api::Solver::mkReal() "mkReal()".
669 * - `Solver::mkInteger(const std::string& s) const`
670 * - `Solver::mkInteger(int64_t val) const`
671 * - `Solver::mkReal(const std::string& s) const`
672 * - `Solver::mkReal(int64_t val) const`
673 * - `Solver::mkReal(int64_t num, int64_t den) const`
677 * Less than, chainable.
680 * - 1..n: Terms of sort Integer, Real; [1] < ... < [n]
683 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
684 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
685 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
689 * Less than or equal, chainable.
692 * - 1..n: Terms of sort Integer, Real; [1] <= ... <= [n]
695 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
696 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
700 * Greater than, chainable.
703 * - 1..n: Terms of sort Integer, Real, [1] > ... > [n]
706 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
707 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
708 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
712 * Greater than or equal, chainable.
715 * - 1..n: Terms of sort Integer, Real; [1] >= ... >= [n]
718 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
719 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
720 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
724 * Is-integer predicate.
727 * - 1: Term of sort Integer, Real
730 * - `Solver::mkTerm(Kind kind, const Term& child) const`
734 * Convert Term to Integer by the floor function.
737 * - 1: Term of sort Integer, Real
740 * - `Solver::mkTerm(Kind kind, const Term& child) const`
744 * Convert Term to Real.
748 * - 1: Term of sort Integer, Real
750 * This is a no-op in cvc5, as Integer is a subtype of Real.
756 * Note that PI is considered a special symbol of sort Real, but is not
757 * a real value, i.e., `Term::isRealValue() const` will return false.
760 * - `Solver::mkPi() const`
761 * - `Solver::mkTerm(Kind kind) const`
765 /* BV -------------------------------------------------------------------- */
768 * Fixed-size bit-vector constant.
771 * See @ref cvc5::api::Solver::mkBitVector() "mkBitVector()".
774 * - `Solver::mkBitVector(uint32_t size, uint64_t val) const`
775 * - `Solver::mkBitVector(const std::string& s, uint32_t base) const`
776 * - `Solver::mkBitVector(uint32_t size, const std::string& s, uint32_t base) const`
780 * Concatenation of two or more bit-vectors.
783 * - 1..n: Terms of bit-vector sort
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..n: Terms of bit-vector sort (sorts must match)
822 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
823 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
824 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
831 * - 1: Term of bit-vector sort
834 * - `Solver::mkTerm(Kind kind, const Term& child) const`
841 * - 1..2: Terms of bit-vector sort (sorts must match)
844 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
845 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
852 * - 1..2: Terms of bit-vector sort (sorts must match)
855 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
856 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
860 * Bit-wise xnor, left associative.
863 * - 1..n: Terms of bit-vector sort (sorts must match)
866 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
867 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
871 * Equality comparison (returns bit-vector of size 1).
874 * - 1..2: 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 * Multiplication 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 * Addition of two or more bit-vectors.
898 * - 1..n: 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 Term& child1, const Term& child2, const Term& child3) const`
903 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
907 * Subtraction of two bit-vectors.
910 * - 1..2: Terms of bit-vector sort (sorts must match)
913 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
914 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
918 * Negation of a bit-vector (two's complement).
921 * - 1: Term of bit-vector sort
924 * - `Solver::mkTerm(Kind kind, const Term& child) const`
928 * Unsigned division of two bit-vectors, truncating towards 0. If the divisor
929 * is zero, the result is all ones.
932 * - 1..2: Terms of bit-vector sort (sorts must match)
935 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
936 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
940 * Unsigned remainder from truncating division of two bit-vectors. If the
941 * modulus is zero, the result is the dividend.
944 * - 1..2: Terms of bit-vector sort (sorts must match)
947 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
948 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
952 * Two's complement signed division of two bit-vectors. If the divisor is
953 * zero and the dividend is positive, the result is all ones. If the divisor
954 * is zero and the dividend is negative, the result is one.
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 (sign follows
966 * dividend). If the modulus is zero, the result is the dividend.
969 * - 1..2: Terms of bit-vector sort (sorts must match)
972 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
973 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
977 * Two's complement signed remainder (sign follows divisor). If the modulus
978 * is zero, the result is the dividend.
981 * - 1..2: Terms of bit-vector sort (sorts must match)
984 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
985 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
989 * Bit-vector shift left.
990 * The two bit-vector parameters must have same width.
993 * - 1..2: Terms of bit-vector sort (sorts must match)
996 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
997 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1001 * Bit-vector logical shift right.
1002 * The two bit-vector parameters must have same width.
1005 * - 1..2: Terms of bit-vector sort (sorts must match)
1008 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1009 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1013 * Bit-vector arithmetic shift right.
1014 * The two bit-vector parameters must have same width.
1017 * - 1..2: Terms of bit-vector sort (sorts must match)
1020 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1021 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1025 * Bit-vector unsigned less than.
1026 * The two bit-vector parameters must have same width.
1029 * - 1..2: Terms of bit-vector sort (sorts must match)
1032 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1033 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1037 * Bit-vector unsigned less than or equal.
1038 * The two bit-vector parameters must have same width.
1041 * - 1..2: Terms of bit-vector sort (sorts must match)
1044 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1045 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1049 * Bit-vector unsigned greater than.
1050 * The two bit-vector parameters must have same width.
1053 * - 1..2: Terms of bit-vector sort (sorts must match)
1056 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1057 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1061 * Bit-vector unsigned greater than or equal.
1062 * The two bit-vector parameters must have same width.
1065 * - 1..2: Terms of bit-vector sort (sorts must match)
1068 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1069 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1073 * Bit-vector signed less than.
1074 * The two bit-vector parameters must have same width.
1077 * - 1..2: Terms of bit-vector sort (sorts must match)
1080 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1081 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1085 * Bit-vector signed less than or equal.
1086 * The two bit-vector parameters must have same width.
1089 * - 1..2: Terms of bit-vector sort (sorts must match)
1092 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1093 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1097 * Bit-vector signed greater than.
1098 * The two bit-vector parameters must have same width.
1101 * - 1..2: Terms of bit-vector sort (sorts must match)
1104 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1105 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1109 * Bit-vector signed greater than or equal.
1110 * The two bit-vector parameters must have same width.
1113 * - 1..2: Terms of bit-vector sort (sorts must match)
1116 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1117 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1121 * Bit-vector unsigned less than, returns bit-vector of size 1.
1124 * - 1..2: Terms of bit-vector sort (sorts must match)
1127 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1128 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1132 * Bit-vector signed less than. returns bit-vector of size 1.
1135 * - 1..2: Terms of bit-vector sort (sorts must match)
1138 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1139 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1143 * Same semantics as regular ITE, but condition is bit-vector of size 1.
1146 * - 1: Term of bit-vector sort of size 1, representing the condition
1147 * - 2: Term reprsenting the 'then' branch
1148 * - 3: Term representing the 'else' branch
1150 * 'then' and 'else' term must have same base sort.
1153 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1154 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1161 * - 1: Term of bit-vector sort
1164 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1168 * Bit-vector redand.
1171 * - 1: Term of bit-vector sort
1174 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1178 /* formula to be treated as a bv atom via eager bit-blasting
1179 * (internal-only symbol) */
1180 BITVECTOR_EAGER_ATOM
,
1181 /* term to be treated as a variable. used for eager bit-blasting Ackermann
1182 * expansion of bvudiv (internal-only symbol) */
1183 BITVECTOR_ACKERMANIZE_UDIV
,
1184 /* term to be treated as a variable. used for eager bit-blasting Ackermann
1185 * expansion of bvurem (internal-only symbol) */
1186 BITVECTOR_ACKERMANIZE_UREM
,
1189 * Operator for bit-vector extract (from index 'high' to 'low').
1192 * - 1: The 'high' index
1193 * - 2: The 'low' index
1196 * - `Solver::mkOp(Kind kind, uint32_t param, uint32_t param) const`
1198 * Apply bit-vector extract.
1201 * - 1: Op of kind BITVECTOR_EXTRACT
1202 * - 2: Term of bit-vector sort
1205 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1206 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1210 * Operator for bit-vector repeat.
1213 * - 1: Number of times to repeat a given bit-vector
1216 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1218 * Apply bit-vector repeat.
1221 * - 1: Op of kind BITVECTOR_REPEAT
1222 * - 2: Term of bit-vector sort
1225 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1226 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1230 * Operator for bit-vector zero-extend.
1233 * - 1: Number of bits by which a given bit-vector is to be extended
1236 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1238 * Apply bit-vector zero-extend.
1241 * - 1: Op of kind BITVECTOR_ZERO_EXTEND
1242 * - 2: Term of bit-vector sort
1245 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1246 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1248 BITVECTOR_ZERO_EXTEND
,
1250 * Operator for bit-vector sign-extend.
1253 * - 1: Number of bits by which a given bit-vector is to be extended
1256 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1258 * Apply bit-vector sign-extend.
1261 * - 1: Op of kind BITVECTOR_SIGN_EXTEND
1262 * - 2: Term of bit-vector sort
1265 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1266 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1268 BITVECTOR_SIGN_EXTEND
,
1270 * Operator for bit-vector rotate left.
1273 * - 1: Number of bits by which a given bit-vector is to be rotated
1276 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1278 * Apply bit-vector rotate left.
1281 * - 1: Op of kind BITVECTOR_ROTATE_LEFT
1282 * - 2: Term of bit-vector sort
1285 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1286 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1288 BITVECTOR_ROTATE_LEFT
,
1290 * Operator for bit-vector rotate right.
1293 * - 1: Number of bits by which a given bit-vector is to be rotated
1296 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1298 * Apply bit-vector rotate right.
1301 * - 1: Op of kind BITVECTOR_ROTATE_RIGHT
1302 * - 2: Term of bit-vector sort
1305 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1306 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1308 BITVECTOR_ROTATE_RIGHT
,
1310 /* bit-vector boolean bit extract. */
1314 * Operator for the conversion from Integer to bit-vector.
1317 * - 1: Size of the bit-vector to convert to
1320 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1322 * Apply integer conversion to bit-vector.
1325 * - 1: Op of kind INT_TO_BITVECTOR
1329 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1330 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1334 * Bit-vector conversion to (nonnegative) integer.
1337 * - 1: Term of bit-vector sort
1340 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1344 /* FP -------------------------------------------------------------------- */
1347 * Floating-point constant, constructed from a double or string.
1350 * - 1: Size of the exponent
1351 * - 2: Size of the significand
1352 * - 3: Value of the floating-point constant as a bit-vector term
1355 * - `Solver::mkFloatingPoint(uint32_t exp, uint32_t sig, Term val) const`
1357 CONST_FLOATINGPOINT
,
1359 * Floating-point rounding mode term.
1362 * - `Solver::mkRoundingMode(RoundingMode rm) const`
1366 * Create floating-point literal from bit-vector triple.
1369 * - 1: Sign bit as a bit-vector term
1370 * - 2: Exponent bits as a bit-vector term
1371 * - 3: Significand bits as a bit-vector term (without hidden bit)
1374 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1375 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1379 * Floating-point equality.
1382 * - 1..2: Terms of floating point sort
1385 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1386 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1390 * Floating-point absolute value.
1393 * - 1: Term of floating point sort
1396 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1400 * Floating-point negation.
1403 * - 1: Term of floating point sort
1406 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1410 * Floating-point addition.
1413 * - 1: CONST_ROUNDINGMODE
1414 * - 2: Term of sort FloatingPoint
1415 * - 3: Term of sort FloatingPoint
1418 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1419 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1423 * Floating-point sutraction.
1426 * - 1: CONST_ROUNDINGMODE
1427 * - 2: Term of sort FloatingPoint
1428 * - 3: Term of sort FloatingPoint
1431 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1432 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1436 * Floating-point multiply.
1439 * - 1: CONST_ROUNDINGMODE
1440 * - 2: Term of sort FloatingPoint
1441 * - 3: Term of sort FloatingPoint
1444 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1445 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1449 * Floating-point division.
1452 * - 1: CONST_ROUNDINGMODE
1453 * - 2: Term of sort FloatingPoint
1454 * - 3: Term of sort FloatingPoint
1457 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1458 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1462 * Floating-point fused multiply and add.
1465 * - 1: CONST_ROUNDINGMODE
1466 * - 2: Term of sort FloatingPoint
1467 * - 3: Term of sort FloatingPoint
1468 * - 4: Term of sort FloatingPoint
1471 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1475 * Floating-point square root.
1478 * - 1: CONST_ROUNDINGMODE
1479 * - 2: Term of sort FloatingPoint
1482 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1483 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1487 * Floating-point remainder.
1490 * - 1..2: Terms of floating point sort
1493 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1494 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1498 * Floating-point round to integral.
1501 * -1..2: Terms of floating point sort
1504 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1505 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1509 * Floating-point minimum.
1512 * - 1..2: Terms of floating point sort
1515 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1516 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1520 * Floating-point maximum.
1523 * - 1..2: Terms of floating point sort
1526 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1527 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1531 * Floating-point less than or equal.
1534 * - 1..2: Terms of floating point sort
1537 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1538 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1542 * Floating-point less than.
1545 * - 1..2: Terms of floating point sort
1548 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1549 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1553 * Floating-point greater than or equal.
1556 * - 1..2: Terms of floating point sort
1559 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1560 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1564 * Floating-point greater than.
1567 * - 1..2: Terms of floating point sort
1570 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1571 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1575 * Floating-point is normal.
1578 * - 1: Term of floating point sort
1581 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1585 * Floating-point is sub-normal.
1588 * - 1: Term of floating point sort
1591 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1595 * Floating-point is zero.
1598 * - 1: Term of floating point sort
1601 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1605 * Floating-point is infinite.
1608 * - 1: Term of floating point sort
1611 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1613 FLOATINGPOINT_ISINF
,
1615 * Floating-point is NaN.
1618 * - 1: Term of floating point sort
1621 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1623 FLOATINGPOINT_ISNAN
,
1625 * Floating-point is negative.
1628 * - 1: Term of floating point sort
1631 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1633 FLOATINGPOINT_ISNEG
,
1635 * Floating-point is positive.
1638 * - 1: Term of floating point sort
1641 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1643 FLOATINGPOINT_ISPOS
,
1645 * Operator for to_fp from bit vector.
1648 * - 1: Exponent size
1649 * - 2: Significand size
1652 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1654 * Conversion from an IEEE-754 bit vector to floating-point.
1657 * - 1: Op of kind FLOATINGPOINT_TO_FP_IEEE_BITVECTOR
1658 * - 2: Term of sort FloatingPoint
1661 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1662 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1664 FLOATINGPOINT_TO_FP_IEEE_BITVECTOR
,
1666 * Operator for to_fp from floating point.
1669 * - 1: Exponent size
1670 * - 2: Significand size
1673 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1675 * Conversion between floating-point sorts.
1678 * - 1: Op of kind FLOATINGPOINT_TO_FP_FLOATINGPOINT
1679 * - 2: Term of sort FloatingPoint
1682 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1683 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1685 FLOATINGPOINT_TO_FP_FLOATINGPOINT
,
1687 * Operator for to_fp from real.
1690 * - 1: Exponent size
1691 * - 2: Significand size
1694 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1696 * Conversion from a real to floating-point.
1699 * - 1: Op of kind FLOATINGPOINT_TO_FP_REAL
1700 * - 2: Term of sort FloatingPoint
1703 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1704 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1706 FLOATINGPOINT_TO_FP_REAL
,
1708 * Operator for to_fp from signed bit vector
1711 * - 1: Exponent size
1712 * - 2: Significand size
1715 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1717 * Conversion from a signed bit vector to floating-point.
1720 * - 1: Op of kind FLOATINGPOINT_TO_FP_SIGNED_BITVECTOR
1721 * - 2: Term of sort FloatingPoint
1724 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1725 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1727 FLOATINGPOINT_TO_FP_SIGNED_BITVECTOR
,
1729 * Operator for to_fp from unsigned bit vector.
1732 * - 1: Exponent size
1733 * - 2: Significand size
1736 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1738 * Converting an unsigned bit vector to floating-point.
1741 * - 1: Op of kind FLOATINGPOINT_TO_FP_UNSIGNED_BITVECTOR
1742 * - 2: Term of sort FloatingPoint
1745 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1746 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1748 FLOATINGPOINT_TO_FP_UNSIGNED_BITVECTOR
,
1750 * Operator for a generic to_fp.
1753 * - 1: exponent size
1754 * - 2: Significand size
1757 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1759 * Generic conversion to floating-point, used in parsing only.
1762 * - 1: Op of kind FLOATINGPOINT_TO_FP_GENERIC
1763 * - 2: Term of sort FloatingPoint
1766 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1767 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1769 FLOATINGPOINT_TO_FP_GENERIC
,
1771 * Operator for to_ubv.
1774 * - 1: Size of the bit-vector to convert to
1777 * - `Solver::mkOp(Kind kind, uint32_t param) const`
1779 * Conversion from a floating-point value to an unsigned bit vector.
1782 * - 1: Op of kind FLOATINGPOINT_TO_FP_TO_UBV
1783 * - 2: Term of sort FloatingPoint
1786 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1787 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1789 FLOATINGPOINT_TO_UBV
,
1791 * Operator for to_sbv.
1794 * - 1: Size of the bit-vector to convert to
1797 * - `Solver::mkOp(Kind kind, uint32_t param) const`
1799 * Conversion from a floating-point value to a signed bit vector.
1802 * - 1: Op of kind FLOATINGPOINT_TO_FP_TO_SBV
1803 * - 2: Term of sort FloatingPoint
1806 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1807 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1809 FLOATINGPOINT_TO_SBV
,
1811 * Floating-point to real.
1814 * - 1: Term of sort FloatingPoint
1817 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1819 FLOATINGPOINT_TO_REAL
,
1821 /* Arrays ---------------------------------------------------------------- */
1827 * - 1: Term of array sort
1828 * - 2: Selection index
1831 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1832 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1839 * - 1: Term of array sort
1841 * - 3: Term to store at the index
1844 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2, const Term& child3) const`
1845 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1853 * - 2: Term representing a constant
1856 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1857 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1859 * @note We currently support the creation of constant arrays, but under some
1860 * conditions when there is a chain of equalities connecting two constant
1861 * arrays, the solver doesn't know what to do and aborts (Issue <a
1862 * href="https://github.com/cvc5/cvc5/issues/1667">#1667</a>).
1866 * Equality over arrays a and b over a given range [i,j], i.e.,
1868 * \forall k . i \leq k \leq j \Rightarrow a[k] = b[k]
1874 * - 3: Lower bound of range (inclusive)
1875 * - 4: Uppper bound of range (inclusive)
1878 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1880 * Note: We currently support the creation of array equalities over index
1881 * types bit-vector, floating-point, integer and real. Option --arrays-exp is
1882 * required to support this operator.
1886 /* array table function (internal-only symbol) */
1888 /* array lambda (internal-only symbol) */
1890 /* partial array select, for internal use only */
1892 /* partial array select, for internal use only */
1896 /* Datatypes ------------------------------------------------------------- */
1899 * Constructor application.
1902 * - 1: Constructor (operator)
1903 * - 2..n: Parameters to the constructor
1906 * - `Solver::mkTerm(const Op& op) const`
1907 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1908 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1909 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2, const Term& child3) const`
1910 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1914 * Datatype selector application, which is undefined if misapplied.
1917 * - 1: Selector (operator)
1918 * - 2: Datatype term
1921 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1925 * Datatype tester application.
1929 * - 2: Datatype term
1932 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1933 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1937 * Datatype update application, which does not change the argument if
1941 * - 1: Updater (operator)
1942 * - 2: Datatype term
1943 * - 3: Value to update a field of the datatype term with
1946 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1947 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1951 * Match expressions.
1952 * For example, the smt2 syntax match term
1953 * `(match l (((cons h t) h) (nil 0)))`
1954 * is represented by the AST
1957 * (MATCH_BIND_CASE (VARIABLE_LIST h t) (cons h t) h)
1958 * (MATCH_CASE nil 0))
1960 * The type of the last argument of each case term could be equal.
1963 * - 1..n: Terms of kind MATCH_CASE or MATCH_BIND_CASE
1966 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1967 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1968 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1974 * A (constant) case expression to be used within a match expression.
1977 * - 1: Term denoting the pattern expression
1978 * - 2: Term denoting the return value
1981 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1982 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1987 * A (non-constant) case expression to be used within a match expression.
1990 * - 1: a VARIABLE_LIST Term containing the free variables of the case
1991 * - 2: Term denoting the pattern expression
1992 * - 3: Term denoting the return value
1995 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1996 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2001 * An operator mapping datatypes to an integer denoting the number of
2002 * non-nullary applications of constructors they contain.
2005 * - 1: Datatype term
2008 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
2009 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2013 * Operator for tuple projection indices
2016 * - 1: The tuple projection indices
2019 * - `Solver::mkOp(Kind TUPLE_PROJECT, std::vector<uint32_t> param) const`
2021 * Constructs a new tuple from an existing one using the elements at the
2025 * - 1: a term of tuple sort
2028 * - `Solver::mkTerm(const Op& op, const Term& child) const`
2029 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
2033 /* datatypes height bound */
2035 /* datatypes height bound */
2037 /* datatypes sygus bound */
2039 /* datatypes sygus term order */
2040 DT_SYGUS_TERM_ORDER
,
2041 /* datatypes sygus is constant */
2045 /* Separation Logic ------------------------------------------------------ */
2048 * Separation logic nil term.
2053 * - `Solver::mkSepNil(const Sort& sort) const`
2057 * Separation logic empty heap constraint
2060 * - `Solver::mkTerm(Kind kind) const`
2064 * Separation logic points-to relation.
2067 * - 1: Location of the points-to constraint
2068 * - 2: Data of the points-to constraint
2071 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2072 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2076 * Separation logic star.
2079 * - 1..n: Child constraints that hold in disjoint (separated) heaps
2082 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2083 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2084 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2088 * Separation logic magic wand.
2091 * - 1: Antecendant of the magic wand constraint
2092 * - 2: Conclusion of the magic wand constraint, which is asserted to
2093 * hold in all heaps that are disjoint extensions of the antecedent.
2096 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2097 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2101 /* separation label (internal use only) */
2105 /* Sets ------------------------------------------------------------------ */
2108 * Empty set constant.
2111 * - 1: Sort of the set elements
2114 * - `Solver::mkEmptySet(const Sort& sort) const`
2121 * - 1..2: Terms of set sort
2124 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2125 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2132 * - 1..2: Terms of set sort
2135 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2136 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2143 * - 1..2: Terms of set sort
2146 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2147 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2154 * - 1..2: Terms of set sort, [1] a subset of set [2]?
2157 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2158 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2162 * Set membership predicate.
2165 * - 1..2: Terms of set sort, [1] a member of set [2]?
2168 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2169 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2173 * Construct a singleton set from an element given as a parameter.
2174 * The returned set has same type of the element.
2177 * - 1: Single element
2180 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2184 * The set obtained by inserting elements;
2187 * - 1..n-1: Elements inserted into set [n]
2191 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2192 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2193 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2194 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2201 * - 1: Set to determine the cardinality of
2204 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2208 * Set complement with respect to finite universe.
2211 * - 1: Set to complement
2214 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2218 * Finite universe set.
2219 * All set variables must be interpreted as subsets of it.
2221 * Note that SET_UNIVERSE is considered a special symbol of the theory of
2222 * sets and is not considered as a set value,
2223 * i.e., `Term::isSetValue() const` will return false.
2226 * - `Solver::mkUniverseSet(const Sort& sort) const`
2231 * A set comprehension is specified by a variable list x1 ... xn,
2232 * a predicate P[x1...xn], and a term t[x1...xn]. A comprehension C with the
2233 * above form has members given by the following semantics:
2235 * \forall y. ( \exists x_1...x_n. P[x_1...x_n] \hat{} t[x_1...x_n] = y )
2236 * \Leftrightarrow (member y C)
2238 * where y ranges over the element type of the (set) type of the
2239 * comprehension. If @f$ t[x_1..x_n] @f$ is not provided, it is equivalent to
2240 * y in the above formula.
2243 * - 1: Term VARIABLE_LIST
2244 * - 2: Term denoting the predicate of the comprehension
2245 * - 3: (optional) a Term denoting the generator for the comprehension
2248 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2249 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2250 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2254 * Returns an element from a given set.
2255 * If a set A = {x}, then the term (set.choose A) is equivalent to the term x.
2256 * If the set is empty, then (set.choose A) is an arbitrary value.
2257 * If the set has cardinality > 1, then (set.choose A) will deterministically
2258 * return an element in A.
2261 * - 1: Term of set sort
2264 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2268 * Set is_singleton predicate.
2271 * - 1: Term of set sort, is [1] a singleton set?
2274 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2278 * set.map operator applies the first argument, a function of type (-> T1 T2),
2279 * to every element of the second argument, a set of type (Set T1),
2280 * and returns a set of type (Set T2).
2283 * - 1: a function of type (-> T1 T2)
2284 * - 2: a set of type (Set T1)
2287 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2)
2289 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2293 /* Relations ------------------------------------------------------------- */
2299 * - 1..2: Terms of set sort
2302 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2303 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2307 * Set cartesian product.
2310 * - 1..2: Terms of set sort
2313 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2314 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2321 * - 1: Term of set sort
2324 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2328 * Set transitive closure.
2331 * - 1: Term of set sort
2334 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2341 * - 1..2: Terms of set sort
2344 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2345 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2347 RELATION_JOIN_IMAGE
,
2352 * - 1: Term of set sort
2355 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2359 /* Bags ------------------------------------------------------------------ */
2362 * Empty bag constant.
2365 * - 1: Sort of the bag elements
2368 * mkEmptyBag(const Sort& sort)
2374 * - 1..2: Terms of bag sort
2377 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2378 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2382 * Bag disjoint union (sum).
2385 * -1..2: Terms of bag sort
2388 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2389 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2393 * Bag intersection (min).
2396 * - 1..2: Terms of bag sort
2399 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2400 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2404 * Bag difference subtract (subtracts multiplicities of the second from the
2408 * - 1..2: Terms of bag sort
2411 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2412 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2414 BAG_DIFFERENCE_SUBTRACT
,
2416 * Bag difference 2 (removes shared elements in the two bags).
2419 * - 1..2: Terms of bag sort
2422 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2423 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2425 BAG_DIFFERENCE_REMOVE
,
2427 * Inclusion predicate for bags
2428 * (multiplicities of the first bag <= multiplicities of the second bag).
2431 * - 1..2: Terms of bag sort
2434 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2435 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2439 * Element multiplicity in a bag
2442 * - 1..2: Terms of bag sort (Bag E), [1] an element of sort E
2445 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2446 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2450 * Eliminate duplicates in a given bag. The returned bag contains exactly the
2451 * same elements in the given bag, but with multiplicity one.
2454 * - 1: a term of bag sort
2457 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2458 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2460 BAG_DUPLICATE_REMOVAL
,
2462 * Construct a bag with the given element and given multiplicity.
2466 * - 2: The multiplicity of the element.
2469 * - `Solver::mkTerm(Kind kind, const Term& child, const Term& child) const`
2470 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2477 * - 1: Bag to determine the cardinality of
2480 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2484 * Returns an element from a given bag.
2485 * If a bag A = {(x,n)} where n is the multiplicity, then the term (choose A)
2486 * is equivalent to the term x.
2487 * If the bag is empty, then (choose A) is an arbitrary value.
2488 * If the bag contains distinct elements, then (choose A) will
2489 * deterministically return an element in A.
2492 * - 1: Term of bag sort
2495 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2499 * Bag is_singleton predicate (single element with multiplicity exactly one).
2501 * - 1: Term of bag sort, is [1] a singleton bag?
2504 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2508 * Bag.from_set converts a set to a bag.
2511 * - 1: Term of set sort
2514 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2518 * Bag.to_set converts a bag to a set.
2521 * - 1: Term of bag sort
2524 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2528 * bag.map operator applies the first argument, a function of type (-> T1 T2),
2529 * to every element of the second argument, a bag of type (Bag T1),
2530 * and returns a bag of type (Bag T2).
2533 * - 1: a function of type (-> T1 T2)
2534 * - 2: a bag of type (Bag T1)
2537 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2)
2539 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2543 * bag.fold operator combines elements of a bag into a single value.
2544 * (bag.fold f t B) folds the elements of bag B starting with term t and using
2545 * the combining function f.
2548 * - 1: a binary operation of type (-> T1 T2 T2)
2549 * - 2: an initial value of type T2
2550 * - 2: a bag of type (Bag T1)
2553 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2,
2554 * const Term& child3) const`
2555 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2559 /* Strings --------------------------------------------------------------- */
2565 * - 1..n: Terms of String sort
2568 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2569 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2570 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2574 * String membership.
2577 * - 1: Term of String sort
2578 * - 2: Term of RegExp sort
2581 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2582 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2589 * - 1: Term of String sort
2592 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2597 * Extracts a substring, starting at index i and of length l, from a string
2598 * s. If the start index is negative, the start index is greater than the
2599 * length of the string, or the length is negative, the result is the empty
2603 * - 1: Term of sort String
2604 * - 2: Term of sort Integer (index i)
2605 * - 3: Term of sort Integer (length l)
2608 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2609 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2614 * Updates a string s by replacing its context starting at an index with t.
2615 * If the start index is negative, the start index is greater than the
2616 * length of the string, the result is s. Otherwise, the length of the
2617 * original string is preserved.
2620 * - 1: Term of sort String
2621 * - 2: Term of sort Integer (index i)
2622 * - 3: Term of sort String (replacement string t)
2625 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2626 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2630 * String character at.
2631 * Returns the character at index i from a string s. If the index is negative
2632 * or the index is greater than the length of the string, the result is the
2633 * empty string. Otherwise the result is a string of length 1.
2636 * - 1: Term of sort String (string s)
2637 * - 2: Term of sort Integer (index i)
2640 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2641 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2646 * Checks whether a string s1 contains another string s2. If s2 is empty, the
2647 * result is always true.
2650 * - 1: Term of sort String (the string s1)
2651 * - 2: Term of sort String (the string s2)
2654 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2655 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2660 * Returns the index of a substring s2 in a string s1 starting at index i. If
2661 * the index is negative or greater than the length of string s1 or the
2662 * substring s2 does not appear in string s1 after index i, the result is -1.
2665 * - 1: Term of sort String (substring s1)
2666 * - 2: Term of sort String (substring s2)
2667 * - 3: Term of sort Integer (index i)
2670 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2671 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2675 * String index-of regular expression match.
2676 * Returns the first match of a regular expression r in a string s. If the
2677 * index is negative or greater than the length of string s1, or r does not
2678 * match a substring in s after index i, the result is -1.
2681 * - 1: Term of sort String (string s)
2682 * - 2: Term of sort RegLan (regular expression r)
2683 * - 3: Term of sort Integer (index i)
2686 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2687 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2692 * Replaces a string s2 in a string s1 with string s3. If s2 does not appear
2693 * in s1, s1 is returned unmodified.
2696 * - 1: Term of sort String (string s1)
2697 * - 2: Term of sort String (string s2)
2698 * - 3: Term of sort String (string s3)
2701 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2702 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2706 * String replace all.
2707 * Replaces all occurrences of a string s2 in a string s1 with string s3.
2708 * If s2 does not appear in s1, s1 is returned unmodified.
2711 * - 1: Term of sort String (string s1)
2712 * - 2: Term of sort String (string s2)
2713 * - 3: Term of sort String (string s3)
2716 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2717 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2721 * String replace regular expression match.
2722 * Replaces the first match of a regular expression r in string s1 with
2723 * string s2. If r does not match a substring of s1, s1 is returned
2727 * - 1: Term of sort String (string s1)
2728 * - 2: Term of sort Regexp (regexp r)
2729 * - 3: Term of sort String (string s2)
2732 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2733 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2737 * String replace all regular expression matches.
2738 * Replaces all matches of a regular expression r in string s1 with string
2739 * s2. If r does not match a substring of s1, s1 is returned unmodified.
2742 * - 1: Term of sort String (string s1)
2743 * - 2: Term of sort Regexp (regexp r)
2744 * - 3: Term of sort String (string s2)
2747 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2748 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2750 STRING_REPLACE_RE_ALL
,
2752 * String to lower case.
2755 * - 1: Term of String sort
2758 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2762 * String to upper case.
2765 * - 1: Term of String sort
2768 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2775 * - 1: Term of String sort
2778 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2783 * Returns the code point of a string if it has length one, or returns -1
2787 * - 1: Term of String sort
2790 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2795 * Returns a string containing a single character whose code point matches
2796 * the argument to this function, or the empty string if the argument is
2800 * - 1: Term of Integer sort
2803 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2808 * Returns true if string s1 is (strictly) less than s2 based on a
2809 * lexiographic ordering over code points.
2812 * - 1: Term of sort String (the string s1)
2813 * - 2: Term of sort String (the string s2)
2816 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2817 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2821 * String less than or equal.
2822 * Returns true if string s1 is less than or equal to s2 based on a
2823 * lexiographic ordering over code points.
2826 * - 1: Term of sort String (the string s1)
2827 * - 2: Term of sort String (the string s2)
2830 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2831 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2836 * Checks whether a string s1 is a prefix of string s2. If string s1 is
2837 * empty, this operator returns true.
2840 * - 1: Term of sort String (string s1)
2841 * - 2: Term of sort String (string s2)
2844 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2845 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2850 * Checks whether a string s1 is a suffix of string 2. If string s1 is empty,
2851 * this operator returns true.
2854 * - 1: Term of sort String (string s1)
2855 * - 2: Term of sort String (string s2)
2858 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2859 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2864 * Returns true if string s is digit (it is one of "0", ..., "9").
2867 * - 1: Term of sort String
2870 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
2871 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2875 * Integer to string.
2876 * If the integer is negative this operator returns the empty string.
2879 * - 1: Term of sort Integer
2882 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2886 * String to integer (total function).
2887 * If the string does not contain an integer or the integer is negative, the
2888 * operator returns -1.
2891 * - 1: Term of sort String
2894 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2901 * - See @ref cvc5::api::Solver::mkString() "mkString()".
2904 * - `Solver::mkString(const std::string& s, bool useEscSequences) const`
2905 * - `Solver::mkString(const unsigned char c) const`
2906 * - `Solver::mkString(const std::vector<uint32_t>& s) const`
2910 * Conversion from string to regexp.
2913 * - 1: Term of sort String
2916 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2920 * Regexp Concatenation.
2923 * - 1..2: Terms of Regexp sort
2926 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2927 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2934 * - 1..2: Terms of Regexp sort
2937 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2938 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2942 * Regexp intersection.
2945 * - 1..2: Terms of Regexp sort
2948 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2949 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2953 * Regexp difference.
2956 * - 1..2: Terms of Regexp sort
2959 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2960 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2967 * - 1: Term of sort Regexp
2970 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2977 * - 1: Term of sort Regexp
2980 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2987 * - 1: Term of sort Regexp
2990 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2997 * - 1: Lower bound character for the range
2998 * - 2: Upper bound character for the range
3001 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3002 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3006 * Operator for regular expression repeat.
3009 * - 1: The number of repetitions
3012 * - `Solver::mkOp(Kind kind, uint32_t param) const`
3014 * Apply regular expression loop.
3017 * - 1: Op of kind REGEXP_REPEAT
3018 * - 2: Term of regular expression sort
3021 * - `Solver::mkTerm(const Op& op, const Term& child) const`
3022 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
3026 * Operator for regular expression loop, from lower bound to upper bound
3027 * number of repetitions.
3030 * - 1: The lower bound
3031 * - 2: The upper bound
3034 * - `Solver::mkOp(Kind kind, uint32_t param, uint32_t param) const`
3036 * Apply regular expression loop.
3039 * - 1: Op of kind REGEXP_LOOP
3040 * - 2: Term of regular expression sort
3043 * - `Solver::mkTerm(const Op& op, const Term& child) const`
3044 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
3053 * - `Solver::mkRegexpNone() const`
3054 * - `Solver::mkTerm(Kind kind) const`
3058 * Regexp all characters.
3063 * - `Solver::mkRegexpAllchar() const`
3064 * - `Solver::mkTerm(Kind kind) const`
3068 * Regexp complement.
3071 * - 1: Term of sort RegExp
3074 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
3082 * - 1..n: Terms of Sequence sort
3085 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3086 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3087 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3094 * - 1: Term of Sequence sort
3097 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3102 * Extracts a subsequence, starting at index i and of length l, from a
3103 * sequence s. If the start index is negative, the start index is greater
3104 * than the length of the sequence, or the length is negative, the result is
3105 * the empty sequence.
3108 * - 1: Term of sort Sequence
3109 * - 2: Term of sort Integer (index i)
3110 * - 3: Term of sort Integer (length l)
3113 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3114 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3119 * Updates a sequence s by replacing its context starting at an index with t.
3120 * If the start index is negative, the start index is greater than the
3121 * length of the sequence, the result is s. Otherwise, the length of the
3122 * original sequence is preserved.
3125 * - 1: Term of sort Sequence
3126 * - 2: Term of sort Integer (index i)
3127 * - 3: Term of sort Sequence (replacement sequence t)
3130 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3131 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3135 * Sequence element at.
3136 * Returns the element at index i from a sequence s. If the index is negative
3137 * or the index is greater or equal to the length of the sequence, the result
3138 * is the empty sequence. Otherwise the result is a sequence of length 1.
3141 * - 1: Term of sequence sort (string s)
3142 * - 2: Term of sort Integer (index i)
3145 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3146 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3150 * Sequence contains.
3151 * Checks whether a sequence s1 contains another sequence s2. If s2 is empty,
3152 * the result is always true.
3155 * - 1: Term of sort Sequence (the sequence s1)
3156 * - 2: Term of sort Sequence (the sequence s2)
3159 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3160 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3164 * Sequence index-of.
3165 * Returns the index of a subsequence s2 in a sequence s1 starting at index i.
3166 * If the index is negative or greater than the length of sequence s1 or the
3167 * subsequence s2 does not appear in sequence s1 after index i, the result is
3171 * - 1: Term of sort Sequence (subsequence s1)
3172 * - 2: Term of sort Sequence (subsequence s2)
3173 * - 3: Term of sort Integer (index i)
3176 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3177 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3182 * Replaces the first occurrence of a sequence s2 in a sequence s1 with
3183 * sequence s3. If s2 does not appear in s1, s1 is returned unmodified.
3186 * - 1: Term of sort Sequence (sequence s1)
3187 * - 2: Term of sort Sequence (sequence s2)
3188 * - 3: Term of sort Sequence (sequence s3)
3191 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3192 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3196 * Sequence replace all.
3197 * Replaces all occurrences of a sequence s2 in a sequence s1 with sequence
3198 * s3. If s2 does not appear in s1, s1 is returned unmodified.
3201 * - 1: Term of sort Sequence (sequence s1)
3202 * - 2: Term of sort Sequence (sequence s2)
3203 * - 3: Term of sort Sequence (sequence s3)
3206 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3207 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3214 * - 1: Term of Sequence sort
3217 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3221 * Sequence prefix-of.
3222 * Checks whether a sequence s1 is a prefix of sequence s2. If sequence s1 is
3223 * empty, this operator returns true.
3226 * - 1: Term of sort Sequence (sequence s1)
3227 * - 2: Term of sort Sequence (sequence s2)
3230 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3231 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3235 * Sequence suffix-of.
3236 * Checks whether a sequence s1 is a suffix of sequence s2. If sequence s1 is
3237 * empty, this operator returns true.
3240 * - 1: Term of sort Sequence (sequence s1)
3241 * - 2: Term of sort Sequence (sequence s2)
3244 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3245 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3249 * Constant sequence.
3252 * - See @ref cvc5::api::Solver::mkEmptySequence() "mkEmptySequence()".
3255 * - `Solver::mkEmptySequence(const Sort& sort) const`
3257 * Note that a constant sequence is a term that is equivalent to:
3259 * (seq.++ (seq.unit c1) ... (seq.unit cn))
3261 * where n>=0 and c1, ..., cn are constants of some sort. The elements
3262 * can be extracted by `Term::getSequenceValue()`.
3266 * Sequence unit, corresponding to a sequence of length one with the given
3270 * - 1: Element term.
3273 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
3277 * Sequence nth, corresponding to the nth element of a sequence.
3280 * - 1: Sequence term.
3281 * - 2: Integer term.
3284 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3288 /* Quantifiers ----------------------------------------------------------- */
3291 * Universally quantified formula.
3294 * - 1: VARIABLE_LIST Term
3295 * - 2: Quantifier body
3296 * - 3: (optional) INST_PATTERN_LIST Term
3299 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3300 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3301 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3305 * Existentially quantified formula.
3308 * - 1: VARIABLE_LIST Term
3309 * - 2: Quantifier body
3310 * - 3: (optional) INST_PATTERN_LIST Term
3313 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3314 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3315 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3319 * A list of variables (used to bind variables under a quantifier)
3322 * - 1..n: Terms with kind VARIABLE
3325 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3326 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3327 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3331 * An instantiation pattern.
3332 * Specifies a (list of) terms to be used as a pattern for quantifier
3336 * - 1..n: Terms of any sort
3339 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3340 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3341 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3345 * An instantiation no-pattern.
3346 * Specifies a (list of) terms that should not be used as a pattern for
3347 * quantifier instantiation.
3350 * - 1..n: Terms of any sort
3353 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3354 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3355 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3359 * An instantiation pool.
3360 * Specifies an annotation for pool based instantiation.
3362 * - 1..n: Terms that comprise the pools, which are one-to-one with
3363 * the variables of the quantified formula to be instantiated.
3365 * - `mkTerm(Kind kind, Term child1, Term child2)
3366 * - `mkTerm(Kind kind, Term child1, Term child2, Term child3)
3367 * - `mkTerm(Kind kind, const std::vector<Term>& children)
3371 * A instantantiation-add-to-pool annotation.
3373 * - 1: The pool to add to.
3375 * - `mkTerm(Kind kind, Term child)
3379 * A skolemization-add-to-pool annotation.
3381 * - 1: The pool to add to.
3383 * - `mkTerm(Kind kind, Term child)
3387 * An instantiation attribute
3388 * Specifies a custom property for a quantified formula given by a
3389 * term that is ascribed a user attribute.
3391 * Parameters: n >= 1
3392 * - 1: The keyword of the attribute (a term with kind CONST_STRING).
3393 * - 2...n: The values of the attribute.
3396 * - `mkTerm(Kind kind, Term child1, Term child2)
3397 * - `mkTerm(Kind kind, Term child1, Term child2, Term child3)
3398 * - `mkTerm(Kind kind, const std::vector<Term>& children)
3402 * A list of instantiation patterns and/or attributes.
3405 * - 1..n: Terms with kind INST_PATTERN, INST_NO_PATTERN, or
3409 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3410 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3411 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3416 /* Sort Kinds ------------------------------------------------------------ */
3420 /* a type parameter for type ascription */
3424 /* a datatype type index */
3428 /* set type, takes as parameter the type of the elements */
3430 /* bag type, takes as parameter the type of the elements */
3434 /* specifies types of user-declared 'uninterpreted' sorts */
3438 /* a representation for basic types */
3440 /* a function type */
3442 /* the type of a symbolic expression */
3444 /* bit-vector type */
3446 /* floating-point type */
3450 /* ----------------------------------------------------------------------- */
3451 /** Marks the upper-bound of this enumeration. */
3457 * Get the string representation of a given kind.
3459 * @return the string representation of kind k
3461 std::string
kindToString(Kind k
) CVC5_EXPORT
;
3464 * Serialize a kind to given stream.
3465 * @param out the output stream
3466 * @param k the kind to be serialized to the given output stream
3467 * @return the output stream
3469 std::ostream
& operator<<(std::ostream
& out
, Kind k
) CVC5_EXPORT
;
3477 * Hash function for Kinds.
3480 struct CVC5_EXPORT hash
<cvc5::api::Kind
>
3483 * Hashes a Kind to a size_t.
3485 size_t operator()(cvc5::api::Kind k
) const;