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 https://github.com/doxygen/doxygen/issues/8503
32 * The kind of a cvc5 term.
34 * Note that the underlying type of Kind must be signed (to enable range
35 * checks for validity). The size of this type depends on the size of
36 * cvc5::Kind (NodeValue::NBITS_KIND, currently 10 bits, see expr/node_value.h).
38 enum CVC5_EXPORT Kind
: int32_t
42 * Should never be exposed or created via the API.
47 * Should never be exposed or created via the API.
51 * Null kind (kind of null term `Term::Term()`).
52 * Do not explicitly create via API functions other than `Term::Term()`.
56 /* Builtin --------------------------------------------------------------- */
59 * Uninterpreted constant.
62 * - 1: Sort of the constant
63 * - 2: Index of the constant
66 * - `Solver::mkUninterpretedConst(const Sort& sort, int32_t index) const`
68 UNINTERPRETED_CONSTANT
,
70 * Abstract value (other than uninterpreted sort constants).
73 * - 1: Index of the abstract value
76 * - `Solver::mkAbstractValue(const std::string& index) const`
77 * - `Solver::mkAbstractValue(uint64_t index) const`
81 /* Built-in operator */
85 * Equality, chainable.
88 * - 1..n: Terms with same sorts
91 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
92 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
93 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
100 * - 1..n: Terms with same sorts
103 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
104 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
105 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
109 * First-order constant.
111 * Not permitted in bindings (forall, exists, ...).
114 * - See @ref cvc5::api::Solver::mkConst() "mkConst()".
117 * - `Solver::mkConst(const Sort& sort, const std::string& symbol) const`
118 * - `Solver::mkConst(const Sort& sort) const`
124 * Permitted in bindings and in the lambda and quantifier bodies only.
127 * - See @ref cvc5::api::Solver::mkVar() "mkVar()".
130 * - `Solver::mkVar(const Sort& sort, const std::string& symbol) const`
134 /* Skolem variable (internal only) */
138 * Symbolic expression.
144 * - `Solver::mkTerm(Kind kind, const Term& child) const`
145 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
146 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
147 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
154 * - 1: BOUND_VAR_LIST
158 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
159 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
163 * The syntax of a witness term is similar to a quantified formula except that
164 * only one bound variable is allowed.
165 * The term `(witness ((x T)) F)` returns an element `x` of type `T`
168 * The witness operator behaves like the description operator
169 * (see https://planetmath.org/hilbertsvarepsilonoperator) if there is no x
170 * that satisfies F. But if such x exists, the witness operator does not
171 * enforce the axiom that ensures uniqueness up to logical equivalence:
174 * \forall x. F \equiv G \Rightarrow witness~x. F = witness~x. G
177 * For example if there are 2 elements of type T that satisfy F, then the
178 * following formula is satisfiable:
181 * (witness ((x Int)) F)
182 * (witness ((x Int)) F))
184 * This kind is primarily used internally, but may be returned in models
185 * (e.g. for arithmetic terms in non-linear queries). However, it is not
186 * supported by the parser. Moreover, the user of the API should be cautious
187 * when using this operator. In general, all witness terms
188 * `(witness ((x Int)) F)` should be such that `(exists ((x Int)) F)` is a
189 * valid formula. If this is not the case, then the semantics in formulas that
190 * use witness terms may be unintuitive. For example, the following formula is
192 * `(or (= (witness ((x Int)) false) 0) (not (= (witness ((x Int)) false) 0))`
193 * whereas notice that `(or (= z 0) (not (= z 0)))` is true for any `z`.
196 * - 1: BOUND_VAR_LIST
200 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
201 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
205 /* Boolean --------------------------------------------------------------- */
211 * - 1: Boolean value of the constant
214 * - `Solver::mkTrue() const`
215 * - `Solver::mkFalse() const`
216 * - `Solver::mkBoolean(bool val) const`
223 * - 1: Boolean Term to negate
226 * - `Solver::mkTerm(Kind kind, const Term& child) const`
230 * Logical conjunction.
233 * - 1..n: Boolean Term of the conjunction
236 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
237 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
238 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
242 * Logical implication.
245 * - 1..n: Boolean Terms, right associative
248 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
249 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
250 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
254 * Logical disjunction.
257 * - 1..n: Boolean Term of the disjunction
260 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
261 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
262 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
266 * Logical exclusive disjunction, left associative.
269 * - 1..n: Boolean Terms, `[1] xor ... xor [n]`
272 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
273 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
274 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
281 * - 1: is a Boolean condition Term
282 * - 2: the 'then' Term
283 * - 3: the 'else' Term
285 * 'then' and 'else' term must have same base sort.
288 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
289 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
293 /* UF -------------------------------------------------------------------- */
296 * Application of an uninterpreted function.
300 * - 2..n: Function argument instantiation Terms
303 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
304 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
305 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
309 /* Boolean term variable */
310 BOOLEAN_TERM_VARIABLE
,
313 * Cardinality constraint on uninterpreted sort S.
314 * Interpreted as a predicate that is true when the cardinality of S
315 * is less than or equal to the value of the second argument.
318 * - 1: Term of sort S
319 * - 2: Positive integer constant that bounds the cardinality of sort S
322 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
323 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
325 CARDINALITY_CONSTRAINT
,
327 * Cardinality value for uninterpreted sort S.
328 * An operator that returns an integer indicating the value of the cardinality
332 * - 1: Term of sort S
335 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
336 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
340 /* Combined cardinality constraint. */
341 COMBINED_CARDINALITY_CONSTRAINT
,
342 /* Partial uninterpreted function application. */
346 * Higher-order applicative encoding of function application, left
350 * - 1: Function to apply
351 * - 2..n: Arguments of the function
354 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
355 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
356 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
360 /* Arithmetic ------------------------------------------------------------ */
363 * Arithmetic addition.
366 * - 1..n: Terms of sort Integer, Real (sorts must match)
369 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
370 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
371 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
375 * Arithmetic multiplication.
378 * - 1..n: Terms of sort Integer, Real (sorts must match)
381 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
382 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
383 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
387 * Operator for Integer AND
390 * - 1: Size of the bit-vector that determines the semantics of the IAND
393 * - `Solver::mkOp(Kind kind, uint32_t param) const`
395 * Apply integer conversion to bit-vector.
398 * - 1: Op of kind IAND
403 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
404 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
408 /* Synonym for MULT. */
412 * Arithmetic subtraction, left associative.
415 * - 1..n: Terms of sort Integer, Real (sorts must match)
418 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
419 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
420 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
424 * Arithmetic negation.
427 * - 1: Term of sort Integer, Real
430 * - `Solver::mkTerm(Kind kind, const Term& child) const`
434 * Real division, division by 0 undefined, left associative.
437 * - 1..n: Terms of sort Integer, Real
440 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
441 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
442 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
446 * Integer division, division by 0 undefined, left associative.
449 * - 1..n: Terms of sort Integer
452 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
453 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
454 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
458 * Integer modulus, division by 0 undefined.
461 * - 1: Term of sort Integer
462 * - 2: Term of sort Integer
465 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
466 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
473 * - 1: Term of sort Integer
476 * - `Solver::mkTerm(Kind kind, const Term& child) const`
483 * - 1: Term of sort Integer, Real
484 * - 2: Term of sort Integer, Real
487 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
488 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
492 * Exponential function.
495 * - 1: Term of sort Integer, Real
498 * - `Solver::mkTerm(Kind kind, const Term& child) const`
505 * - 1: Term of sort Integer, Real
508 * - `Solver::mkTerm(Kind kind, const Term& child) const`
515 * - 1: Term of sort Integer, Real
518 * - `Solver::mkTerm(Kind kind, const Term& child) const`
525 * - 1: Term of sort Integer, Real
528 * - `Solver::mkTerm(Kind kind, const Term& child) const`
535 * - 1: Term of sort Integer, Real
538 * - `Solver::mkTerm(Kind kind, const Term& child) const`
545 * - 1: Term of sort Integer, Real
548 * - `Solver::mkTerm(Kind kind, const Term& child) const`
552 * Cotangent function.
555 * - 1: Term of sort Integer, Real
558 * - `Solver::mkTerm(Kind kind, const Term& child) const`
565 * - 1: Term of sort Integer, Real
568 * - `Solver::mkTerm(Kind kind, const Term& child) const`
572 * Arc cosine function.
575 * - 1: Term of sort Integer, Real
578 * - `Solver::mkTerm(Kind kind, const Term& child) const`
582 * Arc tangent function.
585 * - 1: Term of sort Integer, Real
588 * - `Solver::mkTerm(Kind kind, const Term& child) const`
592 * Arc cosecant function.
595 * - 1: Term of sort Integer, Real
598 * - `Solver::mkTerm(Kind kind, const Term& child) const`
602 * Arc secant function.
605 * - 1: Term of sort Integer, Real
608 * - `Solver::mkTerm(Kind kind, const Term& child) const`
612 * Arc cotangent function.
615 * - 1: Term of sort Integer, Real
618 * - `Solver::mkTerm(Kind kind, const Term& child) const`
625 * - 1: Term of sort Integer, Real
628 * - `Solver::mkTerm(Kind kind, const Term& child) const`
632 * Operator for the divisibility-by-k predicate.
635 * - 1: The k to divide by (sort Integer)
638 * - `Solver::mkOp(Kind kind, uint32_t param) const`
640 * Apply divisibility-by-k predicate.
643 * - 1: Op of kind DIVISIBLE
647 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
648 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
652 * Multiple-precision rational constant.
655 * See @ref cvc5::api::Solver::mkInteger() "mkInteger()", @ref cvc5::api::Solver::mkReal() "mkReal()".
658 * - `Solver::mkInteger(const std::string& s) const`
659 * - `Solver::mkInteger(int64_t val) const`
660 * - `Solver::mkReal(const std::string& s) const`
661 * - `Solver::mkReal(int64_t val) const`
662 * - `Solver::mkReal(int64_t num, int64_t den) const`
666 * Less than, chainable.
669 * - 1..n: Terms of sort Integer, Real; [1] < ... < [n]
672 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
673 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
674 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
678 * Less than or equal, chainable.
681 * - 1..n: Terms of sort Integer, Real; [1] <= ... <= [n]
684 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
685 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
689 * Greater than, 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 Term& child1, const Term& child2, const Term& child3) const`
697 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
701 * Greater than or equal, chainable.
704 * - 1..n: Terms of sort Integer, Real; [1] >= ... >= [n]
707 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
708 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
709 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
713 * Is-integer predicate.
716 * - 1: Term of sort Integer, Real
719 * - `Solver::mkTerm(Kind kind, const Term& child) const`
723 * Convert Term to Integer by the floor function.
726 * - 1: Term of sort Integer, Real
729 * - `Solver::mkTerm(Kind kind, const Term& child) const`
733 * Convert Term to Real.
737 * - 1: Term of sort Integer, Real
739 * This is a no-op in cvc5, as Integer is a subtype of Real.
746 * - `Solver::mkPi() const`
747 * - `Solver::mkTerm(Kind kind) const`
751 /* BV -------------------------------------------------------------------- */
754 * Fixed-size bit-vector constant.
757 * See @ref cvc5::api::Solver::mkBitVector() "mkBitVector()".
760 * - `Solver::mkBitVector(uint32_t size, uint64_t val) const`
761 * - `Solver::mkBitVector(const std::string& s, uint32_t base) const`
762 * - `Solver::mkBitVector(uint32_t size, const std::string& s, uint32_t base) const`
766 * Concatenation of two or more bit-vectors.
769 * - 1..n: Terms of bit-vector sort
772 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
773 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
774 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
781 * - 1..n: Terms of bit-vector sort (sorts must match)
784 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
785 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
786 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
793 * - 1..n: Terms of bit-vector sort (sorts must match)
796 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
797 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
798 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
805 * - 1..n: Terms of bit-vector sort (sorts must match)
808 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
809 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
810 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
817 * - 1: Term of bit-vector sort
820 * - `Solver::mkTerm(Kind kind, const Term& child) const`
827 * - 1..2: Terms of bit-vector sort (sorts must match)
830 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
831 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
838 * - 1..2: Terms of bit-vector sort (sorts must match)
841 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
842 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
846 * Bit-wise xnor, left associative.
849 * - 1..n: Terms of bit-vector sort (sorts must match)
852 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
853 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
857 * Equality comparison (returns bit-vector of size 1).
860 * - 1..2: Terms of bit-vector sort (sorts must match)
863 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
864 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
865 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
869 * Multiplication of two or more bit-vectors.
872 * - 1..n: Terms of bit-vector sort (sorts must match)
875 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
876 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
877 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
881 * Addition of two or more bit-vectors.
884 * - 1..n: Terms of bit-vector sort (sorts must match)
887 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
888 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
889 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
893 * Subtraction of two bit-vectors.
896 * - 1..2: Terms of bit-vector sort (sorts must match)
899 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
900 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
904 * Negation of a bit-vector (two's complement).
907 * - 1: Term of bit-vector sort
910 * - `Solver::mkTerm(Kind kind, const Term& child) const`
914 * Unsigned division of two bit-vectors, truncating towards 0.
916 * Note: The semantics of this operator depends on `bv-div-zero-const`
917 * (default is true). Depending on the setting, a division by zero is
918 * treated as all ones (default, corresponds to SMT-LIB >=2.6) or an
919 * uninterpreted value (corresponds to SMT-LIB <2.6).
922 * - 1..2: Terms of bit-vector sort (sorts must match)
925 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
926 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
930 * Unsigned remainder from truncating division of two bit-vectors.
932 * Note: The semantics of this operator depends on `bv-div-zero-const`
933 * (default is true). Depending on the setting, if the modulus is zero, the
934 * result is either the dividend (default, corresponds to SMT-LIB >=2.6) or
935 * an uninterpreted value (corresponds to SMT-LIB <2.6).
938 * - 1..2: Terms of bit-vector sort (sorts must match)
941 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
942 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
946 * Two's complement signed division of two bit-vectors.
948 * Note: The semantics of this operator depends on `bv-div-zero-const`
949 * (default is true). By default, the function returns all ones if the
950 * dividend is positive and one if the dividend is negative (corresponds to
951 * SMT-LIB >=2.6). If the option is disabled, a division by zero is treated
952 * as an uninterpreted value (corresponds to SMT-LIB <2.6).
955 * - 1..2: Terms of bit-vector sort (sorts must match)
958 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
959 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
963 * Two's complement signed remainder of two bit-vectors
964 * (sign follows dividend).
966 * Note: The semantics of this operator depends on `bv-div-zero-const`
967 * (default is true, corresponds to SMT-LIB >=2.6). Depending on the setting,
968 * if the modulus is zero, the result is either the dividend (default) or an
969 * uninterpreted value (corresponds to SMT-LIB <2.6).
972 * - 1..2: Terms of bit-vector sort (sorts must match)
975 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
976 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
980 * Two's complement signed remainder
981 * (sign follows divisor).
983 * Note: The semantics of this operator depends on `bv-div-zero-const`
984 * (default is on). Depending on the setting, if the modulus is zero, the
985 * result is either the dividend (default, corresponds to SMT-LIB >=2.6) or
986 * an uninterpreted value (corresponds to SMT-LIB <2.6).
989 * - 1..2: Terms of bit-vector sort (sorts must match)
992 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
993 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
997 * Bit-vector shift left.
998 * The two bit-vector parameters must have same width.
1001 * - 1..2: Terms of bit-vector sort (sorts must match)
1004 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1005 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1009 * Bit-vector logical shift right.
1010 * The two bit-vector parameters must have same width.
1013 * - 1..2: Terms of bit-vector sort (sorts must match)
1016 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1017 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1021 * Bit-vector arithmetic shift right.
1022 * The two bit-vector parameters must have same width.
1025 * - 1..2: Terms of bit-vector sort (sorts must match)
1028 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1029 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1033 * Bit-vector unsigned less than.
1034 * The two bit-vector parameters must have same width.
1037 * - 1..2: Terms of bit-vector sort (sorts must match)
1040 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1041 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1045 * Bit-vector unsigned less than or equal.
1046 * The two bit-vector parameters must have same width.
1049 * - 1..2: Terms of bit-vector sort (sorts must match)
1052 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1053 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1057 * Bit-vector unsigned greater than.
1058 * The two bit-vector parameters must have same width.
1061 * - 1..2: Terms of bit-vector sort (sorts must match)
1064 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1065 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1069 * Bit-vector unsigned greater than or equal.
1070 * The two bit-vector parameters must have same width.
1073 * - 1..2: Terms of bit-vector sort (sorts must match)
1076 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1077 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1081 * Bit-vector signed less than.
1082 * The two bit-vector parameters must have same width.
1085 * - 1..2: Terms of bit-vector sort (sorts must match)
1088 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1089 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1093 * Bit-vector signed less than or equal.
1094 * The two bit-vector parameters must have same width.
1097 * - 1..2: Terms of bit-vector sort (sorts must match)
1100 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1101 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1105 * Bit-vector signed greater than.
1106 * The two bit-vector parameters must have same width.
1109 * - 1..2: Terms of bit-vector sort (sorts must match)
1112 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1113 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1117 * Bit-vector signed greater than or equal.
1118 * The two bit-vector parameters must have same width.
1121 * - 1..2: Terms of bit-vector sort (sorts must match)
1124 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1125 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1129 * Bit-vector unsigned less than, returns bit-vector of size 1.
1132 * - 1..2: Terms of bit-vector sort (sorts must match)
1135 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1136 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1140 * Bit-vector signed less than. returns bit-vector of size 1.
1143 * - 1..2: Terms of bit-vector sort (sorts must match)
1146 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1147 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1151 * Same semantics as regular ITE, but condition is bit-vector of size 1.
1154 * - 1: Term of bit-vector sort of size 1, representing the condition
1155 * - 2: Term reprsenting the 'then' branch
1156 * - 3: Term representing the 'else' branch
1158 * 'then' and 'else' term must have same base sort.
1161 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1162 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1169 * - 1: Term of bit-vector sort
1172 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1176 * Bit-vector redand.
1179 * - 1: Term of bit-vector sort
1182 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1186 /* formula to be treated as a bv atom via eager bit-blasting
1187 * (internal-only symbol) */
1188 BITVECTOR_EAGER_ATOM
,
1189 /* term to be treated as a variable. used for eager bit-blasting Ackermann
1190 * expansion of bvudiv (internal-only symbol) */
1191 BITVECTOR_ACKERMANIZE_UDIV
,
1192 /* term to be treated as a variable. used for eager bit-blasting Ackermann
1193 * expansion of bvurem (internal-only symbol) */
1194 BITVECTOR_ACKERMANIZE_UREM
,
1197 * Operator for bit-vector extract (from index 'high' to 'low').
1200 * - 1: The 'high' index
1201 * - 2: The 'low' index
1204 * - `Solver::mkOp(Kind kind, uint32_t param, uint32_t param) const`
1206 * Apply bit-vector extract.
1209 * - 1: Op of kind BITVECTOR_EXTRACT
1210 * - 2: Term of bit-vector sort
1213 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1214 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1218 * Operator for bit-vector repeat.
1221 * - 1: Number of times to repeat a given bit-vector
1224 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1226 * Apply bit-vector repeat.
1229 * - 1: Op of kind BITVECTOR_REPEAT
1230 * - 2: Term of bit-vector sort
1233 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1234 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1238 * Operator for bit-vector zero-extend.
1241 * - 1: Number of bits by which a given bit-vector is to be extended
1244 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1246 * Apply bit-vector zero-extend.
1249 * - 1: Op of kind BITVECTOR_ZERO_EXTEND
1250 * - 2: Term of bit-vector sort
1253 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1254 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1256 BITVECTOR_ZERO_EXTEND
,
1258 * Operator for bit-vector sign-extend.
1261 * - 1: Number of bits by which a given bit-vector is to be extended
1264 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1266 * Apply bit-vector sign-extend.
1269 * - 1: Op of kind BITVECTOR_SIGN_EXTEND
1270 * - 2: Term of bit-vector sort
1273 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1274 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1276 BITVECTOR_SIGN_EXTEND
,
1278 * Operator for bit-vector rotate left.
1281 * - 1: Number of bits by which a given bit-vector is to be rotated
1284 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1286 * Apply bit-vector rotate left.
1289 * - 1: Op of kind BITVECTOR_ROTATE_LEFT
1290 * - 2: Term of bit-vector sort
1293 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1294 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1296 BITVECTOR_ROTATE_LEFT
,
1298 * Operator for bit-vector rotate right.
1301 * - 1: Number of bits by which a given bit-vector is to be rotated
1304 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1306 * Apply bit-vector rotate right.
1309 * - 1: Op of kind BITVECTOR_ROTATE_RIGHT
1310 * - 2: Term of bit-vector sort
1313 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1314 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1316 BITVECTOR_ROTATE_RIGHT
,
1318 /* bit-vector boolean bit extract. */
1322 * Operator for the conversion from Integer to bit-vector.
1325 * - 1: Size of the bit-vector to convert to
1328 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1330 * Apply integer conversion to bit-vector.
1333 * - 1: Op of kind INT_TO_BITVECTOR
1337 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1338 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1342 * Bit-vector conversion to (nonnegative) integer.
1345 * - 1: Term of bit-vector sort
1348 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1352 /* FP -------------------------------------------------------------------- */
1355 * Floating-point constant, constructed from a double or string.
1358 * - 1: Size of the exponent
1359 * - 2: Size of the significand
1360 * - 3: Value of the floating-point constant as a bit-vector term
1363 * - `Solver::mkFloatingPoint(uint32_t exp, uint32_t sig, Term val) const`
1365 CONST_FLOATINGPOINT
,
1367 * Floating-point rounding mode term.
1370 * - `Solver::mkRoundingMode(RoundingMode rm) const`
1374 * Create floating-point literal from bit-vector triple.
1377 * - 1: Sign bit as a bit-vector term
1378 * - 2: Exponent bits as a bit-vector term
1379 * - 3: Significand bits as a bit-vector term (without hidden bit)
1382 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1383 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1387 * Floating-point equality.
1390 * - 1..2: Terms of floating point sort
1393 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1394 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1398 * Floating-point absolute value.
1401 * - 1: Term of floating point sort
1404 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1408 * Floating-point negation.
1411 * - 1: Term of floating point sort
1414 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1418 * Floating-point addition.
1421 * - 1: CONST_ROUNDINGMODE
1422 * - 2: Term of sort FloatingPoint
1423 * - 3: Term of sort FloatingPoint
1426 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1427 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1431 * Floating-point sutraction.
1434 * - 1: CONST_ROUNDINGMODE
1435 * - 2: Term of sort FloatingPoint
1436 * - 3: Term of sort FloatingPoint
1439 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1440 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1444 * Floating-point multiply.
1447 * - 1: CONST_ROUNDINGMODE
1448 * - 2: Term of sort FloatingPoint
1449 * - 3: Term of sort FloatingPoint
1452 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1453 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1457 * Floating-point division.
1460 * - 1: CONST_ROUNDINGMODE
1461 * - 2: Term of sort FloatingPoint
1462 * - 3: Term of sort FloatingPoint
1465 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1466 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1470 * Floating-point fused multiply and add.
1473 * - 1: CONST_ROUNDINGMODE
1474 * - 2: Term of sort FloatingPoint
1475 * - 3: Term of sort FloatingPoint
1476 * - 4: Term of sort FloatingPoint
1479 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1483 * Floating-point square root.
1486 * - 1: CONST_ROUNDINGMODE
1487 * - 2: Term of sort FloatingPoint
1490 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1491 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1495 * Floating-point remainder.
1498 * - 1..2: Terms of floating point sort
1501 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1502 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1506 * Floating-point round to integral.
1509 * -1..2: Terms of floating point sort
1512 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1513 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1517 * Floating-point minimum.
1520 * - 1..2: Terms of floating point sort
1523 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1524 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1528 * Floating-point maximum.
1531 * - 1..2: Terms of floating point sort
1534 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1535 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1539 * Floating-point less than or equal.
1542 * - 1..2: Terms of floating point sort
1545 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1546 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1550 * Floating-point less than.
1553 * - 1..2: Terms of floating point sort
1556 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1557 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1561 * Floating-point greater than or equal.
1564 * - 1..2: Terms of floating point sort
1567 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1568 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1572 * Floating-point greater than.
1575 * - 1..2: Terms of floating point sort
1578 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1579 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1583 * Floating-point is normal.
1586 * - 1: Term of floating point sort
1589 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1593 * Floating-point is sub-normal.
1596 * - 1: Term of floating point sort
1599 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1603 * Floating-point is zero.
1606 * - 1: Term of floating point sort
1609 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1613 * Floating-point is infinite.
1616 * - 1: Term of floating point sort
1619 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1621 FLOATINGPOINT_ISINF
,
1623 * Floating-point is NaN.
1626 * - 1: Term of floating point sort
1629 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1631 FLOATINGPOINT_ISNAN
,
1633 * Floating-point is negative.
1636 * - 1: Term of floating point sort
1639 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1641 FLOATINGPOINT_ISNEG
,
1643 * Floating-point is positive.
1646 * - 1: Term of floating point sort
1649 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1651 FLOATINGPOINT_ISPOS
,
1653 * Operator for to_fp from bit vector.
1656 * - 1: Exponent size
1657 * - 2: Significand size
1660 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1662 * Conversion from an IEEE-754 bit vector to floating-point.
1665 * - 1: Op of kind FLOATINGPOINT_TO_FP_IEEE_BITVECTOR
1666 * - 2: Term of sort FloatingPoint
1669 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1670 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1672 FLOATINGPOINT_TO_FP_IEEE_BITVECTOR
,
1674 * Operator for to_fp from floating point.
1677 * - 1: Exponent size
1678 * - 2: Significand size
1681 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1683 * Conversion between floating-point sorts.
1686 * - 1: Op of kind FLOATINGPOINT_TO_FP_FLOATINGPOINT
1687 * - 2: Term of sort FloatingPoint
1690 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1691 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1693 FLOATINGPOINT_TO_FP_FLOATINGPOINT
,
1695 * Operator for to_fp from real.
1698 * - 1: Exponent size
1699 * - 2: Significand size
1702 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1704 * Conversion from a real to floating-point.
1707 * - 1: Op of kind FLOATINGPOINT_TO_FP_REAL
1708 * - 2: Term of sort FloatingPoint
1711 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1712 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1714 FLOATINGPOINT_TO_FP_REAL
,
1716 * Operator for to_fp from signed bit vector
1719 * - 1: Exponent size
1720 * - 2: Significand size
1723 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1725 * Conversion from a signed bit vector to floating-point.
1728 * - 1: Op of kind FLOATINGPOINT_TO_FP_SIGNED_BITVECTOR
1729 * - 2: Term of sort FloatingPoint
1732 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1733 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1735 FLOATINGPOINT_TO_FP_SIGNED_BITVECTOR
,
1737 * Operator for to_fp from unsigned bit vector.
1740 * - 1: Exponent size
1741 * - 2: Significand size
1744 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1746 * Converting an unsigned bit vector to floating-point.
1749 * - 1: Op of kind FLOATINGPOINT_TO_FP_UNSIGNED_BITVECTOR
1750 * - 2: Term of sort FloatingPoint
1753 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1754 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1756 FLOATINGPOINT_TO_FP_UNSIGNED_BITVECTOR
,
1758 * Operator for a generic to_fp.
1761 * - 1: exponent size
1762 * - 2: Significand size
1765 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1767 * Generic conversion to floating-point, used in parsing only.
1770 * - 1: Op of kind FLOATINGPOINT_TO_FP_GENERIC
1771 * - 2: Term of sort FloatingPoint
1774 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1775 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1777 FLOATINGPOINT_TO_FP_GENERIC
,
1779 * Operator for to_ubv.
1782 * - 1: Size of the bit-vector to convert to
1785 * - `Solver::mkOp(Kind kind, uint32_t param) const`
1787 * Conversion from a floating-point value to an unsigned bit vector.
1790 * - 1: Op of kind FLOATINGPOINT_TO_FP_TO_UBV
1791 * - 2: Term of sort FloatingPoint
1794 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1795 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1797 FLOATINGPOINT_TO_UBV
,
1799 * Operator for to_sbv.
1802 * - 1: Size of the bit-vector to convert to
1805 * - `Solver::mkOp(Kind kind, uint32_t param) const`
1807 * Conversion from a floating-point value to a signed bit vector.
1810 * - 1: Op of kind FLOATINGPOINT_TO_FP_TO_SBV
1811 * - 2: Term of sort FloatingPoint
1814 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1815 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1817 FLOATINGPOINT_TO_SBV
,
1819 * Floating-point to real.
1822 * - 1: Term of sort FloatingPoint
1825 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1827 FLOATINGPOINT_TO_REAL
,
1829 /* Arrays ---------------------------------------------------------------- */
1835 * - 1: Term of array sort
1836 * - 2: Selection index
1839 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1840 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1847 * - 1: Term of array sort
1849 * - 3: Term to store at the index
1852 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2, const Term& child3) const`
1853 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1861 * - 2: Term representing a constant
1864 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1865 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1867 * Note: We currently support the creation of constant arrays, but under some
1868 * conditions when there is a chain of equalities connecting two constant
1869 * arrays, the solver doesn't know what to do and aborts (Issue <a href="https://github.com/CVC4/CVC4/issues/1667">#1667</a>).
1873 * Equality over arrays a and b over a given range [i,j], i.e.,
1875 * \forall k . i \leq k \leq j \Rightarrow a[k] = b[k]
1881 * - 3: Lower bound of range (inclusive)
1882 * - 4: Uppper bound of range (inclusive)
1885 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1887 * Note: We currently support the creation of array equalities over index
1888 * types bit-vector, floating-point, integer and real. Option --arrays-exp is
1889 * required to support this operator.
1893 /* array table function (internal-only symbol) */
1895 /* array lambda (internal-only symbol) */
1897 /* partial array select, for internal use only */
1899 /* partial array select, for internal use only */
1903 /* Datatypes ------------------------------------------------------------- */
1906 * Constructor application.
1909 * - 1: Constructor (operator)
1910 * - 2..n: Parameters to the constructor
1913 * - `Solver::mkTerm(const Op& op) const`
1914 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1915 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1916 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2, const Term& child3) const`
1917 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1921 * Datatype selector application.
1924 * - 1: Selector (operator)
1925 * - 2: Datatype term (undefined if mis-applied)
1928 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1932 * Datatype tester application.
1936 * - 2: Datatype term
1939 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1940 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1944 /* Parametric datatype term. */
1945 PARAMETRIC_DATATYPE
,
1946 /* type ascription, for datatype constructor applications;
1947 * first parameter is an ASCRIPTION_TYPE, second is the datatype constructor
1948 * application being ascribed */
1949 APPLY_TYPE_ASCRIPTION
,
1952 * Operator for a tuple update.
1955 * - 1: Index of the tuple to be updated
1958 * - `Solver::mkOp(Kind kind, uint32_t param) const`
1960 * Apply tuple update.
1963 * - 1: Op of kind TUPLE_UPDATE (which references an index)
1965 * - 3: Element to store in the tuple at the given index
1968 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1969 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1973 * Operator for a record update.
1976 * - 1: Name of the field to be updated
1979 * - `Solver::mkOp(Kind kind, const std::string& param) const`
1984 * - 1: Op of kind RECORD_UPDATE (which references a field)
1985 * - 2: Record term to update
1986 * - 3: Element to store in the record in the given field
1989 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1990 * - `Solver::mkTerm(const Op& op,, const std::vector<Term>& children) const`
1994 * Match expressions.
1995 * For example, the smt2 syntax match term
1996 * `(match l (((cons h t) h) (nil 0)))`
1997 * is represented by the AST
2000 * (MATCH_BIND_CASE (BOUND_VAR_LIST h t) (cons h t) h)
2001 * (MATCH_CASE nil 0))
2003 * The type of the last argument of each case term could be equal.
2006 * - 1..n: Terms of kind MATCH_CASE or MATCH_BIND_CASE
2009 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2010 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2011 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2017 * A (constant) case expression to be used within a match expression.
2020 * - 1: Term denoting the pattern expression
2021 * - 2: Term denoting the return value
2024 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2025 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2030 * A (non-constant) case expression to be used within a match expression.
2033 * - 1: a BOUND_VAR_LIST Term containing the free variables of the case
2034 * - 2: Term denoting the pattern expression
2035 * - 3: Term denoting the return value
2038 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2039 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2044 * An operator mapping datatypes to an integer denoting the number of
2045 * non-nullary applications of constructors they contain.
2048 * - 1: Datatype term
2051 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
2052 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2056 * Operator for tuple projection indices
2059 * - 1: The tuple projection indices
2062 * - `Solver::mkOp(Kind TUPLE_PROJECT, std::vector<uint32_t> param) const`
2064 * Constructs a new tuple from an existing one using the elements at the
2068 * - 1: a term of tuple sort
2071 * - `Solver::mkTerm(const Op& op, const Term& child) const`
2072 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
2076 /* datatypes height bound */
2078 /* datatypes height bound */
2080 /* datatypes sygus bound */
2082 /* datatypes sygus term order */
2083 DT_SYGUS_TERM_ORDER
,
2084 /* datatypes sygus is constant */
2088 /* Separation Logic ------------------------------------------------------ */
2091 * Separation logic nil term.
2096 * - `Solver::mkSepNil(const Sort& sort) const`
2100 * Separation logic empty heap.
2103 * - 1: Term of the same sort as the sort of the location of the heap
2104 * that is constrained to be empty
2105 * - 2: Term of the same sort as the data sort of the heap that is
2106 * that is constrained to be empty
2109 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2110 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2114 * Separation logic points-to relation.
2117 * - 1: Location of the points-to constraint
2118 * - 2: Data of the points-to constraint
2121 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2122 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2126 * Separation logic star.
2129 * - 1..n: Child constraints that hold in disjoint (separated) heaps
2132 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2133 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2134 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2138 * Separation logic magic wand.
2141 * - 1: Antecendant of the magic wand constraint
2142 * - 2: Conclusion of the magic wand constraint, which is asserted to
2143 * hold in all heaps that are disjoint extensions of the antecedent.
2146 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2147 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2151 /* separation label (internal use only) */
2155 /* Sets ------------------------------------------------------------------ */
2158 * Empty set constant.
2161 * - 1: Sort of the set elements
2164 * - `Solver::mkEmptySet(const Sort& sort) const`
2171 * - 1..2: Terms of set sort
2174 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2175 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2182 * - 1..2: Terms of set sort
2185 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2186 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2193 * - 1..2: Terms of set sort
2196 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2197 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2204 * - 1..2: Terms of set sort, [1] a subset of set [2]?
2207 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2208 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2212 * Set membership predicate.
2215 * - 1..2: Terms of set sort, [1] a member of set [2]?
2218 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2219 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2223 * Construct a singleton set from an element given as a parameter.
2224 * The returned set has same type of the element.
2227 * - 1: Single element
2230 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2234 * The set obtained by inserting elements;
2237 * - 1..n-1: Elements inserted into set [n]
2241 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2242 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2243 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2244 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2251 * - 1: Set to determine the cardinality of
2254 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2258 * Set complement with respect to finite universe.
2261 * - 1: Set to complement
2264 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2268 * Finite universe set.
2269 * All set variables must be interpreted as subsets of it.
2272 * - `Solver::mkUniverseSet(const Sort& sort) const`
2279 * - 1..2: Terms of set sort
2282 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2283 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2287 * Set cartesian product.
2290 * - 1..2: Terms of set sort
2293 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2294 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2301 * - 1: Term of set sort
2304 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2308 * Set transitive closure.
2311 * - 1: Term of set sort
2314 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2321 * - 1..2: Terms of set sort
2324 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2325 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2332 * - 1: Term of set sort
2335 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2340 * A set comprehension is specified by a bound variable list x1 ... xn,
2341 * a predicate P[x1...xn], and a term t[x1...xn]. A comprehension C with the
2342 * above form has members given by the following semantics:
2344 * \forall y. ( \exists x_1...x_n. P[x_1...x_n] \hat{} t[x_1...x_n] = y )
2345 * \Leftrightarrow (member y C)
2347 * where y ranges over the element type of the (set) type of the
2348 * comprehension. If @f$ t[x_1..x_n] @f$ is not provided, it is equivalent to
2349 * y in the above formula.
2352 * - 1: Term BOUND_VAR_LIST
2353 * - 2: Term denoting the predicate of the comprehension
2354 * - 3: (optional) a Term denoting the generator for the comprehension
2357 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2358 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2359 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2363 * Returns an element from a given set.
2364 * If a set A = {x}, then the term (choose A) is equivalent to the term x.
2365 * If the set is empty, then (choose A) is an arbitrary value.
2366 * If the set has cardinality > 1, then (choose A) will deterministically
2367 * return an element in A.
2370 * - 1: Term of set sort
2373 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2377 * Set is_singleton predicate.
2380 * - 1: Term of set sort, is [1] a singleton set?
2383 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2386 /* Bags ------------------------------------------------------------------ */
2388 * Empty bag constant.
2391 * - 1: Sort of the bag elements
2394 * mkEmptyBag(const Sort& sort)
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`
2408 * Bag disjoint union (sum).
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 * Bag intersection (min).
2422 * - 1..2: Terms of bag sort
2425 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2426 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2430 * Bag difference subtract (subtracts multiplicities of the second from the
2434 * - 1..2: Terms of bag sort
2437 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2438 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2440 DIFFERENCE_SUBTRACT
,
2442 * Bag difference 2 (removes shared elements in the two bags).
2445 * - 1..2: Terms of bag sort
2448 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2449 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2453 * Inclusion predicate for bags
2454 * (multiplicities of the first bag <= multiplicities of the second bag).
2457 * - 1..2: Terms of bag sort
2460 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2461 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2465 * Element multiplicity in a bag
2468 * - 1..2: Terms of bag sort (Bag E), [1] an element of sort E
2471 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2472 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2476 * Eliminate duplicates in a given bag. The returned bag contains exactly the
2477 * same elements in the given bag, but with multiplicity one.
2480 * - 1: a term of bag sort
2483 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2484 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2488 * The bag of the single element given as a parameter.
2491 * - 1: Single element
2494 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2501 * - 1: Bag to determine the cardinality of
2504 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2508 * Returns an element from a given bag.
2509 * If a bag A = {(x,n)} where n is the multiplicity, then the term (choose A)
2510 * is equivalent to the term x.
2511 * If the bag is empty, then (choose A) is an arbitrary value.
2512 * If the bag contains distinct elements, then (choose A) will
2513 * deterministically return an element in A.
2516 * - 1: Term of bag sort
2519 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2523 * Bag is_singleton predicate (single element with multiplicity exactly one).
2525 * - 1: Term of bag sort, is [1] a singleton bag?
2528 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2532 * Bag.from_set converts a set to a bag.
2535 * - 1: Term of set sort
2538 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2542 * Bag.to_set converts a bag to a set.
2545 * - 1: Term of bag sort
2548 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2552 /* Strings --------------------------------------------------------------- */
2558 * - 1..n: Terms of String sort
2561 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2562 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2563 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2567 * String membership.
2570 * - 1: Term of String sort
2571 * - 2: Term of RegExp sort
2574 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2575 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2582 * - 1: Term of String sort
2585 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2590 * Extracts a substring, starting at index i and of length l, from a string
2591 * s. If the start index is negative, the start index is greater than the
2592 * length of the string, or the length is negative, the result is the empty
2596 * - 1: Term of sort String
2597 * - 2: Term of sort Integer (index i)
2598 * - 3: Term of sort Integer (length l)
2601 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2602 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2607 * Updates a string s by replacing its context starting at an index with t.
2608 * If the start index is negative, the start index is greater than the
2609 * length of the string, the result is s. Otherwise, the length of the
2610 * original string is preserved.
2613 * - 1: Term of sort String
2614 * - 2: Term of sort Integer (index i)
2615 * - 3: Term of sort String (replacement string t)
2618 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2619 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2623 * String character at.
2624 * Returns the character at index i from a string s. If the index is negative
2625 * or the index is greater than the length of the string, the result is the
2626 * empty string. Otherwise the result is a string of length 1.
2629 * - 1: Term of sort String (string s)
2630 * - 2: Term of sort Integer (index i)
2633 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2634 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2639 * Checks whether a string s1 contains another string s2. If s2 is empty, the
2640 * result is always true.
2643 * - 1: Term of sort String (the string s1)
2644 * - 2: Term of sort String (the string s2)
2647 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2648 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2653 * Returns the index of a substring s2 in a string s1 starting at index i. If
2654 * the index is negative or greater than the length of string s1 or the
2655 * substring s2 does not appear in string s1 after index i, the result is -1.
2658 * - 1: Term of sort String (substring s1)
2659 * - 2: Term of sort String (substring s2)
2660 * - 3: Term of sort Integer (index i)
2663 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2664 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2669 * Replaces a string s2 in a string s1 with string s3. If s2 does not appear
2670 * in s1, s1 is returned unmodified.
2673 * - 1: Term of sort String (string s1)
2674 * - 2: Term of sort String (string s2)
2675 * - 3: Term of sort String (string s3)
2678 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2679 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2683 * String replace all.
2684 * Replaces all occurrences of a string s2 in a string s1 with string s3.
2685 * If s2 does not appear in s1, s1 is returned unmodified.
2688 * - 1: Term of sort String (string s1)
2689 * - 2: Term of sort String (string s2)
2690 * - 3: Term of sort String (string s3)
2693 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2694 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2698 * String replace regular expression match.
2699 * Replaces the first match of a regular expression r in string s1 with
2700 * string s2. If r does not match a substring of s1, s1 is returned
2704 * - 1: Term of sort String (string s1)
2705 * - 2: Term of sort Regexp (regexp r)
2706 * - 3: Term of sort String (string s2)
2709 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2710 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2714 * String replace all regular expression matches.
2715 * Replaces all matches of a regular expression r in string s1 with string
2716 * s2. If r does not match a substring of s1, s1 is returned unmodified.
2719 * - 1: Term of sort String (string s1)
2720 * - 2: Term of sort Regexp (regexp r)
2721 * - 3: Term of sort String (string s2)
2724 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2725 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2727 STRING_REPLACE_RE_ALL
,
2729 * String to lower case.
2732 * - 1: Term of String sort
2735 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2739 * String to upper case.
2742 * - 1: Term of String sort
2745 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2752 * - 1: Term of String sort
2755 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2760 * Returns the code point of a string if it has length one, or returns -1
2764 * - 1: Term of String sort
2767 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2772 * Returns a string containing a single character whose code point matches
2773 * the argument to this function, or the empty string if the argument is
2777 * - 1: Term of Integer sort
2780 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2785 * Returns true if string s1 is (strictly) less than s2 based on a
2786 * lexiographic ordering over code points.
2789 * - 1: Term of sort String (the string s1)
2790 * - 2: Term of sort String (the string s2)
2793 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2794 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2798 * String less than or equal.
2799 * Returns true if string s1 is less than or equal to s2 based on a
2800 * lexiographic ordering over code points.
2803 * - 1: Term of sort String (the string s1)
2804 * - 2: Term of sort String (the string s2)
2807 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2808 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2813 * Checks whether a string s1 is a prefix of string s2. If string s1 is
2814 * empty, this operator returns true.
2817 * - 1: Term of sort String (string s1)
2818 * - 2: Term of sort String (string s2)
2821 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2822 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2827 * Checks whether a string s1 is a suffix of string 2. If string s1 is empty,
2828 * this operator returns true.
2831 * - 1: Term of sort String (string s1)
2832 * - 2: Term of sort String (string s2)
2835 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2836 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2841 * Returns true if string s is digit (it is one of "0", ..., "9").
2844 * - 1: Term of sort String
2847 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
2848 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2852 * Integer to string.
2853 * If the integer is negative this operator returns the empty string.
2856 * - 1: Term of sort Integer
2859 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2863 * String to integer (total function).
2864 * If the string does not contain an integer or the integer is negative, the
2865 * operator returns -1.
2868 * - 1: Term of sort String
2871 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2878 * - See @ref cvc5::api::Solver::mkString() "mkString()".
2881 * - `Solver::mkString(const std::string& s, bool useEscSequences) const`
2882 * - `Solver::mkString(const unsigned char c) const`
2883 * - `Solver::mkString(const std::vector<uint32_t>& s) const`
2887 * Conversion from string to regexp.
2890 * - 1: Term of sort String
2893 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2897 * Regexp Concatenation.
2900 * - 1..2: Terms of Regexp sort
2903 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2904 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2911 * - 1..2: Terms of Regexp sort
2914 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2915 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2919 * Regexp intersection.
2922 * - 1..2: Terms of Regexp sort
2925 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2926 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2930 * Regexp difference.
2933 * - 1..2: Terms of Regexp sort
2936 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2937 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2944 * - 1: Term of sort Regexp
2947 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2954 * - 1: Term of sort Regexp
2957 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2964 * - 1: Term of sort Regexp
2967 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2974 * - 1: Lower bound character for the range
2975 * - 2: Upper bound character for the range
2978 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2979 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2983 * Operator for regular expression repeat.
2986 * - 1: The number of repetitions
2989 * - `Solver::mkOp(Kind kind, uint32_t param) const`
2991 * Apply regular expression loop.
2994 * - 1: Op of kind REGEXP_REPEAT
2995 * - 2: Term of regular expression sort
2998 * - `Solver::mkTerm(const Op& op, const Term& child) const`
2999 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
3003 * Operator for regular expression loop, from lower bound to upper bound
3004 * number of repetitions.
3007 * - 1: The lower bound
3008 * - 2: The upper bound
3011 * - `Solver::mkOp(Kind kind, uint32_t param, uint32_t param) const`
3013 * Apply regular expression loop.
3016 * - 1: Op of kind REGEXP_LOOP
3017 * - 2: Term of regular expression sort
3020 * - `Solver::mkTerm(const Op& op, const Term& child) const`
3021 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
3030 * - `Solver::mkRegexpEmpty() const`
3031 * - `Solver::mkTerm(Kind kind) const`
3035 * Regexp all characters.
3040 * - `Solver::mkRegexpSigma() const`
3041 * - `Solver::mkTerm(Kind kind) const`
3045 * Regexp complement.
3048 * - 1: Term of sort RegExp
3051 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
3059 * - 1..n: Terms of Sequence sort
3062 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3063 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3064 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3071 * - 1: Term of Sequence sort
3074 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3079 * Extracts a subsequence, starting at index i and of length l, from a
3080 * sequence s. If the start index is negative, the start index is greater
3081 * than the length of the sequence, or the length is negative, the result is
3082 * the empty sequence.
3085 * - 1: Term of sort Sequence
3086 * - 2: Term of sort Integer (index i)
3087 * - 3: Term of sort Integer (length l)
3090 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3091 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3096 * Updates a sequence s by replacing its context starting at an index with t.
3097 * If the start index is negative, the start index is greater than the
3098 * length of the sequence, the result is s. Otherwise, the length of the
3099 * original sequence is preserved.
3102 * - 1: Term of sort Sequence
3103 * - 2: Term of sort Integer (index i)
3104 * - 3: Term of sort Sequence (replacement sequence t)
3107 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3108 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3112 * Sequence element at.
3113 * Returns the element at index i from a sequence s. If the index is negative
3114 * or the index is greater or equal to the length of the sequence, the result
3115 * is the empty sequence. Otherwise the result is a sequence of length 1.
3118 * - 1: Term of sequence sort (string s)
3119 * - 2: Term of sort Integer (index i)
3122 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3123 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3127 * Sequence contains.
3128 * Checks whether a sequence s1 contains another sequence s2. If s2 is empty,
3129 * the result is always true.
3132 * - 1: Term of sort Sequence (the sequence s1)
3133 * - 2: Term of sort Sequence (the sequence s2)
3136 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3137 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3141 * Sequence index-of.
3142 * Returns the index of a subsequence s2 in a sequence s1 starting at index i.
3143 * If the index is negative or greater than the length of sequence s1 or the
3144 * subsequence s2 does not appear in sequence s1 after index i, the result is
3148 * - 1: Term of sort Sequence (subsequence s1)
3149 * - 2: Term of sort Sequence (subsequence s2)
3150 * - 3: Term of sort Integer (index i)
3153 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3154 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3159 * Replaces the first occurrence of a sequence s2 in a sequence s1 with
3160 * sequence s3. If s2 does not appear in s1, s1 is returned unmodified.
3163 * - 1: Term of sort Sequence (sequence s1)
3164 * - 2: Term of sort Sequence (sequence s2)
3165 * - 3: Term of sort Sequence (sequence s3)
3168 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3169 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3173 * Sequence replace all.
3174 * Replaces all occurrences of a sequence s2 in a sequence s1 with sequence
3175 * s3. If s2 does not appear in s1, s1 is returned unmodified.
3178 * - 1: Term of sort Sequence (sequence s1)
3179 * - 2: Term of sort Sequence (sequence s2)
3180 * - 3: Term of sort Sequence (sequence s3)
3183 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3184 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3191 * - 1: Term of Sequence sort
3194 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3198 * Sequence prefix-of.
3199 * Checks whether a sequence s1 is a prefix of sequence s2. If sequence s1 is
3200 * empty, this operator returns true.
3203 * - 1: Term of sort Sequence (sequence s1)
3204 * - 2: Term of sort Sequence (sequence s2)
3207 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3208 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3212 * Sequence suffix-of.
3213 * Checks whether a sequence s1 is a suffix of sequence s2. If sequence s1 is
3214 * empty, this operator returns true.
3217 * - 1: Term of sort Sequence (sequence s1)
3218 * - 2: Term of sort Sequence (sequence s2)
3221 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3222 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3226 * Constant sequence.
3229 * - See @ref cvc5::api::Solver::mkEmptySequence() "mkEmptySequence()".
3232 * - `Solver::mkEmptySequence(const Sort& sort) const`
3234 * Note that a constant sequence is a term that is equivalent to:
3236 * (seq.++ (seq.unit c1) ... (seq.unit cn))
3238 * where n>=0 and c1, ..., cn are constants of some sort. The elements
3239 * can be extracted by `Term::getConstSequenceElements()`.
3243 * Sequence unit, corresponding to a sequence of length one with the given
3247 * - 1: Element term.
3250 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
3254 * Sequence nth, corresponding to the nth element of a sequence.
3257 * - 1: Sequence term.
3258 * - 2: Integer term.
3261 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3265 /* Quantifiers ----------------------------------------------------------- */
3268 * Universally quantified formula.
3271 * - 1: BOUND_VAR_LIST Term
3272 * - 2: Quantifier body
3273 * - 3: (optional) INST_PATTERN_LIST Term
3276 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3277 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3278 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3282 * Existentially quantified formula.
3285 * - 1: BOUND_VAR_LIST Term
3286 * - 2: Quantifier body
3287 * - 3: (optional) INST_PATTERN_LIST Term
3290 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3291 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3292 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3296 * A list of bound variables (used to bind variables under a quantifier)
3299 * - 1..n: Terms with kind BOUND_VARIABLE
3302 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3303 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3304 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3308 * An instantiation pattern.
3309 * Specifies a (list of) terms to be used as a pattern for quantifier
3313 * - 1..n: Terms with kind BOUND_VARIABLE
3316 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3317 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3318 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3322 * An instantiation no-pattern.
3323 * Specifies a (list of) terms that should not be used as a pattern for
3324 * quantifier instantiation.
3327 * - 1..n: Terms with kind BOUND_VARIABLE
3330 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3331 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3332 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3336 * An instantiation pool.
3337 * Specifies an annotation for pool based instantiation.
3339 * - 1..n: Terms that comprise the pools, which are one-to-one with
3340 * the variables of the quantified formula to be instantiated.
3342 * - `mkTerm(Kind kind, Term child1, Term child2)
3343 * - `mkTerm(Kind kind, Term child1, Term child2, Term child3)
3344 * - `mkTerm(Kind kind, const std::vector<Term>& children)
3348 * A instantantiation-add-to-pool annotation.
3350 * - 1: The pool to add to.
3352 * - `mkTerm(Kind kind, Term child)
3356 * A skolemization-add-to-pool annotation.
3358 * - 1: The pool to add to.
3360 * - `mkTerm(Kind kind, Term child)
3364 * An instantiation attribute
3365 * Specifies a custom property for a quantified formula given by a
3366 * term that is ascribed a user attribute.
3369 * - 1: Term with a user attribute.
3372 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3376 * A list of instantiation patterns and/or attributes.
3379 * - 1..n: Terms with kind INST_PATTERN, INST_NO_PATTERN, or
3383 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3384 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3385 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3390 /* Sort Kinds ------------------------------------------------------------ */
3394 /* a type parameter for type ascription */
3398 /* a datatype type index */
3402 /* set type, takes as parameter the type of the elements */
3404 /* bag type, takes as parameter the type of the elements */
3408 /* specifies types of user-declared 'uninterpreted' sorts */
3412 /* a representation for basic types */
3414 /* a function type */
3416 /* the type of a symbolic expression */
3418 /* bit-vector type */
3420 /* floating-point type */
3424 /* ----------------------------------------------------------------------- */
3425 /** Marks the upper-bound of this enumeration. */
3430 * Get the string representation of a given kind.
3432 * @return the string representation of kind k
3434 std::string
kindToString(Kind k
) CVC5_EXPORT
;
3437 * Serialize a kind to given stream.
3438 * @param out the output stream
3439 * @param k the kind to be serialized to the given output stream
3440 * @return the output stream
3442 std::ostream
& operator<<(std::ostream
& out
, Kind k
) CVC5_EXPORT
;
3450 * Hash function for Kinds.
3453 struct CVC5_EXPORT hash
<cvc5::api::Kind
>
3456 * Hashes a Kind to a size_t.
3458 size_t operator()(cvc5::api::Kind k
) const;