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).
46 enum CVC5_EXPORT Kind
: int32_t
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`
162 * - 1: BOUND_VAR_LIST
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 bound 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`.
204 * - 1: BOUND_VAR_LIST
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 * Cardinality value for uninterpreted sort S.
336 * An operator that returns an integer indicating the value of the cardinality
340 * - 1: Term of sort S
343 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
344 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
348 /* Combined cardinality constraint. */
349 COMBINED_CARDINALITY_CONSTRAINT
,
350 /* Partial uninterpreted function application. */
354 * Higher-order applicative encoding of function application, left
358 * - 1: Function to apply
359 * - 2..n: Arguments of the function
362 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
363 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
364 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
368 /* Arithmetic ------------------------------------------------------------ */
371 * Arithmetic addition.
374 * - 1..n: Terms of sort Integer, Real (sorts must match)
377 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
378 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
379 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
383 * Arithmetic multiplication.
386 * - 1..n: Terms of sort Integer, Real (sorts must match)
389 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
390 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
391 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
395 * Operator for Integer AND
398 * - 1: Size of the bit-vector that determines the semantics of the IAND
401 * - `Solver::mkOp(Kind kind, uint32_t param) const`
403 * Apply integer conversion to bit-vector.
406 * - 1: Op of kind IAND
411 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
412 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
416 /* Synonym for MULT. */
420 * Arithmetic subtraction, left associative.
423 * - 1..n: Terms of sort Integer, Real (sorts must match)
426 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
427 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
428 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
432 * Arithmetic negation.
435 * - 1: Term of sort Integer, Real
438 * - `Solver::mkTerm(Kind kind, const Term& child) const`
442 * Real division, division by 0 undefined, left associative.
445 * - 1..n: Terms of sort Integer, Real
448 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
449 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
450 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
454 * Integer division, division by 0 undefined, left associative.
457 * - 1..n: Terms of sort Integer
460 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
461 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
462 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
466 * Integer modulus, division by 0 undefined.
469 * - 1: Term of sort Integer
470 * - 2: Term of sort Integer
473 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
474 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
481 * - 1: Term of sort Integer
484 * - `Solver::mkTerm(Kind kind, const Term& child) const`
491 * - 1: Term of sort Integer, Real
492 * - 2: Term of sort Integer, Real
495 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
496 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
500 * Exponential function.
503 * - 1: Term of sort Integer, Real
506 * - `Solver::mkTerm(Kind kind, const Term& child) const`
513 * - 1: Term of sort Integer, Real
516 * - `Solver::mkTerm(Kind kind, const Term& child) const`
523 * - 1: Term of sort Integer, Real
526 * - `Solver::mkTerm(Kind kind, const Term& child) const`
533 * - 1: Term of sort Integer, Real
536 * - `Solver::mkTerm(Kind kind, const Term& child) const`
543 * - 1: Term of sort Integer, Real
546 * - `Solver::mkTerm(Kind kind, const Term& child) const`
553 * - 1: Term of sort Integer, Real
556 * - `Solver::mkTerm(Kind kind, const Term& child) const`
560 * Cotangent function.
563 * - 1: Term of sort Integer, Real
566 * - `Solver::mkTerm(Kind kind, const Term& child) const`
573 * - 1: Term of sort Integer, Real
576 * - `Solver::mkTerm(Kind kind, const Term& child) const`
580 * Arc cosine function.
583 * - 1: Term of sort Integer, Real
586 * - `Solver::mkTerm(Kind kind, const Term& child) const`
590 * Arc tangent function.
593 * - 1: Term of sort Integer, Real
596 * - `Solver::mkTerm(Kind kind, const Term& child) const`
600 * Arc cosecant function.
603 * - 1: Term of sort Integer, Real
606 * - `Solver::mkTerm(Kind kind, const Term& child) const`
610 * Arc secant function.
613 * - 1: Term of sort Integer, Real
616 * - `Solver::mkTerm(Kind kind, const Term& child) const`
620 * Arc cotangent function.
623 * - 1: Term of sort Integer, Real
626 * - `Solver::mkTerm(Kind kind, const Term& child) const`
633 * - 1: Term of sort Integer, Real
636 * - `Solver::mkTerm(Kind kind, const Term& child) const`
640 * Operator for the divisibility-by-k predicate.
643 * - 1: The k to divide by (sort Integer)
646 * - `Solver::mkOp(Kind kind, uint32_t param) const`
648 * Apply divisibility-by-k predicate.
651 * - 1: Op of kind DIVISIBLE
655 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
656 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
660 * Multiple-precision rational constant.
663 * See @ref cvc5::api::Solver::mkInteger() "mkInteger()", @ref cvc5::api::Solver::mkReal() "mkReal()".
666 * - `Solver::mkInteger(const std::string& s) const`
667 * - `Solver::mkInteger(int64_t val) const`
668 * - `Solver::mkReal(const std::string& s) const`
669 * - `Solver::mkReal(int64_t val) const`
670 * - `Solver::mkReal(int64_t num, int64_t den) const`
674 * Less than, chainable.
677 * - 1..n: Terms of sort Integer, Real; [1] < ... < [n]
680 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
681 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
682 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
686 * Less than or equal, chainable.
689 * - 1..n: Terms of sort Integer, Real; [1] <= ... <= [n]
692 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
693 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
697 * Greater than, chainable.
700 * - 1..n: Terms of sort Integer, Real, [1] > ... > [n]
703 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
704 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
705 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
709 * Greater than or equal, chainable.
712 * - 1..n: Terms of sort Integer, Real; [1] >= ... >= [n]
715 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
716 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
717 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
721 * Is-integer predicate.
724 * - 1: Term of sort Integer, Real
727 * - `Solver::mkTerm(Kind kind, const Term& child) const`
731 * Convert Term to Integer by the floor function.
734 * - 1: Term of sort Integer, Real
737 * - `Solver::mkTerm(Kind kind, const Term& child) const`
741 * Convert Term to Real.
745 * - 1: Term of sort Integer, Real
747 * This is a no-op in cvc5, as Integer is a subtype of Real.
754 * - `Solver::mkPi() const`
755 * - `Solver::mkTerm(Kind kind) const`
759 /* BV -------------------------------------------------------------------- */
762 * Fixed-size bit-vector constant.
765 * See @ref cvc5::api::Solver::mkBitVector() "mkBitVector()".
768 * - `Solver::mkBitVector(uint32_t size, uint64_t val) const`
769 * - `Solver::mkBitVector(const std::string& s, uint32_t base) const`
770 * - `Solver::mkBitVector(uint32_t size, const std::string& s, uint32_t base) const`
774 * Concatenation of two or more bit-vectors.
777 * - 1..n: Terms of bit-vector sort
780 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
781 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
782 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
789 * - 1..n: Terms of bit-vector sort (sorts must match)
792 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
793 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
794 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
801 * - 1..n: Terms of bit-vector sort (sorts must match)
804 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
805 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
806 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
813 * - 1..n: Terms of bit-vector sort (sorts must match)
816 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
817 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
818 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
825 * - 1: Term of bit-vector sort
828 * - `Solver::mkTerm(Kind kind, const Term& child) const`
835 * - 1..2: Terms of bit-vector sort (sorts must match)
838 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
839 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
846 * - 1..2: Terms of bit-vector sort (sorts must match)
849 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
850 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
854 * Bit-wise xnor, left associative.
857 * - 1..n: Terms of bit-vector sort (sorts must match)
860 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
861 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
865 * Equality comparison (returns bit-vector of size 1).
868 * - 1..2: Terms of bit-vector sort (sorts must match)
871 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
872 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
873 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
877 * Multiplication of two or more bit-vectors.
880 * - 1..n: Terms of bit-vector sort (sorts must match)
883 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
884 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
885 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
889 * Addition of two or more bit-vectors.
892 * - 1..n: Terms of bit-vector sort (sorts must match)
895 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
896 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
897 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
901 * Subtraction of two bit-vectors.
904 * - 1..2: Terms of bit-vector sort (sorts must match)
907 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
908 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
912 * Negation of a bit-vector (two's complement).
915 * - 1: Term of bit-vector sort
918 * - `Solver::mkTerm(Kind kind, const Term& child) const`
922 * Unsigned division of two bit-vectors, truncating towards 0. If the divisor
923 * is zero, the result is all ones.
926 * - 1..2: Terms of bit-vector sort (sorts must match)
929 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
930 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
934 * Unsigned remainder from truncating division of two bit-vectors. If the
935 * modulus is zero, the result is the dividend.
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. If the divisor is
947 * zero and the dividend is positive, the result is all ones. If the divisor
948 * is zero and the dividend is negative, the result is one.
951 * - 1..2: Terms of bit-vector sort (sorts must match)
954 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
955 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
959 * Two's complement signed remainder of two bit-vectors (sign follows
960 * dividend). If the modulus is zero, the result is the dividend.
963 * - 1..2: Terms of bit-vector sort (sorts must match)
966 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
967 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
971 * Two's complement signed remainder (sign follows divisor). If the modulus
972 * is zero, the result is the dividend.
975 * - 1..2: Terms of bit-vector sort (sorts must match)
978 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
979 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
983 * Bit-vector shift left.
984 * The two bit-vector parameters must have same width.
987 * - 1..2: Terms of bit-vector sort (sorts must match)
990 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
991 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
995 * Bit-vector logical shift right.
996 * The two bit-vector parameters must have same width.
999 * - 1..2: Terms of bit-vector sort (sorts must match)
1002 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1003 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1007 * Bit-vector arithmetic shift right.
1008 * The two bit-vector parameters must have same width.
1011 * - 1..2: Terms of bit-vector sort (sorts must match)
1014 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1015 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1019 * Bit-vector unsigned less than.
1020 * The two bit-vector parameters must have same width.
1023 * - 1..2: Terms of bit-vector sort (sorts must match)
1026 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1027 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1031 * Bit-vector unsigned less than or equal.
1032 * The two bit-vector parameters must have same width.
1035 * - 1..2: Terms of bit-vector sort (sorts must match)
1038 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1039 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1043 * Bit-vector unsigned greater than.
1044 * The two bit-vector parameters must have same width.
1047 * - 1..2: Terms of bit-vector sort (sorts must match)
1050 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1051 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1055 * Bit-vector unsigned greater than or equal.
1056 * The two bit-vector parameters must have same width.
1059 * - 1..2: Terms of bit-vector sort (sorts must match)
1062 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1063 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1067 * Bit-vector signed less than.
1068 * The two bit-vector parameters must have same width.
1071 * - 1..2: Terms of bit-vector sort (sorts must match)
1074 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1075 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1079 * Bit-vector signed less than or equal.
1080 * The two bit-vector parameters must have same width.
1083 * - 1..2: Terms of bit-vector sort (sorts must match)
1086 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1087 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1091 * Bit-vector signed greater than.
1092 * The two bit-vector parameters must have same width.
1095 * - 1..2: Terms of bit-vector sort (sorts must match)
1098 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1099 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1103 * Bit-vector signed greater than or equal.
1104 * The two bit-vector parameters must have same width.
1107 * - 1..2: Terms of bit-vector sort (sorts must match)
1110 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1111 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1115 * Bit-vector unsigned less than, returns bit-vector of size 1.
1118 * - 1..2: Terms of bit-vector sort (sorts must match)
1121 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1122 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1126 * Bit-vector signed less than. returns bit-vector of size 1.
1129 * - 1..2: Terms of bit-vector sort (sorts must match)
1132 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1133 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1137 * Same semantics as regular ITE, but condition is bit-vector of size 1.
1140 * - 1: Term of bit-vector sort of size 1, representing the condition
1141 * - 2: Term reprsenting the 'then' branch
1142 * - 3: Term representing the 'else' branch
1144 * 'then' and 'else' term must have same base sort.
1147 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1148 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1155 * - 1: Term of bit-vector sort
1158 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1162 * Bit-vector redand.
1165 * - 1: Term of bit-vector sort
1168 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1172 /* formula to be treated as a bv atom via eager bit-blasting
1173 * (internal-only symbol) */
1174 BITVECTOR_EAGER_ATOM
,
1175 /* term to be treated as a variable. used for eager bit-blasting Ackermann
1176 * expansion of bvudiv (internal-only symbol) */
1177 BITVECTOR_ACKERMANIZE_UDIV
,
1178 /* term to be treated as a variable. used for eager bit-blasting Ackermann
1179 * expansion of bvurem (internal-only symbol) */
1180 BITVECTOR_ACKERMANIZE_UREM
,
1183 * Operator for bit-vector extract (from index 'high' to 'low').
1186 * - 1: The 'high' index
1187 * - 2: The 'low' index
1190 * - `Solver::mkOp(Kind kind, uint32_t param, uint32_t param) const`
1192 * Apply bit-vector extract.
1195 * - 1: Op of kind BITVECTOR_EXTRACT
1196 * - 2: Term of bit-vector sort
1199 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1200 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1204 * Operator for bit-vector repeat.
1207 * - 1: Number of times to repeat a given bit-vector
1210 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1212 * Apply bit-vector repeat.
1215 * - 1: Op of kind BITVECTOR_REPEAT
1216 * - 2: Term of bit-vector sort
1219 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1220 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1224 * Operator for bit-vector zero-extend.
1227 * - 1: Number of bits by which a given bit-vector is to be extended
1230 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1232 * Apply bit-vector zero-extend.
1235 * - 1: Op of kind BITVECTOR_ZERO_EXTEND
1236 * - 2: Term of bit-vector sort
1239 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1240 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1242 BITVECTOR_ZERO_EXTEND
,
1244 * Operator for bit-vector sign-extend.
1247 * - 1: Number of bits by which a given bit-vector is to be extended
1250 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1252 * Apply bit-vector sign-extend.
1255 * - 1: Op of kind BITVECTOR_SIGN_EXTEND
1256 * - 2: Term of bit-vector sort
1259 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1260 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1262 BITVECTOR_SIGN_EXTEND
,
1264 * Operator for bit-vector rotate left.
1267 * - 1: Number of bits by which a given bit-vector is to be rotated
1270 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1272 * Apply bit-vector rotate left.
1275 * - 1: Op of kind BITVECTOR_ROTATE_LEFT
1276 * - 2: Term of bit-vector sort
1279 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1280 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1282 BITVECTOR_ROTATE_LEFT
,
1284 * Operator for bit-vector rotate right.
1287 * - 1: Number of bits by which a given bit-vector is to be rotated
1290 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1292 * Apply bit-vector rotate right.
1295 * - 1: Op of kind BITVECTOR_ROTATE_RIGHT
1296 * - 2: Term of bit-vector sort
1299 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1300 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1302 BITVECTOR_ROTATE_RIGHT
,
1304 /* bit-vector boolean bit extract. */
1308 * Operator for the conversion from Integer to bit-vector.
1311 * - 1: Size of the bit-vector to convert to
1314 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1316 * Apply integer conversion to bit-vector.
1319 * - 1: Op of kind INT_TO_BITVECTOR
1323 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1324 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1328 * Bit-vector conversion to (nonnegative) integer.
1331 * - 1: Term of bit-vector sort
1334 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1338 /* FP -------------------------------------------------------------------- */
1341 * Floating-point constant, constructed from a double or string.
1344 * - 1: Size of the exponent
1345 * - 2: Size of the significand
1346 * - 3: Value of the floating-point constant as a bit-vector term
1349 * - `Solver::mkFloatingPoint(uint32_t exp, uint32_t sig, Term val) const`
1351 CONST_FLOATINGPOINT
,
1353 * Floating-point rounding mode term.
1356 * - `Solver::mkRoundingMode(RoundingMode rm) const`
1360 * Create floating-point literal from bit-vector triple.
1363 * - 1: Sign bit as a bit-vector term
1364 * - 2: Exponent bits as a bit-vector term
1365 * - 3: Significand bits as a bit-vector term (without hidden bit)
1368 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1369 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1373 * Floating-point equality.
1376 * - 1..2: Terms of floating point sort
1379 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1380 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1384 * Floating-point absolute value.
1387 * - 1: Term of floating point sort
1390 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1394 * Floating-point negation.
1397 * - 1: Term of floating point sort
1400 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1404 * Floating-point addition.
1407 * - 1: CONST_ROUNDINGMODE
1408 * - 2: Term of sort FloatingPoint
1409 * - 3: Term of sort FloatingPoint
1412 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1413 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1417 * Floating-point sutraction.
1420 * - 1: CONST_ROUNDINGMODE
1421 * - 2: Term of sort FloatingPoint
1422 * - 3: Term of sort FloatingPoint
1425 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1426 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1430 * Floating-point multiply.
1433 * - 1: CONST_ROUNDINGMODE
1434 * - 2: Term of sort FloatingPoint
1435 * - 3: Term of sort FloatingPoint
1438 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1439 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1443 * Floating-point division.
1446 * - 1: CONST_ROUNDINGMODE
1447 * - 2: Term of sort FloatingPoint
1448 * - 3: Term of sort FloatingPoint
1451 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1452 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1456 * Floating-point fused multiply and add.
1459 * - 1: CONST_ROUNDINGMODE
1460 * - 2: Term of sort FloatingPoint
1461 * - 3: Term of sort FloatingPoint
1462 * - 4: Term of sort FloatingPoint
1465 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1469 * Floating-point square root.
1472 * - 1: CONST_ROUNDINGMODE
1473 * - 2: Term of sort FloatingPoint
1476 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1477 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1481 * Floating-point remainder.
1484 * - 1..2: Terms of floating point sort
1487 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1488 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1492 * Floating-point round to integral.
1495 * -1..2: Terms of floating point sort
1498 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1499 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1503 * Floating-point minimum.
1506 * - 1..2: Terms of floating point sort
1509 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1510 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1514 * Floating-point maximum.
1517 * - 1..2: Terms of floating point sort
1520 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1521 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1525 * Floating-point less than or equal.
1528 * - 1..2: Terms of floating point sort
1531 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1532 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1536 * Floating-point less than.
1539 * - 1..2: Terms of floating point sort
1542 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1543 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1547 * Floating-point greater than or equal.
1550 * - 1..2: Terms of floating point sort
1553 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1554 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1558 * Floating-point greater than.
1561 * - 1..2: Terms of floating point sort
1564 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1565 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1569 * Floating-point is normal.
1572 * - 1: Term of floating point sort
1575 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1579 * Floating-point is sub-normal.
1582 * - 1: Term of floating point sort
1585 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1589 * Floating-point is zero.
1592 * - 1: Term of floating point sort
1595 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1599 * Floating-point is infinite.
1602 * - 1: Term of floating point sort
1605 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1607 FLOATINGPOINT_ISINF
,
1609 * Floating-point is NaN.
1612 * - 1: Term of floating point sort
1615 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1617 FLOATINGPOINT_ISNAN
,
1619 * Floating-point is negative.
1622 * - 1: Term of floating point sort
1625 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1627 FLOATINGPOINT_ISNEG
,
1629 * Floating-point is positive.
1632 * - 1: Term of floating point sort
1635 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1637 FLOATINGPOINT_ISPOS
,
1639 * Operator for to_fp from bit vector.
1642 * - 1: Exponent size
1643 * - 2: Significand size
1646 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1648 * Conversion from an IEEE-754 bit vector to floating-point.
1651 * - 1: Op of kind FLOATINGPOINT_TO_FP_IEEE_BITVECTOR
1652 * - 2: Term of sort FloatingPoint
1655 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1656 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1658 FLOATINGPOINT_TO_FP_IEEE_BITVECTOR
,
1660 * Operator for to_fp from floating point.
1663 * - 1: Exponent size
1664 * - 2: Significand size
1667 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1669 * Conversion between floating-point sorts.
1672 * - 1: Op of kind FLOATINGPOINT_TO_FP_FLOATINGPOINT
1673 * - 2: Term of sort FloatingPoint
1676 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1677 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1679 FLOATINGPOINT_TO_FP_FLOATINGPOINT
,
1681 * Operator for to_fp from real.
1684 * - 1: Exponent size
1685 * - 2: Significand size
1688 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1690 * Conversion from a real to floating-point.
1693 * - 1: Op of kind FLOATINGPOINT_TO_FP_REAL
1694 * - 2: Term of sort FloatingPoint
1697 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1698 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1700 FLOATINGPOINT_TO_FP_REAL
,
1702 * Operator for to_fp from signed bit vector
1705 * - 1: Exponent size
1706 * - 2: Significand size
1709 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1711 * Conversion from a signed bit vector to floating-point.
1714 * - 1: Op of kind FLOATINGPOINT_TO_FP_SIGNED_BITVECTOR
1715 * - 2: Term of sort FloatingPoint
1718 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1719 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1721 FLOATINGPOINT_TO_FP_SIGNED_BITVECTOR
,
1723 * Operator for to_fp from unsigned bit vector.
1726 * - 1: Exponent size
1727 * - 2: Significand size
1730 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1732 * Converting an unsigned bit vector to floating-point.
1735 * - 1: Op of kind FLOATINGPOINT_TO_FP_UNSIGNED_BITVECTOR
1736 * - 2: Term of sort FloatingPoint
1739 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1740 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1742 FLOATINGPOINT_TO_FP_UNSIGNED_BITVECTOR
,
1744 * Operator for a generic to_fp.
1747 * - 1: exponent size
1748 * - 2: Significand size
1751 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1753 * Generic conversion to floating-point, used in parsing only.
1756 * - 1: Op of kind FLOATINGPOINT_TO_FP_GENERIC
1757 * - 2: Term of sort FloatingPoint
1760 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1761 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1763 FLOATINGPOINT_TO_FP_GENERIC
,
1765 * Operator for to_ubv.
1768 * - 1: Size of the bit-vector to convert to
1771 * - `Solver::mkOp(Kind kind, uint32_t param) const`
1773 * Conversion from a floating-point value to an unsigned bit vector.
1776 * - 1: Op of kind FLOATINGPOINT_TO_FP_TO_UBV
1777 * - 2: Term of sort FloatingPoint
1780 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1781 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1783 FLOATINGPOINT_TO_UBV
,
1785 * Operator for to_sbv.
1788 * - 1: Size of the bit-vector to convert to
1791 * - `Solver::mkOp(Kind kind, uint32_t param) const`
1793 * Conversion from a floating-point value to a signed bit vector.
1796 * - 1: Op of kind FLOATINGPOINT_TO_FP_TO_SBV
1797 * - 2: Term of sort FloatingPoint
1800 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1801 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1803 FLOATINGPOINT_TO_SBV
,
1805 * Floating-point to real.
1808 * - 1: Term of sort FloatingPoint
1811 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1813 FLOATINGPOINT_TO_REAL
,
1815 /* Arrays ---------------------------------------------------------------- */
1821 * - 1: Term of array sort
1822 * - 2: Selection index
1825 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1826 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1833 * - 1: Term of array sort
1835 * - 3: Term to store at the index
1838 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2, const Term& child3) const`
1839 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1847 * - 2: Term representing a constant
1850 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1851 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1853 * Note: We currently support the creation of constant arrays, but under some
1854 * conditions when there is a chain of equalities connecting two constant
1855 * arrays, the solver doesn't know what to do and aborts (Issue <a href="https://github.com/CVC4/CVC4/issues/1667">#1667</a>).
1859 * Equality over arrays a and b over a given range [i,j], i.e.,
1861 * \forall k . i \leq k \leq j \Rightarrow a[k] = b[k]
1867 * - 3: Lower bound of range (inclusive)
1868 * - 4: Uppper bound of range (inclusive)
1871 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1873 * Note: We currently support the creation of array equalities over index
1874 * types bit-vector, floating-point, integer and real. Option --arrays-exp is
1875 * required to support this operator.
1879 /* array table function (internal-only symbol) */
1881 /* array lambda (internal-only symbol) */
1883 /* partial array select, for internal use only */
1885 /* partial array select, for internal use only */
1889 /* Datatypes ------------------------------------------------------------- */
1892 * Constructor application.
1895 * - 1: Constructor (operator)
1896 * - 2..n: Parameters to the constructor
1899 * - `Solver::mkTerm(const Op& op) const`
1900 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1901 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1902 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2, const Term& child3) const`
1903 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1907 * Datatype selector application, which is undefined if misapplied.
1910 * - 1: Selector (operator)
1911 * - 2: Datatype term
1914 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1918 * Datatype tester application.
1922 * - 2: Datatype term
1925 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1926 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1930 * Datatype update application, which does not change the argument if
1934 * - 1: Updater (operator)
1935 * - 2: Datatype term
1936 * - 3: Value to update a field of the datatype term with
1939 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1940 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1944 * Match expressions.
1945 * For example, the smt2 syntax match term
1946 * `(match l (((cons h t) h) (nil 0)))`
1947 * is represented by the AST
1950 * (MATCH_BIND_CASE (BOUND_VAR_LIST h t) (cons h t) h)
1951 * (MATCH_CASE nil 0))
1953 * The type of the last argument of each case term could be equal.
1956 * - 1..n: Terms of kind MATCH_CASE or MATCH_BIND_CASE
1959 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1960 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1961 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1967 * A (constant) case expression to be used within a match expression.
1970 * - 1: Term denoting the pattern expression
1971 * - 2: Term denoting the return value
1974 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1975 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1980 * A (non-constant) case expression to be used within a match expression.
1983 * - 1: a BOUND_VAR_LIST Term containing the free variables of the case
1984 * - 2: Term denoting the pattern expression
1985 * - 3: Term denoting the return value
1988 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1989 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1994 * An operator mapping datatypes to an integer denoting the number of
1995 * non-nullary applications of constructors they contain.
1998 * - 1: Datatype term
2001 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
2002 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2006 * Operator for tuple projection indices
2009 * - 1: The tuple projection indices
2012 * - `Solver::mkOp(Kind TUPLE_PROJECT, std::vector<uint32_t> param) const`
2014 * Constructs a new tuple from an existing one using the elements at the
2018 * - 1: a term of tuple sort
2021 * - `Solver::mkTerm(const Op& op, const Term& child) const`
2022 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
2026 /* datatypes height bound */
2028 /* datatypes height bound */
2030 /* datatypes sygus bound */
2032 /* datatypes sygus term order */
2033 DT_SYGUS_TERM_ORDER
,
2034 /* datatypes sygus is constant */
2038 /* Separation Logic ------------------------------------------------------ */
2041 * Separation logic nil term.
2046 * - `Solver::mkSepNil(const Sort& sort) const`
2050 * Separation logic empty heap.
2053 * - 1: Term of the same sort as the sort of the location of the heap
2054 * that is constrained to be empty
2055 * - 2: Term of the same sort as the data sort of the heap that is
2056 * that is constrained to be empty
2059 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2060 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) 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.
2222 * - `Solver::mkUniverseSet(const Sort& sort) const`
2229 * - 1..2: Terms of set sort
2232 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2233 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2237 * Set cartesian product.
2240 * - 1..2: Terms of set sort
2243 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2244 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2251 * - 1: Term of set sort
2254 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2258 * Set transitive closure.
2261 * - 1: Term of set sort
2264 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2271 * - 1..2: Terms of set sort
2274 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2275 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2282 * - 1: Term of set sort
2285 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2290 * A set comprehension is specified by a bound variable list x1 ... xn,
2291 * a predicate P[x1...xn], and a term t[x1...xn]. A comprehension C with the
2292 * above form has members given by the following semantics:
2294 * \forall y. ( \exists x_1...x_n. P[x_1...x_n] \hat{} t[x_1...x_n] = y )
2295 * \Leftrightarrow (member y C)
2297 * where y ranges over the element type of the (set) type of the
2298 * comprehension. If @f$ t[x_1..x_n] @f$ is not provided, it is equivalent to
2299 * y in the above formula.
2302 * - 1: Term BOUND_VAR_LIST
2303 * - 2: Term denoting the predicate of the comprehension
2304 * - 3: (optional) a Term denoting the generator for the comprehension
2307 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2308 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2309 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2313 * Returns an element from a given set.
2314 * If a set A = {x}, then the term (choose A) is equivalent to the term x.
2315 * If the set is empty, then (choose A) is an arbitrary value.
2316 * If the set has cardinality > 1, then (choose A) will deterministically
2317 * return an element in A.
2320 * - 1: Term of set sort
2323 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2327 * Set is_singleton predicate.
2330 * - 1: Term of set sort, is [1] a singleton set?
2333 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2336 /* Bags ------------------------------------------------------------------ */
2338 * Empty bag constant.
2341 * - 1: Sort of the bag elements
2344 * mkEmptyBag(const Sort& sort)
2350 * - 1..2: Terms of bag sort
2353 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2354 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2358 * Bag disjoint union (sum).
2361 * -1..2: Terms of bag sort
2364 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2365 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2369 * Bag intersection (min).
2372 * - 1..2: Terms of bag sort
2375 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2376 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2380 * Bag difference subtract (subtracts multiplicities of the second from the
2384 * - 1..2: Terms of bag sort
2387 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2388 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2390 DIFFERENCE_SUBTRACT
,
2392 * Bag difference 2 (removes shared elements in the two bags).
2395 * - 1..2: Terms of bag sort
2398 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2399 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2403 * Inclusion predicate for bags
2404 * (multiplicities of the first bag <= multiplicities of the second bag).
2407 * - 1..2: Terms of bag sort
2410 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2411 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2415 * Element multiplicity in a bag
2418 * - 1..2: Terms of bag sort (Bag E), [1] an element of sort E
2421 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2422 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2426 * Eliminate duplicates in a given bag. The returned bag contains exactly the
2427 * same elements in the given bag, but with multiplicity one.
2430 * - 1: a term of bag sort
2433 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2434 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2438 * The bag of the single element given as a parameter.
2441 * - 1: Single element
2444 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2451 * - 1: Bag to determine the cardinality of
2454 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2458 * Returns an element from a given bag.
2459 * If a bag A = {(x,n)} where n is the multiplicity, then the term (choose A)
2460 * is equivalent to the term x.
2461 * If the bag is empty, then (choose A) is an arbitrary value.
2462 * If the bag contains distinct elements, then (choose A) will
2463 * deterministically return an element in A.
2466 * - 1: Term of bag sort
2469 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2473 * Bag is_singleton predicate (single element with multiplicity exactly one).
2475 * - 1: Term of bag sort, is [1] a singleton bag?
2478 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2482 * Bag.from_set converts a set to a bag.
2485 * - 1: Term of set sort
2488 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2492 * Bag.to_set converts a bag to a set.
2495 * - 1: Term of bag sort
2498 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2502 /* Strings --------------------------------------------------------------- */
2508 * - 1..n: Terms of String sort
2511 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2512 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2513 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2517 * String membership.
2520 * - 1: Term of String sort
2521 * - 2: Term of RegExp sort
2524 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2525 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2532 * - 1: Term of String sort
2535 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2540 * Extracts a substring, starting at index i and of length l, from a string
2541 * s. If the start index is negative, the start index is greater than the
2542 * length of the string, or the length is negative, the result is the empty
2546 * - 1: Term of sort String
2547 * - 2: Term of sort Integer (index i)
2548 * - 3: Term of sort Integer (length l)
2551 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2552 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2557 * Updates a string s by replacing its context starting at an index with t.
2558 * If the start index is negative, the start index is greater than the
2559 * length of the string, the result is s. Otherwise, the length of the
2560 * original string is preserved.
2563 * - 1: Term of sort String
2564 * - 2: Term of sort Integer (index i)
2565 * - 3: Term of sort String (replacement string t)
2568 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2569 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2573 * String character at.
2574 * Returns the character at index i from a string s. If the index is negative
2575 * or the index is greater than the length of the string, the result is the
2576 * empty string. Otherwise the result is a string of length 1.
2579 * - 1: Term of sort String (string s)
2580 * - 2: Term of sort Integer (index i)
2583 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2584 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2589 * Checks whether a string s1 contains another string s2. If s2 is empty, the
2590 * result is always true.
2593 * - 1: Term of sort String (the string s1)
2594 * - 2: Term of sort String (the string s2)
2597 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2598 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2603 * Returns the index of a substring s2 in a string s1 starting at index i. If
2604 * the index is negative or greater than the length of string s1 or the
2605 * substring s2 does not appear in string s1 after index i, the result is -1.
2608 * - 1: Term of sort String (substring s1)
2609 * - 2: Term of sort String (substring s2)
2610 * - 3: Term of sort Integer (index i)
2613 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2614 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2618 * String index-of regular expression match.
2619 * Returns the first match of a regular expression r in a string s. If the
2620 * index is negative or greater than the length of string s1, or r does not
2621 * match a substring in s after index i, the result is -1.
2624 * - 1: Term of sort String (string s)
2625 * - 2: Term of sort RegLan (regular expression r)
2626 * - 3: Term of sort Integer (index i)
2629 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2630 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2635 * Replaces a string s2 in a string s1 with string s3. If s2 does not appear
2636 * in s1, s1 is returned unmodified.
2639 * - 1: Term of sort String (string s1)
2640 * - 2: Term of sort String (string s2)
2641 * - 3: Term of sort String (string s3)
2644 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2645 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2649 * String replace all.
2650 * Replaces all occurrences of a string s2 in a string s1 with string s3.
2651 * If s2 does not appear in s1, s1 is returned unmodified.
2654 * - 1: Term of sort String (string s1)
2655 * - 2: Term of sort String (string s2)
2656 * - 3: Term of sort String (string s3)
2659 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2660 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2664 * String replace regular expression match.
2665 * Replaces the first match of a regular expression r in string s1 with
2666 * string s2. If r does not match a substring of s1, s1 is returned
2670 * - 1: Term of sort String (string s1)
2671 * - 2: Term of sort Regexp (regexp r)
2672 * - 3: Term of sort String (string s2)
2675 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2676 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2680 * String replace all regular expression matches.
2681 * Replaces all matches of a regular expression r in string s1 with string
2682 * s2. If r does not match a substring of s1, s1 is returned unmodified.
2685 * - 1: Term of sort String (string s1)
2686 * - 2: Term of sort Regexp (regexp r)
2687 * - 3: Term of sort String (string s2)
2690 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2691 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2693 STRING_REPLACE_RE_ALL
,
2695 * String to lower case.
2698 * - 1: Term of String sort
2701 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2705 * String to upper case.
2708 * - 1: Term of String sort
2711 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2718 * - 1: Term of String sort
2721 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2726 * Returns the code point of a string if it has length one, or returns -1
2730 * - 1: Term of String sort
2733 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2738 * Returns a string containing a single character whose code point matches
2739 * the argument to this function, or the empty string if the argument is
2743 * - 1: Term of Integer sort
2746 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2751 * Returns true if string s1 is (strictly) less than s2 based on a
2752 * lexiographic ordering over code points.
2755 * - 1: Term of sort String (the string s1)
2756 * - 2: Term of sort String (the string s2)
2759 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2760 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2764 * String less than or equal.
2765 * Returns true if string s1 is less than or equal to s2 based on a
2766 * lexiographic ordering over code points.
2769 * - 1: Term of sort String (the string s1)
2770 * - 2: Term of sort String (the string s2)
2773 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2774 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2779 * Checks whether a string s1 is a prefix of string s2. If string s1 is
2780 * empty, this operator returns true.
2783 * - 1: Term of sort String (string s1)
2784 * - 2: Term of sort String (string s2)
2787 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2788 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2793 * Checks whether a string s1 is a suffix of string 2. If string s1 is empty,
2794 * this operator returns true.
2797 * - 1: Term of sort String (string s1)
2798 * - 2: Term of sort String (string s2)
2801 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2802 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2807 * Returns true if string s is digit (it is one of "0", ..., "9").
2810 * - 1: Term of sort String
2813 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
2814 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2818 * Integer to string.
2819 * If the integer is negative this operator returns the empty string.
2822 * - 1: Term of sort Integer
2825 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2829 * String to integer (total function).
2830 * If the string does not contain an integer or the integer is negative, the
2831 * operator returns -1.
2834 * - 1: Term of sort String
2837 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2844 * - See @ref cvc5::api::Solver::mkString() "mkString()".
2847 * - `Solver::mkString(const std::string& s, bool useEscSequences) const`
2848 * - `Solver::mkString(const unsigned char c) const`
2849 * - `Solver::mkString(const std::vector<uint32_t>& s) const`
2853 * Conversion from string to regexp.
2856 * - 1: Term of sort String
2859 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2863 * Regexp Concatenation.
2866 * - 1..2: Terms of Regexp sort
2869 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2870 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2877 * - 1..2: Terms of Regexp sort
2880 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2881 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2885 * Regexp intersection.
2888 * - 1..2: Terms of Regexp sort
2891 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2892 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2896 * Regexp difference.
2899 * - 1..2: Terms of Regexp sort
2902 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2903 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2910 * - 1: Term of sort Regexp
2913 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2920 * - 1: Term of sort Regexp
2923 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2930 * - 1: Term of sort Regexp
2933 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2940 * - 1: Lower bound character for the range
2941 * - 2: Upper bound character for the range
2944 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2945 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2949 * Operator for regular expression repeat.
2952 * - 1: The number of repetitions
2955 * - `Solver::mkOp(Kind kind, uint32_t param) const`
2957 * Apply regular expression loop.
2960 * - 1: Op of kind REGEXP_REPEAT
2961 * - 2: Term of regular expression sort
2964 * - `Solver::mkTerm(const Op& op, const Term& child) const`
2965 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
2969 * Operator for regular expression loop, from lower bound to upper bound
2970 * number of repetitions.
2973 * - 1: The lower bound
2974 * - 2: The upper bound
2977 * - `Solver::mkOp(Kind kind, uint32_t param, uint32_t param) const`
2979 * Apply regular expression loop.
2982 * - 1: Op of kind REGEXP_LOOP
2983 * - 2: Term of regular expression sort
2986 * - `Solver::mkTerm(const Op& op, const Term& child) const`
2987 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
2996 * - `Solver::mkRegexpEmpty() const`
2997 * - `Solver::mkTerm(Kind kind) const`
3001 * Regexp all characters.
3006 * - `Solver::mkRegexpSigma() const`
3007 * - `Solver::mkTerm(Kind kind) const`
3011 * Regexp complement.
3014 * - 1: Term of sort RegExp
3017 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
3025 * - 1..n: Terms of Sequence sort
3028 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3029 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3030 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3037 * - 1: Term of Sequence sort
3040 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3045 * Extracts a subsequence, starting at index i and of length l, from a
3046 * sequence s. If the start index is negative, the start index is greater
3047 * than the length of the sequence, or the length is negative, the result is
3048 * the empty sequence.
3051 * - 1: Term of sort Sequence
3052 * - 2: Term of sort Integer (index i)
3053 * - 3: Term of sort Integer (length l)
3056 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3057 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3062 * Updates a sequence s by replacing its context starting at an index with t.
3063 * If the start index is negative, the start index is greater than the
3064 * length of the sequence, the result is s. Otherwise, the length of the
3065 * original sequence is preserved.
3068 * - 1: Term of sort Sequence
3069 * - 2: Term of sort Integer (index i)
3070 * - 3: Term of sort Sequence (replacement sequence t)
3073 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3074 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3078 * Sequence element at.
3079 * Returns the element at index i from a sequence s. If the index is negative
3080 * or the index is greater or equal to the length of the sequence, the result
3081 * is the empty sequence. Otherwise the result is a sequence of length 1.
3084 * - 1: Term of sequence sort (string s)
3085 * - 2: Term of sort Integer (index i)
3088 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3089 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3093 * Sequence contains.
3094 * Checks whether a sequence s1 contains another sequence s2. If s2 is empty,
3095 * the result is always true.
3098 * - 1: Term of sort Sequence (the sequence s1)
3099 * - 2: Term of sort Sequence (the sequence s2)
3102 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3103 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3107 * Sequence index-of.
3108 * Returns the index of a subsequence s2 in a sequence s1 starting at index i.
3109 * If the index is negative or greater than the length of sequence s1 or the
3110 * subsequence s2 does not appear in sequence s1 after index i, the result is
3114 * - 1: Term of sort Sequence (subsequence s1)
3115 * - 2: Term of sort Sequence (subsequence s2)
3116 * - 3: Term of sort Integer (index i)
3119 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3120 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3125 * Replaces the first occurrence of a sequence s2 in a sequence s1 with
3126 * sequence s3. If s2 does not appear in s1, s1 is returned unmodified.
3129 * - 1: Term of sort Sequence (sequence s1)
3130 * - 2: Term of sort Sequence (sequence s2)
3131 * - 3: Term of sort Sequence (sequence s3)
3134 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3135 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3139 * Sequence replace all.
3140 * Replaces all occurrences of a sequence s2 in a sequence s1 with sequence
3141 * s3. If s2 does not appear in s1, s1 is returned unmodified.
3144 * - 1: Term of sort Sequence (sequence s1)
3145 * - 2: Term of sort Sequence (sequence s2)
3146 * - 3: Term of sort Sequence (sequence s3)
3149 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3150 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3157 * - 1: Term of Sequence sort
3160 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3164 * Sequence prefix-of.
3165 * Checks whether a sequence s1 is a prefix of sequence s2. If sequence s1 is
3166 * empty, this operator returns true.
3169 * - 1: Term of sort Sequence (sequence s1)
3170 * - 2: Term of sort Sequence (sequence s2)
3173 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3174 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3178 * Sequence suffix-of.
3179 * Checks whether a sequence s1 is a suffix of sequence s2. If sequence s1 is
3180 * empty, this operator returns true.
3183 * - 1: Term of sort Sequence (sequence s1)
3184 * - 2: Term of sort Sequence (sequence s2)
3187 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3188 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3192 * Constant sequence.
3195 * - See @ref cvc5::api::Solver::mkEmptySequence() "mkEmptySequence()".
3198 * - `Solver::mkEmptySequence(const Sort& sort) const`
3200 * Note that a constant sequence is a term that is equivalent to:
3202 * (seq.++ (seq.unit c1) ... (seq.unit cn))
3204 * where n>=0 and c1, ..., cn are constants of some sort. The elements
3205 * can be extracted by `Term::getSequenceValue()`.
3209 * Sequence unit, corresponding to a sequence of length one with the given
3213 * - 1: Element term.
3216 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
3220 * Sequence nth, corresponding to the nth element of a sequence.
3223 * - 1: Sequence term.
3224 * - 2: Integer term.
3227 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3231 /* Quantifiers ----------------------------------------------------------- */
3234 * Universally quantified formula.
3237 * - 1: BOUND_VAR_LIST Term
3238 * - 2: Quantifier body
3239 * - 3: (optional) INST_PATTERN_LIST Term
3242 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3243 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3244 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3248 * Existentially quantified formula.
3251 * - 1: BOUND_VAR_LIST Term
3252 * - 2: Quantifier body
3253 * - 3: (optional) INST_PATTERN_LIST Term
3256 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3257 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3258 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3262 * A list of bound variables (used to bind variables under a quantifier)
3265 * - 1..n: Terms with kind BOUND_VARIABLE
3268 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3269 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3270 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3274 * An instantiation pattern.
3275 * Specifies a (list of) terms to be used as a pattern for quantifier
3279 * - 1..n: Terms with kind BOUND_VARIABLE
3282 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3283 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3284 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3288 * An instantiation no-pattern.
3289 * Specifies a (list of) terms that should not be used as a pattern for
3290 * quantifier instantiation.
3293 * - 1..n: Terms with kind BOUND_VARIABLE
3296 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3297 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3298 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3302 * An instantiation pool.
3303 * Specifies an annotation for pool based instantiation.
3305 * - 1..n: Terms that comprise the pools, which are one-to-one with
3306 * the variables of the quantified formula to be instantiated.
3308 * - `mkTerm(Kind kind, Term child1, Term child2)
3309 * - `mkTerm(Kind kind, Term child1, Term child2, Term child3)
3310 * - `mkTerm(Kind kind, const std::vector<Term>& children)
3314 * A instantantiation-add-to-pool annotation.
3316 * - 1: The pool to add to.
3318 * - `mkTerm(Kind kind, Term child)
3322 * A skolemization-add-to-pool annotation.
3324 * - 1: The pool to add to.
3326 * - `mkTerm(Kind kind, Term child)
3330 * An instantiation attribute
3331 * Specifies a custom property for a quantified formula given by a
3332 * term that is ascribed a user attribute.
3335 * - 1: Term with a user attribute.
3338 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3342 * A list of instantiation patterns and/or attributes.
3345 * - 1..n: Terms with kind INST_PATTERN, INST_NO_PATTERN, or
3349 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3350 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3351 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3356 /* Sort Kinds ------------------------------------------------------------ */
3360 /* a type parameter for type ascription */
3364 /* a datatype type index */
3368 /* set type, takes as parameter the type of the elements */
3370 /* bag type, takes as parameter the type of the elements */
3374 /* specifies types of user-declared 'uninterpreted' sorts */
3378 /* a representation for basic types */
3380 /* a function type */
3382 /* the type of a symbolic expression */
3384 /* bit-vector type */
3386 /* floating-point type */
3390 /* ----------------------------------------------------------------------- */
3391 /** Marks the upper-bound of this enumeration. */
3397 * Get the string representation of a given kind.
3399 * @return the string representation of kind k
3401 std::string
kindToString(Kind k
) CVC5_EXPORT
;
3404 * Serialize a kind to given stream.
3405 * @param out the output stream
3406 * @param k the kind to be serialized to the given output stream
3407 * @return the output stream
3409 std::ostream
& operator<<(std::ostream
& out
, Kind k
) CVC5_EXPORT
;
3417 * Hash function for Kinds.
3420 struct CVC5_EXPORT hash
<cvc5::api::Kind
>
3423 * Hashes a Kind to a size_t.
3425 size_t operator()(cvc5::api::Kind k
) const;