27#include <unordered_set>
63 "record_array_equality got equality without matching types",
68 "record_array_equality parameter should be array-typed");
99 for(
const auto &op : expr.
operands())
141 "collect_arrays got 'with' without matching types",
157 "collect_arrays got 'update' without matching types",
175 "collect_arrays got if without matching types",
180 "collect_arrays got if without matching types",
200 "unexpected array expression: member with '" + struct_op.id_string() +
214 "byte_update should be removed before collect_arrays");
223 "unexpected array type cast from " +
typecast_op.type().id_string());
247 "unexpected array expression (collect_arrays): '" +
a.id_string() +
"'");
292 for(std::size_t i = 0; i <
arrays.
size(); i++)
332 std::cout <<
"arrays.size(): " <<
arrays.
size() <<
'\n';
341 std::cout <<
"index_set.size(): " <<
index_set.size() <<
'\n';
345 for(index_sett::const_iterator
349 for(index_sett::const_iterator
355 if(
i1->is_constant() &&
i2->is_constant())
366 const typet &subtype =
430 std::cout <<
"Index set (" <<
index_entry.first <<
" = "
433 <<
"): " <<
format(index) <<
'\n';
434 std::cout <<
"-----\n";
456 "array elements should all have same type");
506 INVARIANT(
false,
"byte_update should be removed before arrayst");
522 "array elements should all have same type");
541 for(
const auto &binding :
544 replace_symbol.
insert(binding.first, binding.second);
546 replace_symbol(where);
565 "unexpected array expression (add_array_constraints): '" +
583 "with-expression operand should match array element type",
650 const exprt &index=expr.where();
651 const exprt &value=expr.new_value();
658 "update operand should match array element type",
679 const typet &subtype=expr.type().subtype();
709 const typet &element_type = expr.
type().element_type();
714 "array_of operand type should match array element type");
733 const typet &element_type = expr.
type().element_type();
736 if(index.is_constant())
741 const std::optional<std::size_t> i =
744 if(!i.has_value() || *i >= operands.size())
747 const exprt v = operands[*i];
750 "array operand type should match array element type");
766 std::vector<std::pair<std::size_t, std::size_t>>
ranges;
768 for(std::size_t i = 0; i < operands.size(); ++i)
770 if(
ranges.empty() || operands[i] != operands[
ranges.back().first])
771 ranges.emplace_back(i, i);
776 for(
const auto &range :
ranges)
780 if(range.first == range.second)
886 return "arrayAckermann";
894 return "arrayTypecast";
896 return "arrayConstant";
898 return "arrayComprehension";
900 return "arrayEquality";
Theory of Arrays with Extensionality.
virtual void clear()
Reset the abstract state.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Boolean AND All operands must be boolean, and the result is always boolean.
Expression to define a mapping from an argument (index) to elements.
const symbol_exprt & arg() const
const exprt & body() const
Array constructor from list of elements.
const array_typet & type() const
Array constructor from single element.
const array_typet & type() const
std::list< lazy_constraintt > lazy_array_constraints
std::unordered_set< irep_idt > array_comprehension_args
void add_array_constraints_equality(const index_sett &index_set, const array_equalityt &array_equality)
std::set< std::size_t > update_indices
void add_array_constraints_array_of(const index_sett &index_set, const array_of_exprt &exprt)
void add_array_Ackermann_constraints()
void add_array_constraints_update(const index_sett &index_set, const update_exprt &expr)
void collect_arrays(const exprt &a)
union_find< exprt, irep_hash > arrays
literalt record_array_equality(const equal_exprt &expr)
void add_array_constraints_array_constant(const index_sett &index_set, const array_exprt &exprt)
arrayst(const namespacet &_ns, propt &_prop, message_handlert &message_handler, bool get_array_constraints=false)
std::map< exprt, bool > expr_map
void add_array_constraints_if(const index_sett &index_set, const if_exprt &exprt)
std::string enum_to_string(constraint_typet)
bool get_array_constraints
void add_array_constraints()
void add_array_constraints_comprehension(const index_sett &index_set, const array_comprehension_exprt &expr)
virtual bool is_unbounded_array(const typet &type) const =0
void record_array_index(const index_exprt &expr)
array_equalitiest array_equalities
std::set< exprt > index_sett
void add_array_constraint(const lazy_constraintt &lazy, bool refine=true)
adds array constraints (refine=true...lazily for the refinement loop)
array_constraint_countt array_constraint_count
void add_array_constraints_with(const index_sett &index_set, const with_exprt &expr)
void display_array_constraint_count()
void update_index_map(bool update_all)
A base class for expressions that are predicates, i.e., Boolean-typed, and that take exactly two argu...
void set_to_true(const exprt &)
For a Boolean expression expr, add the constraint 'expr'.
virtual literalt equality(const exprt &e1, const exprt &e2)
Base class for all expressions.
std::vector< exprt > operandst
bool is_constant() const
Return whether the expression is a constant.
typet & type()
Return the type of the expression.
The trinary if-then-else operator.
const std::string & id_string() const
const irep_idt & id() const
mstreamt & status() const
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Boolean OR All operands must be boolean, and the result is always boolean.
literalt convert(const exprt &expr) override
Convert a Boolean expression and return the corresponding literal.
void l_set_to_true(literalt a)
void lcnf(literalt l0, literalt l1)
Replace a symbol expression by a given expression.
void insert(const class symbol_exprt &old_expr, const exprt &new_expr)
Sets old_expr to be replaced by new_expr if we don't already have a replacement; otherwise does nothi...
static exprt conditional_cast(const exprt &expr, const typet &type)
The type of an expression, extends irept.
size_type number(const T &a)
bool make_union(const T &a, const T &b)
size_type find_number(const_iterator it) const
bool is_root_number(size_type a) const
Operator to update elements in structs and arrays.
Operator to update elements in structs and arrays.
auto lazy(funt fun) -> lazyt< decltype(fun())>
Delay the computation of fun to the next time the force method is called.
std::vector< literalt > bvt
literalt const_literal(bool value)
ranget< iteratort > make_range(iteratort begin, iteratort end)
bool replace_expr(const exprt &what, const exprt &by, exprt &dest)
#define UNREACHABLE
This should be used to mark dead code.
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
#define INVARIANT(CONDITION, REASON)
This macro uses the wrapper function 'invariant_violated_string'.
#define DATA_INVARIANT_WITH_DIAGNOSTICS(CONDITION, REASON,...)
exprt disjunction(const exprt::operandst &op)
1) generates a disjunction for two or more operands 2) for one operand, returns the operand 3) return...
API to expression classes.
const array_of_exprt & to_array_of_expr(const exprt &expr)
Cast an exprt to an array_of_exprt.
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
const array_comprehension_exprt & to_array_comprehension_expr(const exprt &expr)
Cast an exprt to a array_comprehension_exprt.
const array_exprt & to_array_expr(const exprt &expr)
Cast an exprt to an array_exprt.
const typecast_exprt & to_typecast_expr(const exprt &expr)
Cast an exprt to a typecast_exprt.
const if_exprt & to_if_expr(const exprt &expr)
Cast an exprt to an if_exprt.
const member_exprt & to_member_expr(const exprt &expr)
Cast an exprt to a member_exprt.
const constant_exprt & to_constant_expr(const exprt &expr)
Cast an exprt to a constant_exprt.
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
const with_exprt & to_with_expr(const exprt &expr)
Cast an exprt to a with_exprt.
const update_exprt & to_update_expr(const exprt &expr)
Cast an exprt to an update_exprt.
const array_typet & to_array_type(const typet &type)
Cast a typet to an array_typet.