@@ -32,13 +32,26 @@ class sat_tactic : public tactic {
32
32
sat2goal m_sat2goal;
33
33
scoped_ptr<sat::solver> m_solver;
34
34
params_ref m_params;
35
+ vector<std::pair<expr_ref, expr_ref>>& m_var2value;
35
36
36
- imp (ast_manager & _m, params_ref const & p):
37
+ imp (ast_manager & _m, params_ref const & p, vector<std::pair<expr_ref, expr_ref>>& var2value ):
37
38
m (_m),
38
39
m_solver (alloc(sat::solver, p, m.limit())),
39
- m_params (p) {
40
+ m_params (p),
41
+ m_var2value (var2value) {
40
42
updt_params (p);
41
43
}
44
+
45
+ void initialize_values (goal_ref const & g, atom2bool_var& map) {
46
+ g->mc ()->convert_initialize_value (m_var2value);
47
+ for (auto & [var, value] : m_var2value) {
48
+ if (!m.is_bool (var))
49
+ continue ;
50
+ sat::bool_var b = map.to_bool_var (var);
51
+ if (b != sat::null_bool_var)
52
+ m_solver->set_phase (sat::literal (b, m.is_false (value)));
53
+ }
54
+ }
42
55
43
56
void operator ()(goal_ref const & g,
44
57
goal_ref_buffer & result) {
@@ -66,6 +79,8 @@ class sat_tactic : public tactic {
66
79
g->reset ();
67
80
g->m ().compact_memory ();
68
81
82
+ initialize_values (g, map);
83
+
69
84
CASSERT (" sat_solver" , m_solver->check_invariant ());
70
85
IF_VERBOSE (TACTIC_VERBOSITY_LVL, m_solver->display_status (verbose_stream ()););
71
86
TRACE (" sat_dimacs" , m_solver->display_dimacs (tout););
@@ -184,11 +199,14 @@ class sat_tactic : public tactic {
184
199
imp * m_imp;
185
200
params_ref m_params;
186
201
statistics m_stats;
202
+ ast_manager& m;
203
+ vector<std::pair<expr_ref, expr_ref>> m_var2value;
187
204
188
205
public:
189
206
sat_tactic (ast_manager & m, params_ref const & p):
190
207
m_imp (nullptr ),
191
- m_params (p) {
208
+ m_params (p),
209
+ m (m) {
192
210
sat_params p1 (p);
193
211
}
194
212
@@ -215,7 +233,7 @@ class sat_tactic : public tactic {
215
233
216
234
void operator ()(goal_ref const & g,
217
235
goal_ref_buffer & result) override {
218
- imp proc (g->m (), m_params);
236
+ imp proc (g->m (), m_params, m_var2value );
219
237
scoped_set_imp set (this , &proc);
220
238
try {
221
239
proc (g, result);
@@ -247,7 +265,8 @@ class sat_tactic : public tactic {
247
265
}
248
266
249
267
void user_propagate_initialize_value (expr* var, expr* value) override {
250
-
268
+ verbose_stream () << " initialize-value\n " ;
269
+ m_var2value.push_back ({ expr_ref (var, m), expr_ref (value, m) });
251
270
}
252
271
253
272
0 commit comments