Skip to content

Commit 11f6e8d

Browse files
committed
new decision_proceduret API
This changes the API offered by decision_proceduret to solving under assumptions. Solving under assumptions has been popularised by MiniSat, and is a state-less alternative to context stacks. This change mimics the transition from check-sat to check-sat-assuming that SMT-LIB is undergoing.
1 parent a010865 commit 11f6e8d

17 files changed

+118
-28
lines changed

src/solvers/decision_procedure.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,21 @@ Author: Daniel Kroening, [email protected]
1111

1212
#include "decision_procedure.h"
1313

14+
#include <util/std_expr.h>
15+
1416
decision_proceduret::~decision_proceduret()
1517
{
1618
}
1719

1820
decision_proceduret::resultt decision_proceduret::operator()()
1921
{
20-
return dec_solve();
22+
return dec_solve(nil_exprt());
23+
}
24+
25+
decision_proceduret::resultt
26+
decision_proceduret::operator()(const exprt &assumption)
27+
{
28+
return dec_solve(assumption);
2129
}
2230

2331
void decision_proceduret::set_to_true(const exprt &expr)

src/solvers/decision_procedure.h

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,19 @@ Author: Daniel Kroening, [email protected]
1717

1818
class exprt;
1919

20+
/// An interface for a decision procedure for satisfiability problems.
2021
class decision_proceduret
2122
{
2223
public:
2324
/// For a Boolean expression \p expr, add the constraint 'expr' if \p value
2425
/// is `true`, otherwise add 'not expr'
25-
virtual void set_to(const exprt &expr, bool value) = 0;
26+
virtual void set_to(const exprt &, bool value) = 0;
2627

2728
/// For a Boolean expression \p expr, add the constraint 'expr'
28-
void set_to_true(const exprt &expr);
29+
void set_to_true(const exprt &);
2930

3031
/// For a Boolean expression \p expr, add the constraint 'not expr'
31-
void set_to_false(const exprt &expr);
32+
void set_to_false(const exprt &);
3233

3334
/// Generate a handle, which is an expression that
3435
/// has the same value as the argument in any model
@@ -37,7 +38,7 @@ class decision_proceduret
3738
/// \ref set_to.
3839
/// The returned expression may be the expression itself or a more compact
3940
/// but solver-specific representation.
40-
virtual exprt handle(const exprt &expr) = 0;
41+
virtual exprt handle(const exprt &) = 0;
4142

4243
/// Result of running the decision procedure
4344
enum class resultt
@@ -48,12 +49,18 @@ class decision_proceduret
4849
};
4950

5051
/// Run the decision procedure to solve the problem
52+
/// This corresponds to SMT-LIB's check-sat.
5153
resultt operator()();
5254

55+
/// Run the decision procedure to solve the problem under
56+
/// the given assumption.
57+
/// This corresponds to SMT-LIB's check-sat-assuming.
58+
resultt operator()(const exprt &assumption);
59+
5360
/// Return \p expr with variables replaced by values from satisfying
5461
/// assignment if available.
5562
/// Return `nil` if not available
56-
virtual exprt get(const exprt &expr) const = 0;
63+
virtual exprt get(const exprt &) const = 0;
5764

5865
/// Print satisfying assignment to \p out
5966
virtual void print_assignment(std::ostream &out) const = 0;
@@ -67,8 +74,8 @@ class decision_proceduret
6774
virtual ~decision_proceduret();
6875

6976
protected:
70-
/// Run the decision procedure to solve the problem
71-
virtual resultt dec_solve() = 0;
77+
/// Implementation of the decision procedure.
78+
virtual resultt dec_solve(const exprt &assumption) = 0;
7279
};
7380

7481
/// Add Boolean constraint \p src to decision procedure \p dest

src/solvers/prop/prop_conv_solver.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,8 @@ void prop_conv_solvert::finish_eager_conversion()
439439
{
440440
}
441441

