Skip to content

Commit f62db13

Browse files
Split out decision procedure with solving under assumptions
Makes it explicit which algorithms actually require this feature.
1 parent 8927b7d commit f62db13

19 files changed

+133
-114
lines changed

src/goto-checker/bmc_util.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -368,13 +368,14 @@ std::chrono::duration<double> prepare_property_decider(
368368
{
369369
auto solver_start = std::chrono::steady_clock::now();
370370

371+
decision_proceduret &decision_procedure =
372+
property_decider.get_solver().decision_procedure();
371373
messaget log(ui_message_handler);
372374
log.status() << "Passing problem to "
373-
<< property_decider.get_solver().decision_procedure_text()
374-
<< messaget::eom;
375+
<< decision_procedure.decision_procedure_text() << messaget::eom;
375376

376377
convert_symex_target_equation(
377-
equation, property_decider.get_solver(), ui_message_handler);
378+
equation, decision_procedure, ui_message_handler);
378379
property_decider.update_properties_goals_from_symex_target_equation(
379380
properties);
380381
property_decider.convert_goals();
@@ -394,9 +395,10 @@ void run_property_decider(
394395
{
395396
auto solver_start = std::chrono::steady_clock::now();
396397

398+
const decision_proceduret &decision_procedure =
399+
property_decider.get_solver().decision_procedure();
397400
messaget log(ui_message_handler);
398-
log.status() << "Running "
399-
<< property_decider.get_solver().decision_procedure_text()
401+
log.status() << "Running " << decision_procedure.decision_procedure_text()
400402
<< messaget::eom;
401403

402404
property_decider.add_constraint_from_goals(

src/goto-checker/goto_symex_fault_localizer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ goto_symex_fault_localizert::goto_symex_fault_localizert(
1515
const optionst &options,
1616
ui_message_handlert &ui_message_handler,
1717
const symex_target_equationt &equation,
18-
decision_procedure_incrementalt &solver)
18+
decision_procedure_assumptionst &solver)
1919
: options(options),
2020
ui_message_handler(ui_message_handler),
2121
equation(equation),

src/goto-checker/goto_symex_fault_localizer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Author: Peter Schrammel
1818

1919
#include <goto-symex/symex_target_equation.h>
2020

21-
#include <solvers/prop/decision_procedure_incremental.h>
21+
#include <solvers/prop/decision_procedure_assumptions.h>
2222

2323
#include "fault_localization_provider.h"
2424

@@ -29,15 +29,15 @@ class goto_symex_fault_localizert
2929
const optionst &options,
3030
ui_message_handlert &ui_message_handler,
3131
const symex_target_equationt &equation,
32-
decision_procedure_incrementalt &solver);
32+
decision_procedure_assumptionst &solver);
3333

3434
fault_location_infot operator()(const irep_idt &failed_property_id);
3535

3636
protected:
3737
const optionst &options;
3838
ui_message_handlert &ui_message_handler;
3939
const symex_target_equationt &equation;
40-
decision_procedure_incrementalt &solver;
40+
decision_procedure_assumptionst &solver;
4141

4242
/// A localization point is a goto instruction that is potentially at fault
4343
typedef std::map<literalt, fault_location_infot::score_mapt::iterator>

src/goto-checker/goto_symex_property_decider.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Author: Daniel Kroening, Peter Schrammel
1111

1212
#include "goto_symex_property_decider.h"
1313

14+
#include <solvers/prop/literal_expr.h>
15+
1416
goto_symex_property_decidert::goto_symex_property_decidert(
1517
const optionst &options,
1618
ui_message_handlert &ui_message_handler,
@@ -108,10 +110,9 @@ decision_proceduret::resultt goto_symex_property_decidert::solve()
108110
return (*decision_procedure)();
109111
}
110112

111-
decision_procedure_incrementalt &
112-
goto_symex_property_decidert::get_solver() const
113+
const solver_factoryt::solvert &goto_symex_property_decidert::get_solver() const
113114
{
114-
return *decision_procedure;
115+
return *solver;
115116
}
116117

117118
symex_target_equationt &goto_symex_property_decidert::get_equation() const

src/goto-checker/goto_symex_property_decider.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class goto_symex_property_decidert
4949
decision_proceduret::resultt solve();
5050

5151
/// Returns the solver instance
52-
decision_procedure_incrementalt &get_solver() const;
52+
const solver_factoryt::solvert &get_solver() const;
5353

5454
/// Return the equation associated with this instance
5555
symex_target_equationt &get_equation() const;

src/goto-checker/multi_path_symex_checker.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ multi_path_symex_checkert::prepare_property_decider(propertiest &properties)
7373
properties, equation, property_decider, ui_message_handler);
7474

7575
if(options.get_bool_option("localize-faults"))
76-
freeze_guards(equation, property_decider.get_solver());
76+
freeze_guards(
77+
equation, property_decider.get_solver().decision_procedure_incremental());
7778

