CBMC
smt2_incremental_decision_procedure.h
Go to the documentation of this file.
1 // Author: Diffblue Ltd.
2 
5 
6 #ifndef CPROVER_SOLVERS_SMT2_INCREMENTAL_SMT2_INCREMENTAL_DECISION_PROCEDURE_H
7 #define CPROVER_SOLVERS_SMT2_INCREMENTAL_SMT2_INCREMENTAL_DECISION_PROCEDURE_H
8 
9 #include <util/message.h>
10 #include <util/std_expr.h>
11 
17 
18 #include <memory>
19 #include <unordered_map>
20 #include <unordered_set>
21 
22 class smt_commandt;
23 class message_handlert;
24 class namespacet;
26 
29 {
30 public:
38  const namespacet &_ns,
39  std::unique_ptr<smt_base_solver_processt> solver_process,
40  message_handlert &message_handler);
41 
42  // Implementation of public decision_proceduret member functions.
43  exprt handle(const exprt &expr) override;
44  exprt get(const exprt &expr) const override;
45  void print_assignment(std::ostream &out) const override;
46  std::string decision_procedure_text() const override;
47  std::size_t get_number_of_solver_calls() const override;
48  void set_to(const exprt &expr, bool value) override;
49 
50  // Implementation of public stack_decision_proceduret member functions.
51  void push(const std::vector<exprt> &assumptions) override;
52  void push() override;
53  void pop() override;
54 
58  exprt get_expr(const smt_termt &descriptor, const typet &type) const;
59  array_exprt get_expr(const smt_termt &array, const array_typet &type) const;
60 
61 protected:
62  // Implementation of protected decision_proceduret member function.
63  resultt dec_solve() override;
71  template <typename t_exprt>
72  void define_array_function(const t_exprt &array);
76  const array_exprt &array,
77  const smt_identifier_termt &array_identifier);
85  const array_of_exprt &array,
86  const smt_identifier_termt &array_identifier);
89  void define_dependent_functions(const exprt &expr);
90  void ensure_handle_for_expr_defined(const exprt &expr);
93  smt_termt convert_expr_to_smt(const exprt &expr);
94  void define_index_identifiers(const exprt &expr);
96  void define_object_sizes();
97 
102  const namespacet &ns;
108  std::unique_ptr<smt_base_solver_processt> solver_process;
113  class sequencet
114  {
115  size_t next_id = 0;
116 
117  public:
118  size_t operator()()
119  {
120  return next_id++;
121  }
129  std::unordered_map<exprt, smt_identifier_termt, irep_hash>
139  std::unordered_map<exprt, smt_identifier_termt, irep_hash>
148  std::unordered_map<irep_idt, smt_identifier_termt> identifier_table;
157  std::vector<bool> object_size_defined;
164 };
165 
166 #endif // CPROVER_SOLVERS_SMT2_INCREMENTAL_SMT2_INCREMENTAL_DECISION_PROCEDURE_H
messaget
Class that provides messages with a built-in verbosity 'level'.
Definition: message.h:154
smt_object_sizet
Specifics of how the object size lookup is implemented in SMT terms.
Definition: smt_object_size.h:14
smt2_incremental_decision_proceduret::define_dependent_functions
void define_dependent_functions(const exprt &expr)
Defines any functions which expr depends on, which have not yet been defined, along with their depend...
Definition: smt2_incremental_decision_procedure.cpp:154
smt2_incremental_decision_proceduret::identifier_table
std::unordered_map< irep_idt, smt_identifier_termt > identifier_table
This maps from the unsorted/untyped string/symbol for the identifiers which we have declared in SMT s...
Definition: smt2_incremental_decision_procedure.h:148
smt2_incremental_decision_proceduret::define_index_identifiers
void define_index_identifiers(const exprt &expr)
Definition: smt2_incremental_decision_procedure.cpp:278
smt_identifier_termt
Stores identifiers in unescaped and unquoted form.
Definition: smt_terms.h:91
smt2_incremental_decision_proceduret::index_sequence
class smt2_incremental_decision_proceduret::sequencet index_sequence
type_size_mapping.h
typet
The type of an expression, extends irept.
Definition: type.h:28
object_tracking.h
smt2_incremental_decision_proceduret::push
void push() override
Push a new context on the stack This context becomes a child context nested in the current context.
Definition: smt2_incremental_decision_procedure.cpp:512
smt_termt
Definition: smt_terms.h:20
smt2_incremental_decision_proceduret::decision_procedure_text
std::string decision_procedure_text() const override
Return a textual description of the decision procedure.
Definition: smt2_incremental_decision_procedure.cpp:468
exprt
Base class for all expressions.
Definition: expr.h:55
smt2_incremental_decision_proceduret::dec_solve
resultt dec_solve() override
Run the decision procedure to solve the problem.
Definition: smt2_incremental_decision_procedure.cpp:551
smt_base_solver_processt
Definition: smt_solver_process.h:15
smt2_incremental_decision_proceduret::get_number_of_solver_calls
std::size_t get_number_of_solver_calls() const override
Return the number of incremental solver calls.
Definition: smt2_incremental_decision_procedure.cpp:474
stack_decision_proceduret
Definition: stack_decision_procedure.h:57
smt2_incremental_decision_proceduret::object_map
smt_object_mapt object_map
This map is used to track object related state.
Definition: smt2_incremental_decision_procedure.h:151
smt2_incremental_decision_proceduret::print_assignment
void print_assignment(std::ostream &out) const override
Print satisfying assignment to out.
Definition: smt2_incremental_decision_procedure.cpp:461
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
stack_decision_procedure.h
smt2_incremental_decision_proceduret::sequencet::next_id
size_t next_id
Definition: smt2_incremental_decision_procedure.h:115
smt2_incremental_decision_proceduret::get_expr
exprt get_expr(const smt_termt &descriptor, const typet &type) const
Gets the value of descriptor from the solver and returns the solver response expressed as an exprt of...
Definition: smt2_incremental_decision_procedure.cpp:372
smt2_incremental_decision_proceduret
Definition: smt2_incremental_decision_procedure.h:27
smt_object_size.h
smt2_incremental_decision_proceduret::handle_sequence
class smt2_incremental_decision_proceduret::sequencet handle_sequence
smt2_incremental_decision_proceduret::pointer_sizes_map
type_size_mapt pointer_sizes_map
Precalculated type sizes used for pointer arithmetic.
Definition: smt2_incremental_decision_procedure.h:163
array_of_exprt
Array constructor from single element.
Definition: std_expr.h:1497
smt2_incremental_decision_proceduret::number_of_solver_calls
size_t number_of_solver_calls
The number of times dec_solve() has been called.
Definition: smt2_incremental_decision_procedure.h:104
message_handlert
Definition: message.h:27
smt_commandt
Definition: smt_commands.h:13
smt2_incremental_decision_proceduret::sequencet::operator()
size_t operator()()
Definition: smt2_incremental_decision_procedure.h:118
smt2_incremental_decision_proceduret::get
exprt get(const exprt &expr) const override
Return expr with variables replaced by values from satisfying assignment if available.
Definition: smt2_incremental_decision_procedure.cpp:397
smt2_incremental_decision_proceduret::sequencet
Generators of sequences of uniquely identifying numbers used for naming SMT functions introduced by t...
Definition: smt2_incremental_decision_procedure.h:113
decision_proceduret::resultt
resultt
Result of running the decision procedure.
Definition: decision_procedure.h:43
smt2_incremental_decision_proceduret::object_size_function
smt_object_sizet object_size_function
Implementation of the SMT formula for the object size function.
Definition: smt2_incremental_decision_procedure.h:161
smt2_incremental_decision_proceduret::ensure_handle_for_expr_defined
void ensure_handle_for_expr_defined(const exprt &expr)
Definition: smt2_incremental_decision_procedure.cpp:259
smt2_incremental_decision_proceduret::handle
exprt handle(const exprt &expr) override
Generate a handle, which is an expression that has the same value as the argument in any model that i...
Definition: smt2_incremental_decision_procedure.cpp:319
smt2_incremental_decision_proceduret::smt2_incremental_decision_proceduret
smt2_incremental_decision_proceduret(const namespacet &_ns, std::unique_ptr< smt_base_solver_processt > solver_process, message_handlert &message_handler)
Definition: smt2_incremental_decision_procedure.cpp:243
smt2_incremental_decision_proceduret::log
messaget log
For reporting errors, warnings and debugging information back to the user.
Definition: smt2_incremental_decision_procedure.h:110
array_typet
Arrays with given size.
Definition: std_types.h:762
smt2_incremental_decision_proceduret::pop
void pop() override
Pop whatever is on top of the stack.
Definition: smt2_incremental_decision_procedure.cpp:517
smt2_incremental_decision_proceduret::ns
const namespacet & ns
Namespace for looking up the expressions which symbol_exprts relate to.
Definition: smt2_incremental_decision_procedure.h:102
smt_object_mapt
std::unordered_map< exprt, decision_procedure_objectt, irep_hash > smt_object_mapt
Mapping from an object's base expression to the set of information about it which we track.
Definition: object_tracking.h:89
smt2_incremental_decision_proceduret::define_array_function
void define_array_function(const t_exprt &array)
Defines a function of array sort and asserts the element values from array_exprt or array_of_exprt.
Definition: smt2_incremental_decision_procedure.cpp:120
smt2_incremental_decision_proceduret::define_object_sizes
void define_object_sizes()
Sends the solver the definitions of the object sizes.
Definition: smt2_incremental_decision_procedure.cpp:535
smt2_incremental_decision_proceduret::set_to
void set_to(const exprt &expr, bool value) override
For a Boolean expression expr, add the constraint 'expr' if value is true, otherwise add 'not expr'.
Definition: smt2_incremental_decision_procedure.cpp:479
smt2_incremental_decision_proceduret::convert_expr_to_smt
smt_termt convert_expr_to_smt(const exprt &expr)
Add objects in expr to object_map if needed and convert to smt.
Definition: smt2_incremental_decision_procedure.cpp:300
smt2_incremental_decision_proceduret::array_sequence
class smt2_incremental_decision_proceduret::sequencet array_sequence
smt2_incremental_decision_proceduret::solver_process
std::unique_ptr< smt_base_solver_processt > solver_process
For handling the lifetime of and communication with the separate SMT solver process.
Definition: smt2_incremental_decision_procedure.h:108
smt2_incremental_decision_proceduret::expression_handle_identifiers
std::unordered_map< exprt, smt_identifier_termt, irep_hash > expression_handle_identifiers
When the handle(exprt) member function is called, the decision procedure commands the SMT solver to d...
Definition: smt2_incremental_decision_procedure.h:130
type_size_mapt
std::unordered_map< typet, smt_termt, irep_full_hash > type_size_mapt
Definition: type_size_mapping.h:17
message.h
smt_terms.h
std_expr.h
smt2_incremental_decision_proceduret::expression_identifiers
std::unordered_map< exprt, smt_identifier_termt, irep_hash > expression_identifiers
As part of the decision procedure's overall translation of CBMCs exprts into SMT terms,...
Definition: smt2_incremental_decision_procedure.h:140
array_exprt
Array constructor from list of elements.
Definition: std_expr.h:1562
smt2_incremental_decision_proceduret::object_size_defined
std::vector< bool > object_size_defined
The size of each object is separately defined as a pre-solving step.
Definition: smt2_incremental_decision_procedure.h:157
smt2_incremental_decision_proceduret::initialize_array_elements
void initialize_array_elements(const array_exprt &array, const smt_identifier_termt &array_identifier)
Generate and send to the SMT solver clauses asserting that each array element is as specified by arra...
Definition: smt2_incremental_decision_procedure.cpp:84