@@ -2070,7 +2070,8 @@ namespace spacer_qe {
2070
2070
* update sub with val consts for sel terms
2071
2071
*/
2072
2072
void ackermann (ptr_vector<app> const & sel_terms) {
2073
- if (sel_terms.empty ()) return ;
2073
+ if (sel_terms.empty ())
2074
+ return ;
2074
2075
2075
2076
expr* v = sel_terms.get (0 )->get_arg (0 ); // array variable
2076
2077
sort* v_sort = v->get_sort ();
@@ -2118,10 +2119,19 @@ namespace spacer_qe {
2118
2119
// sort reprs by their value and add a chain of strict inequalities
2119
2120
2120
2121
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
+ }
2122
2134
2123
- SASSERT ((m_ari_u.is_real (idx_sort) || m_ari_u.is_int (idx_sort))
2124
- && " Unsupported index sort: neither real nor int" );
2125
2135
2126
2136
// using insertion sort
2127
2137
unsigned end = start + num_reprs;
@@ -2173,13 +2183,11 @@ namespace spacer_qe {
2173
2183
collect_selects (fml);
2174
2184
2175
2185
// 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) {
2179
2187
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);
2183
2191
}
2184
2192
2185
2193
TRACE (" qe" ,
0 commit comments