7879
return solver_runtime;
7980
}
@@ -93,7 +94,7 @@ goto_tracet multi_path_symex_checkert::build_full_trace() const
9394
build_goto_trace(
9495
equation,
9596
equation.SSA_steps.end(),
96-
property_decider.get_solver(),
97+
property_decider.get_solver().decision_procedure(),
9798
ns,
9899
goto_trace);
99100

@@ -106,11 +107,17 @@ goto_tracet multi_path_symex_checkert::build_shortest_trace() const
106107
{
107108
// NOLINTNEXTLINE(whitespace/braces)
108109
counterexample_beautificationt{ui_message_handler}(
109-
dynamic_cast<boolbvt &>(property_decider.get_solver()), equation);
110+
dynamic_cast<boolbvt &>(
111+
property_decider.get_solver().decision_procedure()),
112+
equation);
110113
}
111114

112115
goto_tracet goto_trace;
113-
build_goto_trace(equation, property_decider.get_solver(), ns, goto_trace);
116+
build_goto_trace(
117+
equation,
118+
property_decider.get_solver().decision_procedure(),
119+
ns,
120+
goto_trace);
114121

115122
return goto_trace;
116123
}
@@ -122,7 +129,7 @@ multi_path_symex_checkert::build_trace(const irep_idt &property_id) const
122129
build_goto_trace(
123130
equation,
124131
ssa_step_matches_failing_property(property_id),
125-
property_decider.get_solver(),
132+
property_decider.get_solver().decision_procedure(),
126133
ns,
127134
goto_trace);
128135

@@ -149,7 +156,10 @@ fault_location_infot
149156
multi_path_symex_checkert::localize_fault(const irep_idt &property_id) const
150157
{
151158
goto_symex_fault_localizert fault_localizer(
152-
options, ui_message_handler, equation, property_decider.get_solver());
159+
options,
160+
ui_message_handler,
161+
equation,
162+
property_decider.get_solver().decision_procedure_assumptions());
153163

154164
return fault_localizer(property_id);
155165
}

src/goto-checker/single_path_symex_checker.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ goto_tracet single_path_symex_checkert::build_full_trace() const
122122
build_goto_trace(
123123
property_decider->get_equation(),
124124
property_decider->get_equation().SSA_steps.end(),
125-
property_decider->get_solver(),
125+
property_decider->get_solver().decision_procedure(),
126126
ns,
127127
goto_trace);
128128

@@ -135,14 +135,15 @@ goto_tracet single_path_symex_checkert::build_shortest_trace() const
135135
{
136136
// NOLINTNEXTLINE(whitespace/braces)
137137
counterexample_beautificationt{ui_message_handler}(
138-
dynamic_cast<boolbvt &>(property_decider->get_solver()),
138+
dynamic_cast<boolbvt &>(
139+
property_decider->get_solver().decision_procedure()),
139140
property_decider->get_equation());
140141
}
141142

142143
goto_tracet goto_trace;
143144
build_goto_trace(
144145
property_decider->get_equation(),
145-
property_decider->get_solver(),
146+
property_decider->get_solver().decision_procedure(),
146147
ns,
147148
goto_trace);
148149

@@ -156,7 +157,7 @@ single_path_symex_checkert::build_trace(const irep_idt &property_id) const
156157
build_goto_trace(
157158
property_decider->get_equation(),
158159
ssa_step_matches_failing_property(property_id),
159-
property_decider->get_solver(),
160+
property_decider->get_solver().decision_procedure(),
160161
ns,
161162
goto_trace);
162163

src/goto-checker/solver_factory.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,18 @@ solver_factoryt::solvert::decision_procedure_incremental() const
8080
return *solver;
8181
}
8282

