12 #include <unordered_set> 25 if(expr.
type().
id()!=ID_bool)
28 if(expr.
id()==ID_implies)
30 if(operands.size()!=2 ||
31 operands.front().type().id()!=ID_bool ||
32 operands.back().type().id()!=ID_bool)
43 else if(expr.
id()==ID_iff)
45 if(operands.size()!=2 ||
46 operands.front().type().id()!=ID_bool ||
47 operands.back().type().id()!=ID_bool)
50 if(operands.front().is_false())
53 operands.erase(operands.begin());
56 else if(operands.front().is_true())
58 exprt tmp(operands.back());
62 else if(operands.back().is_false())
65 operands.erase(++operands.begin());
68 else if(operands.back().is_true())
70 exprt tmp(operands.front());
75 else if(expr.
id()==ID_or ||
84 exprt::operandst::const_iterator last;
89 for(exprt::operandst::iterator it=operands.begin();
92 if(it->type().id()!=ID_bool)
95 bool is_true=it->is_true();
96 bool is_false=it->is_false();
98 if(expr.
id()==ID_and && is_false)
103 else if(expr.
id()==ID_or && is_true)
111 if(expr.
id()==ID_and)
113 else if(is_true && expr.
id()==ID_xor)
121 if(last_set && *it==*last &&
122 (expr.
id()==ID_or || expr.
id()==ID_and))
127 it=operands.erase(it);
139 if(expr.
id()==ID_and || expr.
id()==ID_or)
143 std::unordered_set<exprt, irep_hash> expr_set;
146 if(it->id()==ID_not &&
147 it->operands().size()==1 &&
148 it->type().id()==ID_bool)
149 expr_set.insert(it->op0());
153 if(!expr_set.empty())
157 if(it->id()!=ID_not &&
158 expr_set.find(*it)!=expr_set.end())
169 if(expr.
id()==ID_and || negate)
176 else if(operands.size()==1)
180 exprt tmp(operands.front());
198 if(expr.
type().
id()!=ID_bool ||
222 else if(op.
id()==ID_and ||
235 expr.
id(expr.
id()==ID_and?ID_or:ID_and);
239 else if(op.
id()==ID_notequal)
247 else if(op.
id()==ID_exists)
bool simplify_node(exprt &expr)
void make_bool(bool value)
const irep_idt & id() const
The boolean constant true.
bool simplify_boolean(exprt &expr)
API to expression classes.
#define forall_operands(it, expr)
bool has_operands() const
The boolean constant false.
std::vector< exprt > operandst
Base class for all expressions.
#define Forall_operands(it, expr)
bool simplify_not(exprt &expr)