35#include <unordered_map>
36#include <unordered_set>
177 std::vector<DTConstructorDecl>
ctors;
205 std::unordered_map<std::string, std::shared_ptr<DAGNode>>
207 std::unordered_map<std::string, std::shared_ptr<DAGNode>>
209 std::unordered_map<std::string, std::shared_ptr<DAGNode>>
fun_key_map;
210 std::unordered_map<std::string, std::shared_ptr<DAGNode>>
213 std::unordered_map<std::string, std::vector<std::shared_ptr<DAGNode>>>
215 std::unordered_map<std::string, size_t>
217 std::vector<std::shared_ptr<DAGNode>>
221 std::vector<std::vector<DTTypeDecl>>
223 std::unordered_set<std::string>
226 std::unordered_set<std::string>
247 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
249 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
251 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
253 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
255 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
270 std::vector<std::pair<std::shared_ptr<DAGNode>,
271 std::vector<std::vector<std::shared_ptr<DAGNode>>>>>
276 std::unordered_map<std::string, std::unordered_set<size_t>>
290 Parser(
const std::string &filename);
308 const std::vector<std::shared_ptr<DAGNode>> &new_assertions) {
311 std::shared_ptr<DAGNode>
mkUFVNode(
const std::string &name,
312 const std::shared_ptr<Sort> &sort) {
315 std::shared_ptr<DAGNode>
322 std::unordered_map<std::string, std::shared_ptr<DAGNode>> &
getFunKeyMap() {
326 std::unordered_map<std::string, std::shared_ptr<Sort>> &
getSortNames() {
341 bool parse(
const std::string &filename);
351 bool parseStr(
const std::string &constraint);
363 bool assert(
const std::string &constraint);
373 bool assert(std::shared_ptr<DAGNode> node);
384 std::shared_ptr<DAGNode>
mkExpr(
const std::string &expression);
402 std::unordered_map<std::string, std::unordered_set<size_t>>
413 std::vector<std::vector<std::shared_ptr<DAGNode>>>
getAssumptions()
const;
440 std::unordered_map<std::string, std::unordered_set<size_t>>
456 void setOption(
const std::string &key,
const std::string &value);
457 void setOption(
const std::string &key,
const int &value);
458 void setOption(
const std::string &key,
const double &value);
459 void setOption(
const std::string &key,
const bool &value);
466 std::shared_ptr<GlobalOptions>
getOptions()
const;
473 std::vector<std::shared_ptr<DAGNode>>
getVariables()
const;
496 std::shared_ptr<DAGNode>
getVariable(
const std::string &var_name);
506 std::vector<std::shared_ptr<DAGNode>>
getFunctions()
const;
523 std::shared_ptr<Sort>
524 getSort(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
532 std::shared_ptr<Sort>
getSort(std::shared_ptr<DAGNode> param);
541 std::shared_ptr<Sort>
getSort(std::shared_ptr<DAGNode> l,
542 std::shared_ptr<DAGNode> r);
552 std::shared_ptr<Sort>
getSort(std::shared_ptr<DAGNode> l,
553 std::shared_ptr<DAGNode> r,
554 std::shared_ptr<DAGNode> m);
613 std::shared_ptr<DAGNode>
mkOper(
const std::shared_ptr<Sort> &sort,
615 std::shared_ptr<DAGNode> p);
626 std::shared_ptr<DAGNode>
mkOper(
const std::shared_ptr<Sort> &sort,
628 std::shared_ptr<DAGNode> l,
629 std::shared_ptr<DAGNode> r);
641 std::shared_ptr<DAGNode>
mkOper(
const std::shared_ptr<Sort> &sort,
643 std::shared_ptr<DAGNode> l,
644 std::shared_ptr<DAGNode> m,
645 std::shared_ptr<DAGNode> r);
655 std::shared_ptr<DAGNode>
656 mkOper(
const std::shared_ptr<Sort> &sort,
const NODE_KIND &t,
const std::vector<std::shared_ptr<DAGNode>> &p);
714 std::shared_ptr<DAGNode>
rewrite(
NODE_KIND &t, std::shared_ptr<DAGNode> &p);
723 std::shared_ptr<DAGNode>
rewrite(
NODE_KIND &t, std::shared_ptr<DAGNode> &l, std::shared_ptr<DAGNode> &r);
733 std::shared_ptr<DAGNode>
rewrite(
NODE_KIND &t, std::shared_ptr<DAGNode> &l, std::shared_ptr<DAGNode> &m, std::shared_ptr<DAGNode> &r);
744 std::shared_ptr<DAGNode>
rewrite(
NODE_KIND &t, std::shared_ptr<DAGNode> &l, std::shared_ptr<DAGNode> &ml, std::shared_ptr<DAGNode> &mr, std::shared_ptr<DAGNode> &r);
753 std::vector<std::shared_ptr<DAGNode>> &p);
761 std::shared_ptr<DAGNode>
770 std::shared_ptr<DAGNode>
771 mkNode(std::shared_ptr<Sort> sort,
NODE_KIND t, std::string name, std::vector<std::shared_ptr<DAGNode>> params) {
774 if (result !=
nullptr)
775 throw std::runtime_error(
776 "rewrite_oper should return nullptr for commutative operators");
782 std::vector<std::shared_ptr<DAGNode>> nparams(params.begin() + 1,
785 nparams.insert(nparams.begin(), params[0]);
798 if (result !=
nullptr)
811 static std::vector<std::shared_ptr<DAGNode>>
812 sortParams(
const std::vector<std::shared_ptr<DAGNode>> &p);
824 std::shared_ptr<DAGNode>
826 const std::vector<std::shared_ptr<Sort>> ¶ms,
827 std::shared_ptr<Sort> out_sort);
838 std::shared_ptr<DAGNode>
840 const std::vector<std::shared_ptr<DAGNode>> ¶ms,
841 std::shared_ptr<Sort> out_sort,
842 std::shared_ptr<DAGNode> body);
853 std::shared_ptr<DAGNode>
855 const std::vector<std::shared_ptr<DAGNode>> ¶ms,
856 std::shared_ptr<Sort> out_sort,
857 std::shared_ptr<DAGNode> body);
866 std::shared_ptr<DAGNode>
868 const std::vector<std::shared_ptr<DAGNode>> ¶ms);
870 std::shared_ptr<DAGNode>
871 mkPattern(
const std::shared_ptr<Sort> &sort,
const std::string &name,
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
872 std::shared_ptr<DAGNode>
mkNoPattern(
const std::shared_ptr<Sort> &sort,
873 const std::string &name,
874 std::shared_ptr<DAGNode> param);
875 std::shared_ptr<DAGNode>
mkWeight(
const std::shared_ptr<Sort> &sort,
876 const std::string &name,
877 std::shared_ptr<DAGNode> weight);
878 std::shared_ptr<DAGNode>
879 mkAttribute(
const std::shared_ptr<Sort> &sort,
const std::string &name,
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
888 std::shared_ptr<DAGNode>
889 mkApplyUF(
const std::shared_ptr<Sort> &sort,
const std::string &name,
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
899 std::shared_ptr<Sort>
mkSortDec(
const std::string &name,
const size_t &arity);
909 std::shared_ptr<Sort>
911 const std::vector<std::shared_ptr<Sort>> ¶ms,
912 std::shared_ptr<Sort> out_sort);
963 std::shared_ptr<Sort>
mkBVSort(
const size_t &width);
971 std::shared_ptr<Sort>
mkFPSort(
const size_t &e,
const size_t &s);
979 std::shared_ptr<Sort>
mkArraySort(std::shared_ptr<Sort> index,
980 std::shared_ptr<Sort> elem);
989 std::shared_ptr<DAGNode>
declareVar(
const std::string &name,
990 const std::string &sort);
998 std::shared_ptr<DAGNode>
declareVar(
const std::string &name,
999 const std::shared_ptr<Sort> &sort);
1007 std::shared_ptr<DAGNode>
mkTrue();
1014 std::shared_ptr<DAGNode>
mkFalse();
1029 std::shared_ptr<DAGNode>
1030 mkEq(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1039 const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1048 std::shared_ptr<DAGNode>
mkConstInt(
const std::string &v);
1056 std::shared_ptr<DAGNode>
mkConstInt(
const int &v);
1080 std::shared_ptr<DAGNode>
mkConstReal(
const std::string &v);
1096 std::shared_ptr<DAGNode>
mkConstReal(
const double &v);
1120 std::shared_ptr<DAGNode>
mkConstStr(
const std::string &v);
1129 std::shared_ptr<DAGNode>
mkConstBv(
const std::string &v,
1130 const size_t &width);
1140 std::shared_ptr<DAGNode>
mkConstFp(
const std::string &v,
const size_t &e,
1149 std::shared_ptr<DAGNode>
1158 std::shared_ptr<DAGNode>
mkConstReg(
const std::string &v);
1166 std::shared_ptr<DAGNode>
1175 std::shared_ptr<DAGNode>
1186 std::shared_ptr<DAGNode>
mkVar(
const std::shared_ptr<Sort> &sort,
1187 const std::string &name);
1188 std::shared_ptr<DAGNode>
1197 std::shared_ptr<DAGNode>
1198 mkTempVar(
const std::shared_ptr<Sort> &sort);
1206 std::shared_ptr<DAGNode>
mkVarBool(
const std::string &name);
1214 std::shared_ptr<DAGNode>
mkVarInt(
const std::string &name);
1222 std::shared_ptr<DAGNode>
mkVarReal(
const std::string &name);
1231 std::shared_ptr<DAGNode>
mkVarBv(
const std::string &name,
1232 const size_t &width);
1242 std::shared_ptr<DAGNode>
mkVarFp(
const std::string &name,
const size_t &e,
1251 std::shared_ptr<DAGNode>
mkVarStr(
const std::string &name);
1259 std::shared_ptr<DAGNode>
mkVarReg(
const std::string &name);
1268 std::shared_ptr<DAGNode>
1270 const std::string &name);
1280 std::shared_ptr<DAGNode>
mkArray(
const std::string &name,
1281 std::shared_ptr<Sort> index,
1282 std::shared_ptr<Sort> elem);
1291 std::shared_ptr<DAGNode>
1293 std::shared_ptr<DAGNode> value);
1302 std::shared_ptr<DAGNode>
mkNot(std::shared_ptr<DAGNode> param);
1310 std::shared_ptr<DAGNode>
1311 mkAnd(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1319 std::shared_ptr<DAGNode>
1320 mkOr(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1328 std::shared_ptr<DAGNode>
1329 mkImplies(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1337 std::shared_ptr<DAGNode>
1338 mkXor(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1348 std::shared_ptr<DAGNode>
mkIte(std::shared_ptr<DAGNode> cond,
1349 std::shared_ptr<DAGNode> l,
1350 std::shared_ptr<DAGNode> r);
1360 std::shared_ptr<DAGNode>
1361 mkIte(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1370 std::shared_ptr<DAGNode>
1371 mkAdd(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1379 std::shared_ptr<DAGNode>
1380 mkMul(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1388 std::shared_ptr<DAGNode>
1389 mkIand(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1397 std::shared_ptr<DAGNode>
mkPow2(std::shared_ptr<DAGNode> param);
1406 std::shared_ptr<DAGNode>
mkPow(std::shared_ptr<DAGNode> l,
1407 std::shared_ptr<DAGNode> r);
1415 std::shared_ptr<DAGNode>
1416 mkSub(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1424 std::shared_ptr<DAGNode>
mkNeg(std::shared_ptr<DAGNode> param);
1435 std::shared_ptr<DAGNode>
1436 mkDiv(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1444 std::shared_ptr<DAGNode>
1445 mkDivInt(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1453 std::shared_ptr<DAGNode>
1454 mkDivReal(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1463 std::shared_ptr<DAGNode>
mkMod(std::shared_ptr<DAGNode> l,
1464 std::shared_ptr<DAGNode> r);
1472 std::shared_ptr<DAGNode>
mkAbs(std::shared_ptr<DAGNode> param);
1482 std::shared_ptr<DAGNode>
1483 mkSqrt(std::shared_ptr<DAGNode> param);
1493 std::shared_ptr<DAGNode>
1502 std::shared_ptr<DAGNode>
1503 mkCeil(std::shared_ptr<DAGNode> param);
1511 std::shared_ptr<DAGNode>
1512 mkFloor(std::shared_ptr<DAGNode> param);
1520 std::shared_ptr<DAGNode>
1521 mkRound(std::shared_ptr<DAGNode> param);
1530 std::shared_ptr<DAGNode>
mkExp(std::shared_ptr<DAGNode> param);
1540 std::shared_ptr<DAGNode>
mkLn(std::shared_ptr<DAGNode> param);
1550 std::shared_ptr<DAGNode>
mkLg(std::shared_ptr<DAGNode> param);
1560 std::shared_ptr<DAGNode>
mkLb(std::shared_ptr<DAGNode> param);
1572 std::shared_ptr<DAGNode>
mkLog(std::shared_ptr<DAGNode> l,
1573 std::shared_ptr<DAGNode> r);
1581 std::shared_ptr<DAGNode>
mkSin(std::shared_ptr<DAGNode> param);
1589 std::shared_ptr<DAGNode>
mkCos(std::shared_ptr<DAGNode> param);
1597 std::shared_ptr<DAGNode>
mkSec(std::shared_ptr<DAGNode> param);
1605 std::shared_ptr<DAGNode>
mkCsc(std::shared_ptr<DAGNode> param);
1615 std::shared_ptr<DAGNode>
mkTan(std::shared_ptr<DAGNode> param);
1625 std::shared_ptr<DAGNode>
mkCot(std::shared_ptr<DAGNode> param);
1635 std::shared_ptr<DAGNode>
1636 mkAsin(std::shared_ptr<DAGNode> param);
1646 std::shared_ptr<DAGNode>
1647 mkAcos(std::shared_ptr<DAGNode> param);
1657 std::shared_ptr<DAGNode>
1658 mkAsec(std::shared_ptr<DAGNode> param);
1668 std::shared_ptr<DAGNode>
1669 mkAcsc(std::shared_ptr<DAGNode> param);
1677 std::shared_ptr<DAGNode>
1678 mkAtan(std::shared_ptr<DAGNode> param);
1686 std::shared_ptr<DAGNode>
1687 mkAcot(std::shared_ptr<DAGNode> param);
1695 std::shared_ptr<DAGNode>
1696 mkSinh(std::shared_ptr<DAGNode> param);
1704 std::shared_ptr<DAGNode>
1705 mkCosh(std::shared_ptr<DAGNode> param);
1713 std::shared_ptr<DAGNode>
1714 mkTanh(std::shared_ptr<DAGNode> param);
1722 std::shared_ptr<DAGNode>
1723 mkSech(std::shared_ptr<DAGNode> param);
1733 std::shared_ptr<DAGNode>
1734 mkCsch(std::shared_ptr<DAGNode> param);
1744 std::shared_ptr<DAGNode>
1745 mkCoth(std::shared_ptr<DAGNode> param);
1753 std::shared_ptr<DAGNode>
1754 mkAsinh(std::shared_ptr<DAGNode> param);
1764 std::shared_ptr<DAGNode>
1765 mkAcosh(std::shared_ptr<DAGNode> param);
1775 std::shared_ptr<DAGNode>
1776 mkAtanh(std::shared_ptr<DAGNode> param);
1786 std::shared_ptr<DAGNode>
1787 mkAsech(std::shared_ptr<DAGNode> param);
1797 std::shared_ptr<DAGNode>
1798 mkAcsch(std::shared_ptr<DAGNode> param);
1808 std::shared_ptr<DAGNode>
1809 mkAcoth(std::shared_ptr<DAGNode> param);
1822 std::shared_ptr<DAGNode>
mkAtan2(std::shared_ptr<DAGNode> l,
1823 std::shared_ptr<DAGNode> r);
1831 std::shared_ptr<DAGNode>
1832 mkLe(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1840 std::shared_ptr<DAGNode>
1841 mkLt(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1849 std::shared_ptr<DAGNode>
mkGe(
const std::vector<std::shared_ptr<DAGNode>>
1858 std::shared_ptr<DAGNode>
1859 mkGt(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
1869 std::shared_ptr<DAGNode>
1870 mkToInt(std::shared_ptr<DAGNode> param);
1878 std::shared_ptr<DAGNode>
1879 mkToReal(std::shared_ptr<DAGNode> param);
1888 std::shared_ptr<DAGNode>
1889 mkIsInt(std::shared_ptr<DAGNode> param);
1898 std::shared_ptr<DAGNode>
1900 std::shared_ptr<DAGNode> r);
1908 std::shared_ptr<DAGNode>
1909 mkIsPrime(std::shared_ptr<DAGNode> param);
1917 std::shared_ptr<DAGNode>
1918 mkIsEven(std::shared_ptr<DAGNode> param);
1926 std::shared_ptr<DAGNode>
1927 mkIsOdd(std::shared_ptr<DAGNode> param);
1937 std::shared_ptr<DAGNode>
mkPi();
1944 std::shared_ptr<DAGNode>
mkE();
1951 std::shared_ptr<DAGNode>
mkInfinity(std::shared_ptr<Sort> sort);
1959 std::shared_ptr<DAGNode>
1968 std::shared_ptr<DAGNode>
1977 std::shared_ptr<DAGNode>
mkNaN(std::shared_ptr<Sort> sort =
nullptr);
2011 std::shared_ptr<DAGNode>
mkGcd(std::shared_ptr<DAGNode> l,
2012 std::shared_ptr<DAGNode> r);
2023 std::shared_ptr<DAGNode>
mkLcm(std::shared_ptr<DAGNode> l,
2024 std::shared_ptr<DAGNode> r);
2034 std::shared_ptr<DAGNode>
2035 mkFact(std::shared_ptr<DAGNode> param);
2044 std::shared_ptr<DAGNode>
mkBvNot(std::shared_ptr<DAGNode> param);
2052 std::shared_ptr<DAGNode>
2053 mkBvAnd(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2061 std::shared_ptr<DAGNode>
2062 mkBvOr(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2070 std::shared_ptr<DAGNode>
2071 mkBvXor(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2080 std::shared_ptr<DAGNode>
2081 mkBvNand(std::shared_ptr<DAGNode> l,
2082 std::shared_ptr<DAGNode> r);
2091 std::shared_ptr<DAGNode>
2092 mkBvNor(std::shared_ptr<DAGNode> l,
2093 std::shared_ptr<DAGNode> r);
2101 std::shared_ptr<DAGNode>
2102 mkBvComp(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2111 std::shared_ptr<DAGNode>
2112 mkBvXnor(std::shared_ptr<DAGNode> l,
2113 std::shared_ptr<DAGNode> r);
2121 std::shared_ptr<DAGNode>
mkBvNeg(std::shared_ptr<DAGNode> param);
2129 std::shared_ptr<DAGNode>
2130 mkBvAdd(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2139 std::shared_ptr<DAGNode>
mkBvSub(std::shared_ptr<DAGNode> l,
2140 std::shared_ptr<DAGNode> r);
2148 std::shared_ptr<DAGNode>
2149 mkBvMul(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2160 std::shared_ptr<DAGNode>
mkBvUdiv(std::shared_ptr<DAGNode> l,
2161 std::shared_ptr<DAGNode> r);
2172 std::shared_ptr<DAGNode>
mkBvUrem(std::shared_ptr<DAGNode> l,
2173 std::shared_ptr<DAGNode> r);
2184 std::shared_ptr<DAGNode>
mkBvUmod(std::shared_ptr<DAGNode> l,
2185 std::shared_ptr<DAGNode> r);
2197 std::shared_ptr<DAGNode>
mkBvSdiv(std::shared_ptr<DAGNode> l,
2198 std::shared_ptr<DAGNode> r);
2209 std::shared_ptr<DAGNode>
mkBvSrem(std::shared_ptr<DAGNode> l,
2210 std::shared_ptr<DAGNode> r);
2221 std::shared_ptr<DAGNode>
mkBvSmod(std::shared_ptr<DAGNode> l,
2222 std::shared_ptr<DAGNode> r);
2231 std::shared_ptr<DAGNode>
mkBvShl(std::shared_ptr<DAGNode> l,
2232 std::shared_ptr<DAGNode> r);
2241 std::shared_ptr<DAGNode>
mkBvLshr(std::shared_ptr<DAGNode> l,
2242 std::shared_ptr<DAGNode> r);
2251 std::shared_ptr<DAGNode>
mkBvAshr(std::shared_ptr<DAGNode> l,
2252 std::shared_ptr<DAGNode> r);
2261 const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2275 std::shared_ptr<DAGNode>
mkBvExtract(std::shared_ptr<DAGNode> l,
2276 std::shared_ptr<DAGNode> r,
2277 std::shared_ptr<DAGNode> s);
2290 std::shared_ptr<DAGNode>
mkBvRepeat(std::shared_ptr<DAGNode> l,
2291 std::shared_ptr<DAGNode> r);
2303 std::shared_ptr<DAGNode>
2305 std::shared_ptr<DAGNode> r);
2317 std::shared_ptr<DAGNode>
2319 std::shared_ptr<DAGNode> r);
2328 std::shared_ptr<DAGNode>
2330 std::shared_ptr<DAGNode> r);
2339 std::shared_ptr<DAGNode>
2341 std::shared_ptr<DAGNode> r);
2351 std::shared_ptr<DAGNode>
mkBvUlt(std::shared_ptr<DAGNode> l,
2352 std::shared_ptr<DAGNode> r);
2361 std::shared_ptr<DAGNode>
mkBvUle(std::shared_ptr<DAGNode> l,
2362 std::shared_ptr<DAGNode> r);
2371 std::shared_ptr<DAGNode>
mkBvUgt(std::shared_ptr<DAGNode> l,
2372 std::shared_ptr<DAGNode> r);
2381 std::shared_ptr<DAGNode>
mkBvUge(std::shared_ptr<DAGNode> l,
2382 std::shared_ptr<DAGNode> r);
2391 std::shared_ptr<DAGNode>
mkBvSlt(std::shared_ptr<DAGNode> l,
2392 std::shared_ptr<DAGNode> r);
2401 std::shared_ptr<DAGNode>
mkBvSle(std::shared_ptr<DAGNode> l,
2402 std::shared_ptr<DAGNode> r);
2411 std::shared_ptr<DAGNode>
mkBvSgt(std::shared_ptr<DAGNode> l,
2412 std::shared_ptr<DAGNode> r);
2421 std::shared_ptr<DAGNode>
mkBvSge(std::shared_ptr<DAGNode> l,
2422 std::shared_ptr<DAGNode> r);
2431 std::shared_ptr<DAGNode>
2432 mkBvToNat(std::shared_ptr<DAGNode> param);
2443 std::shared_ptr<DAGNode>
2444 mkNatToBv(std::shared_ptr<DAGNode> param,
2445 std::shared_ptr<DAGNode> width);
2453 std::shared_ptr<DAGNode>
2454 mkBvToInt(std::shared_ptr<DAGNode> param);
2455 std::shared_ptr<DAGNode>
mkUbvToInt(std::shared_ptr<DAGNode> param);
2456 std::shared_ptr<DAGNode>
mkSbvToInt(std::shared_ptr<DAGNode> param);
2467 std::shared_ptr<DAGNode>
2468 mkIntToBv(std::shared_ptr<DAGNode> param,
2469 std::shared_ptr<DAGNode> width);
2478 std::shared_ptr<DAGNode>
2479 mkFpAdd(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2487 std::shared_ptr<DAGNode>
2488 mkFpSub(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2496 std::shared_ptr<DAGNode>
2497 mkFpMul(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2507 std::shared_ptr<DAGNode>
2508 mkFpDiv(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2516 std::shared_ptr<DAGNode>
mkFpAbs(std::shared_ptr<DAGNode> param);
2524 std::shared_ptr<DAGNode>
mkFpNeg(std::shared_ptr<DAGNode> param);
2535 std::shared_ptr<DAGNode>
mkFpRem(std::shared_ptr<DAGNode> l,
2536 std::shared_ptr<DAGNode> r);
2547 std::shared_ptr<DAGNode>
mkFpFma(
const std::vector<std::shared_ptr<DAGNode>>
2559 std::shared_ptr<DAGNode>
2560 mkFpSqrt(std::shared_ptr<DAGNode> rm,
2561 std::shared_ptr<DAGNode> param);
2562 std::shared_ptr<DAGNode>
2563 mkFpSqrt(std::shared_ptr<DAGNode> param);
2573 std::shared_ptr<DAGNode> rm,
2574 std::shared_ptr<DAGNode> param);
2576 std::shared_ptr<DAGNode> param);
2585 std::shared_ptr<DAGNode>
2586 mkFpMin(std::shared_ptr<DAGNode> l,
2587 std::shared_ptr<DAGNode> r);
2596 std::shared_ptr<DAGNode>
2597 mkFpMax(std::shared_ptr<DAGNode> l,
2598 std::shared_ptr<DAGNode> r);
2607 std::shared_ptr<DAGNode>
2608 mkFpLe(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2616 std::shared_ptr<DAGNode>
2617 mkFpLt(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2625 std::shared_ptr<DAGNode>
2626 mkFpGe(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2634 std::shared_ptr<DAGNode>
2635 mkFpGt(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2645 std::shared_ptr<DAGNode>
2646 mkFpEq(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
2659 std::shared_ptr<DAGNode>
2660 mkFpToUbv(std::shared_ptr<DAGNode> rm, std::shared_ptr<DAGNode> param,
2661 std::shared_ptr<DAGNode> size);
2674 std::shared_ptr<DAGNode>
2675 mkFpToSbv(std::shared_ptr<DAGNode> rm, std::shared_ptr<DAGNode> param,
2676 std::shared_ptr<DAGNode> size);
2686 std::shared_ptr<DAGNode>
2697 std::shared_ptr<DAGNode>
2698 mkToFp(std::shared_ptr<DAGNode> eb, std::shared_ptr<DAGNode> sb, std::shared_ptr<DAGNode> rm,
2699 std::shared_ptr<DAGNode> param);
2700 std::shared_ptr<DAGNode>
2701 mkToFp(std::shared_ptr<DAGNode> eb, std::shared_ptr<DAGNode> sb,
2702 std::shared_ptr<DAGNode> param);
2704 std::shared_ptr<DAGNode> eb, std::shared_ptr<DAGNode> sb, std::shared_ptr<DAGNode> rm,
2705 std::shared_ptr<DAGNode> param);
2706 std::shared_ptr<DAGNode>
2707 mkFpConst(std::shared_ptr<DAGNode> sign, std::shared_ptr<DAGNode> exp,
2708 std::shared_ptr<DAGNode> mant);
2711 std::shared_ptr<DAGNode>
mkRootObj(std::shared_ptr<DAGNode> expr,
2714 const std::vector<std::shared_ptr<DAGNode>> &coeffs,
2715 std::shared_ptr<DAGNode> lower_bound,
2716 std::shared_ptr<DAGNode> upper_bound);
2726 std::shared_ptr<DAGNode>
2735 std::shared_ptr<DAGNode>
2744 std::shared_ptr<DAGNode>
2753 std::shared_ptr<DAGNode>
2754 mkFpIsInf(std::shared_ptr<DAGNode> param);
2762 std::shared_ptr<DAGNode>
2763 mkFpIsNaN(std::shared_ptr<DAGNode> param);
2771 std::shared_ptr<DAGNode>
2772 mkFpIsNeg(std::shared_ptr<DAGNode> param);
2780 std::shared_ptr<DAGNode>
2781 mkFpIsPos(std::shared_ptr<DAGNode> param);
2791 std::shared_ptr<DAGNode>
mkSelect(std::shared_ptr<DAGNode> l,
2792 std::shared_ptr<DAGNode> r);
2804 std::shared_ptr<DAGNode>
mkStore(std::shared_ptr<DAGNode> l,
2805 std::shared_ptr<DAGNode> r,
2806 std::shared_ptr<DAGNode> v);
2815 std::shared_ptr<DAGNode>
2816 mkStrLen(std::shared_ptr<DAGNode> param);
2824 std::shared_ptr<DAGNode>
2825 mkStrConcat(
const std::vector<std::shared_ptr<DAGNode>>
2836 std::shared_ptr<DAGNode>
2837 mkStrSubstr(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2838 std::shared_ptr<DAGNode> s);
2847 std::shared_ptr<DAGNode>
2849 std::shared_ptr<DAGNode> r);
2858 std::shared_ptr<DAGNode>
2860 std::shared_ptr<DAGNode> r);
2870 std::shared_ptr<DAGNode>
2871 mkStrIndexof(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2872 std::shared_ptr<DAGNode> s);
2881 std::shared_ptr<DAGNode>
2883 std::shared_ptr<DAGNode> r);
2893 std::shared_ptr<DAGNode>
2894 mkStrUpdate(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2895 std::shared_ptr<DAGNode> v);
2905 std::shared_ptr<DAGNode>
2906 mkStrReplace(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2907 std::shared_ptr<DAGNode> v);
2917 std::shared_ptr<DAGNode>
2918 mkStrReplaceAll(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2919 std::shared_ptr<DAGNode> v);
2929 std::shared_ptr<DAGNode>
2930 mkStrReplaceReg(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2931 std::shared_ptr<DAGNode> v);
2941 std::shared_ptr<DAGNode>
2943 std::shared_ptr<DAGNode> v);
2952 std::shared_ptr<DAGNode>
2954 std::shared_ptr<DAGNode> r);
2962 std::shared_ptr<DAGNode>
2971 std::shared_ptr<DAGNode>
2980 std::shared_ptr<DAGNode>
2981 mkStrRev(std::shared_ptr<DAGNode> param);
2990 std::shared_ptr<DAGNode>
2992 std::shared_ptr<DAGNode> r);
2994 std::shared_ptr<DAGNode>
2995 mkStrSplitAt(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2996 std::shared_ptr<DAGNode> s);
2998 std::shared_ptr<DAGNode>
2999 mkStrSplitRest(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
3000 std::shared_ptr<DAGNode> s);
3002 std::shared_ptr<DAGNode>
3004 std::shared_ptr<DAGNode> r);
3006 std::shared_ptr<DAGNode>
3007 mkStrSplitAtRe(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
3008 std::shared_ptr<DAGNode> s);
3010 std::shared_ptr<DAGNode>
3012 std::shared_ptr<DAGNode> s);
3014 std::shared_ptr<DAGNode>
3016 std::shared_ptr<DAGNode> r);
3025 std::shared_ptr<DAGNode>
3026 mkStrLt(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
3034 std::shared_ptr<DAGNode>
3035 mkStrLe(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
3043 std::shared_ptr<DAGNode>
3044 mkStrGt(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
3052 std::shared_ptr<DAGNode>
3053 mkStrGe(
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
3063 std::shared_ptr<DAGNode>
3065 std::shared_ptr<DAGNode> r);
3074 std::shared_ptr<DAGNode>
3076 std::shared_ptr<DAGNode> r);
3084 std::shared_ptr<DAGNode>
3094 std::shared_ptr<DAGNode>
3105 std::shared_ptr<DAGNode>
3114 std::shared_ptr<DAGNode>
3127 std::shared_ptr<DAGNode>
3139 std::shared_ptr<DAGNode> param);
3158 std::shared_ptr<DAGNode>
mkRegAll();
3180 const std::vector<std::shared_ptr<DAGNode>> ¶ms);
3190 std::shared_ptr<DAGNode>
3191 mkRegUnion(
const std::vector<std::shared_ptr<DAGNode>>
3203 std::shared_ptr<DAGNode>
3204 mkRegInter(
const std::vector<std::shared_ptr<DAGNode>>
3216 std::shared_ptr<DAGNode>
mkRegDiff(
const std::vector<std::shared_ptr<DAGNode>>
3228 std::shared_ptr<DAGNode>
3229 mkRegStar(std::shared_ptr<DAGNode> param);
3240 std::shared_ptr<DAGNode>
mkRegPlus(std::shared_ptr<DAGNode> param);
3251 std::shared_ptr<DAGNode>
mkRegOpt(std::shared_ptr<DAGNode> param);
3262 std::shared_ptr<DAGNode>
mkRegRange(std::shared_ptr<DAGNode> l,
3263 std::shared_ptr<DAGNode> r);
3275 std::shared_ptr<DAGNode>
3277 std::shared_ptr<DAGNode> r);
3290 std::shared_ptr<DAGNode>
mkRegLoop(std::shared_ptr<DAGNode> l,
3291 std::shared_ptr<DAGNode> r,
3292 std::shared_ptr<DAGNode> s);
3303 std::shared_ptr<DAGNode>
3317 std::shared_ptr<DAGNode>
3318 mkReplaceReg(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
3319 std::shared_ptr<DAGNode> v);
3331 std::shared_ptr<DAGNode>
3332 mkReplaceRegAll(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
3333 std::shared_ptr<DAGNode> v);
3345 std::shared_ptr<DAGNode>
3347 std::shared_ptr<DAGNode> r);
3356 std::shared_ptr<DAGNode>
mkMax(
3357 const std::vector<std::shared_ptr<DAGNode>> ¶ms);
3365 std::shared_ptr<DAGNode>
mkMin(
3366 const std::vector<std::shared_ptr<DAGNode>> ¶ms);
3375 std::shared_ptr<DAGNode>
3376 mkLet(
const std::vector<std::shared_ptr<DAGNode>>
3387 std::shared_ptr<DAGNode>
mkQuantVar(
const std::string &name,
3388 std::shared_ptr<Sort> sort);
3396 std::shared_ptr<DAGNode>
3397 mkForall(
const std::vector<std::shared_ptr<DAGNode>>
3406 std::shared_ptr<DAGNode>
3407 mkExists(
const std::vector<std::shared_ptr<DAGNode>>
3418 std::shared_ptr<DAGNode>
3420 const std::vector<std::shared_ptr<DAGNode>>
3466 std::shared_ptr<DAGNode>
3467 getZero(std::shared_ptr<Sort> sort);
3480 std::shared_ptr<DAGNode>
3482 std::unordered_map<std::string, std::shared_ptr<DAGNode>> ¶ms);
3492 std::shared_ptr<DAGNode>
3493 applyFun(std::shared_ptr<DAGNode> fun,
3494 const std::vector<std::shared_ptr<DAGNode>> ¶ms);
3548 bool isZero(std::shared_ptr<DAGNode> expr);
3556 bool isOne(std::shared_ptr<DAGNode> expr);
3558 bool isOnes(std::shared_ptr<DAGNode> expr);
3567 std::shared_ptr<DAGNode>
expandLet(std::shared_ptr<DAGNode> expr);
3585 std::shared_ptr<DAGNode>
3587 const std::unordered_set<std::shared_ptr<DAGNode>> &nodes);
3596 std::shared_ptr<DAGNode>
rename(std::shared_ptr<DAGNode> expr,
3597 const std::string &new_name);
3606 std::string
toString(std::shared_ptr<DAGNode> expr);
3622 std::string
toString(std::shared_ptr<Sort> sort);
3644 std::string
dumpSMT2(
const std::string &filename);
3647 std::shared_ptr<DAGNode>
3648 mkApplyDTFun(
const std::shared_ptr<Sort> &sort,
const std::string &name,
const std::vector<std::shared_ptr<DAGNode>> ¶ms);
3656 size_t removeFuns(
const std::vector<std::string> &funcNames);
3679 std::shared_ptr<DAGNode>
3681 const std::vector<std::shared_ptr<DAGNode>> &func_args,
3682 const std::vector<std::shared_ptr<DAGNode>> &oper_params);
3683 std::vector<std::shared_ptr<DAGNode>>
parseParams();
3685 std::shared_ptr<DAGNode>
parseLet();
3686 std::shared_ptr<DAGNode>
mkLetBindVar(
const std::string &name,
3687 const std::shared_ptr<DAGNode> &expr);
3688 std::shared_ptr<DAGNode>
3690 std::shared_ptr<DAGNode>
3691 mkLetChain(
const std::vector<std::shared_ptr<DAGNode>> &bind_var_lists,
3692 const std::shared_ptr<DAGNode> &body);
3695 std::shared_ptr<DAGNode>
parseQuant(
const std::string &type);
3701 std::shared_ptr<DAGNode>
3702 mkInternalOper(
const std::shared_ptr<Sort> &sort,
const NODE_KIND &t,
const std::vector<std::shared_ptr<DAGNode>> &p);
3705 std::shared_ptr<DAGNode> expr);
3707 std::shared_ptr<DAGNode> expr);
3710 std::shared_ptr<DAGNode> expr,
3711 std::unordered_map<std::string, std::shared_ptr<DAGNode>> ¶ms,
3712 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3715 std::shared_ptr<DAGNode> node,
3716 std::unordered_map<std::string, std::shared_ptr<DAGNode>> ¶ms);
3719 std::shared_ptr<DAGNode> expr,
3720 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3722 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3726 std::shared_ptr<DAGNode> expr,
3727 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3729 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3732 std::shared_ptr<DAGNode>
toCNF(std::shared_ptr<DAGNode> expr);
3734 std::shared_ptr<DAGNode> expr,
3735 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3737 std::vector<std::shared_ptr<DAGNode>> &clauses);
3738 std::shared_ptr<DAGNode>
3739 toTseitinXor(std::shared_ptr<DAGNode> a, std::shared_ptr<DAGNode> b, std::vector<std::shared_ptr<DAGNode>> &clauses);
3740 std::shared_ptr<DAGNode>
3741 toTseitinEq(std::shared_ptr<DAGNode> a, std::shared_ptr<DAGNode> b, std::vector<std::shared_ptr<DAGNode>> &clauses);
3742 std::shared_ptr<DAGNode>
3743 toTseitinDistinct(std::shared_ptr<DAGNode> a, std::shared_ptr<DAGNode> b, std::vector<std::shared_ptr<DAGNode>> &clauses);
3746 std::shared_ptr<DAGNode> expr,
3747 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3750 std::shared_ptr<DAGNode>
3752 std::shared_ptr<DAGNode>
3754 std::shared_ptr<DAGNode>
3757 std::shared_ptr<DAGNode>
3760 std::shared_ptr<DAGNode> expr,
3761 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3763 std::shared_ptr<DAGNode>
flattenDNF(std::shared_ptr<DAGNode> expr);
3765 std::shared_ptr<DAGNode>
toNNF(std::shared_ptr<DAGNode> expr,
bool is_not);
3767 std::shared_ptr<DAGNode>
3769 const std::unordered_set<std::shared_ptr<DAGNode>> &nodes,
3770 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3777 void err_all(
const ERROR_TYPE e,
const std::string s =
"",
const size_t ln = 0)
const;
3778 void err_all(
const std::shared_ptr<DAGNode> e,
const std::string s =
"",
const size_t ln = 0)
const;
3781 void err_sym_mis(
const std::string mis,
const size_t ln)
const;
3782 void err_sym_mis(
const std::string mis,
const std::string nm,
const size_t ln)
const;
3783 void err_unkwn_sym(
const std::string nm,
const size_t ln)
const;
3784 void err_param_mis(
const std::string nm,
const size_t ln)
const;
3786 void err_param_nnum(
const std::string nm,
const size_t ln)
const;
3788 void err_logic(
const std::string nm,
const size_t ln)
const;
3789 void err_mul_decl(
const std::string nm,
const size_t ln)
const;
3790 void err_mul_def(
const std::string nm,
const size_t ln)
const;
3792 void err_arity_mis(
const std::string nm,
const size_t ln)
const;
3793 void err_keyword(
const std::string nm,
const size_t ln)
const;
3794 void err_type_mis(
const std::string nm,
const size_t ln)
const;
3799 void warn_cmd_nsup(
const std::string nm,
const size_t ln)
const;
3803 std::unordered_set<std::shared_ptr<DAGNode>> &atoms,
3804 std::unordered_set<std::shared_ptr<DAGNode>> &visited);
3807 std::unordered_set<std::shared_ptr<DAGNode>> &atoms,
3808 std::unordered_set<std::shared_ptr<DAGNode>> &visited);
3810 std::unordered_set<std::shared_ptr<DAGNode>> &vars,
3811 std::unordered_set<std::shared_ptr<DAGNode>> &visited);
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.
std::shared_ptr< DAGNode > mkReplaceRegAll(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace-all-regex 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
void err_neg_param(const size_t ln) const
std::shared_ptr< DAGNode > mkSin(std::shared_ptr< DAGNode > param)
Create an sin node.
std::shared_ptr< DAGNode > mkSbvToInt(std::shared_ptr< DAGNode > param)
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 > toDNFEliminateAll(std::shared_ptr< DAGNode > expr)
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.
void collectVars(std::shared_ptr< DAGNode > expr, std::unordered_set< std::shared_ptr< DAGNode > > &vars, std::unordered_set< std::shared_ptr< DAGNode > > &visited)
std::vector< std::vector< DTTypeDecl > > datatype_blocks
std::vector< std::shared_ptr< DAGNode > > assertions
std::shared_ptr< Sort > mkRealSort()
Create a real sort.
std::shared_ptr< DAGNode > replaceAtoms(std::shared_ptr< DAGNode > expr, std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > &atom_map, std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > &visited, bool &is_changed)
std::unordered_map< std::string, std::vector< std::shared_ptr< DAGNode > > > quant_var_map
void err_open_file(const std::string) const
void err_param_nnum(const std::string nm, const size_t ln) const
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< Sort > mkSortDef(const std::string &name, const std::vector< std::shared_ptr< Sort > > ¶ms, std::shared_ptr< Sort > out_sort)
Create a sort definition.
std::unordered_map< std::string, std::shared_ptr< DAGNode > > & getFunKeyMap()
bool parseSmtlib2File(const std::string filename)
Parse an SMT-LIB2 file.
std::unordered_map< std::string, size_t > fun_dup_count_map
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::unordered_map< std::string, size_t > temp_var_names
std::shared_ptr< DAGNode > bindLetVar(const std::string &key, std::shared_ptr< DAGNode > expr)
std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > cnf_bool_var_map
void err_unexp_eof() const
std::unordered_map< std::string, size_t > & getVarNames()
std::shared_ptr< DAGNode > mkStrToReg(std::shared_ptr< DAGNode > param)
Create a string to-regex conversion node.
std::vector< std::shared_ptr< DAGNode > > static_functions
std::shared_ptr< DAGNode > mkVarBool(const std::string &name)
Create a boolean variable.
std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > nnf_map
std::shared_ptr< DAGNode > mkIntToBv(std::shared_ptr< DAGNode > param, std::shared_ptr< DAGNode > width)
Create an integer to bitvector conversion node.
bool isOne(std::shared_ptr< DAGNode > expr)
Check if an expression is one.
std::shared_ptr< DAGNode > mkLet(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a let node.
std::shared_ptr< DAGNode > mkAcsc(std::shared_ptr< DAGNode > param)
Create an acsc node.
std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > dnf_map
std::shared_ptr< DAGNode > mkFpEq(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point equality node.
std::unique_ptr< NodeManager > getNodeManager()
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 > rewrite(NODE_KIND &t, std::shared_ptr< DAGNode > &p)
Rewrite unary operation node when simplification rule applies.
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.
static std::vector< std::shared_ptr< DAGNode > > sortParams(const std::vector< std::shared_ptr< DAGNode > > &p)
Return sorted operand list for deterministic commutative handling.
void setOption(const std::string &key, const std::string &value)
Set global options.
std::shared_ptr< DAGNode > mkStrInReg(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string in-regex check node.
std::shared_ptr< DAGNode > mkQuantVar(const std::string &name, std::shared_ptr< Sort > sort)
Create a quantifier variable 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 > substitute(std::shared_ptr< DAGNode > expr, std::unordered_map< std::string, std::shared_ptr< DAGNode > > ¶ms)
Substitute variables in an expression.
void replaceAssertions(const std::vector< std::shared_ptr< DAGNode > > &new_assertions)
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::vector< std::string > function_names
void err_zero_divisor(const size_t ln) const
std::vector< std::pair< std::shared_ptr< DAGNode >, std::vector< std::vector< std::shared_ptr< DAGNode > > > > > pattern_assertions
std::vector< std::vector< std::shared_ptr< DAGNode > > > assumptions
std::shared_ptr< DAGNode > mkBvSdiv(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed division node.
std::vector< std::shared_ptr< DAGNode > > getAssertions() const
Get all assertions.
std::shared_ptr< DAGNode > mkVarRoundingMode(const std::string &name)
Create a rounding mode variable.
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::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > cnf_map
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.
NODE_KIND getKind(const std::shared_ptr< DAGNode > &node)
Get kind.
void collectGroundAtoms(std::shared_ptr< DAGNode > expr, std::unordered_set< std::shared_ptr< DAGNode > > &atoms, std::unordered_set< std::shared_ptr< DAGNode > > &visited)
std::shared_ptr< DAGNode > mkExists(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an exists node.
std::shared_ptr< DAGNode > bindFunVar(const std::string &key, std::shared_ptr< DAGNode > expr)
std::shared_ptr< DAGNode > mkMul(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an mul node.
std::shared_ptr< DAGNode > mkVarInt(const std::string &name)
Create an integer variable.
std::shared_ptr< DAGNode > mkRegInter(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a regex intersection node.
void setEvaluatePrecision(mpfr_prec_t precision)
Set the precision for evaluation.
void collectAtoms(std::shared_ptr< DAGNode > expr, std::unordered_set< std::shared_ptr< DAGNode > > &atoms, std::unordered_set< std::shared_ptr< DAGNode > > &visited)
std::unordered_map< std::string, std::unordered_set< size_t > > getGroupedSoftAssertions() const
Get grouped soft assertions.
std::shared_ptr< DAGNode > mkLe(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a le node.
void err_param_nsame(const std::string nm, const size_t ln) const
std::shared_ptr< Sort > mkFPSort(const size_t &e, const size_t &s)
Create a floating-point sort.
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 > mkInternalOper(const std::shared_ptr< Sort > &sort, const NODE_KIND &t, const std::vector< std::shared_ptr< DAGNode > > &p)
std::shared_ptr< DAGNode > mkRegAll()
Create a regex all node.
std::shared_ptr< DAGNode > expandLet(std::shared_ptr< DAGNode > expr)
Expand a let expression.
std::shared_ptr< DAGNode > mkForall(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a forall 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 > mkMax(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a max 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::string optionToString()
Print the options.
std::shared_ptr< Sort > mkArraySort(std::shared_ptr< Sort > index, std::shared_ptr< Sort > elem)
Create an array sort.
std::shared_ptr< DAGNode > mkDistinct(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a distinct node.
std::shared_ptr< DAGNode > mkUFVNode(const std::string &name, const std::shared_ptr< Sort > &sort)
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::vector< std::string > & getFunctionNames()
bool parse(const std::string &filename)
Parse SMT-LIB2 file.
Integer toInt(std::shared_ptr< DAGNode > expr)
Convert an expression to an integer.
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.
void err_keyword(const std::string nm, const size_t ln) const
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 > mkVarStr(const std::string &name)
Create a string variable.
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 > getZero(std::shared_ptr< Sort > sort)
Get the zero for a sort.
std::shared_ptr< DAGNode > toTseitinCNF(std::shared_ptr< DAGNode > expr, std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > &visited, std::vector< std::shared_ptr< DAGNode > > &clauses)
std::string toString(std::shared_ptr< DAGNode > expr)
Print an expression.
std::vector< std::vector< std::shared_ptr< DAGNode > > > getAssumptions() const
Get assumptions.
std::shared_ptr< DAGNode > mkBvToNat(std::shared_ptr< DAGNode > param)
Create a bitvector to natural number conversion node.
std::vector< std::shared_ptr< DAGNode > > getFunctions() const
Get functions.
std::shared_ptr< DAGNode > mkRegRepeat(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a regex repeat node.
bool getEvaluateUseFloating() const
Get the use floating for evaluation.
std::shared_ptr< DAGNode > mkSub(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an sub node.
std::shared_ptr< GlobalOptions > getOptions() const
Get global options.
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 > toTseitinXor(std::shared_ptr< DAGNode > a, std::shared_ptr< DAGNode > b, std::vector< std::shared_ptr< DAGNode > > &clauses)
std::shared_ptr< Sort > mkNatSort()
Create a natural sort.
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::unordered_map< std::string, std::shared_ptr< Sort > > sort_key_map
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 > toTseitinDistinct(std::shared_ptr< DAGNode > a, std::shared_ptr< DAGNode > b, std::vector< std::shared_ptr< DAGNode > > &clauses)
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 > replaceNodes(std::shared_ptr< DAGNode > expr, std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > &node_map, std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > &visited, bool &is_changed)
std::shared_ptr< DAGNode > mkBvToInt(std::shared_ptr< DAGNode > param)
Create a bitvector to integer conversion node.
NODE_KIND getNegatedKind(NODE_KIND kind)
Get the opposite kind of a node kind.
std::vector< std::shared_ptr< DAGNode > > getSoftWeights() const
Get soft assertion weights.
std::shared_ptr< DAGNode > mkBvNeg(std::shared_ptr< DAGNode > param)
Create a bitvector negation node.
std::shared_ptr< Sort > mkStrSort()
Create a string sort.
std::shared_ptr< DAGNode > toDNFEliminateEq(const std::vector< std::shared_ptr< DAGNode > > &children)
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 > mkIndexofReg(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string index-of-regex node.
std::shared_ptr< DAGNode > mkConstReal(const std::string &v)
Create a real constant from string.
std::shared_ptr< Sort > mkSortDec(const std::string &name, const size_t &arity)
Create a sort declaration.
bool parseStr(const std::string &constraint)
Parse a constraint.
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.
RESULT_TYPE getResultType()
Get result type.
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 > mkConstReg(const std::string &v)
Create a regular expression constant.
std::shared_ptr< DAGNode > toTseitinEq(std::shared_ptr< DAGNode > a, std::shared_ptr< DAGNode > b, std::vector< std::shared_ptr< DAGNode > > &clauses)
std::shared_ptr< DAGNode > mkStrSplit(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a string split node.
std::shared_ptr< DAGNode > mkFuncDec(const std::string &name, const std::vector< std::shared_ptr< Sort > > ¶ms, std::shared_ptr< Sort > out_sort)
Create a function declaration.
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.
void ensureNumberValue(std::shared_ptr< DAGNode > expr)
ensure the expression is a number
std::shared_ptr< DAGNode > mkApplyRecFunc(std::shared_ptr< DAGNode > fun, const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a recursive function application.
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 > mkVarBv(const std::string &name, const size_t &width)
Create a bit-vector variable.
bool assert(const std::string &constraint)
Assert a constraint.
std::shared_ptr< DAGNode > mkErr(const ERROR_TYPE t)
void err_mul_def(const std::string nm, const size_t ln) const
std::shared_ptr< DAGNode > mkUnknown()
Create an unknown node.
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 > mkLetBindVar(const std::string &name, const std::shared_ptr< DAGNode > &expr)
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.
std::shared_ptr< DAGNode > mkApplyFunc(std::shared_ptr< DAGNode > fun, const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a function application node.
size_t preserving_let_counter
std::shared_ptr< DAGNode > applyFunPostOrder(std::shared_ptr< DAGNode > node, std::unordered_map< std::string, std::shared_ptr< DAGNode > > ¶ms)
std::shared_ptr< DAGNode > mkLetBindVarList(const std::vector< std::shared_ptr< DAGNode > > &bind_vars)
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 > applyDNFDistributiveLawRec(std::shared_ptr< DAGNode > expr, std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > &visited)
std::vector< std::shared_ptr< DAGNode > > parseParams()
std::shared_ptr< DAGNode > mkConstInt(const std::string &v)
Create an integer constant from string.
void err_mul_decl(const std::string nm, const size_t ln) const
std::shared_ptr< DAGNode > mkOper(const std::shared_ptr< Sort > &sort, const NODE_KIND &t, std::shared_ptr< DAGNode > p)
Create an operation.
std::shared_ptr< DAGNode > mkIsDivisible(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a is_divisible node.
bool isZero(std::shared_ptr< DAGNode > expr)
Check if an expression is zero.
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 > mkLetChain(const std::vector< std::shared_ptr< DAGNode > > &bind_var_lists, const std::shared_ptr< DAGNode > &body)
size_t removeFuns(const std::vector< std::string > &funcNames)
Remove functions by name.
std::shared_ptr< DAGNode > mkStrNumSplits(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
void err_logic(const std::string nm, const size_t ln) const
std::vector< std::string > parse_options
std::shared_ptr< DAGNode > mkStrFromCode(std::shared_ptr< DAGNode > param)
Create a string from-code conversion node.
std::shared_ptr< DAGNode > mkFuncDef(const std::string &name, const std::vector< std::shared_ptr< DAGNode > > ¶ms, std::shared_ptr< Sort > out_sort, std::shared_ptr< DAGNode > body)
Create a function definition.
Parser()
Default constructor.
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 > mkDiv(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an div 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::vector< std::shared_ptr< DAGNode > > soft_weights
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 > getVariable(const std::string &var_name)
Get variable.
std::shared_ptr< DAGNode > mkRootObj(std::shared_ptr< DAGNode > expr, int index)
std::vector< std::shared_ptr< DAGNode > > getVariables() const
Get variables.
std::shared_ptr< DAGNode > rewrite_oper(NODE_KIND &t, std::vector< std::shared_ptr< DAGNode > > &p)
Core operation rewrite helper used before node-manager creation.
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< Sort > mkBVSort(const size_t &width)
Create a bit-vector sort.
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 > mkTempVar(const std::shared_ptr< Sort > &sort)
Create a temporary variable.
std::shared_ptr< DAGNode > mkPi()
Create a pi node.
std::vector< std::vector< DTTypeDecl > > & getDatatypeBlocks()
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.
std::shared_ptr< Sort > mkRegSort()
Create a regular expression sort.
bool allow_placeholder_vars
std::shared_ptr< DAGNode > mkArray(const std::string &name, std::shared_ptr< Sort > index, std::shared_ptr< Sort > elem)
Create an array.
void err_unkwn_sym(const std::string nm, const size_t ln) const
void setEvaluateUseFloating(bool use_floating)
Set the use floating for evaluation.
std::shared_ptr< DAGNode > mkBvUmod(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector unsigned modulo node.
Real toReal(std::shared_ptr< DAGNode > expr)
Convert an expression to a real.
void warn_cmd_nsup(const std::string nm, const size_t ln) const
std::shared_ptr< Sort > mkIntSort()
Create an integer sort.
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::unordered_map< std::string, std::unordered_set< size_t > > soft_assertion_groups
size_t getNodeCount()
Get node count.
std::string dumpSMT2()
Dump the SMT2 representation of the parsed expressions.
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 > mkVarFp(const std::string &name, const size_t &e, const size_t &s)
Create a floating-point variable.
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::vector< std::shared_ptr< DAGNode > > split_lemmas
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::unordered_map< std::string, size_t > & getTempVarNames()
std::shared_ptr< DAGNode > flattenDNF(std::shared_ptr< DAGNode > expr)
std::shared_ptr< DAGNode > mkLn(std::shared_ptr< DAGNode > param)
Create an ln node.
void err_type_mis(const std::string nm, const size_t ln) const
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 > mkVarReg(const std::string &name)
Create a regular expression variable.
std::shared_ptr< DAGNode > mkNode(std::shared_ptr< Sort > sort, NODE_KIND t, std::string name, std::vector< std::shared_ptr< DAGNode > > params)
std::shared_ptr< DAGNode > mkBvAnd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a bitvector and node.
void err_arity_mis(const std::string nm, const size_t ln) const
mpfr_prec_t getEvaluatePrecision() const
Get the precision for evaluation.
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.
void err_sym_mis(const std::string mis, const size_t ln) const
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 > rebuildLetBindings(const std::shared_ptr< DAGNode > &root)
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.
bool isDeclaredVariable(const std::string &var_name) const
Check if a variable is declared.
std::shared_ptr< DAGNode > mkPosEpsilon()
Create a positive epsilon node.
std::unordered_map< std::string, size_t > placeholder_var_names
std::shared_ptr< DAGNode > mkCoth(std::shared_ptr< DAGNode > param)
Create a coth node.
std::shared_ptr< DAGNode > getResult()
Get result.
std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > cnf_atom_map
std::shared_ptr< DAGNode > mkFunParamVar(std::shared_ptr< Sort > sort, const std::string &name)
Create a function parameter variable.
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.
void err_param_nbool(const std::string nm, const size_t ln) const
std::shared_ptr< DAGNode > mkAdd(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an add node.
std::shared_ptr< Sort > mkBoolSort()
Create a boolean sort.
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::vector< std::shared_ptr< DAGNode > > getSoftAssertions() const
Get soft assertions.
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 > mkVar(const std::shared_ptr< Sort > &sort, const std::string &name)
Create a variable.
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::vector< std::shared_ptr< DAGNode > > getSplitLemmas()
Get the split lemmas.
std::shared_ptr< DAGNode > mkExpr(const std::string &expression)
Create a DAG node from a string expression.
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::string parseWeight()
std::shared_ptr< DAGNode > mkFpMul(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a floating-point multiplication node.
std::unordered_set< std::string > datatype_sort_names
std::shared_ptr< DAGNode > mkReplaceReg(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r, std::shared_ptr< DAGNode > v)
Create a string replace-regex node.
std::vector< std::shared_ptr< DAGNode > > soft_assertions
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 > toDNFEliminateXOR(const std::vector< std::shared_ptr< DAGNode > > &children)
std::vector< std::shared_ptr< DAGNode > > getDeclaredVariables() const
Get declared variables.
std::shared_ptr< DAGNode > applyDNFDistributiveLaw(std::shared_ptr< DAGNode > expr)
std::shared_ptr< DAGNode > remove(std::shared_ptr< DAGNode > expr, const std::unordered_set< std::shared_ptr< DAGNode > > &nodes)
Remove all the nodes in the expression.
std::unordered_map< std::string, std::unordered_set< size_t > > getGroupedAssertions() const
Get grouped assertions.
std::shared_ptr< DAGNode > mkAtan2(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create an atan2 node.
std::shared_ptr< DAGNode > mkVarReal(const std::string &name)
Create a real variable.
LET_MODE current_let_mode
std::shared_ptr< DAGNode > toDNFEliminateDistinct(const std::vector< std::shared_ptr< DAGNode > > &children)
std::shared_ptr< DAGNode > mkStrToCode(std::shared_ptr< DAGNode > param)
Create a string to-code conversion node.
int getArity(NODE_KIND k) const
Get the arity of a node kind.
void rebuild_node_manager()
std::shared_ptr< DAGNode > mkConstStr(const std::string &v)
Create a string constant.
std::shared_ptr< DAGNode > toDNFEliminateAll(std::shared_ptr< DAGNode > expr, std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > &visited, bool &is_changed)
static bool isCommutative(NODE_KIND t)
Check whether an operation kind is treated as commutative.
std::unique_ptr< SortManager > sort_manager
std::unordered_map< std::string, std::shared_ptr< Sort > > & getSortNames()
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 > mkConstFp(const std::string &v, const size_t &e, const size_t &s)
Create a floating-point constant.
RESULT_TYPE checkSat()
Check satisfiability.
std::shared_ptr< DAGNode > toCNF(std::shared_ptr< DAGNode > expr)
std::shared_ptr< DAGNode > rename(std::shared_ptr< DAGNode > expr, const std::string &new_name)
Rename a node.
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 > remove(std::shared_ptr< DAGNode > expr, const std::unordered_set< std::shared_ptr< DAGNode > > &nodes, std::unordered_map< std::shared_ptr< DAGNode >, std::shared_ptr< DAGNode > > &visited)
NODE_KIND getAddOp(std::shared_ptr< Sort > sort)
Get the add operator for a sort.
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 > result_node
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
bool isOnes(std::shared_ptr< DAGNode > expr)
std::unordered_map< std::string, std::unordered_set< size_t > > assertion_groups
std::shared_ptr< DAGNode > toNNF(std::shared_ptr< DAGNode > expr, bool is_not)
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.
bool isDeclaredFunction(const std::string &func_name) const
Check if a function is declared.
std::shared_ptr< DAGNode > mkAbs(std::shared_ptr< DAGNode > param)
Create an abs node.
std::shared_ptr< DAGNode > declareVar(const std::string &name, const std::string &sort)
Declare a variable.
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< Sort > mkRoundingModeSort()
Create a rounding mode sort.
std::shared_ptr< DAGNode > mkMin(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a min 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 > mkFuncRec(const std::string &name, const std::vector< std::shared_ptr< DAGNode > > ¶ms, std::shared_ptr< Sort > out_sort, std::shared_ptr< DAGNode > body)
Create a recursive function definition.
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.
@ CT_GET_UNSAT_ASSUMPTIONS
std::shared_ptr< Parser > ParserPtr
std::vector< DTSelectorDecl > selectors
std::shared_ptr< Sort > sort
std::vector< DTConstructorDecl > ctors