regex: Rename REGEXP_EMPTY and REGEXP_SIGMA to match SMT-LIB. (#7609)
[cvc5.git] / src / api / cpp / cvc5_kind.h
1 /******************************************************************************
2 * Top contributors (to current version):
3 * Aina Niemetz, Andrew Reynolds, Makai Mann
4 *
5 * This file is part of the cvc5 project.
6 *
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 * ****************************************************************************
12 *
13 * The term kinds of the cvc5 C++ API.
14 */
15
16 #include "cvc5_export.h"
17
18 #ifndef CVC5__API__CVC5_KIND_H
19 #define CVC5__API__CVC5_KIND_H
20
21 #include <ostream>
22
23 namespace cvc5 {
24 namespace api {
25
26 /* -------------------------------------------------------------------------- */
27 /* Kind */
28 /* -------------------------------------------------------------------------- */
29
30 // TODO(Gereon): Fix links that involve std::vector. See
31 // https://github.com/doxygen/doxygen/issues/8503
32 // clang-format off
33 /**
34 * The kind of a cvc5 term.
35 *
36 * \internal
37 *
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).
45 */
46 enum Kind : int32_t
47 {
48 /**
49 * Internal kind.
50 * Should never be exposed or created via the API.
51 */
52 INTERNAL_KIND = -2,
53 /**
54 * Undefined kind.
55 * Should never be exposed or created via the API.
56 */
57 UNDEFINED_KIND = -1,
58 /**
59 * Null kind (kind of null term `Term::Term()`).
60 * Do not explicitly create via API functions other than `Term::Term()`.
61 */
62 NULL_EXPR,
63
64 /* Builtin --------------------------------------------------------------- */
65
66 /**
67 * Uninterpreted constant.
68 *
69 * Parameters:
70 * - 1: Sort of the constant
71 * - 2: Index of the constant
72 *
73 * Create with:
74 * - `Solver::mkUninterpretedConst(const Sort& sort, int32_t index) const`
75 */
76 UNINTERPRETED_CONSTANT,
77 /**
78 * Abstract value (other than uninterpreted sort constants).
79 *
80 * Parameters:
81 * - 1: Index of the abstract value
82 *
83 * Create with:
84 * - `Solver::mkAbstractValue(const std::string& index) const`
85 * - `Solver::mkAbstractValue(uint64_t index) const`
86 */
87 ABSTRACT_VALUE,
88 #if 0
89 /* Built-in operator */
90 BUILTIN,
91 #endif
92 /**
93 * Equality, chainable.
94 *
95 * Parameters: n > 1
96 * - 1..n: Terms with same sorts
97 *
98 * Create with:
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`
102 */
103 EQUAL,
104 /**
105 * Disequality.
106 *
107 * Parameters: n > 1
108 * - 1..n: Terms with same sorts
109 *
110 * Create with:
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`
114 */
115 DISTINCT,
116 /**
117 * First-order constant.
118 *
119 * Not permitted in bindings (forall, exists, ...).
120 *
121 * Parameters:
122 * - See @ref cvc5::api::Solver::mkConst() "mkConst()".
123 *
124 * Create with:
125 * - `Solver::mkConst(const Sort& sort, const std::string& symbol) const`
126 * - `Solver::mkConst(const Sort& sort) const`
127 */
128 CONSTANT,
129 /**
130 * (Bound) variable.
131 *
132 * Permitted in bindings and in the lambda and quantifier bodies only.
133 *
134 * Parameters:
135 * - See @ref cvc5::api::Solver::mkVar() "mkVar()".
136 *
137 * Create with:
138 * - `Solver::mkVar(const Sort& sort, const std::string& symbol) const`
139 */
140 VARIABLE,
141 #if 0
142 /* Skolem variable (internal only) */
143 SKOLEM,
144 #endif
145 /**
146 * Symbolic expression.
147 *
148 * Parameters: n > 0
149 * - 1..n: terms
150 *
151 * Create with:
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`
156 */
157 SEXPR,
158 /**
159 * Lambda expression.
160 *
161 * Parameters:
162 * - 1: BOUND_VAR_LIST
163 * - 2: Lambda body
164 *
165 * Create with:
166 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
167 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
168 */
169 LAMBDA,
170 /**
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`
174 * and asserts `F`.
175 *
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:
180 *
181 * @f[
182 * \forall x. F \equiv G \Rightarrow witness~x. F = witness~x. G
183 * @f]
184 *
185 * For example if there are 2 elements of type T that satisfy F, then the
186 * following formula is satisfiable:
187 *
188 * (distinct
189 * (witness ((x Int)) F)
190 * (witness ((x Int)) F))
191 *
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
199 * unsatisfiable:
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`.
202 *
203 * Parameters:
204 * - 1: BOUND_VAR_LIST
205 * - 2: Witness body
206 *
207 * Create with:
208 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
209 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
210 */
211 WITNESS,
212
213 /* Boolean --------------------------------------------------------------- */
214
215 /**
216 * Boolean constant.
217 *
218 * Parameters:
219 * - 1: Boolean value of the constant
220 *
221 * Create with:
222 * - `Solver::mkTrue() const`
223 * - `Solver::mkFalse() const`
224 * - `Solver::mkBoolean(bool val) const`
225 */
226 CONST_BOOLEAN,
227 /**
228 * Logical negation.
229 *
230 * Parameters:
231 * - 1: Boolean Term to negate
232 *
233 * Create with:
234 * - `Solver::mkTerm(Kind kind, const Term& child) const`
235 */
236 NOT,
237 /**
238 * Logical conjunction.
239 *
240 * Parameters: n > 1
241 * - 1..n: Boolean Term of the conjunction
242 *
243 * Create with:
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`
247 */
248 AND,
249 /**
250 * Logical implication.
251 *
252 * Parameters: n > 1
253 * - 1..n: Boolean Terms, right associative
254 *
255 * Create with:
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`
259 */
260 IMPLIES,
261 /**
262 * Logical disjunction.
263 *
264 * Parameters: n > 1
265 * - 1..n: Boolean Term of the disjunction
266 *
267 * Create with:
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`
271 */
272 OR,
273 /**
274 * Logical exclusive disjunction, left associative.
275 *
276 * Parameters: n > 1
277 * - 1..n: Boolean Terms, `[1] xor ... xor [n]`
278 *
279 * Create with:
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`
283 */
284 XOR,
285 /**
286 * If-then-else.
287 *
288 * Parameters:
289 * - 1: is a Boolean condition Term
290 * - 2: the 'then' Term
291 * - 3: the 'else' Term
292 *
293 * 'then' and 'else' term must have same base sort.
294 *
295 * Create with:
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`
298 */
299 ITE,
300
301 /* UF -------------------------------------------------------------------- */
302
303 /**
304 * Application of an uninterpreted function.
305 *
306 * Parameters: n > 1
307 * - 1: Function Term
308 * - 2..n: Function argument instantiation Terms
309 *
310 * Create with:
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`
314 */
315 APPLY_UF,
316 #if 0
317 /* Boolean term variable */
318 BOOLEAN_TERM_VARIABLE,
319 #endif
320 /**
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.
324 *
325 * Parameters:
326 * - 1: Term of sort S
327 * - 2: Positive integer constant that bounds the cardinality of sort S
328 *
329 * Create with:
330 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
331 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
332 */
333 CARDINALITY_CONSTRAINT,
334 #if 0
335 /* Partial uninterpreted function application. */
336 PARTIAL_APPLY_UF,
337 #endif
338 /**
339 * Higher-order applicative encoding of function application, left
340 * associative.
341 *
342 * Parameters: n > 1
343 * - 1: Function to apply
344 * - 2..n: Arguments of the function
345 *
346 * Create with:
347 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
348 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
349 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
350 */
351 HO_APPLY,
352
353 /* Arithmetic ------------------------------------------------------------ */
354
355 /**
356 * Arithmetic addition.
357 *
358 * Parameters: n > 1
359 * - 1..n: Terms of sort Integer, Real (sorts must match)
360 *
361 * Create with:
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`
365 */
366 PLUS,
367 /**
368 * Arithmetic multiplication.
369 *
370 * Parameters: n > 1
371 * - 1..n: Terms of sort Integer, Real (sorts must match)
372 *
373 * Create with:
374 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
375 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
376 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
377 */
378 MULT,
379 /**
380 * Operator for bit-wise AND over integers, parameterized by a (positive)
381 * bitwidth k.
382 *
383 * ((_ iand k) i1 i2) is equivalent to:
384 * (bv2int (bvand ((_ int2bv k) i1) ((_ int2bv k) i2)))
385 * for all integers i1, i2.
386 *
387 * Parameters:
388 * - 1: Size of the bit-vector that determines the semantics of the IAND
389 *
390 * Create with:
391 * - `Solver::mkOp(Kind kind, uint32_t param) const`
392 *
393 * Apply integer and.
394 *
395 * Parameters:
396 * - 1: Op of kind IAND
397 * - 2: Integer term
398 * - 3: Integer term
399 *
400 * Create with:
401 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
402 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
403 */
404 IAND,
405 /**
406 * Operator for raising 2 to a non-negative integer power.
407 *
408 * Create with:
409 * - `Solver::mkOp(Kind kind) const`
410 *
411 * Parameters:
412 * - 1: Op of kind IAND
413 * - 2: Integer term
414 *
415 * Apply 2 to the power operator.
416 *
417 * Create with:
418 * - `Solver::mkTerm(const Op& op, const Term& child) const`
419 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
420 */
421 POW2,
422 #if 0
423 /* Synonym for MULT. */
424 NONLINEAR_MULT,
425 #endif
426 /**
427 * Arithmetic subtraction, left associative.
428 *
429 * Parameters:
430 * - 1..n: Terms of sort Integer, Real (sorts must match)
431 *
432 * Create with:
433 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
434 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
435 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
436 */
437 MINUS,
438 /**
439 * Arithmetic negation.
440 *
441 * Parameters:
442 * - 1: Term of sort Integer, Real
443 *
444 * Create with:
445 * - `Solver::mkTerm(Kind kind, const Term& child) const`
446 */
447 UMINUS,
448 /**
449 * Real division, division by 0 undefined, left associative.
450 *
451 * Parameters: n > 1
452 * - 1..n: Terms of sort Integer, Real
453 *
454 * Create with:
455 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
456 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
457 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
458 */
459 DIVISION,
460 /**
461 * Integer division, division by 0 undefined, left associative.
462 *
463 * Parameters: n > 1
464 * - 1..n: Terms of sort Integer
465 *
466 * Create with:
467 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
468 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
469 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
470 */
471 INTS_DIVISION,
472 /**
473 * Integer modulus, division by 0 undefined.
474 *
475 * Parameters:
476 * - 1: Term of sort Integer
477 * - 2: Term of sort Integer
478 *
479 * Create with:
480 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
481 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
482 */
483 INTS_MODULUS,
484 /**
485 * Absolute value.
486 *
487 * Parameters:
488 * - 1: Term of sort Integer
489 *
490 * Create with:
491 * - `Solver::mkTerm(Kind kind, const Term& child) const`
492 */
493 ABS,
494 /**
495 * Arithmetic power.
496 *
497 * Parameters:
498 * - 1: Term of sort Integer, Real
499 * - 2: Term of sort Integer, Real
500 *
501 * Create with:
502 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
503 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
504 */
505 POW,
506 /**
507 * Exponential function.
508 *
509 * Parameters:
510 * - 1: Term of sort Integer, Real
511 *
512 * Create with:
513 * - `Solver::mkTerm(Kind kind, const Term& child) const`
514 */
515 EXPONENTIAL,
516 /**
517 * Sine function.
518 *
519 * Parameters:
520 * - 1: Term of sort Integer, Real
521 *
522 * Create with:
523 * - `Solver::mkTerm(Kind kind, const Term& child) const`
524 */
525 SINE,
526 /**
527 * Cosine function.
528 *
529 * Parameters:
530 * - 1: Term of sort Integer, Real
531 *
532 * Create with:
533 * - `Solver::mkTerm(Kind kind, const Term& child) const`
534 */
535 COSINE,
536 /**
537 * Tangent function.
538 *
539 * Parameters:
540 * - 1: Term of sort Integer, Real
541 *
542 * Create with:
543 * - `Solver::mkTerm(Kind kind, const Term& child) const`
544 */
545 TANGENT,
546 /**
547 * Cosecant function.
548 *
549 * Parameters:
550 * - 1: Term of sort Integer, Real
551 *
552 * Create with:
553 * - `Solver::mkTerm(Kind kind, const Term& child) const`
554 */
555 COSECANT,
556 /**
557 * Secant function.
558 *
559 * Parameters:
560 * - 1: Term of sort Integer, Real
561 *
562 * Create with:
563 * - `Solver::mkTerm(Kind kind, const Term& child) const`
564 */
565 SECANT,
566 /**
567 * Cotangent function.
568 *
569 * Parameters:
570 * - 1: Term of sort Integer, Real
571 *
572 * Create with:
573 * - `Solver::mkTerm(Kind kind, const Term& child) const`
574 */
575 COTANGENT,
576 /**
577 * Arc sine function.
578 *
579 * Parameters:
580 * - 1: Term of sort Integer, Real
581 *
582 * Create with:
583 * - `Solver::mkTerm(Kind kind, const Term& child) const`
584 */
585 ARCSINE,
586 /**
587 * Arc cosine function.
588 *
589 * Parameters:
590 * - 1: Term of sort Integer, Real
591 *
592 * Create with:
593 * - `Solver::mkTerm(Kind kind, const Term& child) const`
594 */
595 ARCCOSINE,
596 /**
597 * Arc tangent function.
598 *
599 * Parameters:
600 * - 1: Term of sort Integer, Real
601 *
602 * Create with:
603 * - `Solver::mkTerm(Kind kind, const Term& child) const`
604 */
605 ARCTANGENT,
606 /**
607 * Arc cosecant function.
608 *
609 * Parameters:
610 * - 1: Term of sort Integer, Real
611 *
612 * Create with:
613 * - `Solver::mkTerm(Kind kind, const Term& child) const`
614 */
615 ARCCOSECANT,
616 /**
617 * Arc secant function.
618 *
619 * Parameters:
620 * - 1: Term of sort Integer, Real
621 *
622 * Create with:
623 * - `Solver::mkTerm(Kind kind, const Term& child) const`
624 */
625 ARCSECANT,
626 /**
627 * Arc cotangent function.
628 *
629 * Parameters:
630 * - 1: Term of sort Integer, Real
631 *
632 * Create with:
633 * - `Solver::mkTerm(Kind kind, const Term& child) const`
634 */
635 ARCCOTANGENT,
636 /**
637 * Square root.
638 *
639 * Parameters:
640 * - 1: Term of sort Integer, Real
641 *
642 * Create with:
643 * - `Solver::mkTerm(Kind kind, const Term& child) const`
644 */
645 SQRT,
646 /**
647 * Operator for the divisibility-by-k predicate.
648 *
649 * Parameter:
650 * - 1: The k to divide by (sort Integer)
651 *
652 * Create with:
653 * - `Solver::mkOp(Kind kind, uint32_t param) const`
654 *
655 * Apply divisibility-by-k predicate.
656 *
657 * Parameters:
658 * - 1: Op of kind DIVISIBLE
659 * - 2: Integer Term
660 *
661 * Create with:
662 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
663 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
664 */
665 DIVISIBLE,
666 /**
667 * Multiple-precision rational constant.
668 *
669 * Parameters:
670 * See @ref cvc5::api::Solver::mkInteger() "mkInteger()", @ref cvc5::api::Solver::mkReal() "mkReal()".
671 *
672 * Create with:
673 * - `Solver::mkInteger(const std::string& s) const`
674 * - `Solver::mkInteger(int64_t val) const`
675 * - `Solver::mkReal(const std::string& s) const`
676 * - `Solver::mkReal(int64_t val) const`
677 * - `Solver::mkReal(int64_t num, int64_t den) const`
678 */
679 CONST_RATIONAL,
680 /**
681 * Less than, chainable.
682 *
683 * Parameters: n
684 * - 1..n: Terms of sort Integer, Real; [1] < ... < [n]
685 *
686 * Create with:
687 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
688 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
689 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
690 */
691 LT,
692 /**
693 * Less than or equal, chainable.
694 *
695 * Parameters: n > 1
696 * - 1..n: Terms of sort Integer, Real; [1] <= ... <= [n]
697 *
698 * Create with:
699 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
700 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
701 */
702 LEQ,
703 /**
704 * Greater than, chainable.
705 *
706 * Parameters: n > 1
707 * - 1..n: Terms of sort Integer, Real, [1] > ... > [n]
708 *
709 * Create with:
710 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
711 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
712 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
713 */
714 GT,
715 /**
716 * Greater than or equal, chainable.
717 *
718 * Parameters: n > 1
719 * - 1..n: Terms of sort Integer, Real; [1] >= ... >= [n]
720 *
721 * Create with:
722 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
723 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
724 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
725 */
726 GEQ,
727 /**
728 * Is-integer predicate.
729 *
730 * Parameters:
731 * - 1: Term of sort Integer, Real
732 *
733 * Create with:
734 * - `Solver::mkTerm(Kind kind, const Term& child) const`
735 */
736 IS_INTEGER,
737 /**
738 * Convert Term to Integer by the floor function.
739 *
740 * Parameters:
741 * - 1: Term of sort Integer, Real
742 *
743 * Create with:
744 * - `Solver::mkTerm(Kind kind, const Term& child) const`
745 */
746 TO_INTEGER,
747 /**
748 * Convert Term to Real.
749 *
750 * Parameters:
751 *
752 * - 1: Term of sort Integer, Real
753 *
754 * This is a no-op in cvc5, as Integer is a subtype of Real.
755 */
756 TO_REAL,
757 /**
758 * Pi constant.
759 *
760 * Note that PI is considered a special symbol of sort Real, but is not
761 * a real value, i.e., `Term::isRealValue() const` will return false.
762 *
763 * Create with:
764 * - `Solver::mkPi() const`
765 * - `Solver::mkTerm(Kind kind) const`
766 */
767 PI,
768
769 /* BV -------------------------------------------------------------------- */
770
771 /**
772 * Fixed-size bit-vector constant.
773 *
774 * Parameters:
775 * See @ref cvc5::api::Solver::mkBitVector() "mkBitVector()".
776 *
777 * Create with:
778 * - `Solver::mkBitVector(uint32_t size, uint64_t val) const`
779 * - `Solver::mkBitVector(const std::string& s, uint32_t base) const`
780 * - `Solver::mkBitVector(uint32_t size, const std::string& s, uint32_t base) const`
781 */
782 CONST_BITVECTOR,
783 /**
784 * Concatenation of two or more bit-vectors.
785 *
786 * Parameters: n > 1
787 * - 1..n: Terms of bit-vector sort
788 *
789 * Create with:
790 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
791 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
792 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
793 */
794 BITVECTOR_CONCAT,
795 /**
796 * Bit-wise and.
797 *
798 * Parameters: n > 1
799 * - 1..n: Terms of bit-vector sort (sorts must match)
800 *
801 * Create with:
802 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
803 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
804 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
805 */
806 BITVECTOR_AND,
807 /**
808 * Bit-wise or.
809 *
810 * Parameters: n > 1
811 * - 1..n: Terms of bit-vector sort (sorts must match)
812 *
813 * Create with:
814 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
815 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
816 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
817 */
818 BITVECTOR_OR,
819 /**
820 * Bit-wise xor.
821 *
822 * Parameters: n > 1
823 * - 1..n: Terms of bit-vector sort (sorts must match)
824 *
825 * Create with:
826 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
827 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
828 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
829 */
830 BITVECTOR_XOR,
831 /**
832 * Bit-wise negation.
833 *
834 * Parameters:
835 * - 1: Term of bit-vector sort
836 *
837 * Create with:
838 * - `Solver::mkTerm(Kind kind, const Term& child) const`
839 */
840 BITVECTOR_NOT,
841 /**
842 * Bit-wise nand.
843 *
844 * Parameters:
845 * - 1..2: Terms of bit-vector sort (sorts must match)
846 *
847 * Create with:
848 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
849 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
850 */
851 BITVECTOR_NAND,
852 /**
853 * Bit-wise nor.
854 *
855 * Parameters:
856 * - 1..2: Terms of bit-vector sort (sorts must match)
857 *
858 * Create with:
859 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
860 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
861 */
862 BITVECTOR_NOR,
863 /**
864 * Bit-wise xnor, left associative.
865 *
866 * Parameters: n > 1
867 * - 1..n: Terms of bit-vector sort (sorts must match)
868 *
869 * Create with:
870 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
871 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
872 */
873 BITVECTOR_XNOR,
874 /**
875 * Equality comparison (returns bit-vector of size 1).
876 *
877 * Parameters:
878 * - 1..2: Terms of bit-vector sort (sorts must match)
879 *
880 * Create with:
881 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
882 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
883 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
884 */
885 BITVECTOR_COMP,
886 /**
887 * Multiplication of two or more bit-vectors.
888 *
889 * Parameters: n > 1
890 * - 1..n: Terms of bit-vector sort (sorts must match)
891 *
892 * Create with:
893 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
894 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
895 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
896 */
897 BITVECTOR_MULT,
898 /**
899 * Addition of two or more bit-vectors.
900 *
901 * Parameters: n > 1
902 * - 1..n: Terms of bit-vector sort (sorts must match)
903 *
904 * Create with:
905 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
906 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
907 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
908 */
909 BITVECTOR_ADD,
910 /**
911 * Subtraction of two bit-vectors.
912 *
913 * Parameters:
914 * - 1..2: Terms of bit-vector sort (sorts must match)
915 *
916 * Create with:
917 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
918 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
919 */
920 BITVECTOR_SUB,
921 /**
922 * Negation of a bit-vector (two's complement).
923 *
924 * Parameters:
925 * - 1: Term of bit-vector sort
926 *
927 * Create with:
928 * - `Solver::mkTerm(Kind kind, const Term& child) const`
929 */
930 BITVECTOR_NEG,
931 /**
932 * Unsigned division of two bit-vectors, truncating towards 0. If the divisor
933 * is zero, the result is all ones.
934 *
935 * Parameters:
936 * - 1..2: Terms of bit-vector sort (sorts must match)
937 *
938 * Create with:
939 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
940 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
941 */
942 BITVECTOR_UDIV,
943 /**
944 * Unsigned remainder from truncating division of two bit-vectors. If the
945 * modulus is zero, the result is the dividend.
946 *
947 * Parameters:
948 * - 1..2: Terms of bit-vector sort (sorts must match)
949 *
950 * Create with:
951 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
952 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
953 */
954 BITVECTOR_UREM,
955 /**
956 * Two's complement signed division of two bit-vectors. If the divisor is
957 * zero and the dividend is positive, the result is all ones. If the divisor
958 * is zero and the dividend is negative, the result is one.
959 *
960 * Parameters:
961 * - 1..2: Terms of bit-vector sort (sorts must match)
962 *
963 * Create with:
964 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
965 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
966 */
967 BITVECTOR_SDIV,
968 /**
969 * Two's complement signed remainder of two bit-vectors (sign follows
970 * dividend). If the modulus is zero, the result is the dividend.
971 *
972 * Parameters:
973 * - 1..2: Terms of bit-vector sort (sorts must match)
974 *
975 * Create with:
976 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
977 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
978 */
979 BITVECTOR_SREM,
980 /**
981 * Two's complement signed remainder (sign follows divisor). If the modulus
982 * is zero, the result is the dividend.
983 *
984 * Parameters:
985 * - 1..2: Terms of bit-vector sort (sorts must match)
986 *
987 * Create with:
988 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
989 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
990 */
991 BITVECTOR_SMOD,
992 /**
993 * Bit-vector shift left.
994 * The two bit-vector parameters must have same width.
995 *
996 * Parameters:
997 * - 1..2: Terms of bit-vector sort (sorts must match)
998 *
999 * Create with:
1000 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1001 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1002 */
1003 BITVECTOR_SHL,
1004 /**
1005 * Bit-vector logical shift right.
1006 * The two bit-vector parameters must have same width.
1007 *
1008 * Parameters:
1009 * - 1..2: Terms of bit-vector sort (sorts must match)
1010 *
1011 * Create with:
1012 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1013 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1014 */
1015 BITVECTOR_LSHR,
1016 /**
1017 * Bit-vector arithmetic shift right.
1018 * The two bit-vector parameters must have same width.
1019 *
1020 * Parameters:
1021 * - 1..2: Terms of bit-vector sort (sorts must match)
1022 *
1023 * Create with:
1024 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1025 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1026 */
1027 BITVECTOR_ASHR,
1028 /**
1029 * Bit-vector unsigned less than.
1030 * The two bit-vector parameters must have same width.
1031 *
1032 * Parameters:
1033 * - 1..2: Terms of bit-vector sort (sorts must match)
1034 *
1035 * Create with:
1036 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1037 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1038 */
1039 BITVECTOR_ULT,
1040 /**
1041 * Bit-vector unsigned less than or equal.
1042 * The two bit-vector parameters must have same width.
1043 *
1044 * Parameters:
1045 * - 1..2: Terms of bit-vector sort (sorts must match)
1046 *
1047 * Create with:
1048 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1049 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1050 */
1051 BITVECTOR_ULE,
1052 /**
1053 * Bit-vector unsigned greater than.
1054 * The two bit-vector parameters must have same width.
1055 *
1056 * Parameters:
1057 * - 1..2: Terms of bit-vector sort (sorts must match)
1058 *
1059 * Create with:
1060 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1061 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1062 */
1063 BITVECTOR_UGT,
1064 /**
1065 * Bit-vector unsigned greater than or equal.
1066 * The two bit-vector parameters must have same width.
1067 *
1068 * Parameters:
1069 * - 1..2: Terms of bit-vector sort (sorts must match)
1070 *
1071 * Create with:
1072 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1073 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1074 */
1075 BITVECTOR_UGE,
1076 /**
1077 * Bit-vector signed less than.
1078 * The two bit-vector parameters must have same width.
1079 *
1080 * Parameters:
1081 * - 1..2: Terms of bit-vector sort (sorts must match)
1082 *
1083 * Create with:
1084 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1085 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1086 */
1087 BITVECTOR_SLT,
1088 /**
1089 * Bit-vector signed less than or equal.
1090 * The two bit-vector parameters must have same width.
1091 *
1092 * Parameters:
1093 * - 1..2: Terms of bit-vector sort (sorts must match)
1094 *
1095 * Create with:
1096 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1097 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1098 */
1099 BITVECTOR_SLE,
1100 /**
1101 * Bit-vector signed greater than.
1102 * The two bit-vector parameters must have same width.
1103 *
1104 * Parameters:
1105 * - 1..2: Terms of bit-vector sort (sorts must match)
1106 *
1107 * Create with:
1108 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1109 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1110 */
1111 BITVECTOR_SGT,
1112 /**
1113 * Bit-vector signed greater than or equal.
1114 * The two bit-vector parameters must have same width.
1115 *
1116 * Parameters:
1117 * - 1..2: Terms of bit-vector sort (sorts must match)
1118 *
1119 * Create with:
1120 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1121 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1122 */
1123 BITVECTOR_SGE,
1124 /**
1125 * Bit-vector unsigned less than, returns bit-vector of size 1.
1126 *
1127 * Parameters:
1128 * - 1..2: Terms of bit-vector sort (sorts must match)
1129 *
1130 * Create with:
1131 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1132 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1133 */
1134 BITVECTOR_ULTBV,
1135 /**
1136 * Bit-vector signed less than. returns bit-vector of size 1.
1137 *
1138 * Parameters:
1139 * - 1..2: Terms of bit-vector sort (sorts must match)
1140 *
1141 * Create with:
1142 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1143 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1144 */
1145 BITVECTOR_SLTBV,
1146 /**
1147 * Same semantics as regular ITE, but condition is bit-vector of size 1.
1148 *
1149 * Parameters:
1150 * - 1: Term of bit-vector sort of size 1, representing the condition
1151 * - 2: Term reprsenting the 'then' branch
1152 * - 3: Term representing the 'else' branch
1153 *
1154 * 'then' and 'else' term must have same base sort.
1155 *
1156 * Create with:
1157 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1158 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1159 */
1160 BITVECTOR_ITE,
1161 /**
1162 * Bit-vector redor.
1163 *
1164 * Parameters:
1165 * - 1: Term of bit-vector sort
1166 *
1167 * Create with:
1168 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1169 */
1170 BITVECTOR_REDOR,
1171 /**
1172 * Bit-vector redand.
1173 *
1174 * Parameters:
1175 * - 1: Term of bit-vector sort
1176 *
1177 * Create with:
1178 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1179 */
1180 BITVECTOR_REDAND,
1181 #if 0
1182 /* formula to be treated as a bv atom via eager bit-blasting
1183 * (internal-only symbol) */
1184 BITVECTOR_EAGER_ATOM,
1185 /* term to be treated as a variable. used for eager bit-blasting Ackermann
1186 * expansion of bvudiv (internal-only symbol) */
1187 BITVECTOR_ACKERMANIZE_UDIV,
1188 /* term to be treated as a variable. used for eager bit-blasting Ackermann
1189 * expansion of bvurem (internal-only symbol) */
1190 BITVECTOR_ACKERMANIZE_UREM,
1191 #endif
1192 /**
1193 * Operator for bit-vector extract (from index 'high' to 'low').
1194 *
1195 * Parameters:
1196 * - 1: The 'high' index
1197 * - 2: The 'low' index
1198 *
1199 * Create with:
1200 * - `Solver::mkOp(Kind kind, uint32_t param, uint32_t param) const`
1201 *
1202 * Apply bit-vector extract.
1203 *
1204 * Parameters:
1205 * - 1: Op of kind BITVECTOR_EXTRACT
1206 * - 2: Term of bit-vector sort
1207 *
1208 * Create with:
1209 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1210 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1211 */
1212 BITVECTOR_EXTRACT,
1213 /**
1214 * Operator for bit-vector repeat.
1215 *
1216 * Parameter:
1217 * - 1: Number of times to repeat a given bit-vector
1218 *
1219 * Create with:
1220 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1221 *
1222 * Apply bit-vector repeat.
1223 *
1224 * Parameters:
1225 * - 1: Op of kind BITVECTOR_REPEAT
1226 * - 2: Term of bit-vector sort
1227 *
1228 * Create with:
1229 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1230 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1231 */
1232 BITVECTOR_REPEAT,
1233 /**
1234 * Operator for bit-vector zero-extend.
1235 *
1236 * Parameter:
1237 * - 1: Number of bits by which a given bit-vector is to be extended
1238 *
1239 * Create with:
1240 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1241 *
1242 * Apply bit-vector zero-extend.
1243 *
1244 * Parameters:
1245 * - 1: Op of kind BITVECTOR_ZERO_EXTEND
1246 * - 2: Term of bit-vector sort
1247 *
1248 * Create with:
1249 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1250 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1251 */
1252 BITVECTOR_ZERO_EXTEND,
1253 /**
1254 * Operator for bit-vector sign-extend.
1255 *
1256 * Parameter:
1257 * - 1: Number of bits by which a given bit-vector is to be extended
1258 *
1259 * Create with:
1260 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1261 *
1262 * Apply bit-vector sign-extend.
1263 *
1264 * Parameters:
1265 * - 1: Op of kind BITVECTOR_SIGN_EXTEND
1266 * - 2: Term of bit-vector sort
1267 *
1268 * Create with:
1269 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1270 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1271 */
1272 BITVECTOR_SIGN_EXTEND,
1273 /**
1274 * Operator for bit-vector rotate left.
1275 *
1276 * Parameter:
1277 * - 1: Number of bits by which a given bit-vector is to be rotated
1278 *
1279 * Create with:
1280 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1281 *
1282 * Apply bit-vector rotate left.
1283 *
1284 * Parameters:
1285 * - 1: Op of kind BITVECTOR_ROTATE_LEFT
1286 * - 2: Term of bit-vector sort
1287 *
1288 * Create with:
1289 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1290 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1291 */
1292 BITVECTOR_ROTATE_LEFT,
1293 /**
1294 * Operator for bit-vector rotate right.
1295 *
1296 * Parameter:
1297 * - 1: Number of bits by which a given bit-vector is to be rotated
1298 *
1299 * Create with:
1300 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1301 *
1302 * Apply bit-vector rotate right.
1303 *
1304 * Parameters:
1305 * - 1: Op of kind BITVECTOR_ROTATE_RIGHT
1306 * - 2: Term of bit-vector sort
1307 *
1308 * Create with:
1309 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1310 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1311 */
1312 BITVECTOR_ROTATE_RIGHT,
1313 #if 0
1314 /* bit-vector boolean bit extract. */
1315 BITVECTOR_BITOF,
1316 #endif
1317 /**
1318 * Operator for the conversion from Integer to bit-vector.
1319 *
1320 * Parameter:
1321 * - 1: Size of the bit-vector to convert to
1322 *
1323 * Create with:
1324 * - `Solver::mkOp(Kind kind, uint32_t param) const`.
1325 *
1326 * Apply integer conversion to bit-vector.
1327 *
1328 * Parameters:
1329 * - 1: Op of kind INT_TO_BITVECTOR
1330 * - 2: Integer term
1331 *
1332 * Create with:
1333 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1334 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1335 */
1336 INT_TO_BITVECTOR,
1337 /**
1338 * Bit-vector conversion to (nonnegative) integer.
1339 *
1340 * Parameter:
1341 * - 1: Term of bit-vector sort
1342 *
1343 * Create with:
1344 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1345 */
1346 BITVECTOR_TO_NAT,
1347
1348 /* FP -------------------------------------------------------------------- */
1349
1350 /**
1351 * Floating-point constant, constructed from a double or string.
1352 *
1353 * Parameters:
1354 * - 1: Size of the exponent
1355 * - 2: Size of the significand
1356 * - 3: Value of the floating-point constant as a bit-vector term
1357 *
1358 * Create with:
1359 * - `Solver::mkFloatingPoint(uint32_t exp, uint32_t sig, Term val) const`
1360 */
1361 CONST_FLOATINGPOINT,
1362 /**
1363 * Floating-point rounding mode term.
1364 *
1365 * Create with:
1366 * - `Solver::mkRoundingMode(RoundingMode rm) const`
1367 */
1368 CONST_ROUNDINGMODE,
1369 /**
1370 * Create floating-point literal from bit-vector triple.
1371 *
1372 * Parameters:
1373 * - 1: Sign bit as a bit-vector term
1374 * - 2: Exponent bits as a bit-vector term
1375 * - 3: Significand bits as a bit-vector term (without hidden bit)
1376 *
1377 * Create with:
1378 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1379 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1380 */
1381 FLOATINGPOINT_FP,
1382 /**
1383 * Floating-point equality.
1384 *
1385 * Parameters:
1386 * - 1..2: Terms of floating point sort
1387 *
1388 * Create with:
1389 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1390 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1391 */
1392 FLOATINGPOINT_EQ,
1393 /**
1394 * Floating-point absolute value.
1395 *
1396 * Parameters:
1397 * - 1: Term of floating point sort
1398 *
1399 * Create with:
1400 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1401 */
1402 FLOATINGPOINT_ABS,
1403 /**
1404 * Floating-point negation.
1405 *
1406 * Parameters:
1407 * - 1: Term of floating point sort
1408 *
1409 * Create with:
1410 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1411 */
1412 FLOATINGPOINT_NEG,
1413 /**
1414 * Floating-point addition.
1415 *
1416 * Parameters:
1417 * - 1: CONST_ROUNDINGMODE
1418 * - 2: Term of sort FloatingPoint
1419 * - 3: Term of sort FloatingPoint
1420 *
1421 * Create with:
1422 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1423 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1424 */
1425 FLOATINGPOINT_ADD,
1426 /**
1427 * Floating-point sutraction.
1428 *
1429 * Parameters:
1430 * - 1: CONST_ROUNDINGMODE
1431 * - 2: Term of sort FloatingPoint
1432 * - 3: Term of sort FloatingPoint
1433 *
1434 * Create with:
1435 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1436 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1437 */
1438 FLOATINGPOINT_SUB,
1439 /**
1440 * Floating-point multiply.
1441 *
1442 * Parameters:
1443 * - 1: CONST_ROUNDINGMODE
1444 * - 2: Term of sort FloatingPoint
1445 * - 3: Term of sort FloatingPoint
1446 *
1447 * Create with:
1448 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1449 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1450 */
1451 FLOATINGPOINT_MULT,
1452 /**
1453 * Floating-point division.
1454 *
1455 * Parameters:
1456 * - 1: CONST_ROUNDINGMODE
1457 * - 2: Term of sort FloatingPoint
1458 * - 3: Term of sort FloatingPoint
1459 *
1460 * Create with:
1461 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1462 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1463 */
1464 FLOATINGPOINT_DIV,
1465 /**
1466 * Floating-point fused multiply and add.
1467 *
1468 * Parameters:
1469 * - 1: CONST_ROUNDINGMODE
1470 * - 2: Term of sort FloatingPoint
1471 * - 3: Term of sort FloatingPoint
1472 * - 4: Term of sort FloatingPoint
1473 *
1474 * Create with:
1475 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1476 */
1477 FLOATINGPOINT_FMA,
1478 /**
1479 * Floating-point square root.
1480 *
1481 * Parameters:
1482 * - 1: CONST_ROUNDINGMODE
1483 * - 2: Term of sort FloatingPoint
1484 *
1485 * Create with:
1486 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1487 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1488 */
1489 FLOATINGPOINT_SQRT,
1490 /**
1491 * Floating-point remainder.
1492 *
1493 * Parameters:
1494 * - 1..2: Terms of floating point sort
1495 *
1496 * Create with:
1497 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1498 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1499 */
1500 FLOATINGPOINT_REM,
1501 /**
1502 * Floating-point round to integral.
1503 *
1504 * Parameters:
1505 * -1..2: Terms of floating point sort
1506 *
1507 * Create with:
1508 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1509 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1510 */
1511 FLOATINGPOINT_RTI,
1512 /**
1513 * Floating-point minimum.
1514 *
1515 * Parameters:
1516 * - 1..2: Terms of floating point sort
1517 *
1518 * Create with:
1519 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1520 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1521 */
1522 FLOATINGPOINT_MIN,
1523 /**
1524 * Floating-point maximum.
1525 *
1526 * Parameters:
1527 * - 1..2: Terms of floating point sort
1528 *
1529 * Create with:
1530 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1531 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1532 */
1533 FLOATINGPOINT_MAX,
1534 /**
1535 * Floating-point less than or equal.
1536 *
1537 * Parameters:
1538 * - 1..2: Terms of floating point sort
1539 *
1540 * Create with:
1541 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1542 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1543 */
1544 FLOATINGPOINT_LEQ,
1545 /**
1546 * Floating-point less than.
1547 *
1548 * Parameters:
1549 * - 1..2: Terms of floating point sort
1550 *
1551 * Create with:
1552 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1553 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1554 */
1555 FLOATINGPOINT_LT,
1556 /**
1557 * Floating-point greater than or equal.
1558 *
1559 * Parameters:
1560 * - 1..2: Terms of floating point sort
1561 *
1562 * Create with:
1563 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1564 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1565 */
1566 FLOATINGPOINT_GEQ,
1567 /**
1568 * Floating-point greater than.
1569 *
1570 * Parameters:
1571 * - 1..2: Terms of floating point sort
1572 *
1573 * Create with:
1574 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1575 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1576 */
1577 FLOATINGPOINT_GT,
1578 /**
1579 * Floating-point is normal.
1580 *
1581 * Parameters:
1582 * - 1: Term of floating point sort
1583 *
1584 * Create with:
1585 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1586 */
1587 FLOATINGPOINT_ISN,
1588 /**
1589 * Floating-point is sub-normal.
1590 *
1591 * Parameters:
1592 * - 1: Term of floating point sort
1593 *
1594 * Create with:
1595 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1596 */
1597 FLOATINGPOINT_ISSN,
1598 /**
1599 * Floating-point is zero.
1600 *
1601 * Parameters:
1602 * - 1: Term of floating point sort
1603 *
1604 * Create with:
1605 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1606 */
1607 FLOATINGPOINT_ISZ,
1608 /**
1609 * Floating-point is infinite.
1610 *
1611 * Parameters:
1612 * - 1: Term of floating point sort
1613 *
1614 * Create with:
1615 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1616 */
1617 FLOATINGPOINT_ISINF,
1618 /**
1619 * Floating-point is NaN.
1620 *
1621 * Parameters:
1622 * - 1: Term of floating point sort
1623 *
1624 * Create with:
1625 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1626 */
1627 FLOATINGPOINT_ISNAN,
1628 /**
1629 * Floating-point is negative.
1630 *
1631 * Parameters:
1632 * - 1: Term of floating point sort
1633 *
1634 * Create with:
1635 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1636 */
1637 FLOATINGPOINT_ISNEG,
1638 /**
1639 * Floating-point is positive.
1640 *
1641 * Parameters:
1642 * - 1: Term of floating point sort
1643 *
1644 * Create with:
1645 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1646 */
1647 FLOATINGPOINT_ISPOS,
1648 /**
1649 * Operator for to_fp from bit vector.
1650 *
1651 * Parameters:
1652 * - 1: Exponent size
1653 * - 2: Significand size
1654 *
1655 * Create with:
1656 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1657 *
1658 * Conversion from an IEEE-754 bit vector to floating-point.
1659 *
1660 * Parameters:
1661 * - 1: Op of kind FLOATINGPOINT_TO_FP_IEEE_BITVECTOR
1662 * - 2: Term of sort FloatingPoint
1663 *
1664 * Create with:
1665 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1666 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1667 */
1668 FLOATINGPOINT_TO_FP_IEEE_BITVECTOR,
1669 /**
1670 * Operator for to_fp from floating point.
1671 *
1672 * Parameters:
1673 * - 1: Exponent size
1674 * - 2: Significand size
1675 *
1676 * Create with:
1677 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1678 *
1679 * Conversion between floating-point sorts.
1680 *
1681 * Parameters:
1682 * - 1: Op of kind FLOATINGPOINT_TO_FP_FLOATINGPOINT
1683 * - 2: Term of sort FloatingPoint
1684 *
1685 * Create with:
1686 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1687 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1688 */
1689 FLOATINGPOINT_TO_FP_FLOATINGPOINT,
1690 /**
1691 * Operator for to_fp from real.
1692 *
1693 * Parameters:
1694 * - 1: Exponent size
1695 * - 2: Significand size
1696 *
1697 * Create with:
1698 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1699 *
1700 * Conversion from a real to floating-point.
1701 *
1702 * Parameters:
1703 * - 1: Op of kind FLOATINGPOINT_TO_FP_REAL
1704 * - 2: Term of sort FloatingPoint
1705 *
1706 * Create with:
1707 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1708 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1709 */
1710 FLOATINGPOINT_TO_FP_REAL,
1711 /**
1712 * Operator for to_fp from signed bit vector
1713 *
1714 * Parameters:
1715 * - 1: Exponent size
1716 * - 2: Significand size
1717 *
1718 * Create with:
1719 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1720 *
1721 * Conversion from a signed bit vector to floating-point.
1722 *
1723 * Parameters:
1724 * - 1: Op of kind FLOATINGPOINT_TO_FP_SIGNED_BITVECTOR
1725 * - 2: Term of sort FloatingPoint
1726 *
1727 * Create with:
1728 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1729 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1730 */
1731 FLOATINGPOINT_TO_FP_SIGNED_BITVECTOR,
1732 /**
1733 * Operator for to_fp from unsigned bit vector.
1734 *
1735 * Parameters:
1736 * - 1: Exponent size
1737 * - 2: Significand size
1738 *
1739 * Create with:
1740 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1741 *
1742 * Converting an unsigned bit vector to floating-point.
1743 *
1744 * Parameters:
1745 * - 1: Op of kind FLOATINGPOINT_TO_FP_UNSIGNED_BITVECTOR
1746 * - 2: Term of sort FloatingPoint
1747 *
1748 * Create with:
1749 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1750 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1751 */
1752 FLOATINGPOINT_TO_FP_UNSIGNED_BITVECTOR,
1753 /**
1754 * Operator for a generic to_fp.
1755 *
1756 * Parameters:
1757 * - 1: exponent size
1758 * - 2: Significand size
1759 *
1760 * Create with:
1761 * - `Solver::mkOp(Kind kind, uint32_t param1, uint32_t param2) const`
1762 *
1763 * Generic conversion to floating-point, used in parsing only.
1764 *
1765 * Parameters:
1766 * - 1: Op of kind FLOATINGPOINT_TO_FP_GENERIC
1767 * - 2: Term of sort FloatingPoint
1768 *
1769 * Create with:
1770 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1771 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1772 */
1773 FLOATINGPOINT_TO_FP_GENERIC,
1774 /**
1775 * Operator for to_ubv.
1776 *
1777 * Parameters:
1778 * - 1: Size of the bit-vector to convert to
1779 *
1780 * Create with:
1781 * - `Solver::mkOp(Kind kind, uint32_t param) const`
1782 *
1783 * Conversion from a floating-point value to an unsigned bit vector.
1784 *
1785 * Parameters:
1786 * - 1: Op of kind FLOATINGPOINT_TO_FP_TO_UBV
1787 * - 2: Term of sort FloatingPoint
1788 *
1789 * Create with:
1790 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1791 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1792 */
1793 FLOATINGPOINT_TO_UBV,
1794 /**
1795 * Operator for to_sbv.
1796 *
1797 * Parameters:
1798 * - 1: Size of the bit-vector to convert to
1799 *
1800 * Create with:
1801 * - `Solver::mkOp(Kind kind, uint32_t param) const`
1802 *
1803 * Conversion from a floating-point value to a signed bit vector.
1804 *
1805 * Parameters:
1806 * - 1: Op of kind FLOATINGPOINT_TO_FP_TO_SBV
1807 * - 2: Term of sort FloatingPoint
1808 *
1809 * Create with:
1810 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1811 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1812 */
1813 FLOATINGPOINT_TO_SBV,
1814 /**
1815 * Floating-point to real.
1816 *
1817 * Parameters:
1818 * - 1: Term of sort FloatingPoint
1819 *
1820 * Create with:
1821 * - `Solver::mkTerm(Kind kind, const Term& child) const`
1822 */
1823 FLOATINGPOINT_TO_REAL,
1824
1825 /* Arrays ---------------------------------------------------------------- */
1826
1827 /**
1828 * Array select.
1829 *
1830 * Parameters:
1831 * - 1: Term of array sort
1832 * - 2: Selection index
1833 *
1834 * Create with:
1835 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1836 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1837 */
1838 SELECT,
1839 /**
1840 * Array store.
1841 *
1842 * Parameters:
1843 * - 1: Term of array sort
1844 * - 2: Store index
1845 * - 3: Term to store at the index
1846 *
1847 * Create with:
1848 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2, const Term& child3) const`
1849 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1850 */
1851 STORE,
1852 /**
1853 * Constant array.
1854 *
1855 * Parameters:
1856 * - 1: Array sort
1857 * - 2: Term representing a constant
1858 *
1859 * Create with:
1860 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1861 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1862 *
1863 * @note We currently support the creation of constant arrays, but under some
1864 * conditions when there is a chain of equalities connecting two constant
1865 * arrays, the solver doesn't know what to do and aborts (Issue <a
1866 * href="https://github.com/cvc5/cvc5/issues/1667">#1667</a>).
1867 */
1868 CONST_ARRAY,
1869 /**
1870 * Equality over arrays a and b over a given range [i,j], i.e.,
1871 * @f[
1872 * \forall k . i \leq k \leq j \Rightarrow a[k] = b[k]
1873 * @f]
1874 *
1875 * Parameters:
1876 * - 1: First array
1877 * - 2: Second array
1878 * - 3: Lower bound of range (inclusive)
1879 * - 4: Uppper bound of range (inclusive)
1880 *
1881 * Create with:
1882 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1883 *
1884 * Note: We currently support the creation of array equalities over index
1885 * types bit-vector, floating-point, integer and real. Option --arrays-exp is
1886 * required to support this operator.
1887 */
1888 EQ_RANGE,
1889 #if 0
1890 /* array table function (internal-only symbol) */
1891 ARR_TABLE_FUN,
1892 /* array lambda (internal-only symbol) */
1893 ARRAY_LAMBDA,
1894 /* partial array select, for internal use only */
1895 PARTIAL_SELECT_0,
1896 /* partial array select, for internal use only */
1897 PARTIAL_SELECT_1,
1898 #endif
1899
1900 /* Datatypes ------------------------------------------------------------- */
1901
1902 /**
1903 * Constructor application.
1904 *
1905 * Paramters: n > 0
1906 * - 1: Constructor (operator)
1907 * - 2..n: Parameters to the constructor
1908 *
1909 * Create with:
1910 * - `Solver::mkTerm(const Op& op) const`
1911 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1912 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2) const`
1913 * - `Solver::mkTerm(const Op& op, const Term& child1, const Term& child2, const Term& child3) const`
1914 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
1915 */
1916 APPLY_CONSTRUCTOR,
1917 /**
1918 * Datatype selector application, which is undefined if misapplied.
1919 *
1920 * Parameters:
1921 * - 1: Selector (operator)
1922 * - 2: Datatype term
1923 *
1924 * Create with:
1925 * - `Solver::mkTerm(const Op& op, const Term& child) const`
1926 */
1927 APPLY_SELECTOR,
1928 /**
1929 * Datatype tester application.
1930 *
1931 * Parameters:
1932 * - 1: Tester term
1933 * - 2: Datatype term
1934 *
1935 * Create with:
1936 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1937 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1938 */
1939 APPLY_TESTER,
1940 /**
1941 * Datatype update application, which does not change the argument if
1942 * misapplied.
1943 *
1944 * Parameters:
1945 * - 1: Updater (operator)
1946 * - 2: Datatype term
1947 * - 3: Value to update a field of the datatype term with
1948 *
1949 * Create with:
1950 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1951 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1952 */
1953 APPLY_UPDATER,
1954 /**
1955 * Match expressions.
1956 * For example, the smt2 syntax match term
1957 * `(match l (((cons h t) h) (nil 0)))`
1958 * is represented by the AST
1959 *
1960 * (MATCH l
1961 * (MATCH_BIND_CASE (BOUND_VAR_LIST h t) (cons h t) h)
1962 * (MATCH_CASE nil 0))
1963 *
1964 * The type of the last argument of each case term could be equal.
1965 *
1966 * Parameters: n > 1
1967 * - 1..n: Terms of kind MATCH_CASE or MATCH_BIND_CASE
1968 *
1969 * Create with:
1970 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1971 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
1972 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1973 *
1974 */
1975 MATCH,
1976 /**
1977 * Match case
1978 * A (constant) case expression to be used within a match expression.
1979 *
1980 * Parameters:
1981 * - 1: Term denoting the pattern expression
1982 * - 2: Term denoting the return value
1983 *
1984 * Create with:
1985 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
1986 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
1987 */
1988 MATCH_CASE,
1989 /**
1990 * Match bind case
1991 * A (non-constant) case expression to be used within a match expression.
1992 *
1993 * Parameters:
1994 * - 1: a BOUND_VAR_LIST Term containing the free variables of the case
1995 * - 2: Term denoting the pattern expression
1996 * - 3: Term denoting the return value
1997 *
1998 * Create with:
1999 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2000 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2001 */
2002 MATCH_BIND_CASE,
2003 /**
2004 * Datatypes size
2005 * An operator mapping datatypes to an integer denoting the number of
2006 * non-nullary applications of constructors they contain.
2007 *
2008 * Parameters:
2009 * - 1: Datatype term
2010 *
2011 * Create with:
2012 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
2013 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2014 */
2015 DT_SIZE,
2016 /**
2017 * Operator for tuple projection indices
2018 *
2019 * Parameters:
2020 * - 1: The tuple projection indices
2021 *
2022 * Create with:
2023 * - `Solver::mkOp(Kind TUPLE_PROJECT, std::vector<uint32_t> param) const`
2024 *
2025 * Constructs a new tuple from an existing one using the elements at the
2026 * given indices
2027 *
2028 * Parameters:
2029 * - 1: a term of tuple sort
2030 *
2031 * Create with:
2032 * - `Solver::mkTerm(const Op& op, const Term& child) const`
2033 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
2034 */
2035 TUPLE_PROJECT,
2036 #if 0
2037 /* datatypes height bound */
2038 DT_HEIGHT_BOUND,
2039 /* datatypes height bound */
2040 DT_SIZE_BOUND,
2041 /* datatypes sygus bound */
2042 DT_SYGUS_BOUND,
2043 /* datatypes sygus term order */
2044 DT_SYGUS_TERM_ORDER,
2045 /* datatypes sygus is constant */
2046 DT_SYGUS_IS_CONST,
2047 #endif
2048
2049 /* Separation Logic ------------------------------------------------------ */
2050
2051 /**
2052 * Separation logic nil term.
2053 *
2054 * Parameters: none
2055 *
2056 * Create with:
2057 * - `Solver::mkSepNil(const Sort& sort) const`
2058 */
2059 SEP_NIL,
2060 /**
2061 * Separation logic empty heap constraint
2062 *
2063 * Create with:
2064 * - `Solver::mkTerm(Kind kind) const`
2065 */
2066 SEP_EMP,
2067 /**
2068 * Separation logic points-to relation.
2069 *
2070 * Parameters:
2071 * - 1: Location of the points-to constraint
2072 * - 2: Data of the points-to constraint
2073 *
2074 * Create with:
2075 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2076 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2077 */
2078 SEP_PTO,
2079 /**
2080 * Separation logic star.
2081 *
2082 * Parameters: n > 1
2083 * - 1..n: Child constraints that hold in disjoint (separated) heaps
2084 *
2085 * Create with:
2086 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2087 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2088 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2089 */
2090 SEP_STAR,
2091 /**
2092 * Separation logic magic wand.
2093 *
2094 * Parameters:
2095 * - 1: Antecendant of the magic wand constraint
2096 * - 2: Conclusion of the magic wand constraint, which is asserted to
2097 * hold in all heaps that are disjoint extensions of the antecedent.
2098 *
2099 * Create with:
2100 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2101 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2102 */
2103 SEP_WAND,
2104 #if 0
2105 /* separation label (internal use only) */
2106 SEP_LABEL,
2107 #endif
2108
2109 /* Sets ------------------------------------------------------------------ */
2110
2111 /**
2112 * Empty set constant.
2113 *
2114 * Parameters:
2115 * - 1: Sort of the set elements
2116 *
2117 * Create with:
2118 * - `Solver::mkEmptySet(const Sort& sort) const`
2119 */
2120 SET_EMPTY,
2121 /**
2122 * Set union.
2123 *
2124 * Parameters:
2125 * - 1..2: Terms of set sort
2126 *
2127 * Create with:
2128 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2129 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2130 */
2131 SET_UNION,
2132 /**
2133 * Set intersection.
2134 *
2135 * Parameters:
2136 * - 1..2: Terms of set sort
2137 *
2138 * Create with:
2139 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2140 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2141 */
2142 SET_INTERSECTION,
2143 /**
2144 * Set subtraction.
2145 *
2146 * Parameters:
2147 * - 1..2: Terms of set sort
2148 *
2149 * Create with:
2150 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2151 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2152 */
2153 SET_MINUS,
2154 /**
2155 * Subset predicate.
2156 *
2157 * Parameters:
2158 * - 1..2: Terms of set sort, [1] a subset of set [2]?
2159 *
2160 * Create with:
2161 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2162 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2163 */
2164 SET_SUBSET,
2165 /**
2166 * Set membership predicate.
2167 *
2168 * Parameters:
2169 * - 1..2: Terms of set sort, [1] a member of set [2]?
2170 *
2171 * Create with:
2172 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2173 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2174 */
2175 SET_MEMBER,
2176 /**
2177 * Construct a singleton set from an element given as a parameter.
2178 * The returned set has same type of the element.
2179 *
2180 * Parameters:
2181 * - 1: Single element
2182 *
2183 * Create with:
2184 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2185 */
2186 SET_SINGLETON,
2187 /**
2188 * The set obtained by inserting elements;
2189 *
2190 * Parameters: n > 0
2191 * - 1..n-1: Elements inserted into set [n]
2192 * - n: Set Term
2193 *
2194 * Create with:
2195 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2196 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2197 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2198 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2199 */
2200 SET_INSERT,
2201 /**
2202 * Set cardinality.
2203 *
2204 * Parameters:
2205 * - 1: Set to determine the cardinality of
2206 *
2207 * Create with:
2208 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2209 */
2210 SET_CARD,
2211 /**
2212 * Set complement with respect to finite universe.
2213 *
2214 * Parameters:
2215 * - 1: Set to complement
2216 *
2217 * Create with:
2218 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2219 */
2220 SET_COMPLEMENT,
2221 /**
2222 * Finite universe set.
2223 * All set variables must be interpreted as subsets of it.
2224 *
2225 * Note that SET_UNIVERSE is considered a special symbol of the theory of
2226 * sets and is not considered as a set value,
2227 * i.e., `Term::isSetValue() const` will return false.
2228 *
2229 * Create with:
2230 * - `Solver::mkUniverseSet(const Sort& sort) const`
2231 */
2232 SET_UNIVERSE,
2233 /**
2234 * Set comprehension
2235 * A set comprehension is specified by a bound variable list x1 ... xn,
2236 * a predicate P[x1...xn], and a term t[x1...xn]. A comprehension C with the
2237 * above form has members given by the following semantics:
2238 * @f[
2239 * \forall y. ( \exists x_1...x_n. P[x_1...x_n] \hat{} t[x_1...x_n] = y )
2240 * \Leftrightarrow (member y C)
2241 * @f]
2242 * where y ranges over the element type of the (set) type of the
2243 * comprehension. If @f$ t[x_1..x_n] @f$ is not provided, it is equivalent to
2244 * y in the above formula.
2245 *
2246 * Parameters:
2247 * - 1: Term BOUND_VAR_LIST
2248 * - 2: Term denoting the predicate of the comprehension
2249 * - 3: (optional) a Term denoting the generator for the comprehension
2250 *
2251 * Create with:
2252 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2253 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2254 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2255 */
2256 SET_COMPREHENSION,
2257 /**
2258 * Returns an element from a given set.
2259 * If a set A = {x}, then the term (choose A) is equivalent to the term x.
2260 * If the set is empty, then (choose A) is an arbitrary value.
2261 * If the set has cardinality > 1, then (choose A) will deterministically
2262 * return an element in A.
2263 *
2264 * Parameters:
2265 * - 1: Term of set sort
2266 *
2267 * Create with:
2268 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2269 */
2270 SET_CHOOSE,
2271 /**
2272 * Set is_singleton predicate.
2273 *
2274 * Parameters:
2275 * - 1: Term of set sort, is [1] a singleton set?
2276 *
2277 * Create with:
2278 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2279 */
2280 SET_IS_SINGLETON,
2281
2282 /* Relations ------------------------------------------------------------- */
2283
2284 /**
2285 * Set join.
2286 *
2287 * Parameters:
2288 * - 1..2: Terms of set sort
2289 *
2290 * Create with:
2291 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2292 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2293 */
2294 RELATION_JOIN,
2295 /**
2296 * Set cartesian product.
2297 *
2298 * Parameters:
2299 * - 1..2: Terms of set sort
2300 *
2301 * Create with:
2302 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2303 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2304 */
2305 RELATION_PRODUCT,
2306 /**
2307 * Set transpose.
2308 *
2309 * Parameters:
2310 * - 1: Term of set sort
2311 *
2312 * Create with:
2313 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2314 */
2315 RELATION_TRANSPOSE,
2316 /**
2317 * Set transitive closure.
2318 *
2319 * Parameters:
2320 * - 1: Term of set sort
2321 *
2322 * Create with:
2323 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2324 */
2325 RELATION_TCLOSURE,
2326 /**
2327 * Set join image.
2328 *
2329 * Parameters:
2330 * - 1..2: Terms of set sort
2331 *
2332 * Create with:
2333 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2334 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2335 */
2336 RELATION_JOIN_IMAGE,
2337 /**
2338 * Set identity.
2339 *
2340 * Parameters:
2341 * - 1: Term of set sort
2342 *
2343 * Create with:
2344 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2345 */
2346 RELATION_IDEN,
2347
2348 /* Bags ------------------------------------------------------------------ */
2349
2350 /**
2351 * Empty bag constant.
2352 *
2353 * Parameters:
2354 * - 1: Sort of the bag elements
2355 *
2356 * Create with:
2357 * mkEmptyBag(const Sort& sort)
2358 */
2359 EMPTYBAG,
2360 /**
2361 * Bag max union.
2362 * Parameters:
2363 * - 1..2: Terms of bag sort
2364 *
2365 * Create with:
2366 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2367 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2368 */
2369 UNION_MAX,
2370 /**
2371 * Bag disjoint union (sum).
2372 *
2373 * Parameters:
2374 * -1..2: Terms of bag sort
2375 *
2376 * Create with:
2377 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2378 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2379 */
2380 UNION_DISJOINT,
2381 /**
2382 * Bag intersection (min).
2383 *
2384 * Parameters:
2385 * - 1..2: Terms of bag sort
2386 *
2387 * Create with:
2388 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2389 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2390 */
2391 INTERSECTION_MIN,
2392 /**
2393 * Bag difference subtract (subtracts multiplicities of the second from the
2394 * first).
2395 *
2396 * Parameters:
2397 * - 1..2: Terms of bag sort
2398 *
2399 * Create with:
2400 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2401 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2402 */
2403 DIFFERENCE_SUBTRACT,
2404 /**
2405 * Bag difference 2 (removes shared elements in the two bags).
2406 *
2407 * Parameters:
2408 * - 1..2: Terms of bag sort
2409 *
2410 * Create with:
2411 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2412 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2413 */
2414 DIFFERENCE_REMOVE,
2415 /**
2416 * Inclusion predicate for bags
2417 * (multiplicities of the first bag <= multiplicities of the second bag).
2418 *
2419 * Parameters:
2420 * - 1..2: Terms of bag sort
2421 *
2422 * Create with:
2423 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2424 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2425 */
2426 SUBBAG,
2427 /**
2428 * Element multiplicity in a bag
2429 *
2430 * Parameters:
2431 * - 1..2: Terms of bag sort (Bag E), [1] an element of sort E
2432 *
2433 * Create with:
2434 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2435 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2436 */
2437 BAG_COUNT,
2438 /**
2439 * Eliminate duplicates in a given bag. The returned bag contains exactly the
2440 * same elements in the given bag, but with multiplicity one.
2441 *
2442 * Parameters:
2443 * - 1: a term of bag sort
2444 *
2445 * Create with:
2446 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2447 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2448 */
2449 DUPLICATE_REMOVAL,
2450 /**
2451 * The bag of the single element given as a parameter.
2452 *
2453 * Parameters:
2454 * - 1: Single element
2455 *
2456 * Create with:
2457 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2458 */
2459 MK_BAG,
2460 /**
2461 * Bag cardinality.
2462 *
2463 * Parameters:
2464 * - 1: Bag to determine the cardinality of
2465 *
2466 * Create with:
2467 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2468 */
2469 BAG_CARD,
2470 /**
2471 * Returns an element from a given bag.
2472 * If a bag A = {(x,n)} where n is the multiplicity, then the term (choose A)
2473 * is equivalent to the term x.
2474 * If the bag is empty, then (choose A) is an arbitrary value.
2475 * If the bag contains distinct elements, then (choose A) will
2476 * deterministically return an element in A.
2477 *
2478 * Parameters:
2479 * - 1: Term of bag sort
2480 *
2481 * Create with:
2482 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2483 */
2484 BAG_CHOOSE,
2485 /**
2486 * Bag is_singleton predicate (single element with multiplicity exactly one).
2487 * Parameters:
2488 * - 1: Term of bag sort, is [1] a singleton bag?
2489 *
2490 * Create with:
2491 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2492 */
2493 BAG_IS_SINGLETON,
2494 /**
2495 * Bag.from_set converts a set to a bag.
2496 *
2497 * Parameters:
2498 * - 1: Term of set sort
2499 *
2500 * Create with:
2501 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2502 */
2503 BAG_FROM_SET,
2504 /**
2505 * Bag.to_set converts a bag to a set.
2506 *
2507 * Parameters:
2508 * - 1: Term of bag sort
2509 *
2510 * Create with:
2511 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2512 */
2513 BAG_TO_SET,
2514 /**
2515 * bag.map operator applies the first argument, a function of type (-> T1 T2),
2516 * to every element of the second argument, a bag of type (Bag T1),
2517 * and returns a bag of type (Bag T2).
2518 *
2519 * Parameters:
2520 * - 1: a function of type (-> T1 T2)
2521 * - 2: a bag of type (Bag T1)
2522 *
2523 * Create with:
2524 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2)
2525 * const`
2526 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2527 */
2528 BAG_MAP,
2529
2530 /* Strings --------------------------------------------------------------- */
2531
2532 /**
2533 * String concat.
2534 *
2535 * Parameters: n > 1
2536 * - 1..n: Terms of String sort
2537 *
2538 * Create with:
2539 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2540 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2541 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2542 */
2543 STRING_CONCAT,
2544 /**
2545 * String membership.
2546 *
2547 * Parameters:
2548 * - 1: Term of String sort
2549 * - 2: Term of RegExp sort
2550 *
2551 * Create with:
2552 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2553 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2554 */
2555 STRING_IN_REGEXP,
2556 /**
2557 * String length.
2558 *
2559 * Parameters:
2560 * - 1: Term of String sort
2561 *
2562 * Create with:
2563 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2564 */
2565 STRING_LENGTH,
2566 /**
2567 * String substring.
2568 * Extracts a substring, starting at index i and of length l, from a string
2569 * s. If the start index is negative, the start index is greater than the
2570 * length of the string, or the length is negative, the result is the empty
2571 * string.
2572 *
2573 * Parameters:
2574 * - 1: Term of sort String
2575 * - 2: Term of sort Integer (index i)
2576 * - 3: Term of sort Integer (length l)
2577 *
2578 * Create with:
2579 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2580 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2581 */
2582 STRING_SUBSTR,
2583 /**
2584 * String update.
2585 * Updates a string s by replacing its context starting at an index with t.
2586 * If the start index is negative, the start index is greater than the
2587 * length of the string, the result is s. Otherwise, the length of the
2588 * original string is preserved.
2589 *
2590 * Parameters:
2591 * - 1: Term of sort String
2592 * - 2: Term of sort Integer (index i)
2593 * - 3: Term of sort String (replacement string t)
2594 *
2595 * Create with:
2596 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2597 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2598 */
2599 STRING_UPDATE,
2600 /**
2601 * String character at.
2602 * Returns the character at index i from a string s. If the index is negative
2603 * or the index is greater than the length of the string, the result is the
2604 * empty string. Otherwise the result is a string of length 1.
2605 *
2606 * Parameters:
2607 * - 1: Term of sort String (string s)
2608 * - 2: Term of sort Integer (index i)
2609 *
2610 * Create with:
2611 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2612 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2613 */
2614 STRING_CHARAT,
2615 /**
2616 * String contains.
2617 * Checks whether a string s1 contains another string s2. If s2 is empty, the
2618 * result is always true.
2619 *
2620 * Parameters:
2621 * - 1: Term of sort String (the string s1)
2622 * - 2: Term of sort String (the string s2)
2623 *
2624 * Create with:
2625 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2626 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2627 */
2628 STRING_CONTAINS,
2629 /**
2630 * String index-of.
2631 * Returns the index of a substring s2 in a string s1 starting at index i. If
2632 * the index is negative or greater than the length of string s1 or the
2633 * substring s2 does not appear in string s1 after index i, the result is -1.
2634 *
2635 * Parameters:
2636 * - 1: Term of sort String (substring s1)
2637 * - 2: Term of sort String (substring s2)
2638 * - 3: Term of sort Integer (index i)
2639 *
2640 * Create with:
2641 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2642 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2643 */
2644 STRING_INDEXOF,
2645 /**
2646 * String index-of regular expression match.
2647 * Returns the first match of a regular expression r in a string s. If the
2648 * index is negative or greater than the length of string s1, or r does not
2649 * match a substring in s after index i, the result is -1.
2650 *
2651 * Parameters:
2652 * - 1: Term of sort String (string s)
2653 * - 2: Term of sort RegLan (regular expression r)
2654 * - 3: Term of sort Integer (index i)
2655 *
2656 * Create with:
2657 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2658 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2659 */
2660 STRING_INDEXOF_RE,
2661 /**
2662 * String replace.
2663 * Replaces a string s2 in a string s1 with string s3. If s2 does not appear
2664 * in s1, s1 is returned unmodified.
2665 *
2666 * Parameters:
2667 * - 1: Term of sort String (string s1)
2668 * - 2: Term of sort String (string s2)
2669 * - 3: Term of sort String (string s3)
2670 *
2671 * Create with:
2672 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2673 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2674 */
2675 STRING_REPLACE,
2676 /**
2677 * String replace all.
2678 * Replaces all occurrences of a string s2 in a string s1 with string s3.
2679 * If s2 does not appear in s1, s1 is returned unmodified.
2680 *
2681 * Parameters:
2682 * - 1: Term of sort String (string s1)
2683 * - 2: Term of sort String (string s2)
2684 * - 3: Term of sort String (string s3)
2685 *
2686 * Create with:
2687 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2688 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2689 */
2690 STRING_REPLACE_ALL,
2691 /**
2692 * String replace regular expression match.
2693 * Replaces the first match of a regular expression r in string s1 with
2694 * string s2. If r does not match a substring of s1, s1 is returned
2695 * unmodified.
2696 *
2697 * Parameters:
2698 * - 1: Term of sort String (string s1)
2699 * - 2: Term of sort Regexp (regexp r)
2700 * - 3: Term of sort String (string s2)
2701 *
2702 * Create with:
2703 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2704 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2705 */
2706 STRING_REPLACE_RE,
2707 /**
2708 * String replace all regular expression matches.
2709 * Replaces all matches of a regular expression r in string s1 with string
2710 * s2. If r does not match a substring of s1, s1 is returned unmodified.
2711 *
2712 * Parameters:
2713 * - 1: Term of sort String (string s1)
2714 * - 2: Term of sort Regexp (regexp r)
2715 * - 3: Term of sort String (string s2)
2716 *
2717 * Create with:
2718 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
2719 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2720 */
2721 STRING_REPLACE_RE_ALL,
2722 /**
2723 * String to lower case.
2724 *
2725 * Parameters:
2726 * - 1: Term of String sort
2727 *
2728 * Create with:
2729 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2730 */
2731 STRING_TOLOWER,
2732 /**
2733 * String to upper case.
2734 *
2735 * Parameters:
2736 * - 1: Term of String sort
2737 *
2738 * Create with:
2739 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2740 */
2741 STRING_TOUPPER,
2742 /**
2743 * String reverse.
2744 *
2745 * Parameters:
2746 * - 1: Term of String sort
2747 *
2748 * Create with:
2749 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2750 */
2751 STRING_REV,
2752 /**
2753 * String to code.
2754 * Returns the code point of a string if it has length one, or returns -1
2755 * otherwise.
2756 *
2757 * Parameters:
2758 * - 1: Term of String sort
2759 *
2760 * Create with:
2761 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2762 */
2763 STRING_TO_CODE,
2764 /**
2765 * String from code.
2766 * Returns a string containing a single character whose code point matches
2767 * the argument to this function, or the empty string if the argument is
2768 * out-of-bounds.
2769 *
2770 * Parameters:
2771 * - 1: Term of Integer sort
2772 *
2773 * Create with:
2774 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2775 */
2776 STRING_FROM_CODE,
2777 /**
2778 * String less than.
2779 * Returns true if string s1 is (strictly) less than s2 based on a
2780 * lexiographic ordering over code points.
2781 *
2782 * Parameters:
2783 * - 1: Term of sort String (the string s1)
2784 * - 2: Term of sort String (the string s2)
2785 *
2786 * Create with:
2787 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2788 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2789 */
2790 STRING_LT,
2791 /**
2792 * String less than or equal.
2793 * Returns true if string s1 is less than or equal to s2 based on a
2794 * lexiographic ordering over code points.
2795 *
2796 * Parameters:
2797 * - 1: Term of sort String (the string s1)
2798 * - 2: Term of sort String (the string s2)
2799 *
2800 * Create with:
2801 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2802 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2803 */
2804 STRING_LEQ,
2805 /**
2806 * String prefix-of.
2807 * Checks whether a string s1 is a prefix of string s2. If string s1 is
2808 * empty, this operator returns true.
2809 *
2810 * Parameters:
2811 * - 1: Term of sort String (string s1)
2812 * - 2: Term of sort String (string s2)
2813 *
2814 * Create with:
2815 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2816 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2817 */
2818 STRING_PREFIX,
2819 /**
2820 * String suffix-of.
2821 * Checks whether a string s1 is a suffix of string 2. If string s1 is empty,
2822 * this operator returns true.
2823 *
2824 * Parameters:
2825 * - 1: Term of sort String (string s1)
2826 * - 2: Term of sort String (string s2)
2827 *
2828 * Create with:
2829 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2830 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2831 */
2832 STRING_SUFFIX,
2833 /**
2834 * String is-digit.
2835 * Returns true if string s is digit (it is one of "0", ..., "9").
2836 *
2837 * Parameters:
2838 * - 1: Term of sort String
2839 *
2840 * Create with:
2841 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
2842 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2843 */
2844 STRING_IS_DIGIT,
2845 /**
2846 * Integer to string.
2847 * If the integer is negative this operator returns the empty string.
2848 *
2849 * Parameters:
2850 * - 1: Term of sort Integer
2851 *
2852 * Create with:
2853 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2854 */
2855 STRING_FROM_INT,
2856 /**
2857 * String to integer (total function).
2858 * If the string does not contain an integer or the integer is negative, the
2859 * operator returns -1.
2860 *
2861 * Parameters:
2862 * - 1: Term of sort String
2863 *
2864 * Create with:
2865 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2866 */
2867 STRING_TO_INT,
2868 /**
2869 * Constant string.
2870 *
2871 * Parameters:
2872 * - See @ref cvc5::api::Solver::mkString() "mkString()".
2873 *
2874 * Create with:
2875 * - `Solver::mkString(const std::string& s, bool useEscSequences) const`
2876 * - `Solver::mkString(const unsigned char c) const`
2877 * - `Solver::mkString(const std::vector<uint32_t>& s) const`
2878 */
2879 CONST_STRING,
2880 /**
2881 * Conversion from string to regexp.
2882 *
2883 * Parameters:
2884 * - 1: Term of sort String
2885 *
2886 * Create with:
2887 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2888 */
2889 STRING_TO_REGEXP,
2890 /**
2891 * Regexp Concatenation.
2892 *
2893 * Parameters:
2894 * - 1..2: Terms of Regexp sort
2895 *
2896 * Create with:
2897 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2898 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2899 */
2900 REGEXP_CONCAT,
2901 /**
2902 * Regexp union.
2903 *
2904 * Parameters:
2905 * - 1..2: Terms of Regexp sort
2906 *
2907 * Create with:
2908 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2909 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2910 */
2911 REGEXP_UNION,
2912 /**
2913 * Regexp intersection.
2914 *
2915 * Parameters:
2916 * - 1..2: Terms of Regexp sort
2917 *
2918 * Create with:
2919 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2920 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2921 */
2922 REGEXP_INTER,
2923 /**
2924 * Regexp difference.
2925 *
2926 * Parameters:
2927 * - 1..2: Terms of Regexp sort
2928 *
2929 * Create with:
2930 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2931 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2932 */
2933 REGEXP_DIFF,
2934 /**
2935 * Regexp *.
2936 *
2937 * Parameters:
2938 * - 1: Term of sort Regexp
2939 *
2940 * Create with:
2941 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2942 */
2943 REGEXP_STAR,
2944 /**
2945 * Regexp +.
2946 *
2947 * Parameters:
2948 * - 1: Term of sort Regexp
2949 *
2950 * Create with:
2951 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2952 */
2953 REGEXP_PLUS,
2954 /**
2955 * Regexp ?.
2956 *
2957 * Parameters:
2958 * - 1: Term of sort Regexp
2959 *
2960 * Create with:
2961 * - `Solver::mkTerm(Kind kind, const Term& child) const`
2962 */
2963 REGEXP_OPT,
2964 /**
2965 * Regexp range.
2966 *
2967 * Parameters:
2968 * - 1: Lower bound character for the range
2969 * - 2: Upper bound character for the range
2970 *
2971 * Create with:
2972 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
2973 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
2974 */
2975 REGEXP_RANGE,
2976 /**
2977 * Operator for regular expression repeat.
2978 *
2979 * Parameters:
2980 * - 1: The number of repetitions
2981 *
2982 * Create with:
2983 * - `Solver::mkOp(Kind kind, uint32_t param) const`
2984 *
2985 * Apply regular expression loop.
2986 *
2987 * Parameters:
2988 * - 1: Op of kind REGEXP_REPEAT
2989 * - 2: Term of regular expression sort
2990 *
2991 * Create with:
2992 * - `Solver::mkTerm(const Op& op, const Term& child) const`
2993 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
2994 */
2995 REGEXP_REPEAT,
2996 /**
2997 * Operator for regular expression loop, from lower bound to upper bound
2998 * number of repetitions.
2999 *
3000 * Parameters:
3001 * - 1: The lower bound
3002 * - 2: The upper bound
3003 *
3004 * Create with:
3005 * - `Solver::mkOp(Kind kind, uint32_t param, uint32_t param) const`
3006 *
3007 * Apply regular expression loop.
3008 *
3009 * Parameters:
3010 * - 1: Op of kind REGEXP_LOOP
3011 * - 2: Term of regular expression sort
3012 *
3013 * Create with:
3014 * - `Solver::mkTerm(const Op& op, const Term& child) const`
3015 * - `Solver::mkTerm(const Op& op, const std::vector<Term>& children) const`
3016 */
3017 REGEXP_LOOP,
3018 /**
3019 * Regexp none.
3020 *
3021 * Parameters: none
3022 *
3023 * Create with:
3024 * - `Solver::mkRegexpNone() const`
3025 * - `Solver::mkTerm(Kind kind) const`
3026 */
3027 REGEXP_NONE,
3028 /**
3029 * Regexp all characters.
3030 *
3031 * Parameters: none
3032 *
3033 * Create with:
3034 * - `Solver::mkRegexpAllchar() const`
3035 * - `Solver::mkTerm(Kind kind) const`
3036 */
3037 REGEXP_ALLCHAR,
3038 /**
3039 * Regexp complement.
3040 *
3041 * Parameters:
3042 * - 1: Term of sort RegExp
3043 *
3044 * Create with:
3045 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
3046 */
3047 REGEXP_COMPLEMENT,
3048
3049 /**
3050 * Sequence concat.
3051 *
3052 * Parameters: n > 1
3053 * - 1..n: Terms of Sequence sort
3054 *
3055 * Create with:
3056 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3057 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3058 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3059 */
3060 SEQ_CONCAT,
3061 /**
3062 * Sequence length.
3063 *
3064 * Parameters:
3065 * - 1: Term of Sequence sort
3066 *
3067 * Create with:
3068 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3069 */
3070 SEQ_LENGTH,
3071 /**
3072 * Sequence extract.
3073 * Extracts a subsequence, starting at index i and of length l, from a
3074 * sequence s. If the start index is negative, the start index is greater
3075 * than the length of the sequence, or the length is negative, the result is
3076 * the empty sequence.
3077 *
3078 * Parameters:
3079 * - 1: Term of sort Sequence
3080 * - 2: Term of sort Integer (index i)
3081 * - 3: Term of sort Integer (length l)
3082 *
3083 * Create with:
3084 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3085 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3086 */
3087 SEQ_EXTRACT,
3088 /**
3089 * Sequence update.
3090 * Updates a sequence s by replacing its context starting at an index with t.
3091 * If the start index is negative, the start index is greater than the
3092 * length of the sequence, the result is s. Otherwise, the length of the
3093 * original sequence is preserved.
3094 *
3095 * Parameters:
3096 * - 1: Term of sort Sequence
3097 * - 2: Term of sort Integer (index i)
3098 * - 3: Term of sort Sequence (replacement sequence t)
3099 *
3100 * Create with:
3101 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3102 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3103 */
3104 SEQ_UPDATE,
3105 /**
3106 * Sequence element at.
3107 * Returns the element at index i from a sequence s. If the index is negative
3108 * or the index is greater or equal to the length of the sequence, the result
3109 * is the empty sequence. Otherwise the result is a sequence of length 1.
3110 *
3111 * Parameters:
3112 * - 1: Term of sequence sort (string s)
3113 * - 2: Term of sort Integer (index i)
3114 *
3115 * Create with:
3116 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3117 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3118 */
3119 SEQ_AT,
3120 /**
3121 * Sequence contains.
3122 * Checks whether a sequence s1 contains another sequence s2. If s2 is empty,
3123 * the result is always true.
3124 *
3125 * Parameters:
3126 * - 1: Term of sort Sequence (the sequence s1)
3127 * - 2: Term of sort Sequence (the sequence s2)
3128 *
3129 * Create with:
3130 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3131 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3132 */
3133 SEQ_CONTAINS,
3134 /**
3135 * Sequence index-of.
3136 * Returns the index of a subsequence s2 in a sequence s1 starting at index i.
3137 * If the index is negative or greater than the length of sequence s1 or the
3138 * subsequence s2 does not appear in sequence s1 after index i, the result is
3139 * -1.
3140 *
3141 * Parameters:
3142 * - 1: Term of sort Sequence (subsequence s1)
3143 * - 2: Term of sort Sequence (subsequence s2)
3144 * - 3: Term of sort Integer (index i)
3145 *
3146 * Create with:
3147 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3148 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3149 */
3150 SEQ_INDEXOF,
3151 /**
3152 * Sequence replace.
3153 * Replaces the first occurrence of a sequence s2 in a sequence s1 with
3154 * sequence s3. If s2 does not appear in s1, s1 is returned unmodified.
3155 *
3156 * Parameters:
3157 * - 1: Term of sort Sequence (sequence s1)
3158 * - 2: Term of sort Sequence (sequence s2)
3159 * - 3: Term of sort Sequence (sequence s3)
3160 *
3161 * Create with:
3162 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3163 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3164 */
3165 SEQ_REPLACE,
3166 /**
3167 * Sequence replace all.
3168 * Replaces all occurrences of a sequence s2 in a sequence s1 with sequence
3169 * s3. If s2 does not appear in s1, s1 is returned unmodified.
3170 *
3171 * Parameters:
3172 * - 1: Term of sort Sequence (sequence s1)
3173 * - 2: Term of sort Sequence (sequence s2)
3174 * - 3: Term of sort Sequence (sequence s3)
3175 *
3176 * Create with:
3177 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3178 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3179 */
3180 SEQ_REPLACE_ALL,
3181 /**
3182 * Sequence reverse.
3183 *
3184 * Parameters:
3185 * - 1: Term of Sequence sort
3186 *
3187 * Create with:
3188 * - `Solver::mkTerm(Kind kind, const Term& child) const`
3189 */
3190 SEQ_REV,
3191 /**
3192 * Sequence prefix-of.
3193 * Checks whether a sequence s1 is a prefix of sequence s2. If sequence s1 is
3194 * empty, this operator returns true.
3195 *
3196 * Parameters:
3197 * - 1: Term of sort Sequence (sequence s1)
3198 * - 2: Term of sort Sequence (sequence s2)
3199 *
3200 * Create with:
3201 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3202 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3203 */
3204 SEQ_PREFIX,
3205 /**
3206 * Sequence suffix-of.
3207 * Checks whether a sequence s1 is a suffix of sequence s2. If sequence s1 is
3208 * empty, this operator returns true.
3209 *
3210 * Parameters:
3211 * - 1: Term of sort Sequence (sequence s1)
3212 * - 2: Term of sort Sequence (sequence s2)
3213 *
3214 * Create with:
3215 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3216 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3217 */
3218 SEQ_SUFFIX,
3219 /**
3220 * Constant sequence.
3221 *
3222 * Parameters:
3223 * - See @ref cvc5::api::Solver::mkEmptySequence() "mkEmptySequence()".
3224 *
3225 * Create with:
3226 * - `Solver::mkEmptySequence(const Sort& sort) const`
3227 *
3228 * Note that a constant sequence is a term that is equivalent to:
3229 *
3230 * (seq.++ (seq.unit c1) ... (seq.unit cn))
3231 *
3232 * where n>=0 and c1, ..., cn are constants of some sort. The elements
3233 * can be extracted by `Term::getSequenceValue()`.
3234 */
3235 CONST_SEQUENCE,
3236 /**
3237 * Sequence unit, corresponding to a sequence of length one with the given
3238 * term.
3239 *
3240 * Parameters:
3241 * - 1: Element term.
3242 *
3243 * Create with:
3244 * - `Solver::mkTerm(Kind kind, const Term& child1) const`
3245 */
3246 SEQ_UNIT,
3247 /**
3248 * Sequence nth, corresponding to the nth element of a sequence.
3249 *
3250 * Parameters:
3251 * - 1: Sequence term.
3252 * - 2: Integer term.
3253 *
3254 * Create with:
3255 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3256 */
3257 SEQ_NTH,
3258
3259 /* Quantifiers ----------------------------------------------------------- */
3260
3261 /**
3262 * Universally quantified formula.
3263 *
3264 * Parameters:
3265 * - 1: BOUND_VAR_LIST Term
3266 * - 2: Quantifier body
3267 * - 3: (optional) INST_PATTERN_LIST Term
3268 *
3269 * Create with:
3270 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3271 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3272 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3273 */
3274 FORALL,
3275 /**
3276 * Existentially quantified formula.
3277 *
3278 * Parameters:
3279 * - 1: BOUND_VAR_LIST Term
3280 * - 2: Quantifier body
3281 * - 3: (optional) INST_PATTERN_LIST Term
3282 *
3283 * Create with:
3284 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3285 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3286 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3287 */
3288 EXISTS,
3289 /**
3290 * A list of bound variables (used to bind variables under a quantifier)
3291 *
3292 * Parameters: n > 1
3293 * - 1..n: Terms with kind BOUND_VARIABLE
3294 *
3295 * Create with:
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`
3299 */
3300 BOUND_VAR_LIST,
3301 /**
3302 * An instantiation pattern.
3303 * Specifies a (list of) terms to be used as a pattern for quantifier
3304 * instantiation.
3305 *
3306 * Parameters: n > 1
3307 * - 1..n: Terms with kind BOUND_VARIABLE
3308 *
3309 * Create with:
3310 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3311 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3312 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3313 */
3314 INST_PATTERN,
3315 /**
3316 * An instantiation no-pattern.
3317 * Specifies a (list of) terms that should not be used as a pattern for
3318 * quantifier instantiation.
3319 *
3320 * Parameters: n > 1
3321 * - 1..n: Terms with kind BOUND_VARIABLE
3322 *
3323 * Create with:
3324 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3325 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3326 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3327 */
3328 INST_NO_PATTERN,
3329 /*
3330 * An instantiation pool.
3331 * Specifies an annotation for pool based instantiation.
3332 * Parameters: n > 1
3333 * - 1..n: Terms that comprise the pools, which are one-to-one with
3334 * the variables of the quantified formula to be instantiated.
3335 * Create with:
3336 * - `mkTerm(Kind kind, Term child1, Term child2)
3337 * - `mkTerm(Kind kind, Term child1, Term child2, Term child3)
3338 * - `mkTerm(Kind kind, const std::vector<Term>& children)
3339 */
3340 INST_POOL,
3341 /*
3342 * A instantantiation-add-to-pool annotation.
3343 * Parameters: n = 1
3344 * - 1: The pool to add to.
3345 * Create with:
3346 * - `mkTerm(Kind kind, Term child)
3347 */
3348 INST_ADD_TO_POOL,
3349 /*
3350 * A skolemization-add-to-pool annotation.
3351 * Parameters: n = 1
3352 * - 1: The pool to add to.
3353 * Create with:
3354 * - `mkTerm(Kind kind, Term child)
3355 */
3356 SKOLEM_ADD_TO_POOL,
3357 /**
3358 * An instantiation attribute
3359 * Specifies a custom property for a quantified formula given by a
3360 * term that is ascribed a user attribute.
3361 *
3362 * Parameters: n >= 1
3363 * - 1: The keyword of the attribute (a term with kind CONST_STRING).
3364 * - 2...n: The values of the attribute.
3365 *
3366 * Create with:
3367 * - `mkTerm(Kind kind, Term child1, Term child2)
3368 * - `mkTerm(Kind kind, Term child1, Term child2, Term child3)
3369 * - `mkTerm(Kind kind, const std::vector<Term>& children)
3370 */
3371 INST_ATTRIBUTE,
3372 /**
3373 * A list of instantiation patterns and/or attributes.
3374 *
3375 * Parameters: n > 1
3376 * - 1..n: Terms with kind INST_PATTERN, INST_NO_PATTERN, or
3377 * INST_ATTRIBUTE.
3378 *
3379 * Create with:
3380 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2) const`
3381 * - `Solver::mkTerm(Kind kind, const Term& child1, const Term& child2, const Term& child3) const`
3382 * - `Solver::mkTerm(Kind kind, const std::vector<Term>& children) const`
3383 */
3384 INST_PATTERN_LIST,
3385 #if 0
3386
3387 /* Sort Kinds ------------------------------------------------------------ */
3388
3389 /* array type */
3390 ARRAY_TYPE,
3391 /* a type parameter for type ascription */
3392 ASCRIPTION_TYPE,
3393 /* constructor */
3394 CONSTRUCTOR_TYPE,
3395 /* a datatype type index */
3396 DATATYPE_TYPE,
3397 /* selector */
3398 SELECTOR_TYPE,
3399 /* set type, takes as parameter the type of the elements */
3400 SET_TYPE,
3401 /* bag type, takes as parameter the type of the elements */
3402 BAG_TYPE,
3403 /* sort tag */
3404 SORT_TAG,
3405 /* specifies types of user-declared 'uninterpreted' sorts */
3406 SORT_TYPE,
3407 /* tester */
3408 TESTER_TYPE,
3409 /* a representation for basic types */
3410 TYPE_CONSTANT,
3411 /* a function type */
3412 FUNCTION_TYPE,
3413 /* the type of a symbolic expression */
3414 SEXPR_TYPE,
3415 /* bit-vector type */
3416 BITVECTOR_TYPE,
3417 /* floating-point type */
3418 FLOATINGPOINT_TYPE,
3419 #endif
3420
3421 /* ----------------------------------------------------------------------- */
3422 /** Marks the upper-bound of this enumeration. */
3423 LAST_KIND
3424 };
3425 // clang-format on
3426
3427 /**
3428 * Get the string representation of a given kind.
3429 * @param k the kind
3430 * @return the string representation of kind k
3431 */
3432 std::string kindToString(Kind k) CVC5_EXPORT;
3433
3434 /**
3435 * Serialize a kind to given stream.
3436 * @param out the output stream
3437 * @param k the kind to be serialized to the given output stream
3438 * @return the output stream
3439 */
3440 std::ostream& operator<<(std::ostream& out, Kind k) CVC5_EXPORT;
3441
3442 } // namespace api
3443 } // namespace cvc5
3444
3445 namespace std {
3446
3447 /**
3448 * Hash function for Kinds.
3449 */
3450 template<>
3451 struct CVC5_EXPORT hash<cvc5::api::Kind>
3452 {
3453 /**
3454 * Hashes a Kind to a size_t.
3455 */
3456 size_t operator()(cvc5::api::Kind k) const;
3457 };
3458
3459 }
3460
3461 #endif