36#include <unordered_map>
37#include <unordered_set>
64 options = std::make_shared<GlobalOptions>();
99 options = std::make_shared<GlobalOptions>();
128 bool all_true =
true;
130 if (assertion->isErr()) {
134 else if (assertion->isFalse()) {
138 else if (assertion->isTrue()) {
162 std::unordered_set<std::shared_ptr<DAGNode>> visited;
163 std::queue<std::shared_ptr<DAGNode>> q;
164 for (
size_t i = 0; i <
assertions.size(); i++) {
167 visited.insert(node);
170 for (
size_t j = 0; j <
assumptions[i].size(); j++) {
173 visited.insert(node);
179 visited.insert(node);
184 visited.insert(node);
187 auto node = q.front();
189 for (
size_t i = 0; i < node->getChildrenSize(); i++) {
190 auto child = node->getChild(i);
191 if (visited.find(child) == visited.end()) {
192 visited.insert(child);
197 return visited.size();
204std::unordered_map<std::string, std::unordered_set<size_t>>
208std::vector<std::vector<std::shared_ptr<DAGNode>>>
218std::unordered_map<std::string, std::unordered_set<size_t>>
224 options->setOption(key, value);
227 options->setOption(key, std::to_string(value));
230 options->setOption(key, std::to_string(value));
233 options->setOption(key, value ?
"true" :
"false");
237 std::vector<std::shared_ptr<DAGNode>> vars;
255 std::vector<std::shared_ptr<DAGNode>> vars;
271 std::vector<std::shared_ptr<DAGNode>> funs;
279 options->setEvaluatePrecision(precision);
282 return options->getEvaluatePrecision();
285 options->setEvaluateUseFloating(use_floating);
288 return options->getEvaluateUseFloating();
293 "Cannot convert non-constant expression to real");
303 "Cannot convert non-integer expression to integer");
304 return expr->getValue()->getNumberValue().toInteger();
308 return toReal(expr) == 0.0;
310 return toInt(expr) == 0;
312 std::string value = expr->
toString();
313 return std::all_of(value.begin(), value.end(), [](
char c) { return c !=
'1'; });
319 return toReal(expr) == 1.0;
321 return toInt(expr) == 1;
323 std::string value = expr->
toString();
324 return std::find(value.begin(), value.end(),
'1') == value.end() - 1;
330 std::string value = expr->toString();
331 return std::all_of(value.begin() + 2, value.end(), [](
char c) { return c ==
'1'; });
337 if (!expr || !expr->isConst())
339 if (expr->getValue() !=
nullptr)
342 std::string s = expr->toString();
355 mpfr_prec_t prec = digits * 4 + 16;
369 bool in_scientific_notation =
false;
370 bool has_open_bracket =
false;
371 int bracket_level = 0;
376 static auto wrapper = [](
const std::string &s) {
377 if (s.size() > 1 && s.front() ==
'|' && s.back() ==
'|') {
378 std::string t = s.substr(1, s.size() - 2);
383 return s.substr(1, s.size() - 2);
393 if (!in_scientific_notation) {
395 std::string current(beg,
bufptr - beg);
396 size_t e_pos = current.find_first_of(
"Ee");
397 if (e_pos != std::string::npos && e_pos > 0 &&
398 e_pos == current.size() - 1) {
400 std::string mantissa = current.substr(0, e_pos);
403 in_scientific_notation =
true;
409 if (in_scientific_notation) {
412 has_open_bracket =
true;
418 else if (*
bufptr ==
')' && has_open_bracket) {
420 if (bracket_level == 0) {
423 std::string tmp_s(beg,
bufptr - beg);
425 return wrapper(tmp_s);
431 else if (isblank(*
bufptr)) {
440 in_scientific_notation =
false;
442 std::string tmp_s(beg,
bufptr - beg);
443 return wrapper(tmp_s);
450 std::string tmp_s(beg,
bufptr - beg);
454 return wrapper(tmp_s);
460 std::string tmp_s(beg,
bufptr - beg);
464 return wrapper(tmp_s);
469 std::string tmp_s(beg,
bufptr - beg);
470 return wrapper(tmp_s);
480 else if (*
bufptr ==
'|') {
483 std::string tmp_s(beg,
bufptr - beg);
486 return wrapper(tmp_s);
495 else if (*
bufptr ==
'"') {
504 std::string tmp_s(beg,
bufptr - beg);
507 return wrapper(tmp_s);
524 std::string tmp_s(beg,
bufptr - beg);
527 return wrapper(tmp_s);
609 else if (*
bufptr ==
')') {
637 if (!filename.empty()) {
638 std::ifstream fin(filename, std::ifstream::binary);
642 fin.seekg(0, std::ios::end);
643 buflen = (long)fin.tellg();
644 fin.seekg(0, std::ios::beg);
653 std::istreambuf_iterator<char> it(std::cin);
654 std::istreambuf_iterator<char> end;
655 content.assign(it, end);
656 buflen = (long)content.size();
690 char *new_str =
new (std::nothrow)
char[str.length() + 1];
694 std::memcpy(new_str, str.c_str(), str.length() + 1);
700 buflen = constraint.length();
719 std::shared_ptr<DAGNode> expr =
mkExpr(constraint);
731 if (expression.empty()) {
740 buflen = expression.length();
745 std::shared_ptr<DAGNode> expr =
parseExpr();
761 else if (key ==
":weight") {
764 else if (key ==
":comp") {
767 else if (key ==
":epsilon") {
770 else if (key ==
":M") {
773 else if (key ==
":named") {
776 else if (key ==
":pattern") {
779 else if (key ==
":no-pattern") {
782 else if (key ==
":qid") {
785 else if (key ==
":skolemid") {
788 else if (key ==
":lblpos") {
791 else if (key ==
":lblneg") {
805 if (command ==
"assert") {
806 std::string grp_id =
"";
807 std::string named_name =
"";
814 std::shared_ptr<DAGNode> assert_expr =
parseExpr();
825 if (named_name ==
"") {
836 std::pair<std::string, std::unordered_set<size_t>>(grp_id,
844 if (named_name !=
"") {
852 if (command ==
"check-sat") {
859 if (command ==
"check-sat-assuming") {
862 std::vector<std::shared_ptr<DAGNode>> cur_assumptions;
864 std::shared_ptr<DAGNode> assump =
parseExpr();
865 cur_assumptions.emplace_back(assump);
873 if (command ==
"declare-const") {
879 std::shared_ptr<DAGNode> res =
nullptr;
880 std::shared_ptr<Sort> sort =
parseSort();
881 res =
mkVar(sort, name);
892 if (command ==
"declare-fun") {
902 std::shared_ptr<DAGNode> res =
nullptr;
906 std::shared_ptr<Sort> out_sort =
parseSort();
907 res =
mkVar(out_sort, name);
911 std::vector<std::shared_ptr<Sort>> params;
916 std::shared_ptr<Sort> out_sort =
parseSort();
932 if (command ==
"declare-sort") {
938 size_t num = std::stoi(numeral);
941 std::shared_ptr<Sort> sort =
mkSortDec(name, num);
943 std::pair<std::string, std::shared_ptr<Sort>>(name, sort));
950 if (command ==
"declare-datatype") {
958 arity = std::stoul(num);
966 std::shared_ptr<Sort> dt_sort_sym =
972 std::vector<DTTypeDecl> block;
974 type_decl.
name = type_name;
975 type_decl.
arity = arity;
981 std::vector<std::shared_ptr<Sort>> sel_sorts;
986 ctor_decl.
name = ctor_name;
991 std::shared_ptr<Sort> sel_sort =
parseSort();
994 mkFuncDec(sel_name, {dt_sort_sym}, sel_sort);
996 sel_sorts.push_back(sel_sort);
1007 ctor_decl.
name = ctor_name;
1012 type_decl.
ctors.push_back(ctor_decl);
1016 block.push_back(type_decl);
1025 if (command ==
"declare-datatypes") {
1028 std::vector<std::pair<std::string, size_t>> type_headers;
1029 std::vector<DTTypeDecl> block;
1036 arity = std::stoul(num);
1042 type_headers.emplace_back(tname, arity);
1044 std::shared_ptr<Sort> dt_sort_sym =
1051 block.push_back(td);
1057 for (
size_t i = 0; i < type_headers.size(); ++i) {
1059 const auto &[tname, arity] = type_headers[i];
1060 std::shared_ptr<Sort> dt_sort_sym =
sort_key_map[tname];
1065 std::vector<std::shared_ptr<Sort>> sel_sorts;
1067 ctor_decl.
name = ctor_name;
1073 std::shared_ptr<Sort> sel_sort =
parseSort();
1079 mkFuncDec(sel_name, {dt_sort_sym}, sel_sort);
1081 sel_sorts.push_back(sel_sort);
1086 mkFuncDec(ctor_name, sel_sorts, dt_sort_sym);
1088 block[i].ctors.push_back(ctor_decl);
1099 if (command ==
"define-const") {
1105 std::shared_ptr<DAGNode> check_fun =
fun_key_map[name];
1115 std::shared_ptr<Sort> out_sort =
parseSort();
1116 std::shared_ptr<DAGNode> func_body =
parseExpr();
1117 std::vector<std::shared_ptr<DAGNode>> params;
1118 std::shared_ptr<DAGNode> res =
mkFuncDef(name, params, out_sort, func_body);
1125 if (command ==
"define-fun") {
1131 std::shared_ptr<DAGNode> check_fun =
fun_key_map[name];
1143 std::vector<std::shared_ptr<DAGNode>> params;
1144 std::vector<std::string> key_list;
1150 std::shared_ptr<Sort> ptype =
parseSort();
1151 key_list.emplace_back(pname);
1152 std::shared_ptr<DAGNode> expr =
nullptr;
1160 std::pair<std::string, std::shared_ptr<DAGNode>>(pname, expr));
1161 params.emplace_back(expr);
1173 std::shared_ptr<Sort> out_sort =
parseSort();
1174 std::shared_ptr<DAGNode> func_body =
parseExpr();
1179 std::shared_ptr<DAGNode> res =
mkFuncDef(name, params, out_sort, func_body);
1185 while (key_list.size() > 0) {
1187 key_list.pop_back();
1195 if (command ==
"define-fun-rec") {
1201 std::shared_ptr<DAGNode> check_fun =
fun_key_map[name];
1213 std::vector<std::shared_ptr<DAGNode>> params;
1214 std::vector<std::string> key_list;
1215 std::vector<std::shared_ptr<Sort>> param_sorts;
1221 std::shared_ptr<Sort> ptype =
parseSort();
1222 key_list.emplace_back(pname);
1223 param_sorts.emplace_back(ptype);
1224 std::shared_ptr<DAGNode> expr =
nullptr;
1232 std::pair<std::string, std::shared_ptr<DAGNode>>(pname, expr));
1233 params.emplace_back(expr);
1245 std::shared_ptr<Sort> out_sort =
parseSort();
1249 std::shared_ptr<DAGNode> func_dec =
mkFuncDec(name, param_sorts, out_sort);
1252 std::shared_ptr<DAGNode> func_body =
parseExpr();
1253 std::shared_ptr<DAGNode> res =
mkFuncRec(name, params, out_sort, func_body);
1257 while (key_list.size() > 0) {
1259 key_list.pop_back();
1265 if (command ==
"define-funs-rec") {
1271 std::vector<std::string> func_names;
1272 std::vector<std::vector<std::shared_ptr<DAGNode>>> all_params;
1273 std::vector<std::vector<std::string>> all_key_lists;
1274 std::vector<std::vector<std::shared_ptr<Sort>>> all_param_sorts;
1275 std::vector<std::shared_ptr<Sort>> return_sorts;
1283 std::shared_ptr<DAGNode> check_fun =
fun_key_map[name];
1291 func_names.emplace_back(name);
1296 std::vector<std::shared_ptr<DAGNode>> params;
1297 std::vector<std::string> key_list;
1298 std::vector<std::shared_ptr<Sort>> param_sorts;
1303 std::shared_ptr<Sort> ptype =
parseSort();
1304 key_list.emplace_back(pname);
1305 param_sorts.emplace_back(ptype);
1306 std::shared_ptr<DAGNode> expr =
mkFunParamVar(ptype, pname);
1307 params.emplace_back(expr);
1313 std::shared_ptr<Sort> out_sort =
parseSort();
1314 return_sorts.emplace_back(out_sort);
1316 all_params.emplace_back(params);
1317 all_key_lists.emplace_back(key_list);
1318 all_param_sorts.emplace_back(param_sorts);
1326 for (
size_t i = 0; i < func_names.size(); i++) {
1327 mkFuncDec(func_names[i], all_param_sorts[i], return_sorts[i]);
1332 for (
size_t i = 0; i < func_names.size(); i++) {
1334 for (
size_t j = 0; j < all_key_lists[i].size(); j++) {
1335 fun_var_map.insert(std::pair<std::string, std::shared_ptr<DAGNode>>(
1336 all_key_lists[i][j], all_params[i][j]));
1340 std::shared_ptr<DAGNode> func_body =
parseExpr();
1341 std::shared_ptr<DAGNode> res =
1342 mkFuncRec(func_names[i], all_params[i], return_sorts[i], func_body);
1345 for (
const auto &key : all_key_lists[i]) {
1360 if (command ==
"define-sort") {
1365 std::vector<std::string> param_names;
1373 std::vector<std::shared_ptr<Sort>> params;
1374 for (
const auto &name : param_names) {
1379 std::shared_ptr<Sort> out_sort =
parseSort();
1380 if (params.size() == 0) {
1383 std::pair<std::string, std::shared_ptr<Sort>>(name, out_sort));
1386 std::shared_ptr<Sort> sort =
mkSortDef(name, params, out_sort);
1388 std::pair<std::string, std::shared_ptr<Sort>>(name, sort));
1394 if (command ==
"echo") {
1402 if (command ==
"exit") {
1409 if (command ==
"get-assertions") {
1416 if (command ==
"get-assignment") {
1423 if (command ==
"get-info") {
1430 if (command ==
"get-option") {
1437 if (command ==
"get-model") {
1444 if (command ==
"get-option") {
1451 if (command ==
"get-proof") {
1458 if (command ==
"get-unsat-assumptions") {
1465 if (command ==
"get-unsat-core") {
1472 if (command ==
"get-value") {
1479 if (command ==
"pop") {
1486 if (command ==
"push") {
1493 if (command ==
"reset") {
1500 if (command ==
"reset-assertions") {
1509 if (command ==
"set-info") {
1515 if (command ==
"set-logic") {
1518 bool is_valid =
options->setLogic(type);
1528 if (command ==
"set-option") {
1532 std::string result =
"(" + command +
" ";
1546 else if (*
bufptr ==
')') {
1576 if (command ==
"exists") {
1587 if (command ==
"forall") {
1611 static const std::unordered_map<std::string, std::shared_ptr<Sort>>
1630 auto basic_it = BASIC_SORTS.find(s);
1631 if (basic_it != BASIC_SORTS.end()) {
1632 return basic_it->second;
1653 std::shared_ptr<Sort> sortS =
parseSort();
1654 std::shared_ptr<Sort> sortT =
parseSort();
1655 std::string sort_key_name =
1656 "ARRAY_" + sortS->toString() +
"_" + sortT->toString();
1663 std::pair<std::string, std::shared_ptr<Sort>>(sort_key_name, sort));
1666 else if (s ==
"Datatype") {
1668 else if (s ==
"Set") {
1670 else if (s ==
"Relation") {
1672 else if (s ==
"Bag") {
1674 else if (s ==
"Sequence") {
1676 else if (s ==
"RegEx") {
1678 std::shared_ptr<Sort> alphabet_sort =
parseSort();
1679 if (!alphabet_sort->isStr()) {
1684 else if (s ==
"UF") {
1692 else if (s ==
"_") {
1696 if (
id ==
"BitVec") {
1700 std::string sort_key_name =
"BV_" + n;
1707 std::pair<std::string, std::shared_ptr<Sort>>(sort_key_name, sort));
1710 else if (
id ==
"FloatingPoint") {
1716 std::string sort_key_name =
"FP_" + e +
"_" + s;
1721 sort =
sort_manager->createFPSort(std::stoi(e), std::stoi(s));
1723 std::pair<std::string, std::shared_ptr<Sort>>(sort_key_name, sort));
1729 else if (s ==
"Tuple") {
1731 std::vector<std::shared_ptr<Sort>> fields;
1735 std::shared_ptr<Sort> field =
parseSort();
1736 fields.push_back(field);
1743 auto basic_it = BASIC_SORTS.find(s);
1744 if (basic_it != BASIC_SORTS.end()) {
1745 sort = basic_it->second;
1754 if (sort->arity > 0) {
1755 for (
size_t i = 0; i < sort->arity; i++) {
1756 std::shared_ptr<Sort> sort_child =
parseSort();
1757 if (sort_child->arity != sort_child->children.size())
1758 sort->children.push_back(sort_child);
1769 std::vector<std::shared_ptr<DAGNode>> params;
1772 std::shared_ptr<DAGNode> expr =
parseExpr();
1773 params.emplace_back(expr);
1781 std::vector<std::shared_ptr<DAGNode>>
1807 std::vector<LetContext> stateStack;
1810 std::vector<std::shared_ptr<DAGNode>> all_bind_var_lists;
1818 std::string preserving_let_bind_var_suffix =
1822 while (!stateStack.empty()) {
1823 auto ¤tState = stateStack.back();
1824 auto ¶ms = currentState.params;
1825 auto &key_list = currentState.key_list;
1827 if (!currentState.is_complete) {
1835 std::string prefixed_name = name + preserving_let_bind_var_suffix;
1841 for (
auto &state : stateStack) {
1842 for (
const auto &key : state.key_list) {
1846 err_sym_mis(
"Duplicate variable binding: " + name, name_ln);
1850 std::shared_ptr<DAGNode> expr =
parseExpr();
1852 if (expr->isErr()) {
1854 for (
auto &state : stateStack) {
1855 for (
const auto &key : state.key_list) {
1863 std::shared_ptr<DAGNode> let_var =
mkLetBindVar(prefixed_name, expr);
1866 params.emplace_back(let_var);
1867 key_list.emplace_back(prefixed_name);
1874 all_bind_var_lists.emplace_back(currentState.bind_var_list);
1887 condAssert(let_key ==
"let",
"Invalid keyword for let");
1890 stateStack.emplace_back(
LetContext(currentState.nesting_level + 1));
1899 auto completedState = currentState;
1900 stateStack.pop_back();
1903 if (stateStack.empty()) {
1905 std::shared_ptr<DAGNode> result =
1906 mkLetChain(all_bind_var_lists, completedState.result);
1914 stateStack.back().result = completedState.result;
1915 stateStack.back().is_complete =
true;
1932 std::vector<LetContext> stateStack;
1941 while (!stateStack.empty()) {
1942 auto ¤tState = stateStack.back();
1943 auto ¶ms = currentState.params;
1944 auto &key_list = currentState.key_list;
1946 if (!currentState.is_complete) {
1958 for (
auto &state : stateStack) {
1959 for (
const auto &key : state.key_list) {
1963 err_sym_mis(
"Duplicate variable binding: " + name, name_ln);
1967 std::shared_ptr<DAGNode> expr =
parseExpr();
1969 if (expr->isErr()) {
1971 for (
auto &state : stateStack) {
1972 for (
const auto &key : state.key_list) {
1981 std::pair<std::string, std::shared_ptr<DAGNode>>(name, expr));
1982 params.emplace_back(expr);
1983 key_list.emplace_back(name);
1999 condAssert(let_key ==
"let",
"Invalid keyword for let");
2002 stateStack.emplace_back(
LetContext(currentState.nesting_level + 1));
2010 for (
const auto &key : key_list) {
2015 stateStack.pop_back();
2018 if (stateStack.empty()) {
2019 return currentState.result;
2025 stateStack.back().result = currentState.result;
2026 stateStack.back().is_complete =
true;
2037 char *save_bufptr =
bufptr;
2059std::shared_ptr<DAGNode>
2061 const std::vector<std::shared_ptr<DAGNode>> ¶ms) {
2063 if (fun->getFuncParamsSize() != params.size()) {
2068 if (fun->getFuncBody()->isNull()) {
2072 return mkApplyDTFun(fun->getSort(), fun->getName(), params);
2082 if (fun->isFuncRec()) {
2083 if (!
options->getExpandRecursiveFunctions()) {
2089 else if (fun->isFuncDec()) {
2091 return mkApplyUF(fun->getSort(), fun->getName(), params);
2095 if (fun->isFuncDef()) {
2096 if (!
options->getExpandFunctions()) {
2103 if (fun->getFuncBody()->isErr()) {
2104 return fun->getFuncBody();
2109 std::unordered_map<std::string, std::shared_ptr<DAGNode>> new_params_map;
2110 std::vector<std::shared_ptr<DAGNode>> func_params = fun->getFuncParams();
2111 for (
size_t i = 0; i < func_params.size(); i++) {
2112 if (params[i]->isErr()) {
2115 new_params_map.insert(std::pair<std::string, std::shared_ptr<DAGNode>>(
2116 func_params[i]->getName(), params[i]));
2120 std::shared_ptr<DAGNode> formula = fun->getFuncBody();
2129 std::shared_ptr<DAGNode> node,
2130 std::unordered_map<std::string, std::shared_ptr<DAGNode>> ¶ms) {
2138 std::stack<std::pair<std::shared_ptr<DAGNode>,
bool>> todo;
2141 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
2145 todo.push(std::make_pair(node,
false));
2147 while (!todo.empty()) {
2148 std::shared_ptr<DAGNode> current = todo.top().first;
2149 bool processed = todo.top().second;
2154 std::vector<std::shared_ptr<DAGNode>> childResults;
2157 for (
size_t i = 0; i < current->getChildrenSize(); i++) {
2158 childResults.emplace_back(results[current->getChild(i)]);
2162 std::shared_ptr<DAGNode> result;
2163 if (current->isUFApplication() || current->isDtFunApplication()) {
2165 if (current->isDtFunApplication())
2166 result =
mkApplyDTFun(current->getSort(), current->getName(), childResults);
2169 mkApplyUF(current->getSort(), current->getName(), childResults);
2171 else if (current->isFuncRecApplication() &&
2172 !
options->getExpandRecursiveFunctions()) {
2177 else if (current->isFuncApplication() ||
2178 (current->isFuncRecApplication() &&
2179 options->getExpandRecursiveFunctions())) {
2182 std::vector<std::shared_ptr<DAGNode>> funcParams;
2183 for (
size_t i = 1; i < childResults.size(); i++) {
2184 funcParams.emplace_back(childResults[i]);
2186 result =
applyFun(current->getFuncBody(), funcParams);
2192 if (!childResults.empty())
2193 result =
mkOper(current->getSort(), current->getKind(), childResults);
2198 results[current] = result;
2202 if (current->isFuncParam()) {
2204 auto it = params.find(current->getName());
2205 if (it != params.end()) {
2206 results[current] = it->second;
2214 else if (current->isConst() || current->isVar()) {
2216 results[current] = current;
2221 todo.push(std::make_pair(current,
true));
2226 bool isFuncAppToExpand = current->isFuncApplication() ||
2227 (current->isFuncRecApplication() &&
2228 options->getExpandRecursiveFunctions());
2229 int startIdx = isFuncAppToExpand ? 1 : 0;
2232 for (
int i = current->getChildrenSize() - 1; i >= startIdx; i--) {
2233 todo.push(std::make_pair(current->getChild(i),
false));
2240 return results[node];
2243std::shared_ptr<DAGNode>
2245 const std::vector<std::shared_ptr<DAGNode>> ¶ms) {
2246 std::shared_ptr<DAGNode> res = std::shared_ptr<DAGNode>(
2248 res->updateApplyFunc(fun->getSort(), fun, params);
2253std::shared_ptr<DAGNode>
2255 const std::vector<std::shared_ptr<DAGNode>> ¶ms) {
2258 std::shared_ptr<DAGNode> res = std::shared_ptr<DAGNode>(
new DAGNode(
2260 res->updateApplyFunc(fun->getSort(), fun, params,
true);
2265std::shared_ptr<DAGNode>
2266Parser::mkPattern(
const std::shared_ptr<Sort> &sort,
const std::string &name,
const std::vector<std::shared_ptr<DAGNode>> ¶ms) {
2271 const std::string &name,
2272 std::shared_ptr<DAGNode> param) {
2277 const std::string &name,
2278 std::shared_ptr<DAGNode> param) {
2282std::shared_ptr<DAGNode>
2283Parser::mkAttribute(
const std::shared_ptr<Sort> &sort,
const std::string &name,
const std::vector<std::shared_ptr<DAGNode>> ¶ms) {
2286std::shared_ptr<DAGNode>
2287Parser::mkApplyUF(
const std::shared_ptr<Sort> &sort,
const std::string &name,
const std::vector<std::shared_ptr<DAGNode>> ¶ms) {
2291std::shared_ptr<DAGNode>
2292Parser::mkApplyDTFun(
const std::shared_ptr<Sort> &sort,
const std::string &name,
const std::vector<std::shared_ptr<DAGNode>> ¶ms) {
2299 std::shared_ptr<Sort> sort) {
2304 std::shared_ptr<DAGNode> var =
2306 auto [itr, success] =
quant_var_map.emplace(name, std::vector{var});
2308 itr->second.emplace_back(var);
2317 std::vector<std::shared_ptr<DAGNode>> params;
2318 std::vector<std::string> quant_var_names;
2324 std::shared_ptr<Sort> var_sort =
parseSort();
2325 std::shared_ptr<DAGNode> var =
mkQuantVar(var_name, var_sort);
2326 params.emplace_back(var);
2327 quant_var_names.emplace_back(var_name);
2333 std::shared_ptr<DAGNode> body =
parseExpr();
2335 params.insert(params.begin(), body);
2337 if (type ==
"forall") {
2340 else if (type ==
"exists") {
2346 for (
auto &name : quant_var_names) {
2349 if (itr->second.size() == 1)
2352 itr->second.pop_back();
2357std::shared_ptr<DAGNode>
2361std::shared_ptr<DAGNode>
2367 std::shared_ptr<DAGNode> expr,
2368 std::unordered_map<std::string, std::shared_ptr<DAGNode>> ¶ms) {
2369 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
2375 std::shared_ptr<DAGNode> expr,
2376 std::unordered_map<std::string, std::shared_ptr<DAGNode>> ¶ms,
2377 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
2387 if (visited.find(expr) != visited.end()) {
2388 return visited[expr];
2393 std::stack<std::pair<std::shared_ptr<DAGNode>,
bool>> todo;
2394 todo.push(std::make_pair(expr,
false));
2396 while (!todo.empty()) {
2397 auto curPair = todo.top();
2399 std::shared_ptr<DAGNode> current = curPair.first;
2400 bool processed = curPair.second;
2403 if (visited.find(current) != visited.end()) {
2413 std::vector<std::shared_ptr<DAGNode>> newChildren;
2414 newChildren.reserve(current->getChildrenSize());
2415 for (
size_t i = 0; i < current->getChildrenSize(); ++i) {
2416 newChildren.emplace_back(visited[current->getChild(i)]);
2421 std::shared_ptr<DAGNode> newNode;
2425 if (current->isUFApplication() || current->isFuncApplication() ||
2426 current->isFuncRecApplication() || current->isArray()) {
2429 node_manager->createNode(current->getSort(), current->getKind(), current->getName(), newChildren);
2433 newNode =
mkOper(current->getSort(), current->getKind(), newChildren);
2435 visited[current] = newNode;
2439 if (current->isVar()) {
2441 auto it = params.find(current->getName());
2442 visited[current] = (it != params.end()) ? it->second : current;
2444 else if (current->isConst() || current->isFuncParam()) {
2446 visited[current] = current;
2450 todo.push(std::make_pair(current,
true));
2452 for (
int i =
static_cast<int>(current->getChildrenSize()) - 1; i >= 0;
2454 auto child = current->getChild(i);
2455 if (visited.find(child) == visited.end()) {
2456 todo.push(std::make_pair(child,
false));
2463 return visited[expr];
2468 if (sort->isInt() || sort->isReal() || sort->isIntOrReal()) {
2471 else if (sort->isBv()) {
2474 else if (sort->isFp()) {
2485 if (sort->isInt() || sort->isIntOrReal()) {
2488 else if (sort->isReal()) {
2491 else if (sort->isBv()) {
2492 return mkConstBv(
"0", sort->getBitWidth());
2494 else if (sort->isFp()) {
2495 return mkConstFp(
"0.0", sort->getExponentWidth(), sort->getSignificandWidth());
2497 else if (sort->isStr()) {
2564 throw std::runtime_error(
"Unknown parser error");
2568void Parser::err_all(
const std::shared_ptr<DAGNode> e,
const std::string s,
const size_t ln)
const {
2574 throw std::runtime_error(
"error: Unexpected end of file found.");
2579 throw std::runtime_error(
"error: \"" + mis +
"\" missing in line " + std::to_string(ln) +
".");
2583 throw std::runtime_error(
"error: \"" + mis +
"\" missing before \"" + nm +
"\" in line " + std::to_string(ln) +
".");
2590 throw std::runtime_error(
"error: Unknown or unexptected symbol \"" + nm +
"\" in line " + std::to_string(ln) +
".");
2595 throw std::runtime_error(
"error: Wrong number of parameters of \"" + nm +
"\" in line " + std::to_string(ln) +
".");
2600 throw std::runtime_error(
"error: Invalid command \"" + nm +
"\" in line " + std::to_string(ln) +
", paramerter is not a boolean.");
2604 throw std::runtime_error(
"error: Invalid command \"" + nm +
"\" in line " + std::to_string(ln) +
", paramerter is not an integer or a real.");
2609 throw std::runtime_error(
"error: Invalid command \"" + nm +
"\" in line " + std::to_string(ln) +
", paramerters are not in same type.");
2614 throw std::runtime_error(
"error: Logic does not support \"" + nm +
"\" in line " + std::to_string(ln) +
".");
2619 throw std::runtime_error(
"error: Multiple declarations of \"" + nm +
"\" in line " + std::to_string(ln) +
".");
2624 throw std::runtime_error(
"error: Multiple definitions or keybindings of \"" + nm +
"\" in line " + std::to_string(ln) +
".");
2629 throw std::runtime_error(
"error: Divisor is zero in line " + std::to_string(ln) +
".");
2634 throw std::runtime_error(
"error: Arity mismatch of command \"" + nm +
"\" in line " + std::to_string(ln) +
".");
2639 throw std::runtime_error(
"error: Kind mismatch of command \"" + nm +
"\" in line " + std::to_string(ln) +
".");
2643 throw std::runtime_error(
"error: Negative parameter in line " + std::to_string(ln) +
".");
2648 throw std::runtime_error(
"error: keyword mismatch of command \"" + nm +
"\" in line " + std::to_string(ln) +
".");
2656 throw std::runtime_error(
"error: Cannot open file \"" + filename +
"\".");
2660 const std::string &new_name) {
2661 condAssert(expr->isVar(),
"Only variable can be renamed");
2662 std::string old_name = expr->getName();
2663 if (expr->isTempVar()) {
2671 expr->rename(new_name);
2681 return sort->toString();
2690std::shared_ptr<DAGNode>
2694 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
2696 std::vector<std::vector<std::shared_ptr<DAGNode>>> let_binds(1);
2697 std::unordered_map<std::shared_ptr<DAGNode>,
size_t> refs;
2699 auto is_quanted = [](
const std::shared_ptr<DAGNode> &node) {
2703 auto is_binder = [](
const std::shared_ptr<DAGNode> &node) {
2704 return node->isFuncDef() || node->isFuncRec() || node->isFuncDec() ||
2705 node->isLetBindVar() || node->isAttributeParam();
2707 auto is_suitable_for_let = [&](
const std::shared_ptr<DAGNode> &node) {
2708 return !is_binder(node) && !node->isVar() && !node->isVUF() &&
2709 !node->isFuncParam() && !node->isCInt() && !node->isAttribute() &&
2713 std::vector<std::shared_ptr<DAGNode>> quanted;
2714 std::unordered_map<std::shared_ptr<DAGNode>,
size_t> let_level;
2715 constexpr size_t MAX_LET_LEVEL = SIZE_MAX;
2716 constexpr size_t ROOT_LET_LEVEL = 0;
2718 std::vector<std::shared_ptr<DAGNode>> visit(1, root);
2719 std::vector<std::shared_ptr<DAGNode>> nodes;
2720 while (!visit.empty()) {
2721 auto cur = visit.back();
2722 auto [itr, success] = subst_map.emplace(cur,
nullptr);
2724 if (!is_binder(cur)) {
2725 for (
const auto &child : cur->getChildren()) {
2726 visit.emplace_back(child);
2731 else if (itr->second ==
nullptr) {
2732 itr->second = std::make_shared<DAGNode>(*cur);
2733 refs[itr->second] = 0;
2734 let_level[itr->second] = ROOT_LET_LEVEL;
2735 if (!is_binder(itr->second)) {
2736 auto children = itr->second->getChildren();
2737 for (
auto &child : children) {
2738 child = subst_map.at(child);
2741 itr->second->replace_children(children);
2743 if (is_quanted(itr->second)) {
2744 quanted.emplace_back(itr->second);
2745 let_level.at(itr->second) = MAX_LET_LEVEL;
2748 nodes.emplace_back(itr->second);
2754 std::reverse(quanted.begin(), quanted.end());
2755 let_binds.resize(quanted.size() + 1);
2756 for (
size_t i = 0, isz = quanted.size(); i < isz; ++i) {
2757 const auto &quant = quanted.at(i);
2758 for (
size_t j = 1, jsz = quant->getChildrenSize(); j < jsz; ++j) {
2759 auto child = quant->getChild(j);
2760 let_level.at(child) = i + 1;
2764 for (
const auto &node : nodes) {
2765 auto children = node->getChildren();
2766 if (!is_binder(node))
2767 for (
auto &child : children) {
2768 let_level.at(node) = std::max(let_level.at(node), let_level.at(child));
2769 child = subst_map.at(child);
2771 node->replace_children(children);
2774 if (is_suitable_for_let(node) && let_level.at(node) < MAX_LET_LEVEL) {
2776 auto let_var =
mkLetBindVar(
"L" + std::to_string(lets++), node);
2777 let_binds.at(let_level.at(node)).emplace_back(let_var);
2778 subst_map[node] = let_var;
2781 subst_map[node] = node;
2785 for (
size_t i = 0, isz = quanted.size(); i < isz; ++i) {
2786 if (let_binds.at(i + 1).empty())
2788 auto children = quanted.at(i)->getChildren();
2789 std::vector<std::shared_ptr<DAGNode>> var_list;
2790 for (
const auto &bind_var : let_binds.at(i + 1)) {
2793 children.front() =
mkLetChain(var_list, children.front());
2794 if (quanted.at(i)->getChild(0)->isAttribute()) {
2795 children = quanted.at(i)->getChild(0)->getChildren();
2796 children.front() =
mkLetChain(var_list, children.front());
2797 quanted.at(i)->getChild(0)->replace_children(children);
2800 quanted.at(i)->replace_children(children);
2804 visit.emplace_back(nodes.back());
2805 while (!visit.empty()) {
2806 auto cur = visit.back();
2807 auto [itr, success] = subst_map.emplace(cur,
nullptr);
2809 if (!is_binder(cur) && !is_quanted(cur)) {
2810 for (
const auto &child : cur->getChildren()) {
2811 visit.emplace_back(child);
2816 else if (itr->second ==
nullptr) {
2821 auto children = itr->second->getChildren();
2822 if (!is_binder(cur) && !is_quanted(cur))
2823 for (
auto &child : children) {
2824 child = subst_map.at(child);
2827 itr->second->replace_children(children);
2830 if (refs.find(cur) != refs.end() && is_suitable_for_let(cur)) {
2832 std::cout <<
"!!!" << std::endl;
2833 auto bind_var =
mkLetBindVar(
"L" + std::to_string(lets++), cur);
2834 let_binds.at(0).emplace_back(bind_var);
2835 itr->second = bind_var;
2841 if (!let_binds.at(0).empty()) {
2842 std::vector<std::shared_ptr<DAGNode>> var_list;
2843 for (
const auto &bind_var : let_binds.at(0)) {
2846 return mkLetChain(var_list, subst_map.at(nodes.back()));
2848 return subst_map.at(nodes.back());
2852 std::stringstream ss;
2856 ss << s << std::endl;
2857 ss <<
"(set-logic " <<
options->getLogic() <<
")" << std::endl;
2859 size_t sort_count = 0;
2860 std::vector<std::pair<std::string, std::shared_ptr<Sort>>> sorts;
2861 for (
const auto &[sort_name, sort_ptr] :
sort_key_map) {
2862 sorts.emplace_back(sort_name, sort_ptr);
2864 std::sort(sorts.begin(), sorts.end(), [](
const auto &a,
const auto &b) { return a.first < b.first; });
2865 for (
const auto &[sort_name, sort_ptr] : sorts) {
2866 if (sort_ptr->isDec()) {
2871 if (sort_name.starts_with(
"DT"))
2875 ss <<
"(declare-sort " << sort_name <<
" " << sort_ptr->arity <<
")"
2884 ss <<
"(declare-datatypes (";
2885 for (
size_t i = 0; i < block.size(); ++i) {
2886 const auto &td = block[i];
2887 ss <<
"(" << td.name <<
" " << td.arity <<
")";
2888 if (i + 1 < block.size())
2893 for (
size_t i = 0; i < block.size(); ++i) {
2894 const auto &td = block[i];
2896 for (
size_t j = 0; j < td.ctors.size(); ++j) {
2897 const auto &cd = td.ctors[j];
2898 ss <<
"(" << cd.name;
2899 for (
const auto &sel : cd.selectors) {
2900 ss <<
" (" << sel.name <<
" " << sel.sort->toString() <<
")";
2903 if (j + 1 < td.ctors.size())
2907 if (i + 1 < block.size())
2910 ss <<
"))" << std::endl;
2915 std::vector<std::shared_ptr<DAGNode>> vars =
getVariables();
2917 vars.begin(), vars.end(), [](
const std::shared_ptr<DAGNode> &a,
const std::shared_ptr<DAGNode> &b) {
2918 return a->getName() < b->getName();
2920 for (
auto &var : vars) {
2921 ss <<
"(declare-fun " << var->getName() <<
" () "
2922 << var->getSort()->toString() <<
")" << std::endl;
2937 std::vector<std::shared_ptr<DAGNode>> functions =
getFunctions();
2938 for (
auto &func : functions) {
2939 if (func->isFuncDec()) {
2947 else if (func->isFuncRec()) {
2954 ss <<
"(define-fun " << func->getName() <<
" (";
2956 for (
size_t i = 1; i < func->getChildrenSize(); i++) {
2958 ss <<
"(" << func->getChild(i)->getName() <<
" "
2959 << func->getChild(i)->getSort()->toString() <<
")";
2961 ss <<
" (" << func->getChild(i)->getName() <<
" "
2962 << func->getChild(i)->getSort()->toString() <<
")";
2966 ss <<
") " << func->getSort()->toString() <<
" ";
2974 ss <<
"(assert " <<
dumpSMTLIB2(formula) <<
")" << std::endl;
2976 ss <<
"(check-sat)" << std::endl;
2977 ss <<
"(exit)" << std::endl;
2982 std::ofstream file(filename);
2989 size_t removedCount = 0;
2991 for (
const auto &funcName : funcNames) {
3008 return removedCount;
3023 return std::make_shared<Parser>(filename);
#define condAssert(cond, msg)
std::string toString(int base=10) const
static HighPrecisionReal pi(mpfr_prec_t precision=128)
static HighPrecisionReal e(mpfr_prec_t precision=128)
static const std::shared_ptr< DAGNode > NULL_NODE
void err_all(const ERROR_TYPE e, const std::string s="", const size_t ln=0) const
std::shared_ptr< GlobalOptions > options
void err_neg_param(const size_t ln) const
void err_param_mis(const std::string nm, const size_t ln) const
std::vector< std::vector< DTTypeDecl > > datatype_blocks
std::vector< std::shared_ptr< DAGNode > > assertions
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< Sort > mkSortDef(const std::string &name, const std::vector< std::shared_ptr< Sort > > ¶ms, std::shared_ptr< Sort > out_sort)
Create a sort definition.
bool parseSmtlib2File(const std::string filename)
Parse an SMT-LIB2 file.
std::unordered_map< std::string, size_t > temp_var_names
void err_unexp_eof() const
std::vector< std::shared_ptr< DAGNode > > static_functions
bool isOne(std::shared_ptr< DAGNode > expr)
Check if an expression is one.
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.
void setOption(const std::string &key, const std::string &value)
Set global options.
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 > substitute(std::shared_ptr< DAGNode > expr, std::unordered_map< std::string, std::shared_ptr< DAGNode > > ¶ms)
Substitute variables in an expression.
std::vector< std::string > function_names
void err_zero_divisor(const size_t ln) const
std::vector< std::vector< std::shared_ptr< DAGNode > > > assumptions
std::vector< std::shared_ptr< DAGNode > > getAssertions() const
Get all assertions.
std::shared_ptr< DAGNode > mkExists(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create an exists node.
void setEvaluatePrecision(mpfr_prec_t precision)
Set the precision for evaluation.
std::unordered_map< std::string, std::unordered_set< size_t > > getGroupedSoftAssertions() const
Get grouped soft assertions.
void err_param_nsame(const std::string nm, const size_t ln) const
std::shared_ptr< DAGNode > mkForall(const std::vector< std::shared_ptr< DAGNode > > ¶ms)
Create a forall node.
std::string optionToString()
Print the options.
std::shared_ptr< Sort > placeholder_var_sort
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()
void err_keyword(const std::string nm, const size_t ln) const
std::shared_ptr< DAGNode > parsePreservingLet()
std::shared_ptr< DAGNode > getZero(std::shared_ptr< Sort > sort)
Get the zero for a sort.
std::string toString(std::shared_ptr< DAGNode > expr)
Print an expression.
std::vector< std::vector< std::shared_ptr< DAGNode > > > getAssumptions() const
Get assumptions.
std::vector< std::shared_ptr< DAGNode > > getFunctions() const
Get functions.
bool getEvaluateUseFloating() const
Get the use floating for evaluation.
std::shared_ptr< GlobalOptions > getOptions() const
Get global options.
std::shared_ptr< DAGNode > mkWeight(const std::shared_ptr< Sort > &sort, const std::string &name, std::shared_ptr< DAGNode > weight)
std::unordered_map< std::string, size_t > var_names
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 > mkApplyDTFun(const std::shared_ptr< Sort > &sort, const std::string &name, const std::vector< std::shared_ptr< DAGNode > > ¶ms)
KEYWORD attemptParseKeywords()
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 > 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.
RESULT_TYPE getResultType()
Get result type.
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.
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.
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 > mkLetBindVar(const std::string &name, const std::shared_ptr< DAGNode > &expr)
size_t quant_nesting_depth
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::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.
bool isZero(std::shared_ptr< DAGNode > expr)
Check if an expression is zero.
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.
void err_logic(const std::string nm, const size_t ln) const
std::vector< std::string > parse_options
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::vector< std::shared_ptr< DAGNode > > soft_weights
std::shared_ptr< DAGNode > getVariable(const std::string &var_name)
Get variable.
std::vector< std::shared_ptr< DAGNode > > getVariables() const
Get variables.
std::shared_ptr< DAGNode > parseQuant(const std::string &type)
bool allow_placeholder_vars
void err_unkwn_sym(const std::string nm, const size_t ln) const
void setEvaluateUseFloating(bool use_floating)
Set the use floating for evaluation.
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::unordered_map< std::string, std::shared_ptr< DAGNode > > named_assertions
std::unordered_map< std::string, std::shared_ptr< DAGNode > > let_key_map
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 > 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()
void err_type_mis(const std::string nm, const size_t ln) const
void err_arity_mis(const std::string nm, const size_t ln) const
mpfr_prec_t getEvaluatePrecision() const
Get the precision for evaluation.
void err_sym_mis(const std::string mis, const size_t ln) const
std::shared_ptr< DAGNode > rebuildLetBindings(const std::shared_ptr< DAGNode > &root)
bool isDeclaredVariable(const std::string &var_name) const
Check if a variable is declared.
std::shared_ptr< DAGNode > getResult()
Get result.
std::shared_ptr< DAGNode > mkFunParamVar(std::shared_ptr< Sort > sort, const std::string &name)
Create a function parameter variable.
void err_param_nbool(const std::string nm, const size_t ln) const
std::vector< std::shared_ptr< DAGNode > > getSoftAssertions() const
Get soft assertions.
std::shared_ptr< DAGNode > mkVar(const std::shared_ptr< Sort > &sort, const std::string &name)
Create a variable.
std::shared_ptr< DAGNode > mkExpr(const std::string &expression)
Create a DAG node from a string expression.
std::shared_ptr< DAGNode > parseExpr()
std::shared_ptr< DAGNode > mkAttribute(const std::shared_ptr< Sort > &sort, const std::string &name, const std::vector< std::shared_ptr< DAGNode > > ¶ms)
std::unordered_set< std::string > datatype_sort_names
std::vector< std::shared_ptr< DAGNode > > soft_assertions
std::unique_ptr< NodeManager > node_manager
std::vector< std::shared_ptr< DAGNode > > getDeclaredVariables() const
Get declared variables.
std::unordered_map< std::string, std::unordered_set< size_t > > getGroupedAssertions() const
Get grouped assertions.
std::shared_ptr< DAGNode > mkConstStr(const std::string &v)
Create a string constant.
std::unique_ptr< SortManager > sort_manager
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 > rename(std::shared_ptr< DAGNode > expr, const std::string &new_name)
Rename a node.
NODE_KIND getAddOp(std::shared_ptr< Sort > sort)
Get the add operator for a sort.
std::shared_ptr< DAGNode > result_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
bool isDeclaredFunction(const std::string &func_name) const
Check if a function is declared.
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.
static const std::shared_ptr< Sort > ROUNDING_MODE_SORT
static const std::shared_ptr< Sort > STR_SORT
static const std::shared_ptr< Sort > INT_SORT
static const std::shared_ptr< Sort > FLOAT32_SORT
static const std::shared_ptr< Sort > FLOAT16_SORT
static const std::shared_ptr< Sort > FLOAT64_SORT
static const std::shared_ptr< Sort > REG_SORT
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)
std::string kindToString(const NODE_KIND &nk)
const std::string PRESERVING_LET_BIND_VAR_SUFFIX
std::string dumpSMTLIB2(const std::shared_ptr< DAGNode > &root)
std::string dumpFuncDec(const std::shared_ptr< DAGNode > &node)
@ CT_GET_UNSAT_ASSUMPTIONS
std::string dumpFuncRec(const std::shared_ptr< DAGNode > &node)
char * safe_strdup(const std::string &str)
NODE_KIND getNegatedKind(const NODE_KIND &nk)
std::shared_ptr< Parser > ParserPtr
std::vector< std::shared_ptr< DAGNode > > params
std::shared_ptr< DAGNode > bind_var_list
std::vector< std::string > key_list
std::shared_ptr< DAGNode > result
std::vector< DTSelectorDecl > selectors
std::vector< DTConstructorDecl > ctors