1 |
|
/****************************************************************************** |
2 |
|
* Top contributors (to current version): |
3 |
|
* Andrew Reynolds, Haniel Barbosa, Gereon Kremer |
4 |
|
* |
5 |
|
* This file is part of the cvc5 project. |
6 |
|
* |
7 |
|
* Copyright (c) 2009-2021 by the authors listed in the file AUTHORS |
8 |
|
* in the top-level source directory and their institutional affiliations. |
9 |
|
* All rights reserved. See the file COPYING in the top-level source |
10 |
|
* directory for licensing information. |
11 |
|
* **************************************************************************** |
12 |
|
* |
13 |
|
* Implementation of proof rule. |
14 |
|
*/ |
15 |
|
|
16 |
|
#include "expr/proof_rule.h" |
17 |
|
|
18 |
|
#include <iostream> |
19 |
|
|
20 |
|
namespace cvc5 { |
21 |
|
|
22 |
148462 |
const char* toString(PfRule id) |
23 |
|
{ |
24 |
148462 |
switch (id) |
25 |
|
{ |
26 |
|
//================================================= Core rules |
27 |
32820 |
case PfRule::ASSUME: return "ASSUME"; |
28 |
32820 |
case PfRule::SCOPE: return "SCOPE"; |
29 |
|
case PfRule::SUBS: return "SUBS"; |
30 |
|
case PfRule::REWRITE: return "REWRITE"; |
31 |
|
case PfRule::EVALUATE: return "EVALUATE"; |
32 |
|
case PfRule::MACRO_SR_EQ_INTRO: return "MACRO_SR_EQ_INTRO"; |
33 |
|
case PfRule::MACRO_SR_PRED_INTRO: return "MACRO_SR_PRED_INTRO"; |
34 |
|
case PfRule::MACRO_SR_PRED_ELIM: return "MACRO_SR_PRED_ELIM"; |
35 |
32817 |
case PfRule::MACRO_SR_PRED_TRANSFORM: return "MACRO_SR_PRED_TRANSFORM"; |
36 |
|
case PfRule::REMOVE_TERM_FORMULA_AXIOM: return "REMOVE_TERM_FORMULA_AXIOM"; |
37 |
|
//================================================= Trusted rules |
38 |
|
case PfRule::THEORY_LEMMA: return "THEORY_LEMMA"; |
39 |
1 |
case PfRule::THEORY_REWRITE: return "THEORY_REWRITE"; |
40 |
|
case PfRule::PREPROCESS: return "PREPROCESS"; |
41 |
|
case PfRule::PREPROCESS_LEMMA: return "PREPROCESS_LEMMA"; |
42 |
|
case PfRule::THEORY_PREPROCESS: return "THEORY_PREPROCESS"; |
43 |
|
case PfRule::THEORY_PREPROCESS_LEMMA: return "THEORY_PREPROCESS_LEMMA"; |
44 |
|
case PfRule::THEORY_EXPAND_DEF: return "THEORY_EXPAND_DEF"; |
45 |
|
case PfRule::WITNESS_AXIOM: return "WITNESS_AXIOM"; |
46 |
|
case PfRule::TRUST_REWRITE: return "TRUST_REWRITE"; |
47 |
|
case PfRule::TRUST_SUBS: return "TRUST_SUBS"; |
48 |
|
case PfRule::TRUST_SUBS_MAP: return "TRUST_SUBS_MAP"; |
49 |
|
//================================================= Boolean rules |
50 |
|
case PfRule::RESOLUTION: return "RESOLUTION"; |
51 |
1 |
case PfRule::CHAIN_RESOLUTION: return "CHAIN_RESOLUTION"; |
52 |
|
case PfRule::FACTORING: return "FACTORING"; |
53 |
1 |
case PfRule::REORDERING: return "REORDERING"; |
54 |
|
case PfRule::MACRO_RESOLUTION: return "MACRO_RESOLUTION"; |
55 |
|
case PfRule::MACRO_RESOLUTION_TRUST: return "MACRO_RESOLUTION_TRUST"; |
56 |
|
case PfRule::SPLIT: return "SPLIT"; |
57 |
1 |
case PfRule::EQ_RESOLVE: return "EQ_RESOLVE"; |
58 |
|
case PfRule::MODUS_PONENS: return "MODUS_PONENS"; |
59 |
|
case PfRule::NOT_NOT_ELIM: return "NOT_NOT_ELIM"; |
60 |
|
case PfRule::CONTRA: return "CONTRA"; |
61 |
|
case PfRule::AND_ELIM: return "AND_ELIM"; |
62 |
1 |
case PfRule::AND_INTRO: return "AND_INTRO"; |
63 |
|
case PfRule::NOT_OR_ELIM: return "NOT_OR_ELIM"; |
64 |
|
case PfRule::IMPLIES_ELIM: return "IMPLIES_ELIM"; |
65 |
|
case PfRule::NOT_IMPLIES_ELIM1: return "NOT_IMPLIES_ELIM1"; |
66 |
|
case PfRule::NOT_IMPLIES_ELIM2: return "NOT_IMPLIES_ELIM2"; |
67 |
|
case PfRule::EQUIV_ELIM1: return "EQUIV_ELIM1"; |
68 |
|
case PfRule::EQUIV_ELIM2: return "EQUIV_ELIM2"; |
69 |
|
case PfRule::NOT_EQUIV_ELIM1: return "NOT_EQUIV_ELIM1"; |
70 |
|
case PfRule::NOT_EQUIV_ELIM2: return "NOT_EQUIV_ELIM2"; |
71 |
|
case PfRule::XOR_ELIM1: return "XOR_ELIM1"; |
72 |
|
case PfRule::XOR_ELIM2: return "XOR_ELIM2"; |
73 |
|
case PfRule::NOT_XOR_ELIM1: return "NOT_XOR_ELIM1"; |
74 |
|
case PfRule::NOT_XOR_ELIM2: return "NOT_XOR_ELIM2"; |
75 |
|
case PfRule::ITE_ELIM1: return "ITE_ELIM1"; |
76 |
|
case PfRule::ITE_ELIM2: return "ITE_ELIM2"; |
77 |
|
case PfRule::NOT_ITE_ELIM1: return "NOT_ITE_ELIM1"; |
78 |
|
case PfRule::NOT_ITE_ELIM2: return "NOT_ITE_ELIM2"; |
79 |
|
//================================================= De Morgan rules |
80 |
1 |
case PfRule::NOT_AND: return "NOT_AND"; |
81 |
|
//================================================= CNF rules |
82 |
|
case PfRule::CNF_AND_POS: return "CNF_AND_POS"; |
83 |
|
case PfRule::CNF_AND_NEG: return "CNF_AND_NEG"; |
84 |
|
case PfRule::CNF_OR_POS: return "CNF_OR_POS"; |
85 |
|
case PfRule::CNF_OR_NEG: return "CNF_OR_NEG"; |
86 |
|
case PfRule::CNF_IMPLIES_POS: return "CNF_IMPLIES_POS"; |
87 |
|
case PfRule::CNF_IMPLIES_NEG1: return "CNF_IMPLIES_NEG1"; |
88 |
|
case PfRule::CNF_IMPLIES_NEG2: return "CNF_IMPLIES_NEG2"; |
89 |
|
case PfRule::CNF_EQUIV_POS1: return "CNF_EQUIV_POS1"; |
90 |
|
case PfRule::CNF_EQUIV_POS2: return "CNF_EQUIV_POS2"; |
91 |
|
case PfRule::CNF_EQUIV_NEG1: return "CNF_EQUIV_NEG1"; |
92 |
|
case PfRule::CNF_EQUIV_NEG2: return "CNF_EQUIV_NEG2"; |
93 |
|
case PfRule::CNF_XOR_POS1: return "CNF_XOR_POS1"; |
94 |
|
case PfRule::CNF_XOR_POS2: return "CNF_XOR_POS2"; |
95 |
|
case PfRule::CNF_XOR_NEG1: return "CNF_XOR_NEG1"; |
96 |
|
case PfRule::CNF_XOR_NEG2: return "CNF_XOR_NEG2"; |
97 |
|
case PfRule::CNF_ITE_POS1: return "CNF_ITE_POS1"; |
98 |
|
case PfRule::CNF_ITE_POS2: return "CNF_ITE_POS2"; |
99 |
|
case PfRule::CNF_ITE_POS3: return "CNF_ITE_POS3"; |
100 |
|
case PfRule::CNF_ITE_NEG1: return "CNF_ITE_NEG1"; |
101 |
|
case PfRule::CNF_ITE_NEG2: return "CNF_ITE_NEG2"; |
102 |
|
case PfRule::CNF_ITE_NEG3: return "CNF_ITE_NEG3"; |
103 |
|
//================================================= Equality rules |
104 |
4 |
case PfRule::REFL: return "REFL"; |
105 |
5 |
case PfRule::SYMM: return "SYMM"; |
106 |
5 |
case PfRule::TRANS: return "TRANS"; |
107 |
5 |
case PfRule::CONG: return "CONG"; |
108 |
5 |
case PfRule::TRUE_INTRO: return "TRUE_INTRO"; |
109 |
1 |
case PfRule::TRUE_ELIM: return "TRUE_ELIM"; |
110 |
5 |
case PfRule::FALSE_INTRO: return "FALSE_INTRO"; |
111 |
4 |
case PfRule::FALSE_ELIM: return "FALSE_ELIM"; |
112 |
|
case PfRule::HO_APP_ENCODE: return "HO_APP_ENCODE"; |
113 |
|
case PfRule::HO_CONG: return "HO_CONG"; |
114 |
|
//================================================= Array rules |
115 |
|
case PfRule::ARRAYS_READ_OVER_WRITE: return "ARRAYS_READ_OVER_WRITE"; |
116 |
|
case PfRule::ARRAYS_READ_OVER_WRITE_CONTRA: |
117 |
|
return "ARRAYS_READ_OVER_WRITE_CONTRA"; |
118 |
|
case PfRule::ARRAYS_READ_OVER_WRITE_1: return "ARRAYS_READ_OVER_WRITE_1"; |
119 |
|
case PfRule::ARRAYS_EXT: return "ARRAYS_EXT"; |
120 |
|
case PfRule::ARRAYS_TRUST: return "ARRAYS_TRUST"; |
121 |
|
//================================================= Bit-Vector rules |
122 |
|
case PfRule::BV_BITBLAST: return "BV_BITBLAST"; |
123 |
|
case PfRule::BV_BITBLAST_CONST: return "BV_BITBLAST_CONST"; |
124 |
|
case PfRule::BV_BITBLAST_VAR: return "BV_BITBLAST_VAR"; |
125 |
|
case PfRule::BV_BITBLAST_EQUAL: return "BV_BITBLAST_EQUAL"; |
126 |
|
case PfRule::BV_BITBLAST_ULT: return "BV_BITBLAST_ULT"; |
127 |
|
case PfRule::BV_BITBLAST_ULE: return "BV_BITBLAST_ULE"; |
128 |
|
case PfRule::BV_BITBLAST_UGT: return "BV_BITBLAST_UGT"; |
129 |
|
case PfRule::BV_BITBLAST_UGE: return "BV_BITBLAST_UGE"; |
130 |
|
case PfRule::BV_BITBLAST_SLT: return "BV_BITBLAST_SLT"; |
131 |
|
case PfRule::BV_BITBLAST_SLE: return "BV_BITBLAST_SLE"; |
132 |
|
case PfRule::BV_BITBLAST_SGT: return "BV_BITBLAST_SGT"; |
133 |
|
case PfRule::BV_BITBLAST_SGE: return "BV_BITBLAST_SGE"; |
134 |
|
case PfRule::BV_BITBLAST_NOT: return "BV_BITBLAST_NOT"; |
135 |
|
case PfRule::BV_BITBLAST_CONCAT: return "BV_BITBLAST_CONCAT"; |
136 |
|
case PfRule::BV_BITBLAST_AND: return "BV_BITBLAST_AND"; |
137 |
|
case PfRule::BV_BITBLAST_OR: return "BV_BITBLAST_OR"; |
138 |
|
case PfRule::BV_BITBLAST_XOR: return "BV_BITBLAST_XOR"; |
139 |
|
case PfRule::BV_BITBLAST_XNOR: return "BV_BITBLAST_XNOR"; |
140 |
|
case PfRule::BV_BITBLAST_NAND: return "BV_BITBLAST_NAND"; |
141 |
|
case PfRule::BV_BITBLAST_NOR: return "BV_BITBLAST_NOR"; |
142 |
|
case PfRule::BV_BITBLAST_COMP: return "BV_BITBLAST_COMP"; |
143 |
|
case PfRule::BV_BITBLAST_MULT: return "BV_BITBLAST_MULT"; |
144 |
|
case PfRule::BV_BITBLAST_ADD: return "BV_BITBLAST_ADD"; |
145 |
|
case PfRule::BV_BITBLAST_SUB: return "BV_BITBLAST_SUB"; |
146 |
|
case PfRule::BV_BITBLAST_NEG: return "BV_BITBLAST_NEG"; |
147 |
|
case PfRule::BV_BITBLAST_UDIV: return "BV_BITBLAST_UDIV"; |
148 |
|
case PfRule::BV_BITBLAST_UREM: return "BV_BITBLAST_UREM"; |
149 |
|
case PfRule::BV_BITBLAST_SDIV: return "BV_BITBLAST_SDIV"; |
150 |
|
case PfRule::BV_BITBLAST_SREM: return "BV_BITBLAST_SREM"; |
151 |
|
case PfRule::BV_BITBLAST_SMOD: return "BV_BITBLAST_SMOD"; |
152 |
|
case PfRule::BV_BITBLAST_SHL: return "BV_BITBLAST_SHL"; |
153 |
|
case PfRule::BV_BITBLAST_LSHR: return "BV_BITBLAST_LSHR"; |
154 |
|
case PfRule::BV_BITBLAST_ASHR: return "BV_BITBLAST_ASHR"; |
155 |
|
case PfRule::BV_BITBLAST_ULTBV: return "BV_BITBLAST_ULTBV"; |
156 |
|
case PfRule::BV_BITBLAST_SLTBV: return "BV_BITBLAST_SLTBV"; |
157 |
|
case PfRule::BV_BITBLAST_ITE: return "BV_BITBLAST_ITE"; |
158 |
|
case PfRule::BV_BITBLAST_EXTRACT: return "BV_BITBLAST_EXTRACT"; |
159 |
|
case PfRule::BV_BITBLAST_REPEAT: return "BV_BITBLAST_REPEAT"; |
160 |
|
case PfRule::BV_BITBLAST_ZERO_EXTEND: return "BV_BITBLAST_ZERO_EXTEND"; |
161 |
|
case PfRule::BV_BITBLAST_SIGN_EXTEND: return "BV_BITBLAST_SIGN_EXTEND"; |
162 |
|
case PfRule::BV_BITBLAST_ROTATE_RIGHT: return "BV_BITBLAST_ROTATE_RIGHT"; |
163 |
|
case PfRule::BV_BITBLAST_ROTATE_LEFT: return "BV_BITBLAST_ROTATE_LEFT"; |
164 |
|
case PfRule::BV_EAGER_ATOM: return "BV_EAGER_ATOM"; |
165 |
|
//================================================= Datatype rules |
166 |
|
case PfRule::DT_UNIF: return "DT_UNIF"; |
167 |
|
case PfRule::DT_INST: return "DT_INST"; |
168 |
|
case PfRule::DT_COLLAPSE: return "DT_COLLAPSE"; |
169 |
|
case PfRule::DT_SPLIT: return "DT_SPLIT"; |
170 |
|
case PfRule::DT_CLASH: return "DT_CLASH"; |
171 |
|
case PfRule::DT_TRUST: return "DT_TRUST"; |
172 |
|
//================================================= Quantifiers rules |
173 |
|
case PfRule::SKOLEM_INTRO: return "SKOLEM_INTRO"; |
174 |
|
case PfRule::EXISTS_INTRO: return "EXISTS_INTRO"; |
175 |
|
case PfRule::SKOLEMIZE: return "SKOLEMIZE"; |
176 |
|
case PfRule::INSTANTIATE: return "INSTANTIATE"; |
177 |
|
//================================================= String rules |
178 |
|
case PfRule::CONCAT_EQ: return "CONCAT_EQ"; |
179 |
|
case PfRule::CONCAT_UNIFY: return "CONCAT_UNIFY"; |
180 |
|
case PfRule::CONCAT_CONFLICT: return "CONCAT_CONFLICT"; |
181 |
|
case PfRule::CONCAT_SPLIT: return "CONCAT_SPLIT"; |
182 |
|
case PfRule::CONCAT_CSPLIT: return "CONCAT_CSPLIT"; |
183 |
|
case PfRule::CONCAT_LPROP: return "CONCAT_LPROP"; |
184 |
|
case PfRule::CONCAT_CPROP: return "CONCAT_CPROP"; |
185 |
|
case PfRule::STRING_DECOMPOSE: return "STRING_DECOMPOSE"; |
186 |
|
case PfRule::STRING_LENGTH_POS: return "STRING_LENGTH_POS"; |
187 |
|
case PfRule::STRING_LENGTH_NON_EMPTY: return "STRING_LENGTH_NON_EMPTY"; |
188 |
|
case PfRule::STRING_REDUCTION: return "STRING_REDUCTION"; |
189 |
|
case PfRule::STRING_EAGER_REDUCTION: return "STRING_EAGER_REDUCTION"; |
190 |
|
case PfRule::RE_INTER: return "RE_INTER"; |
191 |
|
case PfRule::RE_UNFOLD_POS: return "RE_UNFOLD_POS"; |
192 |
|
case PfRule::RE_UNFOLD_NEG: return "RE_UNFOLD_NEG"; |
193 |
|
case PfRule::RE_UNFOLD_NEG_CONCAT_FIXED: |
194 |
|
return "RE_UNFOLD_NEG_CONCAT_FIXED"; |
195 |
|
case PfRule::RE_ELIM: return "RE_ELIM"; |
196 |
|
case PfRule::STRING_CODE_INJ: return "STRING_CODE_INJ"; |
197 |
|
case PfRule::STRING_SEQ_UNIT_INJ: return "STRING_SEQ_UNIT_INJ"; |
198 |
|
case PfRule::STRING_TRUST: return "STRING_TRUST"; |
199 |
|
//================================================= Arith rules |
200 |
32817 |
case PfRule::MACRO_ARITH_SCALE_SUM_UB: |
201 |
32817 |
return "ARITH_SCALE_SUM_UPPER_BOUNDS"; |
202 |
|
case PfRule::ARITH_SUM_UB: return "ARITH_SUM_UB"; |
203 |
1580 |
case PfRule::ARITH_TRICHOTOMY: return "ARITH_TRICHOTOMY"; |
204 |
273 |
case PfRule::INT_TIGHT_LB: return "INT_TIGHT_LB"; |
205 |
15295 |
case PfRule::INT_TIGHT_UB: return "INT_TIGHT_UB"; |
206 |
|
case PfRule::INT_TRUST: return "INT_TRUST"; |
207 |
|
case PfRule::ARITH_MULT_SIGN: return "ARITH_MULT_SIGN"; |
208 |
|
case PfRule::ARITH_MULT_POS: return "ARITH_MULT_POS"; |
209 |
|
case PfRule::ARITH_MULT_NEG: return "ARITH_MULT_NEG"; |
210 |
|
case PfRule::ARITH_MULT_TANGENT: return "ARITH_MULT_TANGENT"; |
211 |
|
case PfRule::ARITH_OP_ELIM_AXIOM: return "ARITH_OP_ELIM_AXIOM"; |
212 |
|
case PfRule::ARITH_TRANS_PI: return "ARITH_TRANS_PI"; |
213 |
|
case PfRule::ARITH_TRANS_EXP_NEG: return "ARITH_TRANS_EXP_NEG"; |
214 |
|
case PfRule::ARITH_TRANS_EXP_POSITIVITY: |
215 |
|
return "ARITH_TRANS_EXP_POSITIVITY"; |
216 |
|
case PfRule::ARITH_TRANS_EXP_SUPER_LIN: return "ARITH_TRANS_EXP_SUPER_LIN"; |
217 |
|
case PfRule::ARITH_TRANS_EXP_ZERO: return "ARITH_TRANS_EXP_ZERO"; |
218 |
|
case PfRule::ARITH_TRANS_EXP_APPROX_ABOVE_NEG: |
219 |
|
return "ARITH_TRANS_EXP_APPROX_ABOVE_NEG"; |
220 |
|
case PfRule::ARITH_TRANS_EXP_APPROX_ABOVE_POS: |
221 |
|
return "ARITH_TRANS_EXP_APPROX_ABOVE_POS"; |
222 |
|
case PfRule::ARITH_TRANS_EXP_APPROX_BELOW: |
223 |
|
return "ARITH_TRANS_EXP_APPROX_BELOW"; |
224 |
|
case PfRule::ARITH_TRANS_SINE_BOUNDS: return "ARITH_TRANS_SINE_BOUNDS"; |
225 |
|
case PfRule::ARITH_TRANS_SINE_SHIFT: return "ARITH_TRANS_SINE_SHIFT"; |
226 |
|
case PfRule::ARITH_TRANS_SINE_SYMMETRY: return "ARITH_TRANS_SINE_SYMMETRY"; |
227 |
|
case PfRule::ARITH_TRANS_SINE_TANGENT_ZERO: |
228 |
|
return "ARITH_TRANS_SINE_TANGENT_ZERO"; |
229 |
|
case PfRule::ARITH_TRANS_SINE_TANGENT_PI: |
230 |
|
return "ARITH_TRANS_SINE_TANGENT_PI"; |
231 |
|
case PfRule::ARITH_TRANS_SINE_APPROX_ABOVE_NEG: |
232 |
|
return "ARITH_TRANS_SINE_APPROX_ABOVE_NEG"; |
233 |
|
case PfRule::ARITH_TRANS_SINE_APPROX_ABOVE_POS: |
234 |
|
return "ARITH_TRANS_SINE_APPROX_ABOVE_POS"; |
235 |
|
case PfRule::ARITH_TRANS_SINE_APPROX_BELOW_NEG: |
236 |
|
return "ARITH_TRANS_SINE_APPROX_BELOW_NEG"; |
237 |
|
case PfRule::ARITH_TRANS_SINE_APPROX_BELOW_POS: |
238 |
|
return "ARITH_TRANS_SINE_APPROX_BELOW_POS"; |
239 |
|
case PfRule::ARITH_NL_CAD_DIRECT: return "ARITH_NL_CAD_DIRECT"; |
240 |
|
case PfRule::ARITH_NL_CAD_RECURSIVE: return "ARITH_NL_CAD_RECURSIVE"; |
241 |
|
//================================================= Unknown rule |
242 |
|
case PfRule::UNKNOWN: return "UNKNOWN"; |
243 |
|
default: return "?"; |
244 |
|
} |
245 |
|
} |
246 |
|
|
247 |
148462 |
std::ostream& operator<<(std::ostream& out, PfRule id) |
248 |
|
{ |
249 |
148462 |
out << toString(id); |
250 |
148462 |
return out; |
251 |
|
} |
252 |
|
|
253 |
2572510 |
size_t PfRuleHashFunction::operator()(PfRule id) const |
254 |
|
{ |
255 |
2572510 |
return static_cast<size_t>(id); |
256 |
|
} |
257 |
|
|
258 |
28191 |
} // namespace cvc5 |