CBMC
Loading...
Searching...
No Matches
arrays.h
Go to the documentation of this file.
1/*******************************************************************\
2
3Module: Theory of Arrays with Extensionality
4
5Author: Daniel Kroening, kroening@kroening.com
6
7\*******************************************************************/
8
11
12#ifndef CPROVER_SOLVERS_FLATTENING_ARRAYS_H
13#define CPROVER_SOLVERS_FLATTENING_ARRAYS_H
14
15#include <list>
16#include <set>
17#include <unordered_set>
18
19#include <util/union_find.h>
20
21#include "equality.h"
22
24class array_exprt;
25class array_of_exprt;
26class equal_exprt;
27class if_exprt;
28class index_exprt;
29class symbol_exprt;
30class with_exprt;
31class update_exprt;
32
33class arrayst:public equalityt
34{
35public:
36 arrayst(
37 const namespacet &_ns,
38 propt &_prop,
40 bool get_array_constraints = false);
41
49
50 // NOLINTNEXTLINE(readability/identifiers)
51 typedef equalityt SUB;
52
54 void record_array_index(const index_exprt &expr);
55
60 void record_array_let_binding(const symbol_exprt &symbol, const exprt &value);
61
62protected:
63 const namespacet &ns;
66
71
73 {
76 };
77
78 // the list of all equalities between arrays
79 // references to objects in this container need to be stable as
80 // elements are added while references are held
81 typedef std::list<array_equalityt> array_equalitiest;
83
84 // this is used to find the clusters of arrays being compared
86
87 // this tracks the array indicies for each array
88 typedef std::set<exprt> index_sett;
89 // references to values in this container need to be stable as
90 // elements are added while references are held
91 typedef std::map<std::size_t, index_sett> index_mapt;
93
94 // adds array constraints lazily
106
108 {
111
113 {
114 type = _type;
115 lazy = _lazy;
116 }
117 };
118
122 std::list<lazy_constraintt> lazy_array_constraints;
123 void add_array_constraint(const lazy_constraintt &lazy, bool refine = true);
124 std::map<exprt, bool> expr_map;
125
138
139 typedef std::map<constraint_typet, size_t> array_constraint_countt;
142 std::string enum_to_string(constraint_typet);
143
144 // adds all the constraints eagerly
150 const index_sett &index_set, const exprt &expr);
152 const index_sett &index_set, const if_exprt &exprt);
154 const index_sett &index_set, const with_exprt &expr);
156 const index_sett &index_set, const update_exprt &expr);
160 const index_sett &index_set,
161 const array_exprt &exprt);
163 const index_sett &index_set,
164 const array_comprehension_exprt &expr);
165
166 void update_index_map(bool update_all);
167 void update_index_map(std::size_t i);
168 std::set<std::size_t> update_indices;
169 void collect_arrays(const exprt &a);
170 void collect_indices();
171 void collect_indices(const exprt &a);
172 std::unordered_set<irep_idt> array_comprehension_args;
173
174 virtual bool is_unbounded_array(const typet &type) const=0;
175 // (maybe this function should be partially moved here from boolbv)
176};
177
178#endif // CPROVER_SOLVERS_FLATTENING_ARRAYS_H
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:566
Expression to define a mapping from an argument (index) to elements.
Definition std_expr.h:3586
Array constructor from list of elements.
Definition std_expr.h:1570
Array constructor from single element.
Definition std_expr.h:1512
std::list< lazy_constraintt > lazy_array_constraints
Definition arrays.h:122
std::unordered_set< irep_idt > array_comprehension_args
Definition arrays.h:172
index_mapt index_map
Definition arrays.h:92
void add_array_constraints_equality(const index_sett &index_set, const array_equalityt &array_equality)
Definition arrays.cpp:451
std::set< std::size_t > update_indices
Definition arrays.h:168
const namespacet & ns
Definition arrays.h:63
void add_array_constraints_array_of(const index_sett &index_set, const array_of_exprt &exprt)
Definition arrays.cpp:712
void add_array_Ackermann_constraints()
Definition arrays.cpp:340
bool lazy_arrays
Definition arrays.h:119
void collect_indices()
Definition arrays.cpp:96
void add_array_constraints_update(const index_sett &index_set, const update_exprt &expr)
Definition arrays.cpp:655
void collect_arrays(const exprt &a)
Definition arrays.cpp:144
message_handlert & message_handler
Definition arrays.h:65
void record_array_let_binding(const symbol_exprt &symbol, const exprt &value)
Record that symbol is equal to value for the purposes of the array theory.
Definition arrays.cpp:83
union_find< exprt, irep_hash > arrays
Definition arrays.h:85
literalt record_array_equality(const equal_exprt &expr)
Definition arrays.cpp:55
void add_array_constraints_array_constant(const index_sett &index_set, const array_exprt &exprt)
Definition arrays.cpp:737
std::list< array_equalityt > array_equalitiest
Definition arrays.h:81
constraint_typet
Definition arrays.h:127
std::map< exprt, bool > expr_map
Definition arrays.h:124
equalityt SUB
Definition arrays.h:51
void add_array_constraints_if(const index_sett &index_set, const if_exprt &exprt)
Definition arrays.cpp:842
void finish_eager_conversion() override
Definition arrays.h:42
std::string enum_to_string(constraint_typet)
Definition arrays.cpp:894
bool get_array_constraints
Definition arrays.h:121
virtual void finish_eager_conversion_arrays()
Definition arrays.h:67
void add_array_constraints()
Definition arrays.cpp:290
void add_array_constraints_comprehension(const index_sett &index_set, const array_comprehension_exprt &expr)
Definition arrays.cpp:818
virtual bool is_unbounded_array(const typet &type) const =0
void record_array_index(const index_exprt &expr)
Definition arrays.cpp:45
array_equalitiest array_equalities
Definition arrays.h:82
lazy_typet
Definition arrays.h:96
std::map< constraint_typet, size_t > array_constraint_countt
Definition arrays.h:139
std::set< exprt > index_sett
Definition arrays.h:88
void add_array_constraint(const lazy_constraintt &lazy, bool refine=true)
adds array constraints (refine=true...lazily for the refinement loop)
Definition arrays.cpp:265
array_constraint_countt array_constraint_count
Definition arrays.h:140
void add_array_constraints_with(const index_sett &index_set, const with_exprt &expr)
Definition arrays.cpp:583
bool incremental_cache
Definition arrays.h:120
std::map< std::size_t, index_sett > index_mapt
Definition arrays.h:91
void display_array_constraint_count()
Definition arrays.cpp:921
void update_index_map(bool update_all)
Definition arrays.cpp:417
messaget log
Definition arrays.h:64
Equality.
Definition std_expr.h:1339
void finish_eager_conversion() override
Definition equality.h:31
Base class for all expressions.
Definition expr.h:57
The trinary if-then-else operator.
Definition std_expr.h:2426
Array index operator.
Definition std_expr.h:1431
Class that provides messages with a built-in verbosity 'level'.
Definition message.h:154
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition namespace.h:91
TO_BE_DOCUMENTED.
Definition prop.h:25
Expression to hold a symbol (variable)
Definition std_expr.h:132
The type of an expression, extends irept.
Definition type.h:29
Operator to update elements in structs and arrays.
Definition std_expr.h:2679
Operator to update elements in structs and arrays.
Definition std_expr.h:2520
auto lazy(funt fun) -> lazyt< decltype(fun())>
Delay the computation of fun to the next time the force method is called.
Definition lazy.h:49
lazy_constraintt(lazy_typet _type, const exprt &_lazy)
Definition arrays.h:112