@@ -339,22 +339,32 @@ namespace smt {
339
339
template <typename Ext>
340
340
theory_var theory_arith<Ext>::internalize_mul(app * m) {
341
341
rational _val;
342
+ TRACE (" arith" , tout << mk_pp (m, get_manager ()) << " \n " ;);
342
343
SASSERT (m_util.is_mul (m));
343
- SASSERT (!m_util.is_numeral (m->get_arg (1 )));
344
- if (m_util.is_numeral (m->get_arg (0 ), _val)) {
344
+ expr* arg0 = m->get_arg (0 );
345
+ expr* arg1 = m->get_arg (1 );
346
+ if (m_util.is_numeral (arg1)) {
347
+ std::swap (arg0, arg1);
348
+ }
349
+ SASSERT (!m_util.is_numeral (arg1));
350
+ if (m_util.is_numeral (arg0, _val)) {
345
351
SASSERT (m->get_num_args () == 2 );
346
352
numeral val (_val);
353
+ if (_val.is_zero ()) {
354
+ return internalize_numeral (m, val);
355
+ }
356
+ SASSERT (!val.is_zero ());
347
357
SASSERT (!val.is_one ());
348
358
unsigned r_id = mk_row ();
349
359
scoped_row_vars _sc (m_row_vars, m_row_vars_top);
350
- if (is_var (m-> get_arg ( 1 ) )) {
360
+ if (is_var (arg1 )) {
351
361
std::ostringstream strm;
352
362
strm << mk_pp (m, get_manager ()) << " contains a free variable" ;
353
363
throw default_exception (strm.str ());
354
364
}
355
365
if (reflection_enabled ())
356
- internalize_term_core (to_app (m-> get_arg ( 0 ) ));
357
- theory_var v = internalize_mul_core (to_app (m-> get_arg ( 1 ) ));
366
+ internalize_term_core (to_app (arg0 ));
367
+ theory_var v = internalize_mul_core (to_app (arg1 ));
358
368
add_row_entry<true >(r_id, val, v);
359
369
enode * e = mk_enode (m);
360
370
theory_var s = mk_var (e);
0 commit comments