SMTStabilizer API
Public API documentation for SMTStabilizer
Loading...
Searching...
No Matches
parser.h
Go to the documentation of this file.
1/* -*- Header -*-
2 *
3 * An SMT/OMT Parser
4 *
5 * Author: Fuqi Jia <jiafq@ios.ac.cn>
6 *
7 * Copyright (C) 2025 Fuqi Jia
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included in
17 * all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 * DEALINGS IN THE SOFTWARE.
26 */
27// Modified by Xiang Zhang, 2026
28// Additional changes licensed under the MIT License
29#ifndef PARSER_HEADER
30#define PARSER_HEADER
31
32#include <cstddef>
33#include <memory>
34#include <string>
35#include <unordered_map>
36#include <unordered_set>
37#include <vector>
38
39#include "dag.h"
40// #include "objective.h"
41#include "options.h"
42#include "parser/kind.h"
43#include "util.h"
44
45namespace stabilizer::parser {
46#undef assert
47enum class SCAN_MODE {
53};
54
55// LET mode, only used in preserving let mode
56enum class LET_MODE {
57 LM_NON_LET, // not in let
58 LM_START_LET, // start of let
59 LM_IN_LET, // in let
60};
61
62enum class KEYWORD {
63 KW_ID,
65 KW_COMP,
67 KW_M,
72 KW_QID,
77};
78
79enum class CMD_TYPE {
81 CT_EOF,
82 // COMMANDS
93 CT_ECHO,
94 CT_EXIT,
104 CT_POP,
105 CT_PUSH,
106 CT_RESET,
111 // QUANTIFIER
112 CT_EXISTS,
113 CT_FORALL,
114 // OPTIMIZATION COMMANDS
125 CT_MINMAX,
126 CT_MAXMIN,
127 CT_MAXSAT,
128 CT_MINSAT,
130 // CT_LEX_MAXIMIZE, CT_PARETO_MINIMIZE, CT_PARETO_MAXIMIZE,
131 // CT_BOX_MINIMIZE, CT_BOX_MAXIMIZE, CT_MINMAX, CT_MAXMIN
132};
133
151
152enum class RESULT_TYPE { RT_SAT,
153 RT_UNSAT,
156 RT_ERROR };
157
158/*
159Parser
160*/
161
162// NOTE: only non-incremental mode
163class Parser {
164 public:
165 // Datatype declarations captured for dumping
167 std::string name;
168 std::shared_ptr<Sort> sort;
169 };
171 std::string name;
172 std::vector<DTSelectorDecl> selectors;
173 };
174 struct DTTypeDecl {
175 std::string name;
176 size_t arity = 0;
177 std::vector<DTConstructorDecl> ctors;
178 };
179
180 private:
181 // attributes
182
183 // vars for parser
184 char *buffer;
185 unsigned long buflen;
186 char *bufptr;
189 size_t preserving_let_counter; // only used in preserving let mode
190 LET_MODE current_let_mode; // only used in preserving let mode
191 size_t let_nesting_depth; // track let nesting depth
192 size_t quant_nesting_depth; // track quantifier nesting depth
194 bool allow_placeholder_vars; // allow creating placeholder variables
195 std::shared_ptr<Sort> placeholder_var_sort; // sort for placeholder variables
196
198 std::vector<std::string> parse_options;
199
200 // node manager
201 std::unique_ptr<NodeManager> node_manager;
202 // sort manager
203 std::unique_ptr<SortManager> sort_manager;
204
205 std::unordered_map<std::string, std::shared_ptr<DAGNode>>
206 let_key_map; // local variables, no need to hash store
207 std::unordered_map<std::string, std::shared_ptr<DAGNode>>
208 preserving_let_key_map; // global variables, no need to hash store
209 std::unordered_map<std::string, std::shared_ptr<DAGNode>> fun_key_map;
210 std::unordered_map<std::string, std::shared_ptr<DAGNode>>
211 fun_var_map; // variables are not the same, no need to hash store
212 std::unordered_map<std::string, std::shared_ptr<Sort>> sort_key_map;
213 std::unordered_map<std::string, std::vector<std::shared_ptr<DAGNode>>>
215 std::unordered_map<std::string, size_t>
216 fun_dup_count_map; // track duplicate function names
217 std::vector<std::shared_ptr<DAGNode>>
218 static_functions; // static functions without substitution
219
220 // Datatype tracking for output
221 std::vector<std::vector<DTTypeDecl>>
222 datatype_blocks; // list of blocks, each with types in the block
223 std::unordered_set<std::string>
224 datatype_sort_names; // names declared by datatypes to suppress
225 // declare-sort
226 std::unordered_set<std::string>
227 datatype_function_names; // ctor/selector names for DT_FUN_APPLY
228 // classification
229
230 // variable name list
231 std::unordered_map<std::string, size_t> var_names;
232 // temp var
234 std::unordered_map<std::string, size_t> temp_var_names;
235 // placeholder variables
236 std::unordered_map<std::string, size_t> placeholder_var_names;
237
238 // temp var name list
239 // function name list
240 std::vector<std::string> function_names;
241 // global options
242 std::shared_ptr<GlobalOptions> options;
243 // // (define-objective name single_opt)
244 // std::unordered_map<std::string, std::shared_ptr<Objective>>
245 // objective_map;
246 // conversion map
247 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
249 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
250 cnf_atom_map; // bool_var -> atom
251 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
252 cnf_bool_var_map; // atom -> bool_var
253 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
255 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
257
258 // result
260 std::shared_ptr<DAGNode> result_node;
261
262 size_t num_quant_vars = 0;
263
264 public:
265 std::vector<std::shared_ptr<DAGNode>> assertions;
266 std::unordered_map<std::string, std::unordered_set<size_t>> assertion_groups;
267 //: named
268 std::unordered_map<std::string, std::shared_ptr<DAGNode>> named_assertions;
269 //: pattern
270 std::vector<std::pair<std::shared_ptr<DAGNode>,
271 std::vector<std::vector<std::shared_ptr<DAGNode>>>>>
273 std::vector<std::vector<std::shared_ptr<DAGNode>>> assumptions;
274 std::vector<std::shared_ptr<DAGNode>> soft_assertions;
275 std::vector<std::shared_ptr<DAGNode>> soft_weights;
276 std::unordered_map<std::string, std::unordered_set<size_t>>
278 // std::vector<std::shared_ptr<Objective>> objectives;
279 std::vector<std::shared_ptr<DAGNode>> split_lemmas;
280
281 public:
290 Parser(const std::string &filename);
291
298 Parser();
299
305 ~Parser();
306
308 const std::vector<std::shared_ptr<DAGNode>> &new_assertions) {
309 assertions = new_assertions;
310 }
311 std::shared_ptr<DAGNode> mkUFVNode(const std::string &name,
312 const std::shared_ptr<Sort> &sort) {
313 return node_manager->createNode(sort, NODE_KIND::NT_UF_NAME, name);
314 }
315 std::shared_ptr<DAGNode>
316 rebuildLetBindings(const std::shared_ptr<DAGNode> &root);
317
318 std::unordered_map<std::string, size_t> &getTempVarNames() {
319 return temp_var_names;
320 }
321 std::unordered_map<std::string, size_t> &getVarNames() { return var_names; }
322 std::unordered_map<std::string, std::shared_ptr<DAGNode>> &getFunKeyMap() {
323 return fun_key_map;
324 }
325 std::vector<std::string> &getFunctionNames() { return function_names; }
326 std::unordered_map<std::string, std::shared_ptr<Sort>> &getSortNames() {
327 return sort_key_map;
328 }
329 std::vector<std::vector<DTTypeDecl>> &getDatatypeBlocks() {
330 return datatype_blocks;
331 }
341 bool parse(const std::string &filename);
342
351 bool parseStr(const std::string &constraint);
352
363 bool assert(const std::string &constraint);
364
373 bool assert(std::shared_ptr<DAGNode> node);
374
384 std::shared_ptr<DAGNode> mkExpr(const std::string &expression);
385
386 // to solver
392 std::vector<std::shared_ptr<DAGNode>> getAssertions() const;
393
402 std::unordered_map<std::string, std::unordered_set<size_t>>
403 getGroupedAssertions() const;
404
413 std::vector<std::vector<std::shared_ptr<DAGNode>>> getAssumptions() const;
414
423 std::vector<std::shared_ptr<DAGNode>> getSoftAssertions() const;
424
430 std::vector<std::shared_ptr<DAGNode>> getSoftWeights() const;
431
440 std::unordered_map<std::string, std::unordered_set<size_t>>
442
443 // /**
444 // * @brief Get objectives
445 // *
446 // * @return Vector of all objectives
447 // */
448 // std::vector<std::shared_ptr<Objective>> getObjectives() const;
449
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);
460
466 std::shared_ptr<GlobalOptions> getOptions() const;
467
473 std::vector<std::shared_ptr<DAGNode>> getVariables() const;
474
480 std::vector<std::shared_ptr<DAGNode>> getDeclaredVariables() const;
481
488 bool isDeclaredVariable(const std::string &var_name) const;
489
496 std::shared_ptr<DAGNode> getVariable(const std::string &var_name);
497
506 std::vector<std::shared_ptr<DAGNode>> getFunctions() const;
507
514 bool isDeclaredFunction(const std::string &func_name) const;
515
516 // get sort
523 std::shared_ptr<Sort>
524 getSort(const std::vector<std::shared_ptr<DAGNode>> &params);
525
532 std::shared_ptr<Sort> getSort(std::shared_ptr<DAGNode> param);
533
541 std::shared_ptr<Sort> getSort(std::shared_ptr<DAGNode> l,
542 std::shared_ptr<DAGNode> r);
543
552 std::shared_ptr<Sort> getSort(std::shared_ptr<DAGNode> l,
553 std::shared_ptr<DAGNode> r,
554 std::shared_ptr<DAGNode> m);
555
562 NODE_KIND getKind(const std::string &s);
563
570 NODE_KIND getKind(const std::shared_ptr<DAGNode> &node);
571
572 // get result type
579
580 // get result
586 std::shared_ptr<DAGNode> getResult();
587
588 // check sat
595
596 // get node count
602 size_t getNodeCount();
603
604 // mk oper
613 std::shared_ptr<DAGNode> mkOper(const std::shared_ptr<Sort> &sort,
614 const NODE_KIND &t,
615 std::shared_ptr<DAGNode> p);
616
626 std::shared_ptr<DAGNode> mkOper(const std::shared_ptr<Sort> &sort,
627 const NODE_KIND &t,
628 std::shared_ptr<DAGNode> l,
629 std::shared_ptr<DAGNode> r);
630
641 std::shared_ptr<DAGNode> mkOper(const std::shared_ptr<Sort> &sort,
642 const NODE_KIND &t,
643 std::shared_ptr<DAGNode> l,
644 std::shared_ptr<DAGNode> m,
645 std::shared_ptr<DAGNode> r);
646
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);
657
658 // /**
659 // * @brief Simplify an operation
660 // *
661 // * @note The parameters are assumed to be constant.
662 // *
663 // * @param t Operation kind
664 // * @param p Parameters
665 // * @return Simplified operation node
666 // */
667 // std::shared_ptr<DAGNode> simp_oper(const NODE_KIND& t,
668 // std::shared_ptr<DAGNode> p);
669
670 // /**
671 // * @brief Simplify an operation
672 // *
673 // * @note The parameters are assumed to be constant.
674 // *
675 // * @param t Operation kind
676 // * @param l Left parameter
677 // * @param r Right parameter
678 // * @return Simplified operation node
679 // */
680 // std::shared_ptr<DAGNode> simp_oper(const NODE_KIND& t,
681 // std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r);
682
683 // /**
684 // * @brief Simplify an operation
685 // *
686 // * @note The parameters are assumed to be constant.
687 // *
688 // * @param t Operation kind
689 // * @param l Left parameter
690 // * @param m Middle parameter
691 // * @param r Right parameter
692 // * @return Simplified operation node
693 // */
694 // std::shared_ptr<DAGNode> simp_oper(const NODE_KIND& t,
695 // std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> m,
696 // std::shared_ptr<DAGNode> r);
697
698 // /**
699 // * @brief Simplify an operation
700 // *
701 // * @param t Operation kind
702 // * @param p Parameters
703 // * @return Simplified operation node
704 // */
705 // std::shared_ptr<DAGNode> simp_oper(const NODE_KIND& t, const
706 // std::vector<std::shared_ptr<DAGNode>>& p);
707
714 std::shared_ptr<DAGNode> rewrite(NODE_KIND &t, std::shared_ptr<DAGNode> &p);
715
723 std::shared_ptr<DAGNode> rewrite(NODE_KIND &t, std::shared_ptr<DAGNode> &l, std::shared_ptr<DAGNode> &r);
724
733 std::shared_ptr<DAGNode> rewrite(NODE_KIND &t, std::shared_ptr<DAGNode> &l, std::shared_ptr<DAGNode> &m, std::shared_ptr<DAGNode> &r);
734
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);
745
752 std::shared_ptr<DAGNode> rewrite(NODE_KIND &t,
753 std::vector<std::shared_ptr<DAGNode>> &p);
754
761 std::shared_ptr<DAGNode>
762 rewrite_oper(NODE_KIND &t, std::vector<std::shared_ptr<DAGNode>> &p);
763
764 std::unique_ptr<NodeManager> getNodeManager() {
765 return std::move(node_manager);
766 }
768 node_manager = std::make_unique<NodeManager>();
769 }
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) {
772 auto result = rewrite_oper(t, params);
773 if (isCommutative(t)) {
774 if (result != nullptr)
775 throw std::runtime_error(
776 "rewrite_oper should return nullptr for commutative operators");
777 switch (t) {
782 std::vector<std::shared_ptr<DAGNode>> nparams(params.begin() + 1,
783 params.end());
784 nparams = sortParams(nparams);
785 nparams.insert(nparams.begin(), params[0]);
786 params = nparams;
787 break;
788 }
789 default:
790 params = sortParams(params);
791 break;
792 }
793
794 // result->rep
795 }
796
797 // auto result = nullptr;
798 if (result != nullptr)
799 return result;
800 else
801 return node_manager->createNode(sort, t, name, params);
802 }
806 static bool isCommutative(NODE_KIND t);
807
811 static std::vector<std::shared_ptr<DAGNode>>
812 sortParams(const std::vector<std::shared_ptr<DAGNode>> &p);
813 // std::shared_ptr<DAGNode> mkNode(std::shared_ptr<Sort> sort, NODE_KIND t,
814 // std::string name, std::shared_ptr<Value> value, const
815 // std::vector<std::shared_ptr<DAGNode>>& children); mk function
824 std::shared_ptr<DAGNode>
825 mkFuncDec(const std::string &name,
826 const std::vector<std::shared_ptr<Sort>> &params,
827 std::shared_ptr<Sort> out_sort);
828
838 std::shared_ptr<DAGNode>
839 mkFuncDef(const std::string &name,
840 const std::vector<std::shared_ptr<DAGNode>> &params,
841 std::shared_ptr<Sort> out_sort,
842 std::shared_ptr<DAGNode> body);
843
853 std::shared_ptr<DAGNode>
854 mkFuncRec(const std::string &name,
855 const std::vector<std::shared_ptr<DAGNode>> &params,
856 std::shared_ptr<Sort> out_sort,
857 std::shared_ptr<DAGNode> body);
858
866 std::shared_ptr<DAGNode>
867 mkApplyRecFunc(std::shared_ptr<DAGNode> fun,
868 const std::vector<std::shared_ptr<DAGNode>> &params);
869
870 std::shared_ptr<DAGNode>
871 mkPattern(const std::shared_ptr<Sort> &sort, const std::string &name, const std::vector<std::shared_ptr<DAGNode>> &params);
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>> &params);
888 std::shared_ptr<DAGNode>
889 mkApplyUF(const std::shared_ptr<Sort> &sort, const std::string &name, const std::vector<std::shared_ptr<DAGNode>> &params);
890
891 // mk sort
899 std::shared_ptr<Sort> mkSortDec(const std::string &name, const size_t &arity);
900
909 std::shared_ptr<Sort>
910 mkSortDef(const std::string &name,
911 const std::vector<std::shared_ptr<Sort>> &params,
912 std::shared_ptr<Sort> out_sort);
913
914 // mk special sort
920 std::shared_ptr<Sort> mkIntSort();
926 std::shared_ptr<Sort> mkRealSort();
932 std::shared_ptr<Sort> mkBoolSort();
938 std::shared_ptr<Sort> mkStrSort();
944 std::shared_ptr<Sort> mkRegSort();
950 std::shared_ptr<Sort> mkRoundingModeSort();
956 std::shared_ptr<Sort> mkNatSort();
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);
981
982 // declare var
989 std::shared_ptr<DAGNode> declareVar(const std::string &name,
990 const std::string &sort);
991
998 std::shared_ptr<DAGNode> declareVar(const std::string &name,
999 const std::shared_ptr<Sort> &sort);
1000
1001 // mk true/false
1007 std::shared_ptr<DAGNode> mkTrue(); // true
1008
1014 std::shared_ptr<DAGNode> mkFalse(); // false
1015
1021 std::shared_ptr<DAGNode> mkUnknown(); // unknown
1022 // CORE OPERATORS
1029 std::shared_ptr<DAGNode>
1030 mkEq(const std::vector<std::shared_ptr<DAGNode>> &params); // l = r = ...
1031
1038 std::shared_ptr<DAGNode> mkDistinct(
1039 const std::vector<std::shared_ptr<DAGNode>> &params); // l != r != ...
1040
1041 // CONST
1048 std::shared_ptr<DAGNode> mkConstInt(const std::string &v); // CONST_INT
1049
1056 std::shared_ptr<DAGNode> mkConstInt(const int &v); // CONST_INT
1057
1064 std::shared_ptr<DAGNode> mkConstInt(const Integer &v); // CONST_INT
1065
1072 std::shared_ptr<DAGNode> mkConstInt(const Number &v); // CONST_INT
1073
1080 std::shared_ptr<DAGNode> mkConstReal(const std::string &v); // CONST_REAL
1081
1088 std::shared_ptr<DAGNode> mkConstReal(const Real &v); // CONST_REAL
1089
1096 std::shared_ptr<DAGNode> mkConstReal(const double &v); // CONST_REAL
1097
1104 std::shared_ptr<DAGNode> mkConstReal(const Integer &v); // CONST_REAL
1105
1112 std::shared_ptr<DAGNode> mkConstReal(const Number &v); // CONST_REAL
1113
1120 std::shared_ptr<DAGNode> mkConstStr(const std::string &v); // CONST_Str
1121
1129 std::shared_ptr<DAGNode> mkConstBv(const std::string &v,
1130 const size_t &width); // CONST_BV
1131
1140 std::shared_ptr<DAGNode> mkConstFp(const std::string &v, const size_t &e,
1141 const size_t &s); // CONST_FP
1142
1149 std::shared_ptr<DAGNode>
1150 mkConstFP(const std::string &fp_expr); // CONST_FP from expression
1151
1158 std::shared_ptr<DAGNode> mkConstReg(const std::string &v); // CONST_REG
1159
1166 std::shared_ptr<DAGNode>
1167 mkRoundingMode(const std::string &mode); // ROUNDING_MODE
1168
1175 std::shared_ptr<DAGNode>
1176 mkVarRoundingMode(const std::string &name); // VAR_ROUNDING_MODE
1177
1178 // VAR
1186 std::shared_ptr<DAGNode> mkVar(const std::shared_ptr<Sort> &sort,
1187 const std::string &name); // VAR
1188 std::shared_ptr<DAGNode>
1189 mkPlaceholderVar(const std::string &name); // PLACEHOLDER_VAR
1190
1197 std::shared_ptr<DAGNode>
1198 mkTempVar(const std::shared_ptr<Sort> &sort); // TEMP_VAR
1199
1206 std::shared_ptr<DAGNode> mkVarBool(const std::string &name); // VAR_BOOL
1207
1214 std::shared_ptr<DAGNode> mkVarInt(const std::string &name); // VAR_INT
1215
1222 std::shared_ptr<DAGNode> mkVarReal(const std::string &name); // VAR_REAL
1223
1231 std::shared_ptr<DAGNode> mkVarBv(const std::string &name,
1232 const size_t &width); // VAR_BV
1233
1242 std::shared_ptr<DAGNode> mkVarFp(const std::string &name, const size_t &e,
1243 const size_t &s); // VAR_FP
1244
1251 std::shared_ptr<DAGNode> mkVarStr(const std::string &name); // VAR_STR
1252
1259 std::shared_ptr<DAGNode> mkVarReg(const std::string &name); // VAR_REG
1260
1268 std::shared_ptr<DAGNode>
1269 mkFunParamVar(std::shared_ptr<Sort> sort,
1270 const std::string &name); // FUN_PARAM_VAR
1271
1280 std::shared_ptr<DAGNode> mkArray(const std::string &name,
1281 std::shared_ptr<Sort> index,
1282 std::shared_ptr<Sort> elem); // ARRAY
1283
1291 std::shared_ptr<DAGNode>
1292 mkConstArray(std::shared_ptr<Sort> sort,
1293 std::shared_ptr<DAGNode> value); // CONST ARRAY
1294
1295 // BOOLEAN
1302 std::shared_ptr<DAGNode> mkNot(std::shared_ptr<DAGNode> param);
1303
1310 std::shared_ptr<DAGNode>
1311 mkAnd(const std::vector<std::shared_ptr<DAGNode>> &params);
1312
1319 std::shared_ptr<DAGNode>
1320 mkOr(const std::vector<std::shared_ptr<DAGNode>> &params);
1321
1328 std::shared_ptr<DAGNode>
1329 mkImplies(const std::vector<std::shared_ptr<DAGNode>> &params);
1330
1337 std::shared_ptr<DAGNode>
1338 mkXor(const std::vector<std::shared_ptr<DAGNode>> &params);
1339
1348 std::shared_ptr<DAGNode> mkIte(std::shared_ptr<DAGNode> cond,
1349 std::shared_ptr<DAGNode> l,
1350 std::shared_ptr<DAGNode> r);
1351
1360 std::shared_ptr<DAGNode>
1361 mkIte(const std::vector<std::shared_ptr<DAGNode>> &params);
1362
1363 // ARITHMATIC COMMON OPERATORS
1370 std::shared_ptr<DAGNode>
1371 mkAdd(const std::vector<std::shared_ptr<DAGNode>> &params); // l + r + ...
1372
1379 std::shared_ptr<DAGNode>
1380 mkMul(const std::vector<std::shared_ptr<DAGNode>> &params); // l * r * ...
1381
1388 std::shared_ptr<DAGNode>
1389 mkIand(const std::vector<std::shared_ptr<DAGNode>> &params); // l & r & ...
1390
1397 std::shared_ptr<DAGNode> mkPow2(std::shared_ptr<DAGNode> param); // 2^param
1398
1406 std::shared_ptr<DAGNode> mkPow(std::shared_ptr<DAGNode> l,
1407 std::shared_ptr<DAGNode> r); // l^r
1408
1415 std::shared_ptr<DAGNode>
1416 mkSub(const std::vector<std::shared_ptr<DAGNode>> &params);
1417
1424 std::shared_ptr<DAGNode> mkNeg(std::shared_ptr<DAGNode> param); // -param
1425
1435 std::shared_ptr<DAGNode>
1436 mkDiv(const std::vector<std::shared_ptr<DAGNode>> &params); // l / r / ...
1437
1444 std::shared_ptr<DAGNode>
1445 mkDivInt(const std::vector<std::shared_ptr<DAGNode>> &params); // l / r / ...
1446
1453 std::shared_ptr<DAGNode>
1454 mkDivReal(const std::vector<std::shared_ptr<DAGNode>> &params); // l / r / ...
1455
1463 std::shared_ptr<DAGNode> mkMod(std::shared_ptr<DAGNode> l,
1464 std::shared_ptr<DAGNode> r); // l % r
1465
1472 std::shared_ptr<DAGNode> mkAbs(std::shared_ptr<DAGNode> param); // |param|
1473
1482 std::shared_ptr<DAGNode>
1483 mkSqrt(std::shared_ptr<DAGNode> param); // sqrt(param)
1484
1493 std::shared_ptr<DAGNode>
1494 mkSafeSqrt(std::shared_ptr<DAGNode> param); // safeSqrt(param)
1495
1502 std::shared_ptr<DAGNode>
1503 mkCeil(std::shared_ptr<DAGNode> param); // ceil(param)
1504
1511 std::shared_ptr<DAGNode>
1512 mkFloor(std::shared_ptr<DAGNode> param); // floor(param)
1513
1520 std::shared_ptr<DAGNode>
1521 mkRound(std::shared_ptr<DAGNode> param); // round(param)
1522
1523 // TRANSCENDENTAL ARITHMATIC
1530 std::shared_ptr<DAGNode> mkExp(std::shared_ptr<DAGNode> param); // exp(param)
1531
1540 std::shared_ptr<DAGNode> mkLn(std::shared_ptr<DAGNode> param); // ln(param)
1541
1550 std::shared_ptr<DAGNode> mkLg(std::shared_ptr<DAGNode> param); // lg(param)
1551
1560 std::shared_ptr<DAGNode> mkLb(std::shared_ptr<DAGNode> param); // lb(param)
1561
1572 std::shared_ptr<DAGNode> mkLog(std::shared_ptr<DAGNode> l,
1573 std::shared_ptr<DAGNode> r); // log_l(r)
1574
1581 std::shared_ptr<DAGNode> mkSin(std::shared_ptr<DAGNode> param); // sin(param)
1582
1589 std::shared_ptr<DAGNode> mkCos(std::shared_ptr<DAGNode> param); // cos(param)
1590
1597 std::shared_ptr<DAGNode> mkSec(std::shared_ptr<DAGNode> param); // sec(param)
1598
1605 std::shared_ptr<DAGNode> mkCsc(std::shared_ptr<DAGNode> param); // csc(param)
1606
1615 std::shared_ptr<DAGNode> mkTan(std::shared_ptr<DAGNode> param); // tan(param)
1616
1625 std::shared_ptr<DAGNode> mkCot(std::shared_ptr<DAGNode> param); // cot(param)
1626
1635 std::shared_ptr<DAGNode>
1636 mkAsin(std::shared_ptr<DAGNode> param); // asin(param)
1637
1646 std::shared_ptr<DAGNode>
1647 mkAcos(std::shared_ptr<DAGNode> param); // acos(param)
1648
1657 std::shared_ptr<DAGNode>
1658 mkAsec(std::shared_ptr<DAGNode> param); // asec(param)
1659
1668 std::shared_ptr<DAGNode>
1669 mkAcsc(std::shared_ptr<DAGNode> param); // acsc(param)
1670
1677 std::shared_ptr<DAGNode>
1678 mkAtan(std::shared_ptr<DAGNode> param); // atan(param)
1679
1686 std::shared_ptr<DAGNode>
1687 mkAcot(std::shared_ptr<DAGNode> param); // acot(param)
1688
1695 std::shared_ptr<DAGNode>
1696 mkSinh(std::shared_ptr<DAGNode> param); // sinh(param)
1697
1704 std::shared_ptr<DAGNode>
1705 mkCosh(std::shared_ptr<DAGNode> param); // cosh(param)
1706
1713 std::shared_ptr<DAGNode>
1714 mkTanh(std::shared_ptr<DAGNode> param); // tanh(param)
1715
1722 std::shared_ptr<DAGNode>
1723 mkSech(std::shared_ptr<DAGNode> param); // sech(param)
1724
1733 std::shared_ptr<DAGNode>
1734 mkCsch(std::shared_ptr<DAGNode> param); // csch(param)
1735
1744 std::shared_ptr<DAGNode>
1745 mkCoth(std::shared_ptr<DAGNode> param); // coth(param)
1746
1753 std::shared_ptr<DAGNode>
1754 mkAsinh(std::shared_ptr<DAGNode> param); // asinh(param)
1755
1764 std::shared_ptr<DAGNode>
1765 mkAcosh(std::shared_ptr<DAGNode> param); // acosh(param)
1766
1775 std::shared_ptr<DAGNode>
1776 mkAtanh(std::shared_ptr<DAGNode> param); // atanh(param)
1777
1786 std::shared_ptr<DAGNode>
1787 mkAsech(std::shared_ptr<DAGNode> param); // asech(param)
1788
1797 std::shared_ptr<DAGNode>
1798 mkAcsch(std::shared_ptr<DAGNode> param); // acsch(param)
1799
1808 std::shared_ptr<DAGNode>
1809 mkAcoth(std::shared_ptr<DAGNode> param); // acoth(param)
1810
1822 std::shared_ptr<DAGNode> mkAtan2(std::shared_ptr<DAGNode> l,
1823 std::shared_ptr<DAGNode> r);
1824 // ARITHMATIC COMP
1831 std::shared_ptr<DAGNode>
1832 mkLe(const std::vector<std::shared_ptr<DAGNode>> &params); // l <= r
1833
1840 std::shared_ptr<DAGNode>
1841 mkLt(const std::vector<std::shared_ptr<DAGNode>> &params); // l < r
1842
1849 std::shared_ptr<DAGNode> mkGe(const std::vector<std::shared_ptr<DAGNode>>
1850 &params); // l >= r >= ... >= s
1851
1858 std::shared_ptr<DAGNode>
1859 mkGt(const std::vector<std::shared_ptr<DAGNode>> &params); // l > r > ... > s
1860
1861 // ARITHMATIC CONVERSION
1862
1869 std::shared_ptr<DAGNode>
1870 mkToInt(std::shared_ptr<DAGNode> param); // to_int(param)
1871
1878 std::shared_ptr<DAGNode>
1879 mkToReal(std::shared_ptr<DAGNode> param); // to_real(param)
1880
1881 // ARITHMATIC PROPERTIES
1888 std::shared_ptr<DAGNode>
1889 mkIsInt(std::shared_ptr<DAGNode> param); // is_int(param)
1890
1898 std::shared_ptr<DAGNode>
1899 mkIsDivisible(std::shared_ptr<DAGNode> l,
1900 std::shared_ptr<DAGNode> r); // is_divisible(l, r)
1901
1908 std::shared_ptr<DAGNode>
1909 mkIsPrime(std::shared_ptr<DAGNode> param); // is_prime(param)
1910
1917 std::shared_ptr<DAGNode>
1918 mkIsEven(std::shared_ptr<DAGNode> param); // is_even(param)
1919
1926 std::shared_ptr<DAGNode>
1927 mkIsOdd(std::shared_ptr<DAGNode> param); // is_odd(param)
1928
1929 // ARITHMATIC CONSTANTS
1930
1937 std::shared_ptr<DAGNode> mkPi(); // pi
1938
1944 std::shared_ptr<DAGNode> mkE(); // e
1945
1951 std::shared_ptr<DAGNode> mkInfinity(std::shared_ptr<Sort> sort); // infinity
1952
1959 std::shared_ptr<DAGNode>
1960 mkPosInfinity(std::shared_ptr<Sort> sort = nullptr); // +infinity
1961
1968 std::shared_ptr<DAGNode>
1969 mkNegInfinity(std::shared_ptr<Sort> sort = nullptr); // -infinity
1970
1977 std::shared_ptr<DAGNode> mkNaN(std::shared_ptr<Sort> sort = nullptr); // nan
1978
1984 std::shared_ptr<DAGNode> mkEpsilon(); // epsilon
1985
1991 std::shared_ptr<DAGNode> mkPosEpsilon(); // +epsilon
1992
1998 std::shared_ptr<DAGNode> mkNegEpsilon(); // -epsilon
1999
2000 // ARITHMATIC FUNCTIONS
2001
2011 std::shared_ptr<DAGNode> mkGcd(std::shared_ptr<DAGNode> l,
2012 std::shared_ptr<DAGNode> r); // gcd(l, r)
2013
2023 std::shared_ptr<DAGNode> mkLcm(std::shared_ptr<DAGNode> l,
2024 std::shared_ptr<DAGNode> r); // lcm(l, r)
2025
2034 std::shared_ptr<DAGNode>
2035 mkFact(std::shared_ptr<DAGNode> param); // factorial(param)
2036
2037 // BITVECTOR COMMON OPERATORS
2044 std::shared_ptr<DAGNode> mkBvNot(std::shared_ptr<DAGNode> param); // ~param
2045
2052 std::shared_ptr<DAGNode>
2053 mkBvAnd(const std::vector<std::shared_ptr<DAGNode>> &params); // l & r & ...
2054
2061 std::shared_ptr<DAGNode>
2062 mkBvOr(const std::vector<std::shared_ptr<DAGNode>> &params); // l | r | ...
2063
2070 std::shared_ptr<DAGNode>
2071 mkBvXor(const std::vector<std::shared_ptr<DAGNode>> &params); // l ^ r ^ ...
2072
2080 std::shared_ptr<DAGNode>
2081 mkBvNand(std::shared_ptr<DAGNode> l,
2082 std::shared_ptr<DAGNode> r); // ~(l & r & ...)
2083
2091 std::shared_ptr<DAGNode>
2092 mkBvNor(std::shared_ptr<DAGNode> l,
2093 std::shared_ptr<DAGNode> r); // ~(l | r | ...)
2094
2101 std::shared_ptr<DAGNode>
2102 mkBvComp(const std::vector<std::shared_ptr<DAGNode>> &params); // l = r
2103
2111 std::shared_ptr<DAGNode>
2112 mkBvXnor(std::shared_ptr<DAGNode> l,
2113 std::shared_ptr<DAGNode> r); // ~(l ^ r ^ ...)
2114
2121 std::shared_ptr<DAGNode> mkBvNeg(std::shared_ptr<DAGNode> param); // -param
2122
2129 std::shared_ptr<DAGNode>
2130 mkBvAdd(const std::vector<std::shared_ptr<DAGNode>> &params); // l + r + ...
2131
2139 std::shared_ptr<DAGNode> mkBvSub(std::shared_ptr<DAGNode> l,
2140 std::shared_ptr<DAGNode> r); // l - r - ...
2141
2148 std::shared_ptr<DAGNode>
2149 mkBvMul(const std::vector<std::shared_ptr<DAGNode>> &params); // l * r * ...
2150
2160 std::shared_ptr<DAGNode> mkBvUdiv(std::shared_ptr<DAGNode> l,
2161 std::shared_ptr<DAGNode> r); // l / r
2162
2172 std::shared_ptr<DAGNode> mkBvUrem(std::shared_ptr<DAGNode> l,
2173 std::shared_ptr<DAGNode> r); // l % r
2174
2184 std::shared_ptr<DAGNode> mkBvUmod(std::shared_ptr<DAGNode> l,
2185 std::shared_ptr<DAGNode> r); // l % r
2186
2197 std::shared_ptr<DAGNode> mkBvSdiv(std::shared_ptr<DAGNode> l,
2198 std::shared_ptr<DAGNode> r); // l / r
2199
2209 std::shared_ptr<DAGNode> mkBvSrem(std::shared_ptr<DAGNode> l,
2210 std::shared_ptr<DAGNode> r); // l % r
2211
2221 std::shared_ptr<DAGNode> mkBvSmod(std::shared_ptr<DAGNode> l,
2222 std::shared_ptr<DAGNode> r); // l % r
2223
2231 std::shared_ptr<DAGNode> mkBvShl(std::shared_ptr<DAGNode> l,
2232 std::shared_ptr<DAGNode> r); // l << r
2233
2241 std::shared_ptr<DAGNode> mkBvLshr(std::shared_ptr<DAGNode> l,
2242 std::shared_ptr<DAGNode> r); // l >> r
2243
2251 std::shared_ptr<DAGNode> mkBvAshr(std::shared_ptr<DAGNode> l,
2252 std::shared_ptr<DAGNode> r); // l >> r
2253
2260 std::shared_ptr<DAGNode> mkBvConcat(
2261 const std::vector<std::shared_ptr<DAGNode>> &params); // l ++ r ++ ...
2262
2275 std::shared_ptr<DAGNode> mkBvExtract(std::shared_ptr<DAGNode> l,
2276 std::shared_ptr<DAGNode> r,
2277 std::shared_ptr<DAGNode> s); // l[r:s]
2278
2290 std::shared_ptr<DAGNode> mkBvRepeat(std::shared_ptr<DAGNode> l,
2291 std::shared_ptr<DAGNode> r); // l * r
2292
2303 std::shared_ptr<DAGNode>
2304 mkBvZeroExt(std::shared_ptr<DAGNode> l,
2305 std::shared_ptr<DAGNode> r); // l zero_extend r
2306
2317 std::shared_ptr<DAGNode>
2318 mkBvSignExt(std::shared_ptr<DAGNode> l,
2319 std::shared_ptr<DAGNode> r); // l sign_extend r
2320
2328 std::shared_ptr<DAGNode>
2329 mkBvRotateLeft(std::shared_ptr<DAGNode> l,
2330 std::shared_ptr<DAGNode> r); // l <<< r
2331
2339 std::shared_ptr<DAGNode>
2340 mkBvRotateRight(std::shared_ptr<DAGNode> l,
2341 std::shared_ptr<DAGNode> r); // l >>> r
2342
2343 // BITVECTOR COMP
2351 std::shared_ptr<DAGNode> mkBvUlt(std::shared_ptr<DAGNode> l,
2352 std::shared_ptr<DAGNode> r); // l < r
2353
2361 std::shared_ptr<DAGNode> mkBvUle(std::shared_ptr<DAGNode> l,
2362 std::shared_ptr<DAGNode> r); // l <= r
2363
2371 std::shared_ptr<DAGNode> mkBvUgt(std::shared_ptr<DAGNode> l,
2372 std::shared_ptr<DAGNode> r); // l > r
2373
2381 std::shared_ptr<DAGNode> mkBvUge(std::shared_ptr<DAGNode> l,
2382 std::shared_ptr<DAGNode> r); // l >= r
2383
2391 std::shared_ptr<DAGNode> mkBvSlt(std::shared_ptr<DAGNode> l,
2392 std::shared_ptr<DAGNode> r); // l < r
2393
2401 std::shared_ptr<DAGNode> mkBvSle(std::shared_ptr<DAGNode> l,
2402 std::shared_ptr<DAGNode> r); // l <= r
2403
2411 std::shared_ptr<DAGNode> mkBvSgt(std::shared_ptr<DAGNode> l,
2412 std::shared_ptr<DAGNode> r); // l > r
2413
2421 std::shared_ptr<DAGNode> mkBvSge(std::shared_ptr<DAGNode> l,
2422 std::shared_ptr<DAGNode> r); // l >= r
2423
2424 // BITVECTOR CONVERSION
2431 std::shared_ptr<DAGNode>
2432 mkBvToNat(std::shared_ptr<DAGNode> param); // to_nat(param)
2433
2443 std::shared_ptr<DAGNode>
2444 mkNatToBv(std::shared_ptr<DAGNode> param,
2445 std::shared_ptr<DAGNode> width); // to_bv(param, width)
2446
2453 std::shared_ptr<DAGNode>
2454 mkBvToInt(std::shared_ptr<DAGNode> param); // to_int(param)
2455 std::shared_ptr<DAGNode> mkUbvToInt(std::shared_ptr<DAGNode> param);
2456 std::shared_ptr<DAGNode> mkSbvToInt(std::shared_ptr<DAGNode> param);
2457
2467 std::shared_ptr<DAGNode>
2468 mkIntToBv(std::shared_ptr<DAGNode> param,
2469 std::shared_ptr<DAGNode> width); // to_bv(param, width)
2470
2471 // FLOATING POINT COMMON OPERATORS
2478 std::shared_ptr<DAGNode>
2479 mkFpAdd(const std::vector<std::shared_ptr<DAGNode>> &params); // l + r + ...
2480
2487 std::shared_ptr<DAGNode>
2488 mkFpSub(const std::vector<std::shared_ptr<DAGNode>> &params); // l - r - ...
2489
2496 std::shared_ptr<DAGNode>
2497 mkFpMul(const std::vector<std::shared_ptr<DAGNode>> &params); // l * r * ...
2498
2507 std::shared_ptr<DAGNode>
2508 mkFpDiv(const std::vector<std::shared_ptr<DAGNode>> &params); // l / r / ...
2509
2516 std::shared_ptr<DAGNode> mkFpAbs(std::shared_ptr<DAGNode> param); // |param|
2517
2524 std::shared_ptr<DAGNode> mkFpNeg(std::shared_ptr<DAGNode> param); // -param
2525
2535 std::shared_ptr<DAGNode> mkFpRem(std::shared_ptr<DAGNode> l,
2536 std::shared_ptr<DAGNode> r); // l % r
2537
2547 std::shared_ptr<DAGNode> mkFpFma(const std::vector<std::shared_ptr<DAGNode>>
2548 &params); // fma(a, b, c) = a * b + c
2549
2559 std::shared_ptr<DAGNode>
2560 mkFpSqrt(std::shared_ptr<DAGNode> rm,
2561 std::shared_ptr<DAGNode> param); // sqrt(rm, param)
2562 std::shared_ptr<DAGNode>
2563 mkFpSqrt(std::shared_ptr<DAGNode> param); // sqrt(param)
2564
2572 std::shared_ptr<DAGNode> mkFpRoundToIntegral(
2573 std::shared_ptr<DAGNode> rm,
2574 std::shared_ptr<DAGNode> param); // round_to_integral(rm, param)
2575 std::shared_ptr<DAGNode> mkFpRoundToIntegral(
2576 std::shared_ptr<DAGNode> param); // round_to_integral(param)
2577
2585 std::shared_ptr<DAGNode>
2586 mkFpMin(std::shared_ptr<DAGNode> l,
2587 std::shared_ptr<DAGNode> r); // fp.min(params)
2588
2596 std::shared_ptr<DAGNode>
2597 mkFpMax(std::shared_ptr<DAGNode> l,
2598 std::shared_ptr<DAGNode> r); // fp.max(params)
2599
2600 // FLOATING POINT COMP
2607 std::shared_ptr<DAGNode>
2608 mkFpLe(const std::vector<std::shared_ptr<DAGNode>> &params); // l <= r
2609
2616 std::shared_ptr<DAGNode>
2617 mkFpLt(const std::vector<std::shared_ptr<DAGNode>> &params); // l < r
2618
2625 std::shared_ptr<DAGNode>
2626 mkFpGe(const std::vector<std::shared_ptr<DAGNode>> &params); // l >= r
2627
2634 std::shared_ptr<DAGNode>
2635 mkFpGt(const std::vector<std::shared_ptr<DAGNode>> &params); // l > r
2636
2645 std::shared_ptr<DAGNode>
2646 mkFpEq(const std::vector<std::shared_ptr<DAGNode>> &params); // l = r
2647
2648 // FLOATING POINT CONVERSION
2659 std::shared_ptr<DAGNode>
2660 mkFpToUbv(std::shared_ptr<DAGNode> rm, std::shared_ptr<DAGNode> param,
2661 std::shared_ptr<DAGNode> size); // to_ubv(rm, param, size)
2662
2674 std::shared_ptr<DAGNode>
2675 mkFpToSbv(std::shared_ptr<DAGNode> rm, std::shared_ptr<DAGNode> param,
2676 std::shared_ptr<DAGNode> size); // to_sbv(rm, param, size)
2677
2686 std::shared_ptr<DAGNode>
2687 mkFpToReal(std::shared_ptr<DAGNode> param); // to_real(param)
2688
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); // to_fp(eb, sb, rm, param)
2700 std::shared_ptr<DAGNode>
2701 mkToFp(std::shared_ptr<DAGNode> eb, std::shared_ptr<DAGNode> sb,
2702 std::shared_ptr<DAGNode> param); // to_fp(eb, sb, param)
2703 std::shared_ptr<DAGNode> mkToFpUnsigned(
2704 std::shared_ptr<DAGNode> eb, std::shared_ptr<DAGNode> sb, std::shared_ptr<DAGNode> rm,
2705 std::shared_ptr<DAGNode> param); // to_fp_unsigned(eb, sb, rm, param)
2706 std::shared_ptr<DAGNode>
2707 mkFpConst(std::shared_ptr<DAGNode> sign, std::shared_ptr<DAGNode> exp,
2708 std::shared_ptr<DAGNode> mant); // fp(sign, exp, mant)
2709
2710 // ROOT OBJECT
2711 std::shared_ptr<DAGNode> mkRootObj(std::shared_ptr<DAGNode> expr,
2712 int index); // root-obj(expr, index)
2713 std::shared_ptr<DAGNode> mkRootOfWithInterval(
2714 const std::vector<std::shared_ptr<DAGNode>> &coeffs,
2715 std::shared_ptr<DAGNode> lower_bound,
2716 std::shared_ptr<DAGNode> upper_bound); // root-of-with-interval(coeffs,
2717 // lower_bound, upper_bound)
2718
2719 // FLOATING POINT PROPERTIES
2726 std::shared_ptr<DAGNode>
2727 mkFpIsNormal(std::shared_ptr<DAGNode> param); // is_normal(param)
2728
2735 std::shared_ptr<DAGNode>
2736 mkFpIsSubnormal(std::shared_ptr<DAGNode> param); // is_subnormal(param)
2737
2744 std::shared_ptr<DAGNode>
2745 mkFpIsZero(std::shared_ptr<DAGNode> param); // is_zero(param)
2746
2753 std::shared_ptr<DAGNode>
2754 mkFpIsInf(std::shared_ptr<DAGNode> param); // is_inf(param)
2755
2762 std::shared_ptr<DAGNode>
2763 mkFpIsNaN(std::shared_ptr<DAGNode> param); // is_nan(param)
2764
2771 std::shared_ptr<DAGNode>
2772 mkFpIsNeg(std::shared_ptr<DAGNode> param); // is_neg(param)
2773
2780 std::shared_ptr<DAGNode>
2781 mkFpIsPos(std::shared_ptr<DAGNode> param); // is_pos(param)
2782
2783 // ARRAY
2791 std::shared_ptr<DAGNode> mkSelect(std::shared_ptr<DAGNode> l,
2792 std::shared_ptr<DAGNode> r); // l[r]
2793
2804 std::shared_ptr<DAGNode> mkStore(std::shared_ptr<DAGNode> l,
2805 std::shared_ptr<DAGNode> r,
2806 std::shared_ptr<DAGNode> v); // l[r] = v
2807
2808 // STRINGS COMMON OPERATORS
2815 std::shared_ptr<DAGNode>
2816 mkStrLen(std::shared_ptr<DAGNode> param); // str.len(param)
2817
2824 std::shared_ptr<DAGNode>
2825 mkStrConcat(const std::vector<std::shared_ptr<DAGNode>>
2826 &params); // str.++(param1, param2, ...)
2827
2836 std::shared_ptr<DAGNode>
2837 mkStrSubstr(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2838 std::shared_ptr<DAGNode> s); // str.substr(l, r, s)
2839
2847 std::shared_ptr<DAGNode>
2848 mkStrPrefixof(std::shared_ptr<DAGNode> l,
2849 std::shared_ptr<DAGNode> r); // str.prefixof(l, r)
2850
2858 std::shared_ptr<DAGNode>
2859 mkStrSuffixof(std::shared_ptr<DAGNode> l,
2860 std::shared_ptr<DAGNode> r); // str.suffixof(l, r)
2861
2870 std::shared_ptr<DAGNode>
2871 mkStrIndexof(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2872 std::shared_ptr<DAGNode> s); // str.indexof(l, r, s)
2873
2881 std::shared_ptr<DAGNode>
2882 mkStrCharat(std::shared_ptr<DAGNode> l,
2883 std::shared_ptr<DAGNode> r); // str.charAt(l, r)
2884
2893 std::shared_ptr<DAGNode>
2894 mkStrUpdate(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2895 std::shared_ptr<DAGNode> v); // str.update(l, r, v)
2896
2905 std::shared_ptr<DAGNode>
2906 mkStrReplace(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2907 std::shared_ptr<DAGNode> v); // str.replace(l, r, v)
2908
2917 std::shared_ptr<DAGNode>
2918 mkStrReplaceAll(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2919 std::shared_ptr<DAGNode> v); // str.replace_all(l, r, v)
2920
2929 std::shared_ptr<DAGNode>
2930 mkStrReplaceReg(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2931 std::shared_ptr<DAGNode> v); // str.replace_re(l, r, v)
2932
2941 std::shared_ptr<DAGNode>
2942 mkStrReplaceRegAll(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2943 std::shared_ptr<DAGNode> v); // str.replace_re_all(l, r, v)
2944
2952 std::shared_ptr<DAGNode>
2953 mkStrIndexofReg(std::shared_ptr<DAGNode> l,
2954 std::shared_ptr<DAGNode> r); // str.indexof_re(l, r)
2955
2962 std::shared_ptr<DAGNode>
2963 mkStrToLower(std::shared_ptr<DAGNode> param); // str.to_lower(param)
2964
2971 std::shared_ptr<DAGNode>
2972 mkStrToUpper(std::shared_ptr<DAGNode> param); // str.to_upper(param)
2973
2980 std::shared_ptr<DAGNode>
2981 mkStrRev(std::shared_ptr<DAGNode> param); // str.rev(param)
2982
2990 std::shared_ptr<DAGNode>
2991 mkStrSplit(std::shared_ptr<DAGNode> l,
2992 std::shared_ptr<DAGNode> r); // str.split(l, r)
2993
2994 std::shared_ptr<DAGNode>
2995 mkStrSplitAt(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
2996 std::shared_ptr<DAGNode> s); // str.split_at(l, r, s)
2997
2998 std::shared_ptr<DAGNode>
2999 mkStrSplitRest(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
3000 std::shared_ptr<DAGNode> s); // str.split_rest(l, r, s)
3001
3002 std::shared_ptr<DAGNode>
3003 mkStrNumSplits(std::shared_ptr<DAGNode> l,
3004 std::shared_ptr<DAGNode> r); // str.num_splits(l, r)
3005
3006 std::shared_ptr<DAGNode>
3007 mkStrSplitAtRe(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
3008 std::shared_ptr<DAGNode> s); // str.split_at_re(l, r, s)
3009
3010 std::shared_ptr<DAGNode>
3011 mkStrSplitRestRe(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
3012 std::shared_ptr<DAGNode> s); // str.split_rest_re(l, r, s)
3013
3014 std::shared_ptr<DAGNode>
3015 mkStrNumSplitsRe(std::shared_ptr<DAGNode> l,
3016 std::shared_ptr<DAGNode> r); // str.num_splits_re(l, r)
3017
3018 // STRINGS COMP
3025 std::shared_ptr<DAGNode>
3026 mkStrLt(const std::vector<std::shared_ptr<DAGNode>> &params); // str.<(l, r)
3027
3034 std::shared_ptr<DAGNode>
3035 mkStrLe(const std::vector<std::shared_ptr<DAGNode>> &params); // str.<=(l, r)
3036
3043 std::shared_ptr<DAGNode>
3044 mkStrGt(const std::vector<std::shared_ptr<DAGNode>> &params); // str.>(l, r)
3045
3052 std::shared_ptr<DAGNode>
3053 mkStrGe(const std::vector<std::shared_ptr<DAGNode>> &params); // str.>=(l, r)
3054
3055 // STRINGS PROPERTIES
3063 std::shared_ptr<DAGNode>
3064 mkStrInReg(std::shared_ptr<DAGNode> l,
3065 std::shared_ptr<DAGNode> r); // str.in_re(l, r)
3066
3074 std::shared_ptr<DAGNode>
3075 mkStrContains(std::shared_ptr<DAGNode> l,
3076 std::shared_ptr<DAGNode> r); // str.contains(l, r)
3077
3084 std::shared_ptr<DAGNode>
3085 mkStrIsDigit(std::shared_ptr<DAGNode> param); // str.is_digit(param)
3086
3087 // STRINGS CONVERSION
3094 std::shared_ptr<DAGNode>
3095 mkStrFromInt(std::shared_ptr<DAGNode> param); // str.from_int(param)
3096
3105 std::shared_ptr<DAGNode>
3106 mkStrToInt(std::shared_ptr<DAGNode> param); // str.to_int(param)
3107
3114 std::shared_ptr<DAGNode>
3115 mkStrToReg(std::shared_ptr<DAGNode> param); // str.to_reg(param)
3116
3127 std::shared_ptr<DAGNode>
3128 mkStrToCode(std::shared_ptr<DAGNode> param); // str.to_code(param) assci code
3129
3138 std::shared_ptr<DAGNode> mkStrFromCode(
3139 std::shared_ptr<DAGNode> param); // str.from_code(param) assci code
3140
3141 // STRINGS RE CONSTANTS
3149 std::shared_ptr<DAGNode> mkRegNone(); // re.none
3150
3158 std::shared_ptr<DAGNode> mkRegAll(); // re.all
3159
3167 std::shared_ptr<DAGNode> mkRegAllChar(); // re.allchar
3168
3169 // STRINGS RE COMMON OPERATORS
3179 std::shared_ptr<DAGNode> mkRegConcat(
3180 const std::vector<std::shared_ptr<DAGNode>> &params); // re.++(l, r, ...)
3181
3190 std::shared_ptr<DAGNode>
3191 mkRegUnion(const std::vector<std::shared_ptr<DAGNode>>
3192 &params); // re.union(l, r, ...)
3193
3203 std::shared_ptr<DAGNode>
3204 mkRegInter(const std::vector<std::shared_ptr<DAGNode>>
3205 &params); // re.inter(l, r, ...)
3206
3216 std::shared_ptr<DAGNode> mkRegDiff(const std::vector<std::shared_ptr<DAGNode>>
3217 &params); // re.diff(l, r, ...)
3218
3228 std::shared_ptr<DAGNode>
3229 mkRegStar(std::shared_ptr<DAGNode> param); // re.*(param)
3230
3240 std::shared_ptr<DAGNode> mkRegPlus(std::shared_ptr<DAGNode> param); // param+
3241
3251 std::shared_ptr<DAGNode> mkRegOpt(std::shared_ptr<DAGNode> param); // param?
3252
3262 std::shared_ptr<DAGNode> mkRegRange(std::shared_ptr<DAGNode> l,
3263 std::shared_ptr<DAGNode> r); // l..r
3264
3275 std::shared_ptr<DAGNode>
3276 mkRegRepeat(std::shared_ptr<DAGNode> l,
3277 std::shared_ptr<DAGNode> r); // re.^(n, l)
3278
3290 std::shared_ptr<DAGNode> mkRegLoop(std::shared_ptr<DAGNode> l,
3291 std::shared_ptr<DAGNode> r,
3292 std::shared_ptr<DAGNode> s); // l{r,s}
3293
3303 std::shared_ptr<DAGNode>
3304 mkRegComplement(std::shared_ptr<DAGNode> param); // ~param
3305
3306 // STRINGS RE FUNCTIONS
3317 std::shared_ptr<DAGNode>
3318 mkReplaceReg(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
3319 std::shared_ptr<DAGNode> v); // replace(l, r, v)
3320
3331 std::shared_ptr<DAGNode>
3332 mkReplaceRegAll(std::shared_ptr<DAGNode> l, std::shared_ptr<DAGNode> r,
3333 std::shared_ptr<DAGNode> v); // replace_all(l, r, v)
3334
3345 std::shared_ptr<DAGNode>
3346 mkIndexofReg(std::shared_ptr<DAGNode> l,
3347 std::shared_ptr<DAGNode> r); // indexof(l, r)
3348
3349 // INTERVAL
3356 std::shared_ptr<DAGNode> mkMax(
3357 const std::vector<std::shared_ptr<DAGNode>> &params); // max(p1, p2, ...)
3358
3365 std::shared_ptr<DAGNode> mkMin(
3366 const std::vector<std::shared_ptr<DAGNode>> &params); // min(p1, p2, ...)
3367
3368 // LET
3375 std::shared_ptr<DAGNode>
3376 mkLet(const std::vector<std::shared_ptr<DAGNode>>
3377 &params); // let((key1, val1), (key2, val2), ...)
3378
3379 // QUANTIFIERS
3387 std::shared_ptr<DAGNode> mkQuantVar(const std::string &name,
3388 std::shared_ptr<Sort> sort);
3389
3396 std::shared_ptr<DAGNode>
3397 mkForall(const std::vector<std::shared_ptr<DAGNode>>
3398 &params); // forall((var1, sort1), (var2, sort2), ..., body)
3399
3406 std::shared_ptr<DAGNode>
3407 mkExists(const std::vector<std::shared_ptr<DAGNode>>
3408 &params); // exists((var1, sort1), (var2, sort2), ..., body)
3409
3410 // FUNCTION
3418 std::shared_ptr<DAGNode>
3419 mkApplyFunc(std::shared_ptr<DAGNode> fun,
3420 const std::vector<std::shared_ptr<DAGNode>>
3421 &params); // static apply function, only (f p1 p2 ... pn)
3422 // without substitution
3423
3424 // parse smt-lib2 file
3433 bool parseSmtlib2File(const std::string filename);
3434
3441 int getArity(NODE_KIND k) const;
3442
3443 // aux functions
3450 NODE_KIND getAddOp(std::shared_ptr<Sort> sort); // mk unique add
3451
3459
3466 std::shared_ptr<DAGNode>
3467 getZero(std::shared_ptr<Sort> sort); // mk unique zero
3468
3469 // additional functions
3480 std::shared_ptr<DAGNode>
3481 substitute(std::shared_ptr<DAGNode> expr,
3482 std::unordered_map<std::string, std::shared_ptr<DAGNode>> &params);
3483
3484 // apply function
3492 std::shared_ptr<DAGNode>
3493 applyFun(std::shared_ptr<DAGNode> fun,
3494 const std::vector<std::shared_ptr<DAGNode>> &params);
3495
3496 // evaluate: return true if the evaluation has changed the expression
3502 void setEvaluatePrecision(mpfr_prec_t precision);
3503
3509 mpfr_prec_t getEvaluatePrecision() const;
3510
3516 void setEvaluateUseFloating(bool use_floating);
3517
3523 bool getEvaluateUseFloating() const;
3524
3525 // type conversion
3532 Real toReal(std::shared_ptr<DAGNode> expr);
3533
3540 Integer toInt(std::shared_ptr<DAGNode> expr);
3541
3548 bool isZero(std::shared_ptr<DAGNode> expr);
3549
3556 bool isOne(std::shared_ptr<DAGNode> expr);
3557
3558 bool isOnes(std::shared_ptr<DAGNode> expr);
3559
3560 // Format conversion
3567 std::shared_ptr<DAGNode> expandLet(std::shared_ptr<DAGNode> expr);
3568
3576 std::vector<std::shared_ptr<DAGNode>> getSplitLemmas();
3577
3585 std::shared_ptr<DAGNode>
3586 remove(std::shared_ptr<DAGNode> expr,
3587 const std::unordered_set<std::shared_ptr<DAGNode>> &nodes);
3588
3596 std::shared_ptr<DAGNode> rename(std::shared_ptr<DAGNode> expr,
3597 const std::string &new_name);
3598
3599 // print
3606 std::string toString(std::shared_ptr<DAGNode> expr);
3607
3614 std::string toString(const NODE_KIND &kind);
3615
3622 std::string toString(std::shared_ptr<Sort> sort);
3623
3629 std::string optionToString();
3630
3636 std::string dumpSMT2();
3637
3644 std::string dumpSMT2(const std::string &filename);
3645
3646 // Create a datatype function application (constructors/selectors)
3647 std::shared_ptr<DAGNode>
3648 mkApplyDTFun(const std::shared_ptr<Sort> &sort, const std::string &name, const std::vector<std::shared_ptr<DAGNode>> &params);
3649
3656 size_t removeFuns(const std::vector<std::string> &funcNames);
3657
3663 void ensureNumberValue(std::shared_ptr<DAGNode> expr);
3664
3665 private:
3666 // parse smt-lib2 file
3667 std::string getSymbol();
3668 void scanToNextSymbol();
3669 void parseLpar();
3670 void parseRpar();
3671 void skipToRpar();
3672 std::string peekSymbol();
3673
3676 std::shared_ptr<Sort> parseSort();
3677 std::shared_ptr<DAGNode> parseExpr();
3678 std::shared_ptr<DAGNode> parseConstFunc(const std::string &s);
3679 std::shared_ptr<DAGNode>
3680 parseOper(const std::string &s,
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();
3684 std::shared_ptr<DAGNode> parsePreservingLet();
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>
3689 mkLetBindVarList(const std::vector<std::shared_ptr<DAGNode>> &bind_vars);
3690 std::shared_ptr<DAGNode>
3691 mkLetChain(const std::vector<std::shared_ptr<DAGNode>> &bind_var_lists,
3692 const std::shared_ptr<DAGNode> &body);
3693 std::string parseGroup();
3694 std::string parseWeight();
3695 std::shared_ptr<DAGNode> parseQuant(const std::string &type);
3696
3698
3699 // auxilary functions
3700
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);
3703
3704 std::shared_ptr<DAGNode> bindLetVar(const std::string &key,
3705 std::shared_ptr<DAGNode> expr);
3706 std::shared_ptr<DAGNode> bindFunVar(const std::string &key,
3707 std::shared_ptr<DAGNode> expr);
3708 // conversion
3709 std::shared_ptr<DAGNode> substitute(
3710 std::shared_ptr<DAGNode> expr,
3711 std::unordered_map<std::string, std::shared_ptr<DAGNode>> &params,
3712 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3713 &visited);
3714 std::shared_ptr<DAGNode> applyFunPostOrder(
3715 std::shared_ptr<DAGNode> node,
3716 std::unordered_map<std::string, std::shared_ptr<DAGNode>> &params);
3717
3718 std::shared_ptr<DAGNode> replaceAtoms(
3719 std::shared_ptr<DAGNode> expr,
3720 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3721 &atom_map,
3722 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3723 &visited,
3724 bool &is_changed);
3725 std::shared_ptr<DAGNode> replaceNodes(
3726 std::shared_ptr<DAGNode> expr,
3727 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3728 &node_map,
3729 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3730 &visited,
3731 bool &is_changed);
3732 std::shared_ptr<DAGNode> toCNF(std::shared_ptr<DAGNode> expr);
3733 std::shared_ptr<DAGNode> toTseitinCNF(
3734 std::shared_ptr<DAGNode> expr,
3735 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3736 &visited,
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);
3744 std::shared_ptr<DAGNode> toDNFEliminateAll(std::shared_ptr<DAGNode> expr);
3745 std::shared_ptr<DAGNode> toDNFEliminateAll(
3746 std::shared_ptr<DAGNode> expr,
3747 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3748 &visited,
3749 bool &is_changed);
3750 std::shared_ptr<DAGNode>
3751 toDNFEliminateXOR(const std::vector<std::shared_ptr<DAGNode>> &children);
3752 std::shared_ptr<DAGNode>
3753 toDNFEliminateEq(const std::vector<std::shared_ptr<DAGNode>> &children);
3754 std::shared_ptr<DAGNode>
3755 toDNFEliminateDistinct(const std::vector<std::shared_ptr<DAGNode>> &children);
3756
3757 std::shared_ptr<DAGNode>
3758 applyDNFDistributiveLaw(std::shared_ptr<DAGNode> expr);
3759 std::shared_ptr<DAGNode> applyDNFDistributiveLawRec(
3760 std::shared_ptr<DAGNode> expr,
3761 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3762 &visited);
3763 std::shared_ptr<DAGNode> flattenDNF(std::shared_ptr<DAGNode> expr);
3764
3765 std::shared_ptr<DAGNode> toNNF(std::shared_ptr<DAGNode> expr, bool is_not);
3766
3767 std::shared_ptr<DAGNode>
3768 remove(std::shared_ptr<DAGNode> expr,
3769 const std::unordered_set<std::shared_ptr<DAGNode>> &nodes,
3770 std::unordered_map<std::shared_ptr<DAGNode>, std::shared_ptr<DAGNode>>
3771 &visited);
3772
3773 // errors & warnings
3774 // mk errror node
3775 std::shared_ptr<DAGNode> mkErr(const ERROR_TYPE t);
3776 // error/warning information
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;
3779
3780 void err_unexp_eof() 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;
3785 void err_param_nbool(const std::string nm, const size_t ln) const;
3786 void err_param_nnum(const std::string nm, const size_t ln) const;
3787 void err_param_nsame(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;
3791 void err_zero_divisor(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;
3795 void err_neg_param(const size_t ln) const;
3796
3797 void err_open_file(const std::string) const;
3798
3799 void warn_cmd_nsup(const std::string nm, const size_t ln) const;
3800
3801 // collect atoms
3802 void collectAtoms(std::shared_ptr<DAGNode> expr,
3803 std::unordered_set<std::shared_ptr<DAGNode>> &atoms,
3804 std::unordered_set<std::shared_ptr<DAGNode>> &visited);
3805 void
3806 collectGroundAtoms(std::shared_ptr<DAGNode> expr,
3807 std::unordered_set<std::shared_ptr<DAGNode>> &atoms,
3808 std::unordered_set<std::shared_ptr<DAGNode>> &visited);
3809 void collectVars(std::shared_ptr<DAGNode> expr,
3810 std::unordered_set<std::shared_ptr<DAGNode>> &vars,
3811 std::unordered_set<std::shared_ptr<DAGNode>> &visited);
3812};
3813
3814// smart pointer
3815typedef std::shared_ptr<Parser> ParserPtr;
3817ParserPtr newParser(const std::string &filename);
3818} // namespace stabilizer::parser
3819#endif
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 > > &params)
Create an and node.
std::shared_ptr< DAGNode > mkCot(std::shared_ptr< DAGNode > param)
Create a cot node.
std::shared_ptr< GlobalOptions > options
Definition parser.h:242
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 > > &params)
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
Definition parser.h:222
std::vector< std::shared_ptr< DAGNode > > assertions
Definition parser.h:265
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
Definition parser.h:214
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
Definition parser.h:211
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 > > &params, std::shared_ptr< Sort > out_sort)
Create a sort definition.
std::unordered_map< std::string, std::shared_ptr< DAGNode > > & getFunKeyMap()
Definition parser.h:322
bool parseSmtlib2File(const std::string filename)
Parse an SMT-LIB2 file.
std::unordered_map< std::string, size_t > fun_dup_count_map
Definition parser.h:216
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 > > &params)
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
Definition parser.h:234
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
Definition parser.h:252
std::unordered_map< std::string, size_t > & getVarNames()
Definition parser.h:321
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
Definition parser.h:218
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
Definition parser.h:256
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 > > &params)
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
Definition parser.h:254
std::shared_ptr< DAGNode > mkFpEq(const std::vector< std::shared_ptr< DAGNode > > &params)
Create a floating-point equality node.
std::unique_ptr< NodeManager > getNodeManager()
Definition parser.h:764
std::shared_ptr< DAGNode > mkBvAdd(const std::vector< std::shared_ptr< DAGNode > > &params)
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 > > &params)
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
Definition parser.h:227
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.
Definition op_parser.cpp:79
std::shared_ptr< DAGNode > mkGt(const std::vector< std::shared_ptr< DAGNode > > &params)
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 > > &params)
Substitute variables in an expression.
void replaceAssertions(const std::vector< std::shared_ptr< DAGNode > > &new_assertions)
Definition parser.h:307
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
Definition parser.h:240
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
Definition parser.h:272
std::vector< std::vector< std::shared_ptr< DAGNode > > > assumptions
Definition parser.h:273
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
Definition parser.h:248
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 > > &params)
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 > > &params)
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 > > &params)
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 > > &params)
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 > > &params)
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 > > &params)
Create a max node.
std::shared_ptr< DAGNode > mkRegUnion(const std::vector< std::shared_ptr< DAGNode > > &params)
Create a regex union node.
std::shared_ptr< DAGNode > mkRegDiff(const std::vector< std::shared_ptr< DAGNode > > &params)
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 > > &params)
Create a distinct node.
std::shared_ptr< DAGNode > mkUFVNode(const std::string &name, const std::shared_ptr< Sort > &sort)
Definition parser.h:311
std::shared_ptr< DAGNode > mkFpDiv(const std::vector< std::shared_ptr< DAGNode > > &params)
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
Definition parser.h:195
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()
Definition parser.h:325
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
Definition parser.h:208
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.
Definition op_parser.cpp:78
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 > > &params)
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 > > &params)
Create a regex concatenation node.
std::unordered_map< std::string, size_t > var_names
Definition parser.h:231
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
Definition parser.h:212
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 > > &params)
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.
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 > > &params)
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 > > &params, 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 > > &params)
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.
Definition op_parser.cpp:80
RESULT_TYPE result_type
Definition parser.h:259
std::shared_ptr< DAGNode > mkFpLt(const std::vector< std::shared_ptr< DAGNode > > &params)
Create a floating-point less than node.
std::shared_ptr< DAGNode > mkStrGt(const std::vector< std::shared_ptr< DAGNode > > &params)
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 > > &params)
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.
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 > > &params)
Create a function application node.
std::shared_ptr< DAGNode > applyFunPostOrder(std::shared_ptr< DAGNode > node, std::unordered_map< std::string, std::shared_ptr< DAGNode > > &params)
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 > > &params)
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 > > &params)
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 > > &params)
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
Definition parser.h:198
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 > > &params, std::shared_ptr< Sort > out_sort, std::shared_ptr< DAGNode > body)
Create a function definition.
unsigned long buflen
Definition parser.h:185
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 > > &params)
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
Definition parser.h:275
std::shared_ptr< DAGNode > mkFpAdd(const std::vector< std::shared_ptr< DAGNode > > &params)
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 > > &params)
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 > > &params)
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()
Definition parser.h:329
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 > > &params)
Create an div node.
std::shared_ptr< Sort > mkRegSort()
Create a regular expression sort.
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
Definition parser.h:268
std::unordered_map< std::string, std::shared_ptr< DAGNode > > let_key_map
Definition parser.h:206
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
Definition parser.h:277
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 > > &params)
Create a string concatenation node.
std::shared_ptr< DAGNode > mkEq(const std::vector< std::shared_ptr< DAGNode > > &params)
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 > > &params)
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
Definition parser.h:279
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 > > &params)
Create a bitvector or node.
std::shared_ptr< DAGNode > mkBvMul(const std::vector< std::shared_ptr< DAGNode > > &params)
Create a bitvector multiplication node.
std::unordered_map< std::string, size_t > & getTempVarNames()
Definition parser.h:318
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)
Definition parser.h:771
std::shared_ptr< DAGNode > mkBvAnd(const std::vector< std::shared_ptr< DAGNode > > &params)
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 > > &params)
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
Definition parser.h:236
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
Definition parser.h:250
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 > > &params)
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 > > &params)
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 > > &params)
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 > > &params)
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 > > &params)
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 > > &params)
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 > > &params)
std::shared_ptr< DAGNode > mkBvSgt(std::shared_ptr< DAGNode > l, std::shared_ptr< DAGNode > r)
Create a bitvector signed greater than node.
std::shared_ptr< DAGNode > mkFpMul(const std::vector< std::shared_ptr< DAGNode > > &params)
Create a floating-point multiplication node.
std::unordered_set< std::string > datatype_sort_names
Definition parser.h:224
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
Definition parser.h:274
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 > > &params)
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
Definition parser.h:201
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.
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.
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.
Definition op_parser.cpp:84
std::unique_ptr< SortManager > sort_manager
Definition parser.h:203
std::unordered_map< std::string, std::shared_ptr< Sort > > & getSortNames()
Definition parser.h:326
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 > > &params)
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 > > &params)
Get sort.
std::shared_ptr< DAGNode > result_node
Definition parser.h:260
std::shared_ptr< DAGNode > mkFpGt(const std::vector< std::shared_ptr< DAGNode > > &params)
Create a floating-point greater than node.
std::unordered_map< std::string, std::shared_ptr< DAGNode > > fun_key_map
Definition parser.h:209
bool isOnes(std::shared_ptr< DAGNode > expr)
std::unordered_map< std::string, std::unordered_set< size_t > > assertion_groups
Definition parser.h:266
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 > > &params)
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 > > &params)
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 > > &params, 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.
std::shared_ptr< Parser > ParserPtr
Definition parser.h:3815
std::vector< DTSelectorDecl > selectors
Definition parser.h:172
std::vector< DTConstructorDecl > ctors
Definition parser.h:177