Skip to content

Commit 1de02f5

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

21 files changed

+150
-118
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: 9 additions & 6 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);
@@ -77,11 +80,11 @@ class solver_factoryt
7780

7881
smt2_dect::solvert get_smt2_solver_type() const;
7982

80-
/// Sets the timeout of \p decision_procedure if the `solver-time-limit`
81-
/// option has a positive value (in seconds).
83+
/// Sets the timeout of \p decision_procedure if the `solver-time-limit` option
84+
/// has a positive value (in seconds).
8285
/// \note Most solvers silently ignore the time limit at the moment.
83-
void set_decision_procedure_time_limit(
84-
decision_proceduret &decision_procedure);
86+
void
87+
set_decision_procedure_time_limit(decision_proceduret &decision_procedure);
8588

8689
// consistency checks during solver creation
8790
void no_beautification();

src/solvers/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ SRC = $(BOOLEFORCE_SRC) \
145145
prop/bdd_expr.cpp \
146146
prop/cover_goals.cpp \
147147
prop/decision_procedure.cpp \
148+
prop/decision_procedure_assumptions.cpp \
148149
prop/decision_procedure_incremental.cpp \
149150
prop/literal.cpp \
150151
prop/prop_minimize.cpp \

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: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*******************************************************************\
2+
3+
Module: Decision procedure with incremental solving under assumptions
4+
5+
Author: Peter Schrammel
6+
7+
\*******************************************************************/
8+
9+
#include "decision_procedure_assumptions.h"
10+
11+
void decision_procedure_assumptionst::set_assumptions(const bvt &)
12+
{
13+
UNREACHABLE;
14+
}
15+
16+
bool decision_procedure_assumptionst::is_in_conflict(literalt) const
17+
{
18+
UNREACHABLE;
19+
return false;
20+
}
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 &);
22+
23+
/// Returns true if an assumption is in the final conflict
24+
virtual bool is_in_conflict(literalt l) const;
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
{

0 commit comments

Comments
 (0)