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",
148 for(std::size_t i = 1; i <
with_expr.operands().size(); i += 2)
160 "collect_arrays got 'update' without matching types",
178 "collect_arrays got if without matching types",
183 "collect_arrays got if without matching types",
203 "unexpected array expression: member with '" + struct_op.id_string() +
217 "byte_update should be removed before collect_arrays");
226 "unexpected array type cast from " +
typecast_op.type().id_string());
250 "unexpected array expression (collect_arrays): '" +
a.id_string() +
"'");
295 for(std::size_t i = 0; i <
arrays.
size(); i++)
335 std::cout <<
"arrays.size(): " <<
arrays.
size() <<
'\n';
344 std::cout <<
"index_set.size(): " <<
index_set.size() <<
'\n';
348 for(index_sett::const_iterator
352 for(index_sett::const_iterator
358 if(
i1->is_constant() &&
i2->is_constant())
369 const typet &subtype =
433 std::cout <<
"Index set (" <<
index_entry.first <<
" = "
436 <<
"): " <<
format(index) <<
'\n';
437 std::cout <<
"-----\n";
459 "array elements should all have same type");
509 INVARIANT(
false,
"byte_update should be removed before arrayst");
525 "array elements should all have same type");
544 for(
const auto &binding :
547 replace_symbol.
insert(binding.first, binding.second);
549 replace_symbol(where);
568 "unexpected array expression (add_array_constraints): '" +
582 for(std::size_t i = 1; i + 1 < operands.size(); i += 2)
584 const exprt &index = operands[i];
585 const exprt &value = operands[i + 1];
592 "with-expression operand should match array element type",
660 const exprt &index=expr.where();
661 const exprt &value=expr.new_value();
668 "update operand should match array element type",
689 const typet &subtype=expr.type().subtype();
719 const typet &element_type = expr.
type().element_type();
724 "array_of operand type should match array element type");
743 const typet &element_type = expr.
type().element_type();
746 if(index.is_constant())
751 const std::optional<std::size_t> i =
754 if(!i.has_value() || *i >= operands.size())
757 const exprt v = operands[*i];
760 "array operand type should match array element type");
776 std::vector<std::pair<std::size_t, std::size_t>>
ranges;
778 for(std::size_t i = 0; i < operands.size(); ++i)
780 if(
ranges.empty() || operands[i] != operands[
ranges.back().first])
781 ranges.emplace_back(i, i);
786 for(
const auto &range :
ranges)
790 if(range.first == range.second)
896 return "arrayAckermann";
904 return "arrayTypecast";
906 return "arrayConstant";
908 return "arrayComprehension";
910 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...
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...
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.