@@ -16,14 +16,14 @@ Author: Daniel Kroening, kroening@kroening.com
1616#include < util/message.h>
1717#include < util/std_expr.h>
1818
19- #include " decision_procedure_assumptions .h"
19+ #include " decision_procedure_contexts .h"
2020#include " literal.h"
2121#include " literal_expr.h"
2222#include " prop.h"
2323#include " solver_conflicts.h"
2424#include " solver_resource_limits.h"
2525
26- class prop_conv_solvert : public decision_procedure_assumptionst ,
26+ class prop_conv_solvert : public decision_procedure_contextst ,
2727 public solver_conflictst,
2828 public solver_resource_limitst
2929{
@@ -36,7 +36,6 @@ class prop_conv_solvert : public decision_procedure_assumptionst,
3636 virtual ~prop_conv_solvert () = default ;
3737
3838 // overloading from decision_proceduret
39- void set_to (const exprt &expr, bool value) override ;
4039 decision_proceduret::resultt dec_solve () override ;
4140 void print_assignment (std::ostream &out) const override ;
4241 std::string decision_procedure_text () const override
@@ -55,10 +54,7 @@ class prop_conv_solvert : public decision_procedure_assumptionst,
5554 {
5655 prop.set_frozen (a);
5756 }
58- void set_assumptions (const bvt &_assumptions) override
59- {
60- prop.set_assumptions (_assumptions);
61- }
57+
6258 void set_all_frozen () override
6359 {
6460 freeze_all = true ;
@@ -69,6 +65,26 @@ class prop_conv_solvert : public decision_procedure_assumptionst,
6965 return prop.is_in_conflict (l);
7066 }
7167
68+ // / For a Boolean expression \p expr, add the constraint
69+ // / 'current_context => expr' if \p value is `true`,
70+ // / otherwise add 'current_context => not expr'
71+ void set_to (const exprt &expr, bool value) override ;
72+
73+ // / Set \p assumptions within current context.
74+ // / These assumptions can be removed by passing empty \p assumptions.
75+ // / These assumptions will also be dropped in the course of any context
76+ // / operation (`push_context` or `pop_context`).
77+ void set_assumptions (const bvt &assumptions) override ;
78+
79+ // / Push a new context on the stack
80+ // / This context becomes a child context nested in the current context.
81+ void push_context () override ;
82+
83+ // / Pop the current context
84+ void pop_context () override ;
85+
86+ static const char *context_prefix;
87+
7288 // get literal for expression, if available
7389 bool literal (const symbol_exprt &expr, literalt &literal) const ;
7490
@@ -123,10 +139,18 @@ class prop_conv_solvert : public decision_procedure_assumptionst,
123139
124140 virtual void ignoring (const exprt &expr);
125141
126- // deliberately protected now to protect lower-level API
142+ // / Actually adds the constraints to `prop`
143+ void do_set_to (const exprt &expr, bool value);
144+
127145 propt ∝
128146
129147 messaget log;
148+
149+ // / Context literals used as assumptions
150+ bvt context_literals;
151+
152+ // / Unique context literal names
153+ std::size_t context_literal_counter = 0 ;
130154};
131155
132156#endif // CPROVER_SOLVERS_PROP_PROP_CONV_SOLVER_H
0 commit comments