16
16
#include < util/message.h>
17
17
#include < util/std_expr.h>
18
18
19
- #include " decision_procedure_assumptions .h"
19
+ #include " decision_procedure_contexts .h"
20
20
#include " literal.h"
21
21
#include " literal_expr.h"
22
22
#include " prop.h"
23
23
#include " solver_conflicts.h"
24
24
#include " solver_resource_limits.h"
25
25
26
- class prop_conv_solvert : public decision_procedure_assumptionst ,
26
+ class prop_conv_solvert : public decision_procedure_contextst ,
27
27
public solver_conflictst,
28
28
public solver_resource_limitst
29
29
{
@@ -36,7 +36,6 @@ class prop_conv_solvert : public decision_procedure_assumptionst,
36
36
virtual ~prop_conv_solvert () = default ;
37
37
38
38
// overloading from decision_proceduret
39
- void set_to (const exprt &expr, bool value) override ;
40
39
decision_proceduret::resultt dec_solve () override ;
41
40
void print_assignment (std::ostream &out) const override ;
42
41
std::string decision_procedure_text () const override
@@ -55,10 +54,7 @@ class prop_conv_solvert : public decision_procedure_assumptionst,
55
54
{
56
55
prop.set_frozen (a);
57
56
}
58
- void set_assumptions (const bvt &_assumptions) override
59
- {
60
- prop.set_assumptions (_assumptions);
61
- }
57
+
62
58
void set_all_frozen () override
63
59
{
64
60
freeze_all = true ;
@@ -69,6 +65,26 @@ class prop_conv_solvert : public decision_procedure_assumptionst,
69
65
return prop.is_in_conflict (l);
70
66
}
71
67
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
+
72
88
// get literal for expression, if available
73
89
bool literal (const symbol_exprt &expr, literalt &literal) const ;
74
90
@@ -123,10 +139,18 @@ class prop_conv_solvert : public decision_procedure_assumptionst,
123
139
124
140
virtual void ignoring (const exprt &expr);
125
141
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
+
127
145
propt ∝
128
146
129
147
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 ;
130
154
};
131
155
132
156
#endif // CPROVER_SOLVERS_PROP_PROP_CONV_SOLVER_H
0 commit comments