@@ -649,13 +649,13 @@ namespace nlsat {
649
649
}
650
650
651
651
bool_var mk_root_atom (atom::kind k, var x, unsigned i, poly * p) {
652
- SASSERT (i > 0 );
653
- SASSERT (x >= max_var (p));
654
- SASSERT (k == atom::ROOT_LT || k == atom::ROOT_GT || k == atom::ROOT_EQ || k == atom::ROOT_LE || k == atom::ROOT_GE);
655
652
polynomial_ref p1 (m_pm), uniq_p (m_pm);
656
653
p1 = m_pm.flip_sign_if_lm_neg (p); // flipping the sign of the polynomial will not change its roots.
657
654
uniq_p = m_cache.mk_unique (p1);
658
- TRACE (" nlsat_solver" , tout << p1 << " " << uniq_p << " \n " ;);
655
+ TRACE (" nlsat_solver" , tout << x << " " << p1 << " " << uniq_p << " \n " ;);
656
+ SASSERT (i > 0 );
657
+ SASSERT (x >= max_var (p));
658
+ SASSERT (k == atom::ROOT_LT || k == atom::ROOT_GT || k == atom::ROOT_EQ || k == atom::ROOT_LE || k == atom::ROOT_GE);
659
659
660
660
void * mem = m_allocator.allocate (sizeof (root_atom));
661
661
root_atom * new_atom = new (mem) root_atom (k, x, i, uniq_p);
@@ -804,7 +804,11 @@ namespace nlsat {
804
804
}
805
805
else if (a->is_root_atom ()) {
806
806
root_atom& r = *to_root_atom (a);
807
- bv = checker.mk_root_atom (r.get_kind (), r.x (), r.i (), r.p ());
807
+ if (r.x () >= max_var (r.p ())) {
808
+ // permutation may be reverted after check completes,
809
+ // but then root atoms are not used in lemmas.
810
+ bv = checker.mk_root_atom (r.get_kind (), r.x (), r.i (), r.p ());
811
+ }
808
812
}
809
813
else {
810
814
UNREACHABLE ();
0 commit comments