cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
solver.cpp
Go to the documentation of this file.
1
/*******************************************************************\
2
3
Module: Solver
4
5
Author: Daniel Kroening, dkr@amazon.com
6
7
\*******************************************************************/
8
11
12
#include "
solver.h
"
13
14
#include <
util/format_expr.h
>
15
16
#include "
address_taken.h
"
17
#include "
generalization.h
"
18
#include "
inductiveness.h
"
19
#include "
report_properties.h
"
20
#include "
report_traces.h
"
21
#include "
solver_progress.h
"
22
#include "
solver_types.h
"
23
24
#include <iostream>
25
26
class
take_time_resourcet
27
{
28
public
:
29
explicit
take_time_resourcet
(
30
std::chrono::time_point<std::chrono::steady_clock> &_dest)
31
:
dest
(_dest)
32
{
33
}
34
35
~take_time_resourcet
()
36
{
37
dest
= std::chrono::steady_clock::now();
38
}
39
40
protected
:
41
std::chrono::time_point<std::chrono::steady_clock> &
dest
;
42
};
43
44
void
solver
(
45
std::vector<framet> &frames,
46
const
std::unordered_set<symbol_exprt, irep_hash> &
address_taken
,
47
const
solver_optionst
&solver_options,
48
const
namespacet
&ns,
49
std::vector<propertyt> &properties,
50
std::size_t property_index)
51
{
52
auto
&
property
= properties[property_index];
53
54
property
.start = std::chrono::steady_clock::now();
55
take_time_resourcet
stop_time(property.stop);
56
57
// Clean up
58
for
(
auto
&frame : frames)
59
frame.reset();
60
61
// We start with I = P.
62
frames[
property
.frame.index].add_invariant(property.condition);
63
64
for
(
unsigned
iteration = 0;
true
; iteration++)
65
{
66
if
(iteration == 3)
// limit the effort
67
{
68
property
.status = propertyt::DROPPED;
69
return
;
// give up
70
}
71
72
if
(solver_options.
verbose
)
73
std::cout <<
"Doing "
<<
format
(property.condition) <<
" iteration "
74
<< iteration + 1 <<
'\n'
;
75
76
auto
result =
inductiveness_check
(
77
frames,
address_taken
, solver_options, ns, properties, property_index);
78
79
switch
(result.outcome)
80
{
81
case
inductiveness_resultt::INDUCTIVE
:
82
property
.status = propertyt::PASS;
83
return
;
// done
84
85
case
inductiveness_resultt::BASE_CASE_FAIL
:
86
if
(iteration == 0)
87
{
88
// no generalization done, so this is a counterexample
89
property
.status = propertyt::REFUTED;
90
return
;
// DONE
91
}
92
else
93
{
94
// Invariant was generalized too much. Try something weaker.
95
property
.status = propertyt::DROPPED;
96
return
;
97
}
98
99
case
inductiveness_resultt::STEP_CASE_FAIL
:
100
// Invariant is too weak or too strong to be inductive.
101
generalization
(frames, *result.work, property, solver_options);
102
break
;
103
}
104
}
105
}
106
107
solver_resultt
solver
(
108
const
std::vector<exprt> &constraints,
109
const
solver_optionst
&solver_options,
110
const
namespacet
&ns)
111
{
112
const
auto
address_taken
=
::address_taken
(constraints);
113
114
#if 0
115
if
(solver_options.
verbose
)
116
{
117
for
(
auto
&a :
address_taken
)
118
std::cout <<
"address_taken: "
<<
format
(a) <<
'\n'
;
119
}
120
#endif
121
122
auto
frames =
setup_frames
(constraints);
123
124
find_implications
(constraints, frames);
125
126
auto
properties =
find_properties
(constraints, frames);
127
128
if
(properties.empty())
129
{
130
std::cout <<
"\nThere are no properties to show.\n"
;
131
return
solver_resultt::ALL_PASS
;
132
}
133
134
solver_progresst
solver_progress(properties.size(), solver_options.
verbose
);
135
136
// solve each property separately, in order of occurence
137
for
(std::size_t i = 0; i < properties.size(); i++)
138
{
139
solver_progress(i);
140
solver
(frames,
address_taken
, solver_options, ns, properties, i);
141
}
142
143
solver_progress.
finished
();
144
145
// reporting
146
report_properties
(properties);
147
148
if
(solver_options.
trace
)
149
report_traces
(frames, properties, solver_options.
verbose
, ns);
150
151
// overall outcome
152
return
overall_outcome
(properties);
153
}
address_taken
std::unordered_set< symbol_exprt, irep_hash > address_taken(const std::vector< exprt > &src)
Definition
address_taken.cpp:51
address_taken.h
Address Taken.
inductiveness_resultt::STEP_CASE_FAIL
@ STEP_CASE_FAIL
Definition
inductiveness.h:26
inductiveness_resultt::INDUCTIVE
@ INDUCTIVE
Definition
inductiveness.h:24
inductiveness_resultt::BASE_CASE_FAIL
@ BASE_CASE_FAIL
Definition
inductiveness.h:25
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition
namespace.h:91
solver_optionst
Definition
solver.h:28
solver_optionst::verbose
bool verbose
Definition
solver.h:31
solver_optionst::trace
bool trace
Definition
solver.h:30
solver_progresst
Definition
solver_progress.h:18
solver_progresst::finished
void finished()
Definition
solver_progress.cpp:47
take_time_resourcet
Definition
solver.cpp:27
take_time_resourcet::dest
std::chrono::time_point< std::chrono::steady_clock > & dest
Definition
solver.cpp:41
take_time_resourcet::take_time_resourcet
take_time_resourcet(std::chrono::time_point< std::chrono::steady_clock > &_dest)
Definition
solver.cpp:29
take_time_resourcet::~take_time_resourcet
~take_time_resourcet()
Definition
solver.cpp:35
format
static format_containert< T > format(const T &o)
Definition
format.h:37
format_expr.h
generalization
void generalization(std::vector< framet > &frames, const workt &dropped, const propertyt &property, const solver_optionst &solver_options)
Definition
generalization.cpp:83
generalization.h
Generalization.
inductiveness_check
inductiveness_resultt inductiveness_check(std::vector< framet > &frames, const std::unordered_set< symbol_exprt, irep_hash > &address_taken, const solver_optionst &solver_options, const namespacet &ns, std::vector< propertyt > &properties, std::size_t property_index)
Definition
inductiveness.cpp:98
inductiveness.h
Inductiveness.
overall_outcome
solver_resultt overall_outcome(const std::vector< propertyt > &properties)
Definition
report_properties.cpp:96
report_properties
void report_properties(const std::vector< propertyt > &properties)
Definition
report_properties.cpp:16
report_properties.h
Property Reporting.
report_traces
void report_traces(const std::vector< framet > &frames, const std::vector< propertyt > &properties, bool verbose, const namespacet &ns)
Definition
report_traces.cpp:151
report_traces.h
Report Traces.
solver
void solver(std::vector< framet > &frames, const std::unordered_set< symbol_exprt, irep_hash > &address_taken, const solver_optionst &solver_options, const namespacet &ns, std::vector< propertyt > &properties, std::size_t property_index)
Definition
solver.cpp:44
solver.h
Equality Propagation.
solver_resultt
solver_resultt
Definition
solver.h:21
solver_resultt::ALL_PASS
@ ALL_PASS
Definition
solver.h:22
solver_progress.h
Solver Progress Reporting.
setup_frames
std::vector< framet > setup_frames(const std::vector< exprt > &constraints)
Definition
solver_types.cpp:73
find_implications
void find_implications(const std::vector< exprt > &constraints, std::vector< framet > &frames)
Definition
solver_types.cpp:91
find_properties
std::vector< propertyt > find_properties(const std::vector< exprt > &constraints, const std::vector< framet > &frames)
Definition
solver_types.cpp:134
solver_types.h
Solver.
cprover
solver.cpp
Generated by
1.17.0