86 std::stack<ExprFrame> st;
91 switch (frame.
state) {
119 else if (s ==
"as") {
122 if (second ==
"const") {
124 std::shared_ptr<Sort> array_sort =
parseSort();
128 std::shared_ptr<DAGNode> value =
parseExpr();
143 else if (s ==
"root-obj") {
153 std::shared_ptr<DAGNode> expr =
parseExpr();
162 int index = std::stoi(index_str);
169 else if (s ==
"root-of-with-interval") {
177 std::vector<std::shared_ptr<DAGNode>> coeffs_list;
180 std::shared_ptr<DAGNode> coeff =
parseExpr();
181 coeffs_list.push_back(coeff);
187 std::shared_ptr<DAGNode> lower_bound =
parseExpr();
190 std::shared_ptr<DAGNode> upper_bound =
parseExpr();
213 if (head ==
"exists" || head ==
"forall") {
225 else if (head ==
"_") {
227 if (second.size() >= 2 && second[0] ==
'b' && second[1] ==
'v') {
231 width = std::stoul(width_str);
236 std::string num = second.substr(2);
243 else if (second ==
"+zero" || second ==
"-zero" || second ==
"+oo" ||
244 second ==
"-oo" || second ==
"NaN" || second ==
"+NaN" ||
251 eb = std::stoul(eb_str);
257 sb = std::stoul(sb_str);
263 std::shared_ptr<Sort> fp_sort =
sort_manager->createFPSort(eb, sb);
267 if (second ==
"NaN" || second ==
"+NaN" || second ==
"-NaN") {
270 else if (second ==
"+oo") {
273 else if (second ==
"-oo") {
278 std::string const_name =
279 "(_ " + second +
" " + eb_str +
" " + sb_str +
")";
293 else if (head ==
"fp") {
295 std::vector<std::shared_ptr<DAGNode>> fp_args;
298 std::shared_ptr<DAGNode> sign =
parseExpr();
299 fp_args.push_back(sign);
302 std::shared_ptr<DAGNode> exp =
parseExpr();
303 fp_args.push_back(exp);
306 std::shared_ptr<DAGNode> mant =
parseExpr();
307 fp_args.push_back(mant);
314 else if (head ==
"let") {
324 std::shared_ptr<DAGNode> res;
325 if (
options->parsing_preserve_let) {
343 else if (head ==
"!") {
344 std::shared_ptr<DAGNode> formula =
parseExpr();
347 std::vector<std::shared_ptr<DAGNode>> attributes;
369 std::vector<std::shared_ptr<DAGNode>> patterns;
378 patterns.push_back(node);
393 attributes.emplace_back(
397 std::shared_ptr<DAGNode> pattern =
parseExpr();
401 attributes.emplace_back(
405 std::shared_ptr<DAGNode> weight =
parseExpr();
406 attributes.emplace_back(
452 if (!attributes.empty()) {
453 attributes.insert(attributes.begin(), formula);
454 formula =
mkAttribute(formula->getSort(),
"!", attributes);
460 else if (head ==
"root-of-with-interval") {
468 std::vector<std::shared_ptr<DAGNode>> coeffs_list;
471 std::shared_ptr<DAGNode> coeff =
parseExpr();
472 coeffs_list.push_back(coeff);
478 std::shared_ptr<DAGNode> lower_bound =
parseExpr();
481 std::shared_ptr<DAGNode> upper_bound =
parseExpr();
502 const std::string &opName =
504 if (opName ==
"root-obj" || opName ==
"root-of-with-interval") {
513 std::shared_ptr<DAGNode> res;
516 const std::string &opName =
523 else if (opName ==
"and") {
526 else if (opName ==
"=>") {
529 else if (opName ==
"or") {
532 else if (opName ==
"not") {
534 "Invalid number of parameters for not");
537 else if (opName ==
"ite") {
539 "Invalid number of parameters for ite");
542 else if (opName ==
"distinct") {
545 else if (opName ==
"+") {
548 else if (opName ==
"-") {
551 else if (opName ==
"*") {
554 else if (opName ==
"<=") {
559 else if (opName ==
"<") {
564 else if (opName ==
">=") {
569 else if (opName ==
">") {
574 else if (opName ==
"bvult") {
576 "Invalid number of parameters for bvult");
579 else if (opName ==
"bvugt") {
581 "Invalid number of parameters for bvugt");
584 else if (opName ==
"bvule") {
586 "Invalid number of parameters for bvule");
589 else if (opName ==
"bvuge") {
591 "Invalid number of parameters for bvuge");
594 else if (opName ==
"bvsgt") {
596 "Invalid number of parameters for bvsgt");
599 else if (opName ==
"bvsle") {
601 "Invalid number of parameters for bvsle");
604 else if (opName ==
"bvslt") {
606 "Invalid number of parameters for bvslt");
609 else if (opName ==
"bvsge") {
611 "Invalid number of parameters for bvsge");
625 if (opName ==
"root-obj" || opName ==
"root-of-with-interval") {
652 std::shared_ptr<DAGNode> res;
701 else if (s ==
"false") {
715 if (
options->parsing_preserve_let &&
720 key_var->incUseCount();
723 else if (!
options->parsing_preserve_let &&
727 key_var->incUseCount();
742 (fun_var->getChildrenSize() > 0 ? fun_var->getChildrenSize() - 1 : 0);
747 fun_var->incUseCount();
753 fun_var->incUseCount();
761 quant_var->incUseCount();
780 if (s[1] ==
'b' || s[1] ==
'B') {
782 width = s.size() - 2;
784 else if (s[1] ==
'x' || s[1] ==
'X') {
786 width = (s.size() - 2) * 4;
788 else if (s[1] ==
'd' || s[1] ==
'D') {
790 std::string decimal_part = s.substr(2);
792 std::string binary = value.
toString(2);
793 width = binary.size();
797 width = s.size() - 2;
815 else if (s.size() > 2 && s[0] ==
'|' && s[s.size() - 1] ==
'|' &&
830 else if (s ==
"pi") {
836 else if (s ==
"inf") {
840 else if (s ==
"+inf") {
844 else if (s ==
"-inf") {
848 else if (s ==
"epsion") {
851 else if (s ==
"+epsilon") {
854 else if (s ==
"-epsilon") {
857 else if (s ==
"NaN" || s ==
"+NaN" || s ==
"-NaN") {
862 else if (s ==
"re.none") {
865 else if (s ==
"re.all") {
868 else if (s ==
"re.allchar") {
872 else if (s ==
"RNE" || s ==
"roundNearestTiesToEven") {
875 else if (s ==
"RNA" || s ==
"roundNearestTiesToAway") {
878 else if (s ==
"RTP" || s ==
"roundTowardPositive") {
881 else if (s ==
"RTN" || s ==
"roundTowardNegative") {
884 else if (s ==
"RTZ" || s ==
"roundTowardZero") {
906std::shared_ptr<DAGNode>
908 const std::vector<std::shared_ptr<DAGNode>> &func_args,
909 const std::vector<std::shared_ptr<DAGNode>> &oper_params) {
914 auto x =
applyFun(func, oper_params);
921 if (s ==
"root-obj") {
923 "root-obj requires exactly 2 parameters");
924 auto expr = oper_params[0];
925 auto index_node = oper_params[1];
926 condAssert(index_node->isConst() && index_node->getSort()->isInt(),
927 "root-obj index must be integer constant");
928 int index = std::stoi(index_node->getName());
935 return mkAnd(oper_params);
937 return mkOr(oper_params);
939 condAssert(oper_params.size() == 1,
"Invalid number of parameters for not");
940 return mkNot(oper_params[0]);
944 return mkXor(oper_params);
946 return mkEq(oper_params);
950 return mkIte(oper_params);
952 return mkAdd(oper_params);
954 condAssert(oper_params.size() == 1,
"Invalid number of parameters for neg");
955 return mkNeg(oper_params[0]);
957 return mkSub(oper_params);
959 return mkMul(oper_params);
961 return mkIand(oper_params);
964 "Invalid number of parameters for pow2");
965 return mkPow2(oper_params[0]);
967 condAssert(oper_params.size() == 2,
"Invalid number of parameters for pow");
968 return mkPow(oper_params[0], oper_params[1]);
970 condAssert(oper_params.size() == 2,
"Invalid number of parameters for div");
973 condAssert(oper_params.size() == 2,
"Invalid number of parameters for div");
976 condAssert(oper_params.size() == 2,
"Invalid number of parameters for mod");
977 return mkMod(oper_params[0], oper_params[1]);
979 condAssert(oper_params.size() == 1,
"Invalid number of parameters for abs");
980 return mkAbs(oper_params[0]);
983 "Invalid number of parameters for sqrt");
984 return mkSqrt(oper_params[0]);
987 "Invalid number of parameters for safeSqrt");
991 "Invalid number of parameters for ceil");
992 return mkCeil(oper_params[0]);
995 "Invalid number of parameters for floor");
996 return mkFloor(oper_params[0]);
999 "Invalid number of parameters for round");
1000 return mkRound(oper_params[0]);
1002 condAssert(oper_params.size() == 1,
"Invalid number of parameters for exp");
1003 return mkExp(oper_params[0]);
1005 condAssert(oper_params.size() == 1,
"Invalid number of parameters for ln");
1006 return mkLn(oper_params[0]);
1008 condAssert(oper_params.size() == 1,
"Invalid number of parameters for lg");
1009 return mkLg(oper_params[0]);
1011 condAssert(oper_params.size() == 1,
"Invalid number of parameters for lb");
1012 return mkLb(oper_params[0]);
1014 if (oper_params.size() == 1) {
1015 return mkLn(oper_params[0]);
1017 else if (oper_params.size() == 2) {
1018 return mkLog(oper_params[0], oper_params[1]);
1025 condAssert(oper_params.size() == 1,
"Invalid number of parameters for sin");
1026 return mkSin(oper_params[0]);
1028 condAssert(oper_params.size() == 1,
"Invalid number of parameters for cos");
1029 return mkCos(oper_params[0]);
1031 condAssert(oper_params.size() == 1,
"Invalid number of parameters for tan");
1032 return mkTan(oper_params[0]);
1034 condAssert(oper_params.size() == 1,
"Invalid number of parameters for cot");
1035 return mkCot(oper_params[0]);
1037 condAssert(oper_params.size() == 1,
"Invalid number of parameters for sec");
1038 return mkSec(oper_params[0]);
1040 condAssert(oper_params.size() == 1,
"Invalid number of parameters for csc");
1041 return mkCsc(oper_params[0]);
1044 "Invalid number of parameters for asin");
1045 return mkAsin(oper_params[0]);
1048 "Invalid number of parameters for acos");
1049 return mkAcos(oper_params[0]);
1052 "Invalid number of parameters for atan");
1053 return mkAtan(oper_params[0]);
1056 "Invalid number of parameters for acot");
1057 return mkAcot(oper_params[0]);
1060 "Invalid number of parameters for asec");
1061 return mkAsec(oper_params[0]);
1064 "Invalid number of parameters for acsc");
1065 return mkAcsc(oper_params[0]);
1068 "Invalid number of parameters for sinh");
1069 return mkSinh(oper_params[0]);
1072 "Invalid number of parameters for cosh");
1073 return mkCosh(oper_params[0]);
1076 "Invalid number of parameters for tanh");
1077 return mkTanh(oper_params[0]);
1080 "Invalid number of parameters for asech");
1081 return mkAsech(oper_params[0]);
1084 "Invalid number of parameters for acsch");
1085 return mkAcsch(oper_params[0]);
1088 "Invalid number of parameters for acoth");
1089 return mkAcoth(oper_params[0]);
1092 "Invalid number of parameters for atan2");
1093 return mkAtan2(oper_params[0], oper_params[1]);
1096 "Invalid number of parameters for asinh");
1097 return mkAsinh(oper_params[0]);
1100 "Invalid number of parameters for acosh");
1101 return mkAcosh(oper_params[0]);
1104 "Invalid number of parameters for atanh");
1105 return mkAtanh(oper_params[0]);
1108 "Invalid number of parameters for sech");
1109 return mkSech(oper_params[0]);
1112 "Invalid number of parameters for csch");
1113 return mkCsch(oper_params[0]);
1117 return mkLe(oper_params);
1121 return mkLt(oper_params);
1125 return mkGe(oper_params);
1129 return mkGt(oper_params);
1132 "Invalid number of parameters for to_real");
1136 "Invalid number of parameters for to_int");
1137 return mkToInt(oper_params[0]);
1140 "Invalid number of parameters for is_int");
1141 return mkIsInt(oper_params[0]);
1144 "Invalid number of parameters for is_divisible");
1148 "Invalid number of parameters for is_prime");
1152 "Invalid number of parameters for is_even");
1156 "Invalid number of parameters for is_odd");
1157 return mkIsOdd(oper_params[0]);
1159 condAssert(oper_params.size() == 2,
"Invalid number of parameters for gcd");
1160 return mkGcd(oper_params[0], oper_params[1]);
1162 condAssert(oper_params.size() == 2,
"Invalid number of parameters for lcm");
1163 return mkLcm(oper_params[0], oper_params[1]);
1166 "Invalid number of parameters for factorial");
1167 return mkFact(oper_params[0]);
1170 "Invalid number of parameters for bvnot");
1171 return mkBvNot(oper_params[0]);
1174 "Invalid number of parameters for bvneg");
1175 return mkBvNeg(oper_params[0]);
1179 return mkBvOr(oper_params);
1183 return mkBvNand(oper_params.at(0), oper_params.at(1));
1185 return mkBvNor(oper_params.at(0), oper_params.at(1));
1187 return mkBvXnor(oper_params.at(0), oper_params.at(1));
1195 return mkBvSub(oper_params.at(0), oper_params.at(1));
1200 "Invalid number of parameters for bvudiv");
1201 return mkBvUdiv(oper_params[0], oper_params[1]);
1204 "Invalid number of parameters for bvurem");
1205 return mkBvUrem(oper_params[0], oper_params[1]);
1208 "Invalid number of parameters for bvsdiv");
1209 return mkBvSdiv(oper_params[0], oper_params[1]);
1212 "Invalid number of parameters for bvsrem");
1213 return mkBvSrem(oper_params[0], oper_params[1]);
1216 "Invalid number of parameters for bvsrem");
1217 return mkBvSmod(oper_params[0], oper_params[1]);
1220 "Invalid number of parameters for bvshl");
1221 return mkBvShl(oper_params[0], oper_params[1]);
1224 "Invalid number of parameters for bvlshr");
1225 return mkBvLshr(oper_params[0], oper_params[1]);
1228 "Invalid number of parameters for bvashr");
1229 return mkBvAshr(oper_params[0], oper_params[1]);
1232 "Invalid number of parameters for bvult");
1233 return mkBvUlt(oper_params[0], oper_params[1]);
1236 "Invalid number of parameters for bvule");
1237 return mkBvUle(oper_params[0], oper_params[1]);
1240 "Invalid number of parameters for bvugt");
1241 return mkBvUgt(oper_params[0], oper_params[1]);
1244 "Invalid number of parameters for bvuge");
1245 return mkBvUge(oper_params[0], oper_params[1]);
1248 "Invalid number of parameters for bvslt");
1249 return mkBvSlt(oper_params[0], oper_params[1]);
1252 "Invalid number of parameters for bvsle");
1253 return mkBvSle(oper_params[0], oper_params[1]);
1256 "Invalid number of parameters for bvsgt");
1257 return mkBvSgt(oper_params[0], oper_params[1]);
1260 "Invalid number of parameters for bvsge");
1261 return mkBvSge(oper_params[0], oper_params[1]);
1266 "Invalid number of parameters for bv2int");
1270 "Invalid number of parameters for ubv2int");
1274 "Invalid number of parameters for sbv2int");
1278 "Invalid number of parameters for bv2nat");
1282 "Invalid number of parameters for nat2bv");
1283 return mkNatToBv(oper_params[0], oper_params[1]);
1286 "Invalid number of arguments for int_to_bv");
1288 "Invalid number of parameters for int_to_bv");
1289 return mkIntToBv(oper_params[0], func_args[0]);
1292 "Invalid number of arguments for extract");
1294 "Invalid number of parameters for extract");
1295 return mkBvExtract(oper_params[0], func_args[0], func_args[1]);
1297 condAssert(func_args.size() == 1,
"Invalid number of arguments for repeat");
1299 "Invalid number of parameters for repeat");
1300 return mkBvRepeat(oper_params[0], func_args[0]);
1303 "Invalid number of arguments for zero_extend");
1305 "Invalid number of parameters for zero_extend");
1309 "Invalid number of arguments for sign_extend");
1311 "Invalid number of parameters for sign_extend");
1315 "Invalid number of arguments for rotate_left");
1317 "Invalid number of parameters for rotate_left");
1321 "Invalid number of arguments for rotate_right");
1323 "Invalid number of parameters for rotate_right");
1327 "Invalid number of parameters for fp.abs");
1328 return mkFpAbs(oper_params[0]);
1331 "Invalid number of parameters for fp.neg");
1332 return mkFpNeg(oper_params[0]);
1346 if (oper_params.size() == 1) {
1349 else if (oper_params.size() == 2) {
1350 return mkFpSqrt(oper_params[0], oper_params[1]);
1358 "Invalid number of parameters for fp.rem");
1359 return mkFpRem(oper_params[0], oper_params[1]);
1361 if (oper_params.size() == 1) {
1364 else if (oper_params.size() == 2) {
1373 "Invalid number of parameters for fp.min");
1374 return mkFpMin(oper_params.at(0), oper_params.at(1));
1377 "Invalid number of parameters for fp.max");
1378 return mkFpMax(oper_params.at(0), oper_params.at(1));
1382 return mkFpLe(oper_params);
1386 return mkFpLt(oper_params);
1390 return mkFpGe(oper_params);
1394 return mkFpGt(oper_params);
1398 return mkFpEq(oper_params);
1400 condAssert(func_args.size() == 1 && oper_params.size() == 2,
1401 "Invalid number of parameters for fp.to_ubv");
1402 return mkFpToUbv(oper_params[0], oper_params[1], func_args[0]);
1404 condAssert(func_args.size() == 1 && oper_params.size() == 2,
1405 "Invalid number of parameters for fp.to_sbv");
1406 return mkFpToSbv(oper_params[0], oper_params[1], func_args[0]);
1409 "Invalid number of parameters for fp.to_real");
1419 if (func_args.size() == 2) {
1420 if (oper_params.size() == 2) {
1422 return mkToFp(func_args[0], func_args[1], oper_params[0], oper_params[1]);
1424 else if (oper_params.size() == 1) {
1426 return mkToFp(func_args[0], func_args[1], oper_params[0]);
1433 else if (oper_params.size() == 3) {
1435 return mkToFp(oper_params[0], oper_params[1], oper_params[2]);
1445 if (func_args.size() == 2 && oper_params.size() == 2) {
1446 return mkToFpUnsigned(func_args[0], func_args[1], oper_params[0], oper_params[1]);
1455 "Invalid number of parameters for fp.isNormal");
1459 "Invalid number of parameters for fp.isSubnormal");
1463 "Invalid number of parameters for fp.isZero");
1467 "Invalid number of parameters for fp.isInfinite");
1471 "Invalid number of parameters for fp.isNaN");
1475 "Invalid number of parameters for fp.isNegative");
1479 "Invalid number of parameters for fp.isPositive");
1483 "Invalid number of parameters for select");
1484 return mkSelect(oper_params[0], oper_params[1]);
1487 "Invalid number of parameters for store");
1488 return mkStore(oper_params[0], oper_params[1], oper_params[2]);
1491 "Invalid number of parameters for str.len");
1497 "Invalid number of parameters for str.substr");
1498 return mkStrSubstr(oper_params[0], oper_params[1], oper_params[2]);
1501 "Invalid number of parameters for str.prefixof");
1505 "Invalid number of parameters for str.suffixof");
1509 "Invalid number of parameters for str.indexof");
1510 return mkStrIndexof(oper_params[0], oper_params[1], oper_params[2]);
1513 "Invalid number of parameters for str.at");
1514 return mkStrCharat(oper_params[0], oper_params[1]);
1517 "Invalid number of parameters for str.update");
1518 return mkStrUpdate(oper_params[0], oper_params[1], oper_params[2]);
1521 "Invalid number of parameters for str.replace");
1522 return mkStrReplace(oper_params[0], oper_params[1], oper_params[2]);
1525 "Invalid number of parameters for str.replace_all");
1526 return mkStrReplaceAll(oper_params[0], oper_params[1], oper_params[2]);
1529 "Invalid number of parameters for str.replace_re");
1530 return mkStrReplaceReg(oper_params[0], oper_params[1], oper_params[2]);
1533 "Invalid number of parameters for str.replace_re_all");
1537 "Invalid number of parameters for str.indexof_re");
1541 "Invalid number of parameters for str.to_lower");
1545 "Invalid number of parameters for str.to_upper");
1549 "Invalid number of parameters for str.rev");
1553 "Invalid number of parameters for str.split");
1554 return mkStrSplit(oper_params[0], oper_params[1]);
1557 "Invalid number of parameters for str.split_at");
1558 return mkStrSplitAt(oper_params[0], oper_params[1], oper_params[2]);
1561 "Invalid number of parameters for str.split_rest");
1562 return mkStrSplitRest(oper_params[0], oper_params[1], oper_params[2]);
1565 "Invalid number of parameters for str.num_splits");
1569 "Invalid number of parameters for str.split_at_re");
1570 return mkStrSplitAtRe(oper_params[0], oper_params[1], oper_params[2]);
1573 "Invalid number of parameters for str.split_rest_re");
1577 "Invalid number of parameters for str.num_splits_re");
1597 "Invalid number of parameters for str.in_re");
1598 return mkStrInReg(oper_params[0], oper_params[1]);
1601 "Invalid number of parameters for str.contains");
1605 "Invalid number of parameters for str.is_digit");
1609 "Invalid number of parameters for str.from_int");
1613 "Invalid number of parameters for str.to_int");
1617 "Invalid number of parameters for str.to_re");
1621 "Invalid number of parameters for str.to_code");
1625 "Invalid number of parameters for str.from_code");
1637 "Invalid number of parameters for re.*");
1641 "Invalid number of parameters for re.+");
1645 "Invalid number of parameters for re.?");
1649 "Invalid number of parameters for re.range");
1650 return mkRegRange(oper_params[0], oper_params[1]);
1653 "Invalid number of parameters for re.repeat");
1654 return mkRegRepeat(oper_params[0], oper_params[1]);
1657 "Invalid number of parameters for re.comp");
1661 "Invalid number of parameters for re.loop");
1663 "Invalid number of arguments for re.loop");
1664 return mkRegLoop(oper_params[0], func_args[0], func_args[1]);
1667 condAssert(func_args.size() == 1 && oper_params.size() == 1,
1668 "Invalid parameters for ((_ is C) t)");
1670 std::string ctor_name = func_args[0]->getName();
1671 auto t = oper_params[0];
1686 condAssert(func_args.size() == 1 && oper_params.size() == 2,
1687 "Invalid parameters for ((_ update S) t u)");
1688 std::string sel_name = func_args[0]->getName();
1689 auto t = oper_params[0];
1690 auto u = oper_params[1];
1698 std::vector<std::shared_ptr<Sort>> fields;
1699 fields.reserve(oper_params.size());
1700 for (
auto &ch : oper_params)
1701 fields.push_back(ch->getSort());
1710 condAssert(func_args.size() == 1 && oper_params.size() == 1,
1711 "Invalid parameters for ((_ tuple.select i) t)");
1712 auto t = oper_params[0];
1713 auto idx = func_args[0];
1715 if (t->getSort()->isTuple()) {
1717 size_t i =
static_cast<size_t>(std::stoul(idx->getName()));
1718 if (i < t->
getSort()->children.size())
1719 out_sort = t->getSort()->children[i];
1725 out_sort = t->getSort();
1730 condAssert(func_args.size() == 1 && oper_params.size() == 2,
1731 "Invalid parameters for ((_ tuple.update i) t u)");
1732 auto t = oper_params[0];
1733 auto idx = func_args[0];
1734 auto u = oper_params[1];
1740 condAssert(!func_args.empty() && oper_params.size() == 1,
1741 "Invalid parameters for ((_ tuple.project i1 ... in) t)");
1742 auto t = oper_params[0];
1743 std::vector<std::shared_ptr<DAGNode>> ch;
1744 ch.reserve(1 + func_args.size());
1746 for (
auto &a : func_args)
1749 std::vector<std::shared_ptr<Sort>> fields;
1750 if (t->getSort()->isTuple()) {
1751 for (
auto &a : func_args) {
1753 size_t i =
static_cast<size_t>(std::stoul(a->getName()));
1754 if (i < t->
getSort()->children.size())
1755 fields.push_back(t->getSort()->children[i]);
1761 std::shared_ptr<Sort> out_sort =
1762 fields.empty() ? t->getSort() :
sort_manager->createTupleSort(fields);
#define condAssert(cond, msg)
static std::string parseScientificNotation(const std::string &str)
std::string toString(int base=10) const
std::shared_ptr< DAGNode > mkSelect(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an array select node.
std::shared_ptr< DAGNode > mkBvSub(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector subtraction node.
void err_all(const ERROR_TYPE e, const std::string s="", const size_t ln=0) const
std::shared_ptr< DAGNode > mkAnd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an and node.
std::shared_ptr< DAGNode > mkCot(std::shared_ptr< DAGNode > param)
Create a cot node.
std::shared_ptr< GlobalOptions > options
std::shared_ptr< DAGNode > mkSin(std::shared_ptr< DAGNode > param)
Create an sin node.
std::shared_ptr< DAGNode > mkConstArray(std::shared_ptr< Sort > sort, std::shared_ptr< DAGNode > value)
Create a constant array node.
std::shared_ptr< DAGNode > mkStrLt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a string less-than node.
void err_param_mis(const std::string nm, const size_t ln) const
std::shared_ptr< DAGNode > mkFpToSbv(std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param, std::shared_ptr< DAGNode > size)
Create a floating-point to signed bitvector conversion node.
std::unordered_map< std::string, std::vector< std::shared_ptr< DAGNode > > > quant_var_map
std::unordered_map< std::string, std::shared_ptr< DAGNode > > fun_var_map
std::shared_ptr< DAGNode > mkAsinh(std::shared_ptr< DAGNode > param)
Create an asinh node.
std::shared_ptr< DAGNode > mkAsec(std::shared_ptr< DAGNode > param)
Create an asec node.
std::shared_ptr< DAGNode > mkCeil(std::shared_ptr< DAGNode > param)
Create an ceil node.
std::shared_ptr< DAGNode > mkLcm(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a lcm node.
std::shared_ptr< DAGNode > mkXor(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an xor node.
std::shared_ptr< DAGNode > mkStrPrefixof(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string prefix check node.
std::shared_ptr< DAGNode > mkStrToReg(std::shared_ptr< DAGNode > param)
Create a string to-regex conversion node.
std::shared_ptr< DAGNode > mkIntToBv(std::shared_ptr< DAGNode > param, std::shared_ptr< DAGNode > width)
Create an integer to bitvector conversion node.
std::shared_ptr< DAGNode > mkAcsc(std::shared_ptr< DAGNode > param)
Create an acsc node.
std::shared_ptr< DAGNode > mkFpEq(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point equality node.
std::shared_ptr< DAGNode > mkBvAdd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector addition node.
std::shared_ptr< DAGNode > mkStrSplitAt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
std::shared_ptr< DAGNode > mkBvSmod(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed modulo node.
std::shared_ptr< DAGNode > applyFun(std::shared_ptr< DAGNode > fun, const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Apply a function to a list of parameters.
std::shared_ptr< DAGNode > mkStrInReg(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string in-regex check node.
std::unordered_set< std::string > datatype_function_names
std::shared_ptr< DAGNode > mkBvXnor(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector xnor node.
std::shared_ptr< DAGNode > mkTan(std::shared_ptr< DAGNode > param)
Create an tan node.
std::shared_ptr< DAGNode > mkFalse()
Create a false node.
std::shared_ptr< DAGNode > mkGt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a gt node.
std::shared_ptr< DAGNode > mkNegEpsilon()
Create a negative epsilon node.
std::shared_ptr< DAGNode > mkBvSrem(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed remainder node.
std::shared_ptr< DAGNode > mkNegInfinity(std::shared_ptr< Sort > sort=nullptr)
Create a negative infinity node.
std::shared_ptr< DAGNode > mkTanh(std::shared_ptr< DAGNode > param)
Create a tanh node.
std::shared_ptr< DAGNode > mkCsch(std::shared_ptr< DAGNode > param)
Create a csch node.
std::shared_ptr< DAGNode > mkIsInt(std::shared_ptr< DAGNode > param)
Create a is_int node.
std::shared_ptr< DAGNode > mkNot(std::shared_ptr< DAGNode > param)
Create a not node.
std::shared_ptr< DAGNode > mkBvSdiv(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed division node.
std::shared_ptr< DAGNode > mkBvUlt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned less than node.
std::shared_ptr< DAGNode > mkIsOdd(std::shared_ptr< DAGNode > param)
Create a is_odd node.
std::shared_ptr< DAGNode > mkSec(std::shared_ptr< DAGNode > param)
Create an sec node.
std::shared_ptr< DAGNode > mkUbvToInt(std::shared_ptr< DAGNode > param)
std::shared_ptr< DAGNode > mkStrReplaceReg(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace-regex node.
std::shared_ptr< DAGNode > mkLb(std::shared_ptr< DAGNode > param)
Create an lb/log2 node.
std::shared_ptr< DAGNode > mkBvZeroExt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector zero extension node.
std::shared_ptr< DAGNode > mkEpsilon()
Create a epsilon node.
std::shared_ptr< DAGNode > mkMul(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an mul node.
std::shared_ptr< DAGNode > mkRegInter(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a regex intersection node.
std::shared_ptr< DAGNode > mkLe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a le node.
std::shared_ptr< DAGNode > mkStrContains(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string contains check node.
std::shared_ptr< DAGNode > mkFpIsSubnormal(std::shared_ptr< DAGNode > param)
Create a floating-point is-subnormal check node.
std::shared_ptr< DAGNode > parseConstFunc(const std::string &s)
std::shared_ptr< DAGNode > mkRegAll()
Create a regex all node.
std::shared_ptr< DAGNode > mkStore(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create an array store node.
std::shared_ptr< DAGNode > mkFpRoundToIntegral(std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param)
Create a floating-point round to integral node.
std::shared_ptr< DAGNode > mkRegOpt(std::shared_ptr< DAGNode > param)
Create a regex option node.
std::shared_ptr< DAGNode > mkRegLoop(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
Create a regex loop node.
std::shared_ptr< DAGNode > mkRegUnion(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a regex union node.
std::shared_ptr< DAGNode > mkRegDiff(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a regex difference node.
std::shared_ptr< DAGNode > mkDistinct(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a distinct node.
std::shared_ptr< DAGNode > mkFpDiv(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point division node.
std::shared_ptr< DAGNode > mkAcsch(std::shared_ptr< DAGNode > param)
Create an acsch node.
std::shared_ptr< Sort > placeholder_var_sort
std::shared_ptr< DAGNode > mkFpSqrt(std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param)
Create a floating-point square root node.
std::unordered_map< std::string, std::shared_ptr< DAGNode > > preserving_let_key_map
std::shared_ptr< DAGNode > parseLet()
std::shared_ptr< DAGNode > mkIsEven(std::shared_ptr< DAGNode > param)
Create a is_even node.
std::shared_ptr< DAGNode > mkTrue()
Create a true node.
std::shared_ptr< DAGNode > mkAsin(std::shared_ptr< DAGNode > param)
Create an asin node.
std::shared_ptr< DAGNode > mkAcosh(std::shared_ptr< DAGNode > param)
Create an acosh node.
std::shared_ptr< DAGNode > parsePreservingLet()
std::shared_ptr< DAGNode > mkStrCharat(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string char-at node.
std::shared_ptr< DAGNode > mkBvToNat(std::shared_ptr< DAGNode > param)
Create a bitvector to natural number conversion node.
std::shared_ptr< DAGNode > mkRegRepeat(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a regex repeat node.
std::shared_ptr< DAGNode > mkSub(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an sub node.
std::shared_ptr< DAGNode > mkBvNot(std::shared_ptr< DAGNode > param)
Create a bitvector not node.
std::shared_ptr< DAGNode > mkWeight(const std::shared_ptr< Sort > &sort, const std::string &name, std::shared_ptr< DAGNode > weight)
std::shared_ptr< DAGNode > mkRegConcat(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a regex concatenation node.
std::unordered_map< std::string, size_t > var_names
std::shared_ptr< DAGNode > mkFpIsZero(std::shared_ptr< DAGNode > param)
Create a floating-point is-zero check node.
std::shared_ptr< DAGNode > mkInfinity(std::shared_ptr< Sort > sort)
Create a infinity node.
std::shared_ptr< DAGNode > mkStrSubstr(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
Create a string substring node.
std::shared_ptr< DAGNode > mkConstBv(const std::string &v, const size_t &width)
Create a bit-vector constant.
std::shared_ptr< DAGNode > mkFpRem(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a floating-point remainder node.
std::shared_ptr< DAGNode > mkApplyDTFun(const std::shared_ptr< Sort > &sort, const std::string &name, const std::vector< std::shared_ptr< DAGNode > > ¶ms)
std::shared_ptr< DAGNode > mkBvRotateLeft(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector rotate left node.
std::shared_ptr< DAGNode > mkPosInfinity(std::shared_ptr< Sort > sort=nullptr)
Create a positive infinity node.
KEYWORD attemptParseKeywords()
std::shared_ptr< DAGNode > mkBvToInt(std::shared_ptr< DAGNode > param)
Create a bitvector to integer conversion node.
std::shared_ptr< DAGNode > mkBvNeg(std::shared_ptr< DAGNode > param)
Create a bitvector negation node.
std::shared_ptr< DAGNode > mkStrReplace(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace node.
std::shared_ptr< DAGNode > mkConstReal(const std::string &v)
Create a real constant from string.
std::shared_ptr< DAGNode > mkRegComplement(std::shared_ptr< DAGNode > param)
Create a regex complement node.
std::shared_ptr< DAGNode > mkDivReal(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an div node.
std::shared_ptr< DAGNode > mkToFp(std::shared_ptr< DAGNode > eb, std::shared_ptr< DAGNode > sb, std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param)
Create a value to floating-point conversion node.
std::shared_ptr< DAGNode > mkFpMin(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a floating-point minimum node.
std::shared_ptr< DAGNode > mkStrSplit(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string split node.
std::shared_ptr< DAGNode > mkFpConst(std::shared_ptr< DAGNode > sign, std::shared_ptr< DAGNode > exp, std::shared_ptr< DAGNode > mant)
std::shared_ptr< DAGNode > mkCosh(std::shared_ptr< DAGNode > param)
Create a cosh node.
std::shared_ptr< DAGNode > mkFpMax(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a floating-point maximum node.
std::shared_ptr< DAGNode > mkErr(const ERROR_TYPE t)
std::shared_ptr< DAGNode > mkFpLt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point less than node.
std::shared_ptr< DAGNode > mkStrGt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a string greater-than node.
std::shared_ptr< DAGNode > mkToReal(std::shared_ptr< DAGNode > param)
Create a to_real node.
std::shared_ptr< DAGNode > mkOr(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an or node.
std::shared_ptr< DAGNode > mkBvRepeat(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector repeat node.
std::shared_ptr< DAGNode > mkIsPrime(std::shared_ptr< DAGNode > param)
Create a is_prime node.
std::shared_ptr< DAGNode > mkBvShl(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector shift left node.
std::shared_ptr< DAGNode > mkAcos(std::shared_ptr< DAGNode > param)
Create an acos node.
size_t quant_nesting_depth
std::shared_ptr< DAGNode > mkSafeSqrt(std::shared_ptr< DAGNode > param)
Create an safeSqrt node.
std::shared_ptr< DAGNode > mkStrToUpper(std::shared_ptr< DAGNode > param)
Create a string to-upper node.
std::shared_ptr< DAGNode > mkBvUle(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned less than or equal node.
size_t preserving_let_counter
std::shared_ptr< DAGNode > mkStrToInt(std::shared_ptr< DAGNode > param)
Create a string to-integer conversion node.
std::shared_ptr< DAGNode > mkBvConcat(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector concatenation node.
std::shared_ptr< DAGNode > mkConstInt(const std::string &v)
Create an integer constant from string.
std::shared_ptr< DAGNode > mkIsDivisible(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a is_divisible node.
std::shared_ptr< DAGNode > mkBvComp(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector comparison node.
std::shared_ptr< DAGNode > mkPattern(const std::shared_ptr< Sort > &sort, const std::string &name, const std::vector< std::shared_ptr< DAGNode > > ¶ms)
std::shared_ptr< DAGNode > mkStrNumSplits(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
std::shared_ptr< DAGNode > mkStrFromCode(std::shared_ptr< DAGNode > param)
Create a string from-code conversion node.
std::shared_ptr< DAGNode > mkBvUrem(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned remainder node.
std::shared_ptr< DAGNode > mkFpToReal(std::shared_ptr< DAGNode > param)
Create a floating-point to real conversion node.
std::shared_ptr< DAGNode > mkSqrt(std::shared_ptr< DAGNode > param)
Create an sqrt node.
std::shared_ptr< DAGNode > mkStrIndexof(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
Create a string index-of node.
std::shared_ptr< DAGNode > mkE()
Create a e node.
std::shared_ptr< DAGNode > mkFpToUbv(std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param, std::shared_ptr< DAGNode > size)
Create a floating-point to unsigned bitvector conversion node.
std::shared_ptr< DAGNode > mkCos(std::shared_ptr< DAGNode > param)
Create an cos node.
std::shared_ptr< DAGNode > mkFpAdd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point addition node.
std::shared_ptr< DAGNode > mkRegAllChar()
Create a regex allchar node.
std::shared_ptr< DAGNode > mkRootObj(std::shared_ptr< DAGNode > expr, int index)
std::shared_ptr< DAGNode > mkGcd(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a gcd node.
std::shared_ptr< DAGNode > mkToFpUnsigned(std::shared_ptr< DAGNode > eb, std::shared_ptr< DAGNode > sb, std::shared_ptr< DAGNode > rm, std::shared_ptr< DAGNode > param)
std::shared_ptr< DAGNode > mkRootOfWithInterval(const std::vector< std::shared_ptr< DAGNode > > &coeffs, std::shared_ptr< DAGNode > lower_bound, std::shared_ptr< DAGNode > upper_bound)
std::shared_ptr< DAGNode > mkStrIsDigit(std::shared_ptr< DAGNode > param)
Create a string is-digit check node.
std::shared_ptr< DAGNode > parseOper(const std::string &s, const std::vector< std::shared_ptr< DAGNode > > &func_args, const std::vector< std::shared_ptr< DAGNode > > &oper_params)
std::shared_ptr< DAGNode > mkGe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a ge node.
std::shared_ptr< DAGNode > mkBvSignExt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector sign extension node.
std::shared_ptr< DAGNode > mkFpGe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point greater than or equal node.
std::shared_ptr< DAGNode > parseQuant(const std::string &type)
std::shared_ptr< DAGNode > mkPi()
Create a pi node.
std::shared_ptr< DAGNode > mkFact(std::shared_ptr< DAGNode > param)
Create a factorial node.
std::shared_ptr< DAGNode > mkFpIsPos(std::shared_ptr< DAGNode > param)
Create a floating-point is-positive check node.
std::shared_ptr< DAGNode > mkDivInt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an div node.
bool allow_placeholder_vars
void err_unkwn_sym(const std::string nm, const size_t ln) const
std::shared_ptr< DAGNode > mkFpNeg(std::shared_ptr< DAGNode > param)
Create a floating-point negation node.
std::shared_ptr< DAGNode > mkRegStar(std::shared_ptr< DAGNode > param)
Create a regex star node.
std::shared_ptr< DAGNode > mkStrSplitRestRe(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
std::unordered_map< std::string, std::shared_ptr< DAGNode > > named_assertions
std::unordered_map< std::string, std::shared_ptr< DAGNode > > let_key_map
std::shared_ptr< DAGNode > mkStrUpdate(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string update node.
std::shared_ptr< DAGNode > mkBvUdiv(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned division node.
std::shared_ptr< DAGNode > mkRegPlus(std::shared_ptr< DAGNode > param)
Create a regex plus node.
std::shared_ptr< DAGNode > mkStrConcat(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a string concatenation node.
std::shared_ptr< DAGNode > mkEq(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an equality node.
std::shared_ptr< DAGNode > mkBvSlt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed less than node.
std::shared_ptr< DAGNode > mkSinh(std::shared_ptr< DAGNode > param)
Create a sinh node.
std::shared_ptr< DAGNode > mkNoPattern(const std::shared_ptr< Sort > &sort, const std::string &name, std::shared_ptr< DAGNode > param)
std::shared_ptr< DAGNode > mkApplyUF(const std::shared_ptr< Sort > &sort, const std::string &name, const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Apply an uninterpreted function.
std::shared_ptr< Sort > parseSort()
std::shared_ptr< DAGNode > mkSech(std::shared_ptr< DAGNode > param)
Create a sech node.
std::shared_ptr< DAGNode > mkBvRotateRight(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector rotate right node.
std::shared_ptr< DAGNode > mkBvOr(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector or node.
std::shared_ptr< DAGNode > mkBvMul(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector multiplication node.
std::shared_ptr< DAGNode > mkLn(std::shared_ptr< DAGNode > param)
Create an ln node.
std::shared_ptr< DAGNode > mkFpIsInf(std::shared_ptr< DAGNode > param)
Create a floating-point is-infinity check node.
std::shared_ptr< DAGNode > mkPow2(std::shared_ptr< DAGNode > param)
Create an pow2 node.
std::shared_ptr< DAGNode > mkConstFP(const std::string &fp_expr)
Create a floating-point constant from expression.
std::shared_ptr< DAGNode > mkFpAbs(std::shared_ptr< DAGNode > param)
Create a floating-point absolute value node.
std::shared_ptr< DAGNode > mkBvExtract(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
Create a bitvector extract node.
std::shared_ptr< DAGNode > mkFpIsNeg(std::shared_ptr< DAGNode > param)
Create a floating-point is-negative check node.
std::shared_ptr< DAGNode > mkBvAshr(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector arithmetic shift right node.
std::shared_ptr< DAGNode > mkBvAnd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector and node.
std::shared_ptr< DAGNode > mkBvNor(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector nor node.
std::shared_ptr< DAGNode > mkAcoth(std::shared_ptr< DAGNode > param)
Create an acoth node.
std::shared_ptr< DAGNode > mkRegNone()
Create a regex none node.
std::shared_ptr< DAGNode > mkAtan(std::shared_ptr< DAGNode > param)
Create an atan node.
std::shared_ptr< DAGNode > mkStrLen(std::shared_ptr< DAGNode > param)
Create a string length node.
std::shared_ptr< DAGNode > mkStrLe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a string less-than-or-equal node.
std::shared_ptr< DAGNode > mkRound(std::shared_ptr< DAGNode > param)
Create an round node.
std::shared_ptr< DAGNode > mkIte(std::shared_ptr< DAGNode > cond, std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an ite node.
std::shared_ptr< DAGNode > mkStrToLower(std::shared_ptr< DAGNode > param)
Create a string to-lower node.
std::shared_ptr< DAGNode > mkAtanh(std::shared_ptr< DAGNode > param)
Create an atanh node.
std::shared_ptr< DAGNode > mkBvNand(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector nand node.
std::shared_ptr< DAGNode > mkPosEpsilon()
Create a positive epsilon node.
std::unordered_map< std::string, size_t > placeholder_var_names
std::shared_ptr< DAGNode > mkToInt(std::shared_ptr< DAGNode > param)
Create a to_int node.
std::shared_ptr< DAGNode > mkStrFromInt(std::shared_ptr< DAGNode > param)
Create a string from-integer conversion node.
std::shared_ptr< DAGNode > mkNaN(std::shared_ptr< Sort > sort=nullptr)
Create a NaN node.
std::shared_ptr< DAGNode > mkAsech(std::shared_ptr< DAGNode > param)
Create an asech node.
std::shared_ptr< DAGNode > mkAdd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an add node.
std::shared_ptr< DAGNode > mkBvSle(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed less than or equal node.
std::shared_ptr< DAGNode > mkPow(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an pow node.
std::shared_ptr< DAGNode > mkBvSge(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed greater than or equal node.
std::shared_ptr< DAGNode > mkStrIndexofReg(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string indexof-regex node.
std::shared_ptr< DAGNode > mkFpFma(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point fused multiply-add node.
std::shared_ptr< DAGNode > mkStrReplaceAll(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace-all node.
std::shared_ptr< DAGNode > mkLg(std::shared_ptr< DAGNode > param)
Create an lg/log10 node.
std::shared_ptr< DAGNode > mkBvUge(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned greater than or equal node.
std::shared_ptr< DAGNode > mkBvXor(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector xor node.
std::shared_ptr< DAGNode > mkNatToBv(std::shared_ptr< DAGNode > param, std::shared_ptr< DAGNode > width)
Create a natural number to bitvector conversion node.
std::shared_ptr< DAGNode > mkStrNumSplitsRe(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
std::shared_ptr< DAGNode > mkFpIsNormal(std::shared_ptr< DAGNode > param)
Create a floating-point is-normal check node.
std::shared_ptr< DAGNode > mkLt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a lt node.
NODE_KIND getKind(const std::string &s)
Get kind.
std::shared_ptr< DAGNode > mkFpLe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point less than or equal node.
std::shared_ptr< DAGNode > mkFpIsNaN(std::shared_ptr< DAGNode > param)
Create a floating-point is-NaN check node.
std::shared_ptr< DAGNode > mkIand(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an iand node.
std::shared_ptr< DAGNode > parseExpr()
std::shared_ptr< DAGNode > mkRegRange(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a regex range node.
std::shared_ptr< DAGNode > mkAttribute(const std::shared_ptr< Sort > &sort, const std::string &name, const std::vector< std::shared_ptr< DAGNode > > ¶ms)
std::shared_ptr< DAGNode > mkBvSgt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed greater than node.
std::shared_ptr< DAGNode > mkFpMul(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point multiplication node.
std::shared_ptr< DAGNode > mkLog(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an log node.
std::shared_ptr< DAGNode > mkStrGe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a string greater-than-or-equal node.
std::shared_ptr< DAGNode > mkStrSplitAtRe(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
std::unique_ptr< NodeManager > node_manager
std::shared_ptr< DAGNode > mkStrSuffixof(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string suffix check node.
std::shared_ptr< DAGNode > mkAtan2(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an atan2 node.
LET_MODE current_let_mode
std::shared_ptr< DAGNode > mkStrToCode(std::shared_ptr< DAGNode > param)
Create a string to-code conversion node.
std::shared_ptr< DAGNode > mkConstStr(const std::string &v)
Create a string constant.
std::unique_ptr< SortManager > sort_manager
std::shared_ptr< DAGNode > mkPlaceholderVar(const std::string &name)
std::shared_ptr< DAGNode > mkRoundingMode(const std::string &mode)
Create a rounding mode constant.
std::shared_ptr< DAGNode > mkStrReplaceRegAll(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace-regex-all node.
std::shared_ptr< DAGNode > mkImplies(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an implies node.
std::shared_ptr< DAGNode > mkStrRev(std::shared_ptr< DAGNode > param)
Create a string reverse node.
std::shared_ptr< DAGNode > mkCsc(std::shared_ptr< DAGNode > param)
Create an csc node.
std::shared_ptr< DAGNode > mkBvUgt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned greater than node.
std::shared_ptr< Sort > getSort(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Get sort.
std::shared_ptr< DAGNode > mkFpGt(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point greater than node.
std::unordered_map< std::string, std::shared_ptr< DAGNode > > fun_key_map
std::shared_ptr< DAGNode > mkFpSub(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point subtraction node.
std::shared_ptr< DAGNode > mkFloor(std::shared_ptr< DAGNode > param)
Create an floor node.
std::shared_ptr< DAGNode > mkAbs(std::shared_ptr< DAGNode > param)
Create an abs node.
std::shared_ptr< DAGNode > mkNeg(std::shared_ptr< DAGNode > param)
Create an neg node.
std::shared_ptr< DAGNode > mkExp(std::shared_ptr< DAGNode > param)
Create an exp node.
std::shared_ptr< DAGNode > mkBvLshr(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector logical shift right node.
std::shared_ptr< DAGNode > mkStrSplitRest(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > s)
std::shared_ptr< DAGNode > mkAcot(std::shared_ptr< DAGNode > param)
Create an acot node.
std::shared_ptr< DAGNode > mkMod(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an mod node.
static const std::shared_ptr< Sort > INT_SORT
static std::shared_ptr< Sort > getNull()
static const std::shared_ptr< Sort > BOOL_SORT
static const std::shared_ptr< Sort > REAL_SORT
static const std::shared_ptr< Sort > NULL_SORT
static bool isReal(const std::string &str)
static bool isScientificNotation(const std::string &str)
static bool isFP(const std::string &str)
static bool isString(const std::string &str)
static bool isInt(const std::string &str)
static bool isBV(const std::string &str)
static bool isNumber(const std::string &str)
const std::string PRESERVING_LET_BIND_VAR_SUFFIX
NODE_KIND getOperKind(const std::string &s)
@ ProcessingParamFuncArgs
@ ProcessingParamFuncParams
@ NT_FP_ROUND_TO_INTEGRAL
std::shared_ptr< DAGNode > result
std::vector< std::shared_ptr< DAGNode > > func_args
std::vector< std::shared_ptr< DAGNode > > oper_params
std::string second_symbol