1 /********************* */
4 ** Original author: cconway
5 ** Major contributors: mdeters
6 ** Minor contributors (to current version): none
7 ** This file is part of the CVC4 prototype.
8 ** Copyright (c) 2009, 2010, 2011 The Analysis of Computer Systems Group (ACSys)
9 ** Courant Institute of Mathematical Sciences
10 ** New York University
11 ** See the file COPYING in the top-level source directory for licensing
12 ** information.\endverbatim
14 ** \brief Definitions of SMT2 constants.
16 ** Definitions of SMT2 constants.
19 #include "expr/type.h"
20 #include "expr/command.h"
21 #include "parser/parser.h"
22 #include "parser/smt1/smt1.h"
23 #include "parser/smt2/smt2.h"
28 Smt2::Smt2(ExprManager
* exprManager
, Input
* input
, bool strictMode
, bool parseOnly
) :
29 Parser(exprManager
,input
,strictMode
,parseOnly
),
31 if( !strictModeEnabled() ) {
32 addTheory(Smt2::THEORY_CORE
);
36 void Smt2::addArithmeticOperators() {
37 addOperator(kind::PLUS
);
38 addOperator(kind::MINUS
);
39 addOperator(kind::UMINUS
);
40 addOperator(kind::MULT
);
41 addOperator(kind::DIVISION
);
42 addOperator(kind::LT
);
43 addOperator(kind::LEQ
);
44 addOperator(kind::GT
);
45 addOperator(kind::GEQ
);
48 void Smt2::addBitvectorOperators() {
49 addOperator(kind::BITVECTOR_CONCAT
);
50 addOperator(kind::BITVECTOR_AND
);
51 addOperator(kind::BITVECTOR_OR
);
52 addOperator(kind::BITVECTOR_XOR
);
53 addOperator(kind::BITVECTOR_NOT
);
54 addOperator(kind::BITVECTOR_NAND
);
55 addOperator(kind::BITVECTOR_NOR
);
56 addOperator(kind::BITVECTOR_XNOR
);
57 addOperator(kind::BITVECTOR_COMP
);
58 addOperator(kind::BITVECTOR_MULT
);
59 addOperator(kind::BITVECTOR_PLUS
);
60 addOperator(kind::BITVECTOR_SUB
);
61 addOperator(kind::BITVECTOR_NEG
);
62 addOperator(kind::BITVECTOR_UDIV
);
63 addOperator(kind::BITVECTOR_UREM
);
64 addOperator(kind::BITVECTOR_SDIV
);
65 addOperator(kind::BITVECTOR_SREM
);
66 addOperator(kind::BITVECTOR_SMOD
);
67 addOperator(kind::BITVECTOR_SHL
);
68 addOperator(kind::BITVECTOR_LSHR
);
69 addOperator(kind::BITVECTOR_ASHR
);
70 addOperator(kind::BITVECTOR_ULT
);
71 addOperator(kind::BITVECTOR_ULE
);
72 addOperator(kind::BITVECTOR_UGT
);
73 addOperator(kind::BITVECTOR_UGE
);
74 addOperator(kind::BITVECTOR_SLT
);
75 addOperator(kind::BITVECTOR_SLE
);
76 addOperator(kind::BITVECTOR_SGT
);
77 addOperator(kind::BITVECTOR_SGE
);
78 addOperator(kind::BITVECTOR_BITOF
);
79 addOperator(kind::BITVECTOR_EXTRACT
);
80 addOperator(kind::BITVECTOR_REPEAT
);
81 addOperator(kind::BITVECTOR_ZERO_EXTEND
);
82 addOperator(kind::BITVECTOR_SIGN_EXTEND
);
83 addOperator(kind::BITVECTOR_ROTATE_LEFT
);
84 addOperator(kind::BITVECTOR_ROTATE_RIGHT
);
87 void Smt2::addTheory(Theory theory
) {
90 defineType("Bool", getExprManager()->booleanType());
91 defineVar("true", getExprManager()->mkConst(true));
92 defineVar("false", getExprManager()->mkConst(false));
93 addOperator(kind::AND
);
94 addOperator(kind::DISTINCT
);
95 addOperator(kind::EQUAL
);
96 addOperator(kind::IFF
);
97 addOperator(kind::IMPLIES
);
98 addOperator(kind::ITE
);
99 addOperator(kind::NOT
);
100 addOperator(kind::OR
);
101 addOperator(kind::XOR
);
105 addOperator(kind::SELECT
);
106 addOperator(kind::STORE
);
109 case THEORY_REALS_INTS
:
110 defineType("Real", getExprManager()->realType());
111 // falling-through on purpose, to add Ints part of RealsInts
114 defineType("Int", getExprManager()->integerType());
115 addArithmeticOperators();
119 defineType("Real", getExprManager()->realType());
120 addArithmeticOperators();
123 case THEORY_BITVECTORS
:
124 addBitvectorOperators();
127 case THEORY_QUANTIFIERS
:
131 std::stringstream ss
;
132 ss
<< "internal error: unsupported theory " << theory
;
133 throw ParserException(ss
.str());
137 bool Smt2::logicIsSet() {
141 void Smt2::setLogic(const std::string
& name
) {
143 d_logic
= Smt1::toLogic(name
);
145 // Core theory belongs to every logic
146 addTheory(THEORY_CORE
);
150 /* No extra symbols necessary */
154 addTheory(THEORY_ARRAYS
);
160 addTheory(THEORY_INTS
);
166 addTheory(THEORY_REALS
);
170 addOperator(kind::APPLY_UF
);
175 case Smt1::QF_UFNIA
:// nonstandard logic
176 addTheory(THEORY_INTS
);
177 addOperator(kind::APPLY_UF
);
182 addTheory(THEORY_REALS
);
183 addOperator(kind::APPLY_UF
);
186 case Smt1::QF_UFLIRA
:// nonstandard logic
187 case Smt1::QF_UFNIRA
:// nonstandard logic
188 addOperator(kind::APPLY_UF
);
189 addTheory(THEORY_INTS
);
190 addTheory(THEORY_REALS
);
194 addTheory(THEORY_BITVECTORS
);
198 addTheory(THEORY_ARRAYS
);
199 addTheory(THEORY_BITVECTORS
);
203 addOperator(kind::APPLY_UF
);
204 addTheory(THEORY_BITVECTORS
);
208 addOperator(kind::APPLY_UF
);
209 addTheory(THEORY_ARRAYS
);
210 addTheory(THEORY_BITVECTORS
);
213 case Smt1::QF_AUFBVLIA
:
214 addOperator(kind::APPLY_UF
);
215 addTheory(THEORY_ARRAYS
);
216 addTheory(THEORY_BITVECTORS
);
217 addTheory(THEORY_INTS
);
220 case Smt1::QF_AUFBVLRA
:
221 addOperator(kind::APPLY_UF
);
222 addTheory(THEORY_ARRAYS
);
223 addTheory(THEORY_BITVECTORS
);
224 addTheory(THEORY_REALS
);
227 case Smt1::QF_AUFLIA
:
228 addTheory(THEORY_ARRAYS
);
229 addOperator(kind::APPLY_UF
);
230 addTheory(THEORY_INTS
);
233 case Smt1::QF_AUFLIRA
:
234 addTheory(THEORY_ARRAYS
);
235 addOperator(kind::APPLY_UF
);
236 addTheory(THEORY_INTS
);
237 addTheory(THEORY_REALS
);
240 case Smt1::ALL_SUPPORTED
:
241 addTheory(THEORY_QUANTIFIERS
);
243 case Smt1::QF_ALL_SUPPORTED
:
244 addTheory(THEORY_ARRAYS
);
245 addOperator(kind::APPLY_UF
);
246 addTheory(THEORY_INTS
);
247 addTheory(THEORY_REALS
);
248 addTheory(THEORY_BITVECTORS
);
258 if(d_logic
!= Smt1::AUFLIA
&& d_logic
!= Smt1::UFNIA
) {
259 addTheory(THEORY_REALS
);
261 if(d_logic
!= Smt1::LRA
) {
262 addOperator(kind::APPLY_UF
);
263 if(d_logic
!= Smt1::UFLRA
) {
264 addTheory(THEORY_INTS
);
265 if(d_logic
!= Smt1::UFNIA
&& d_logic
!= Smt1::UFNIRA
) {
266 addTheory(THEORY_ARRAYS
);
270 addTheory(THEORY_QUANTIFIERS
);
273 }/* Smt2::setLogic() */
275 void Smt2::setInfo(const std::string
& flag
, const SExpr
& sexpr
) {
279 void Smt2::setOption(const std::string
& flag
, const SExpr
& sexpr
) {
283 void Smt2::checkThatLogicIsSet() {
284 if( ! logicIsSet() ) {
285 if( strictModeEnabled() ) {
286 parseError("set-logic must appear before this point.");
288 warning("No set-logic command was given before this point.");
289 warning("CVC4 will assume the non-standard ALL_SUPPORTED logic.");
290 warning("Consider setting a stricter logic for (likely) better performance.");
291 warning("To suppress this warning in the future use (set-logic ALL_SUPPORTED).");
293 setLogic("ALL_SUPPORTED");
295 preemptCommand(new SetBenchmarkLogicCommand("ALL_SUPPORTED"));
300 }/* CVC4::parser namespace */
301 }/* CVC4 namespace */