145{
146
147
148 auto coef = x.get_coef();
149 auto dict = x.get_dict();
150
151 bool can_be_true = true;
152 bool can_be_false = true;
153 if (coef->is_positive()) {
154 can_be_false = false;
155 } else if (coef->is_negative()) {
156 can_be_true = false;
157 }
158 NegativeVisitor neg_visitor(assumptions_);
159 for (const auto &p : dict) {
160 if (not can_be_true and not can_be_false) {
161 is_positive_ = tribool::indeterminate;
162 return;
163 }
164 p.first->accept(*this);
165 if ((p.second->is_positive() and is_true(is_positive_))
166 or (p.second->is_negative()
167 and is_true(neg_visitor.apply(*p.first)))) {
168
169 can_be_false = false;
170 } else if ((p.second->is_negative() and is_true(is_positive_))
171 or (p.second->is_positive()
172 and is_true(neg_visitor.apply(*p.first)))) {
173
174 can_be_true = false;
175 } else {
176 can_be_true = false;
177 can_be_false = false;
178 }
179 }
180 if (can_be_true) {
181 is_positive_ = tribool::tritrue;
182 } else if (can_be_false) {
183 is_positive_ = tribool::trifalse;
184 } else {
185 is_positive_ = tribool::indeterminate;
186 }
187}