Skip to content

Commit 213bfeb

Browse files
committed
Refactor quantifier instantiation in solvers/flattening
1 parent 9d3e064 commit 213bfeb

File tree

3 files changed

+33
-41
lines changed

3 files changed

+33
-41
lines changed

src/solvers/flattening/boolbv.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,9 +463,9 @@ literalt boolbvt::convert_rest(const exprt &expr)
463463
else if(expr.id()==ID_extractbit)
464464
return convert_extractbit(to_extractbit_expr(expr));
465465
else if(expr.id()==ID_forall)
466-
return convert_quantifier(expr);
466+
return convert_quantifier(to_quantifier_expr(expr));
467467
else if(expr.id()==ID_exists)
468-
return convert_quantifier(expr);
468+
return convert_quantifier(to_quantifier_expr(expr));
469469
else if(expr.id()==ID_let)
470470
{
471471
bvt bv=convert_let(to_let_expr(expr));

src/solvers/flattening/boolbv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class boolbvt:public arrayst
131131
virtual literalt convert_verilog_case_equality(
132132
const binary_relation_exprt &expr);
133133
virtual literalt convert_ieee_float_rel(const exprt &expr);
134-
virtual literalt convert_quantifier(const exprt &expr);
134+
virtual literalt convert_quantifier(const quantifier_exprt &expr);
135135

136136
virtual bvt convert_index(const exprt &array, const mp_integer &index);
137137
virtual bvt convert_index(const index_exprt &expr);

src/solvers/flattening/boolbv_quantifier.cpp

Lines changed: 30 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Author: Daniel Kroening, [email protected]
1010

1111
#include <util/arith_tools.h>
1212
#include <util/invariant.h>
13+
#include <util/optional.h>
1314
#include <util/replace_expr.h>
1415
#include <util/simplify_expr.h>
1516

@@ -135,83 +136,74 @@ exprt get_quantifier_var_max(
135136
return res;
136137
}
137138

138-
bool instantiate_quantifier(exprt &expr,
139-
const namespacet &ns)
139+
optionalt<exprt>
140+
instantiate_quantifier(const quantifier_exprt &expr, const namespacet &ns)
140141
{
141142
PRECONDITION(expr.id() == ID_forall || expr.id() == ID_exists);
142143

143-
DATA_INVARIANT(
144-
expr.operands().size() == 2,
145-
"quantifier expressions shall have two operands");
146-
147-
DATA_INVARIANT(
148-
expr.op0().id() == ID_symbol, "quantified variable shall be a symbol");
149-
150-
exprt var_expr=expr.op0();
144+
const symbol_exprt &var_expr = expr.symbol();
151145

152146
/**
153147
* We need to rewrite the forall/exists quantifier into
154148
* an OR/AND expr.
155149
**/
156-
exprt re(expr);
157-
exprt tmp(re.op1());
158-
re.swap(tmp);
159-
re=simplify_expr(re, ns);
150+
151+
const exprt &re = simplify_expr(expr.where(), ns);
160152

161153
if(re.is_true() || re.is_false())
162154
{
163-
expr=re;
164-
return true;
155+
return re;
165156
}
166157

167-
exprt min_i=get_quantifier_var_min(var_expr, re);
168-
exprt max_i=get_quantifier_var_max(var_expr, re);
169-
exprt body_expr=re;
170-
if(var_expr.is_false() ||
171-
min_i.is_false() ||
172-
max_i.is_false() ||
173-
body_expr.is_false())
174-
return false;
158+
const exprt &min_i = get_quantifier_var_min(var_expr, re);
159+
const exprt &max_i = get_quantifier_var_max(var_expr, re);
175160

176-
mp_integer lb, ub;
177-
to_integer(min_i, lb);
178-
to_integer(max_i, ub);
161+
if(min_i.is_false() || max_i.is_false())
162+
return nullopt;
163+
164+
mp_integer lb = numeric_cast_v<mp_integer>(min_i);
165+
mp_integer ub = numeric_cast_v<mp_integer>(max_i);
179166

180167
if(lb>ub)
181-
return false;
168+
return nullopt;
182169

183-
bool res=true;
184170
std::vector<exprt> expr_insts;
185171
for(mp_integer i=lb; i<=ub; ++i)
186172
{
187-
exprt constraint_expr=body_expr;
173+
exprt constraint_expr = re;
188174
replace_expr(var_expr,
189175
from_integer(i, var_expr.type()),
190176
constraint_expr);
191177
expr_insts.push_back(constraint_expr);
192178
}
179+
193180
if(expr.id()==ID_forall)
194181
{
195-
expr=conjunction(expr_insts);
182+
return conjunction(expr_insts);
196183
}
197-
if(expr.id()==ID_exists)
184+
else if(expr.id() == ID_exists)
198185
{
199-
expr=disjunction(expr_insts);
186+
return disjunction(expr_insts);
200187
}
201188

202-
return res;
189+
UNREACHABLE;
190+
return nullopt;
203191
}
204192

205-
literalt boolbvt::convert_quantifier(const exprt &src)
193+
literalt boolbvt::convert_quantifier(const quantifier_exprt &src)
206194
{
207195
PRECONDITION(src.id() == ID_forall || src.id() == ID_exists);
208196

209-
exprt expr(src);
210-
if(!instantiate_quantifier(expr, ns))
197+
quantifier_exprt expr(src);
198+
const auto res = instantiate_quantifier(expr, ns);
199+
200+
if(!res)
201+
{
211202
return SUB::convert_rest(src);
203+
}
212204

213205
quantifiert quantifier;
214-
quantifier.expr=expr;
206+
quantifier.expr = *res;
215207
quantifier_list.push_back(quantifier);
216208

217209
literalt l=prop.new_variable();

0 commit comments

Comments
 (0)