Skip to content

Commit 9ea921b

Browse files
update spacer projection for arrays to allow ackerman reduction for non-integer arrays
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
1 parent e920291 commit 9ea921b

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

src/muz/spacer/spacer_qe_project.cpp

+18-10
Original file line numberDiff line numberDiff line change
@@ -2070,7 +2070,8 @@ namespace spacer_qe {
20702070
* update sub with val consts for sel terms
20712071
*/
20722072
void ackermann (ptr_vector<app> const& sel_terms) {
2073-
if (sel_terms.empty ()) return;
2073+
if (sel_terms.empty ())
2074+
return;
20742075

20752076
expr* v = sel_terms.get (0)->get_arg (0); // array variable
20762077
sort* v_sort = v->get_sort ();
@@ -2118,10 +2119,19 @@ namespace spacer_qe {
21182119
// sort reprs by their value and add a chain of strict inequalities
21192120

21202121
unsigned num_reprs = m_idx_reprs.size () - start;
2121-
if (num_reprs == 0) return;
2122+
if (num_reprs == 0)
2123+
return;
2124+
2125+
if (!m_ari_u.is_real(idx_sort) && !m_ari_u.is_int(idx_sort)) {
2126+
expr_ref_vector args(m);
2127+
for (unsigned i = start; i < m_idx_reprs.size(); ++i)
2128+
args.push_back(m_idx_reprs.get(i));
2129+
for (unsigned i = 0; i < args.size(); ++i)
2130+
for (unsigned j = i + 1; j < args.size(); ++j)
2131+
m_idx_lits.push_back(m.mk_not(m.mk_eq(args.get(i), args.get(j))));
2132+
return;
2133+
}
21222134

2123-
SASSERT ((m_ari_u.is_real (idx_sort) || m_ari_u.is_int (idx_sort))
2124-
&& "Unsupported index sort: neither real nor int");
21252135

21262136
// using insertion sort
21272137
unsigned end = start + num_reprs;
@@ -2173,13 +2183,11 @@ namespace spacer_qe {
21732183
collect_selects (fml);
21742184

21752185
// model based ackermannization
2176-
sel_map::iterator begin = m_sel_terms.begin (),
2177-
end = m_sel_terms.end ();
2178-
for (sel_map::iterator it = begin; it != end; it++) {
2186+
for (auto const& [key, value] : m_sel_terms) {
21792187
TRACE ("qe",
2180-
tout << "ackermann for var: " << mk_pp (it->m_key, m) << "\n";
2181-
);
2182-
ackermann (*(it->m_value));
2188+
tout << "ackermann for var: " << mk_pp (key, m) << "\n";
2189+
);
2190+
ackermann (*value);
21832191
}
21842192

21852193
TRACE ("qe",

0 commit comments

Comments
 (0)