83+
decision_procedure_assumptionst &
84+
solver_factoryt::solvert::decision_procedure_assumptions() const
85+
{
86+
PRECONDITION(decision_procedure_ptr != nullptr);
87+
decision_procedure_assumptionst *solver =
88+
dynamic_cast<decision_procedure_assumptionst *>(&*decision_procedure_ptr);
89+
INVARIANT(
90+
solver != nullptr,
91+
"incremental decision procedure with solving under assumptions required");
92+
return *solver;
93+
}
94+
8395
propt &solver_factoryt::solvert::prop() const
8496
{
8597
PRECONDITION(prop_ptr != nullptr);

src/goto-checker/solver_factory.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ Author: Daniel Kroening, Peter Schrammel
1414

1515
#include <memory>
1616

17+
#include <solvers/prop/decision_procedure.h>
18+
#include <solvers/prop/prop.h>
1719
#include <solvers/smt2/smt2_dec.h>
1820

1921
class message_handlert;
2022
class namespacet;
2123
class optionst;
22-
class propt;
23-
class decision_proceduret;
24+
class decision_procedure_incrementalt;
25+
class decision_procedure_assumptionst;
2426

2527
class solver_factoryt
2628
{
@@ -46,6 +48,7 @@ class solver_factoryt
4648

4749
decision_proceduret &decision_procedure() const;
4850
decision_procedure_incrementalt &decision_procedure_incremental() const;
51+
decision_procedure_assumptionst &decision_procedure_assumptions() const;
4952
propt &prop() const;
5053

5154
void set_decision_procedure(std::unique_ptr<decision_proceduret> p);

src/solvers/prop/cover_goals.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Author: Daniel Kroening, [email protected]
1212
#include "cover_goals.h"
1313

1414
#include <util/message.h>
15+
#include <util/threeval.h>
1516

1617
#include "decision_procedure_incremental.h"
1718
#include "literal_expr.h"
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*******************************************************************\
2+
3+
Module: Decision procedure with incremental solving under assumptions
4+
5+
Author: Peter Schrammel
6+
7+
\*******************************************************************/
8+
9+
/// \file
10+
/// Decision procedure with incremental solving under assumptions
11+
12+
#ifndef CPROVER_SOLVERS_PROP_DECISION_PROCEDURE_ASSUMPTIONS_H
13+
#define CPROVER_SOLVERS_PROP_DECISION_PROCEDURE_ASSUMPTIONS_H
14+
15+
#include "decision_procedure_incremental.h"
16+
17+
class decision_procedure_assumptionst : public decision_procedure_incrementalt
18+
{
19+
public:
20+
/// Set assumptions for the next call to operator() to solve the problem
21+
virtual void set_assumptions(const bvt &) = 0;
22+
23+
/// Returns true if an assumption is in the final conflict
24+
virtual bool is_in_conflict(literalt l) const = 0;
25+
26+
virtual ~decision_procedure_assumptionst() = default;
27+
};
28+
29+
#endif // CPROVER_SOLVERS_PROP_DECISION_PROCEDURE_ASSUMPTIONS_H

src/solvers/prop/decision_procedure_incremental.cpp

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,12 @@
11
/*******************************************************************\
22
3-
Module:
3+
Module: Decision procedure with incremental solving
44
55
Author: Daniel Kroening, [email protected]
66
77
\*******************************************************************/
88

99
#include "decision_procedure_incremental.h"
10-
#include <algorithm>
11-
12-
/// determine whether a variable is in the final conflict
13-
bool decision_procedure_incrementalt::is_in_conflict(literalt) const
14-
{
15-
UNREACHABLE;
16-
return false;
17-
}
18-
19-
void decision_procedure_incrementalt::set_assumptions(const bvt &)
20-
{
21-
UNREACHABLE;
22-
}
23-
24-
void decision_procedure_incrementalt::set_frozen(const literalt)
25-
{
26-
UNREACHABLE;
27-
}
2810

2911
void decision_procedure_incrementalt::set_frozen(const bvt &bv)
3012
{
Lines changed: 17 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,36 @@
11
/*******************************************************************\
22
3-
Module:
3+
Module: Decision procedure with incremental solving
44
55
Author: Daniel Kroening, [email protected]
66
77
\*******************************************************************/
88

9+
/// \file
10+
/// Decision procedure with incremental solving
11+
912
#ifndef CPROVER_SOLVERS_PROP_DECISION_PROCEDURE_INCREMENTAL_H
1013
#define CPROVER_SOLVERS_PROP_DECISION_PROCEDURE_INCREMENTAL_H
1114

12-
#include <map>
13-
#include <string>
14-
15-
#include <util/expr.h>
16-
#include <util/message.h>
17-
#include <util/std_expr.h>
18-
1915
#include "decision_procedure.h"
2016
#include "literal.h"
21-
#include "literal_expr.h"
22-
#include "prop.h"
23-
24-
// API that provides a "handle" in the form of a literalt
25-
// for expressions.
2617

2718
class decision_procedure_incrementalt : public decision_proceduret
2819
{
2920
public:
30-
virtual ~decision_procedure_incrementalt()
31-
{
32-
}
33-
34-
using decision_proceduret::operator();
35-
36-
// incremental solving
37-
virtual void set_frozen(literalt a);
38-
virtual void set_frozen(const bvt &);
39-
virtual void set_assumptions(const bvt &_assumptions);
40-
virtual bool has_set_assumptions() const
41-
{
42-
return false;
43-
}
44-
virtual void set_all_frozen()
45-
{
46-
}
47-
48-
// returns true if an assumption is in the final conflict
49-
virtual bool is_in_conflict(literalt l) const;
50-
virtual bool has_is_in_conflict() const
51-
{
52-
return false;
53-
}
54-
};
21+
/// Prevent the solver-level variable associated with literal \p a from being
22+
/// optimized away by the decision procedure
23+
virtual void set_frozen(literalt a) = 0;
24+
25+
/// Prevent the solver-level variables in the given bitvector \p bv from being
26+
/// optimized away by the decision procedure
27+
virtual void set_frozen(const bvt &bv);
5528

56-
//
57-
// an instance of the above that converts the
58-
// propositional skeleton by passing it to a propt
59-
//
29+
/// Prevent all solver-level variables encoding symbols occurring in the
30+
/// expressions passed to the decision procedure from being optimized away
31+
virtual void set_all_frozen() = 0;
32+
33+
virtual ~decision_procedure_incrementalt() = default;
34+
};
6035

6136
#endif // CPROVER_SOLVERS_PROP_DECISION_PROCEDURE_INCREMENTAL_H

0 commit comments

Comments
 (0)