@@ -45,35 +45,35 @@ using namespace qe;
45
45
namespace {
46
46
// rewrite select(store(a, i, k), j) into k if m \models i = j and select(a, j) if m \models i != j
47
47
struct rd_over_wr_rewriter : public default_rewriter_cfg {
48
- ast_manager &m;
49
- array_util m_arr;
50
- model_evaluator m_eval;
51
- expr_ref_vector m_sc;
52
-
53
- rd_over_wr_rewriter (ast_manager& man, model& mdl): m(man), m_arr(m), m_eval(mdl), m_sc(m) {
54
- m_eval.set_model_completion (false );
55
- }
56
-
57
- br_status reduce_app (func_decl *f, unsigned num, expr *const *args,
58
- expr_ref &result, proof_ref &result_pr) {
59
- if (m_arr.is_select (f) && m_arr.is_store (args[0 ])) {
60
- expr_ref ind1 (m), ind2 (m);
61
- ind1 = m_eval (args[1 ]);
62
- ind2 = m_eval (to_app (args[0 ])->get_arg (1 ));
63
- if (ind1 == ind2) {
64
- result = to_app (args[0 ])->get_arg (2 );
65
- m_sc.push_back (m.mk_eq (args[1 ], to_app (args[0 ])->get_arg (1 )));
66
- return BR_DONE;
67
- }
68
- m_sc.push_back (m.mk_not (m.mk_eq (args[1 ], to_app (args[0 ])->get_arg (1 ))));
69
- expr_ref_vector new_args (m);
70
- new_args.push_back (to_app (args[0 ])->get_arg (0 ));
71
- new_args.push_back (args[1 ]);
72
- result = m_arr.mk_select (new_args);
73
- return BR_REWRITE1;
48
+ ast_manager &m;
49
+ array_util m_arr;
50
+ model_evaluator m_eval;
51
+ expr_ref_vector m_sc;
52
+
53
+ rd_over_wr_rewriter (ast_manager& man, model& mdl): m(man), m_arr(m), m_eval(mdl), m_sc(m) {
54
+ m_eval.set_model_completion (false );
55
+ }
56
+
57
+ br_status reduce_app (func_decl *f, unsigned num, expr *const *args,
58
+ expr_ref &result, proof_ref &result_pr) {
59
+ if (m_arr.is_select (f) && m_arr.is_store (args[0 ])) {
60
+ expr_ref ind1 (m), ind2 (m);
61
+ ind1 = m_eval (args[1 ]);
62
+ ind2 = m_eval (to_app (args[0 ])->get_arg (1 ));
63
+ if (ind1 == ind2) {
64
+ result = to_app (args[0 ])->get_arg (2 );
65
+ m_sc.push_back (m.mk_eq (args[1 ], to_app (args[0 ])->get_arg (1 )));
66
+ return BR_DONE;
74
67
}
75
- return BR_FAILED;
68
+ m_sc.push_back (m.mk_not (m.mk_eq (args[1 ], to_app (args[0 ])->get_arg (1 ))));
69
+ expr_ref_vector new_args (m);
70
+ new_args.push_back (to_app (args[0 ])->get_arg (0 ));
71
+ new_args.push_back (args[1 ]);
72
+ result = m_arr.mk_select (new_args);
73
+ return BR_REWRITE1;
76
74
}
75
+ return BR_FAILED;
76
+ }
77
77
};
78
78
// rewrite all occurrences of (as const arr c) to (as const arr v) where v = m_eval(c)
79
79
struct app_const_arr_rewriter : public default_rewriter_cfg {
@@ -123,6 +123,11 @@ namespace {
123
123
}
124
124
};
125
125
}
126
+
127
+ template class rewriter_tpl <app_const_arr_rewriter>;
128
+ template class rewriter_tpl <rd_over_wr_rewriter>;
129
+
130
+
126
131
void rewrite_as_const_arr (expr* in, model& mdl, expr_ref& out) {
127
132
app_const_arr_rewriter cfg (out.m (), mdl);
128
133
rewriter_tpl<app_const_arr_rewriter> rw (out.m (), false , cfg);
@@ -675,6 +680,8 @@ class mbproj::impl {
675
680
vars.reset ();
676
681
vars.append (other_vars);
677
682
}
683
+
684
+
678
685
};
679
686
680
687
mbproj::mbproj (ast_manager& m, params_ref const & p) {
@@ -715,5 +722,4 @@ opt::inf_eps mbproj::maximize(expr_ref_vector const& fmls, model& mdl, app* t, e
715
722
scoped_no_proof _sp (fmls.get_manager ());
716
723
return m_impl->maximize (fmls, mdl, t, ge, gt);
717
724
}
718
- template class rewriter_tpl <app_const_arr_rewriter>;
719
- template class rewriter_tpl <rd_over_wr_rewriter>;
725
+
0 commit comments