442-
decision_proceduret::resultt prop_conv_solvert::dec_solve()
442+
decision_proceduret::resultt
443+
prop_conv_solvert::dec_solve(const exprt &assumption)
443444
{
444445
// post-processing isn't incremental yet
445446
if(!post_processing_done)
@@ -459,7 +460,16 @@ decision_proceduret::resultt prop_conv_solvert::dec_solve()
459460

460461
log.statistics() << "Solving with " << prop.solver_text() << messaget::eom;
461462

462-
switch(prop.prop_solve())
463+
if(assumption.is_nil())
464+
push();
465+
else
466+
push({literal_exprt(convert(assumption))});
467+
468+
auto prop_result = prop.prop_solve();
469+
470+
pop();
471+
472+
switch(prop_result)
463473
{
464474
case propt::resultt::P_SATISFIABLE:
465475
return resultt::D_SATISFIABLE;

src/solvers/prop/prop_conv_solver.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class prop_conv_solvert : public conflict_providert,
4040
virtual void finish_eager_conversion();
4141

4242
// overloading from decision_proceduret
43-
decision_proceduret::resultt dec_solve() override;
43+
decision_proceduret::resultt dec_solve(const exprt &) override;
4444
void print_assignment(std::ostream &out) const override;
4545
std::string decision_procedure_text() const override;
4646
exprt get(const exprt &expr) const override;

src/solvers/refinement/bv_refinement.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class bv_refinementt:public bv_pointerst
3939

4040
explicit bv_refinementt(const infot &info);
4141

42-
decision_proceduret::resultt dec_solve() override;
42+
decision_proceduret::resultt dec_solve(const exprt &) override;
4343

4444
std::string decision_procedure_text() const override
4545
{

src/solvers/refinement/bv_refinement_loop.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ bv_refinementt::bv_refinementt(const infot &info)
2121
PRECONDITION(prop.has_is_in_conflict());
2222
}
2323

24-
decision_proceduret::resultt bv_refinementt::dec_solve()
24+
decision_proceduret::resultt bv_refinementt::dec_solve(const exprt &assumption)
2525
{
2626
// do the usual post-processing
2727
log.status() << "BV-Refinement: post-processing" << messaget::eom;

src/solvers/smt2/smt2_conv.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,9 +317,17 @@ void smt2_convt::define_object_size(
317317
}
318318
}
319319

320-
decision_proceduret::resultt smt2_convt::dec_solve()
320+
decision_proceduret::resultt smt2_convt::dec_solve(const exprt &assumption)
321321
{
322-
write_footer();
322+
if(assumption.is_nil())
323+
write_footer();
324+
else
325+
{
326+
assumptions.push_back(literal_exprt(convert(assumption)));
327+
write_footer();
328+
assumptions.pop_back();
329+
}
330+
323331
out.flush();
324332
return decision_proceduret::resultt::D_ERROR;
325333
}

src/solvers/smt2/smt2_conv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class smt2_convt : public stack_decision_proceduret
106106

107107
std::size_t number_of_solver_calls = 0;
108108

109-
resultt dec_solve() override;
109+
resultt dec_solve(const exprt &) override;
110110

111111
void write_header();
112112
/// Writes the end of the SMT file to the `smt_convt::out` stream. These parts

src/solvers/smt2/smt2_dec.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ std::string smt2_dect::decision_procedure_text() const
3333
// clang-format on
3434
}
3535

36-
decision_proceduret::resultt smt2_dect::dec_solve()
36+
decision_proceduret::resultt smt2_dect::dec_solve(const exprt &assumption)
3737
{
3838
++number_of_solver_calls;
3939

src/solvers/smt2/smt2_dec.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ class smt2_dect : protected smt2_stringstreamt, public smt2_convt
3939
{
4040
}
4141

42-
resultt dec_solve() override;
4342
std::string decision_procedure_text() const override;
4443

4544
protected:
4645
message_handlert &message_handler;
46+
resultt dec_solve(const exprt &) override;
4747

4848
/// Everything except the footer is cached, so that output files can be
4949
/// rewritten with varying footers.

0 commit comments

Comments
 (0)