@@ -212,24 +212,8 @@ bool order::order_lemma_on_ac_and_bc(const monic& rm_ac,
212
212
// We try to find a monic n = cd, such that |b| = |d|
213
213
// and get a lemma m R n & |b| = |d| => ab/|b| R cd /|d|, where R is a relation
214
214
void order::order_lemma_on_factorization (const monic& m, const factorization& ab) {
215
- bool sign = m.rsign ();
216
- for (factor f: ab)
217
- sign ^= _ ().canonize_sign (f);
218
- const rational rsign = sign_to_rat (sign);
219
- const rational fv = val (var (ab[0 ])) * val (var (ab[1 ]));
220
- const rational mv = rsign * var_val (m);
221
- TRACE (" nla_solver" ,
222
- tout << " ab.size()=" << ab.size () << " \n " ;
223
- tout << " we should have sign*var_val(m):" << mv << " =(" << rsign << " )*(" << var_val (m) <<" ) to be equal to " << " val(var(ab[0]))*val(var(ab[1])):" << fv << " \n " ;);
224
- if (mv == fv)
225
- return ;
226
- bool gt = mv > fv;
227
- SASSERT (mv != fv);
228
215
TRACE (" nla_solver" , tout << " m=" ; _ ().print_monic_with_vars (m, tout); tout << " \n factorization=" ; _ ().print_factorization (ab, tout););
229
216
for (unsigned j = 0 , k = 1 ; j < 2 ; j++, k--) {
230
- order_lemma_on_ab (m, rsign, var (ab[k]), var (ab[j]), gt);
231
- explain (ab); explain (m);
232
- TRACE (" nla_solver" , _ ().print_lemma (tout););
233
217
order_lemma_on_ac_explore (m, ab, j == 1 );
234
218
}
235
219
}
@@ -332,67 +316,5 @@ bool order::order_lemma_on_ac_and_bc_and_factors(const monic& ac,
332
316
}
333
317
return false ;
334
318
}
335
- /* *
336
- \brief Add lemma:
337
- a > 0 & b <= value(b) => sign*ab <= value(b)*a if value(a) > 0
338
- a < 0 & b >= value(b) => sign*ab <= value(b)*a if value(a) < 0
339
- */
340
- void order::order_lemma_on_ab_gt (const monic& m, const rational& sign, lpvar a, lpvar b) {
341
- SASSERT (sign * var_val (m) > val (a) * val (b));
342
- add_lemma ();
343
- if (val (a).is_pos ()) {
344
- TRACE (" nla_solver" , tout << " a is pos\n " ;);
345
- // negate a > 0
346
- mk_ineq (a, llc::LE);
347
- // negate b <= val(b)
348
- mk_ineq (b, llc::GT, val (b));
349
- // ab <= val(b)a
350
- mk_ineq (sign, m.var (), -val (b), a, llc::LE);
351
- } else {
352
- TRACE (" nla_solver" , tout << " a is neg\n " ;);
353
- SASSERT (val (a).is_neg ());
354
- // negate a < 0
355
- mk_ineq (a, llc::GE);
356
- // negate b >= val(b)
357
- mk_ineq (b, llc::LT, val (b));
358
- // ab <= val(b)a
359
- mk_ineq (sign, m.var (), -val (b), a, llc::LE);
360
- }
361
- }
362
- // we need to deduce ab >= val(b)*a
363
- /* *
364
- \brief Add lemma:
365
- a > 0 & b >= value(b) => sign*ab >= value(b)*a if value(a) > 0
366
- a < 0 & b <= value(b) => sign*ab >= value(b)*a if value(a) < 0
367
- */
368
- void order::order_lemma_on_ab_lt (const monic& m, const rational& sign, lpvar a, lpvar b) {
369
- TRACE (" nla_solver" , tout << " sign = " << sign << " , m = " ; c ().print_monic (m, tout) << " , a = " ; c ().print_var (a, tout) <<
370
- " , b = " ; c ().print_var (b, tout) << " \n " ;);
371
- SASSERT (sign * var_val (m) < val (a) * val (b));
372
- add_lemma ();
373
- if (val (a).is_pos ()) {
374
- // negate a > 0
375
- mk_ineq (a, llc::LE);
376
- // negate b >= val(b)
377
- mk_ineq (b, llc::LT, val (b));
378
- // ab <= val(b)a
379
- mk_ineq (sign, m.var (), -val (b), a, llc::GE);
380
- } else {
381
- SASSERT (val (a).is_neg ());
382
- // negate a < 0
383
- mk_ineq (a, llc::GE);
384
- // negate b <= val(b)
385
- mk_ineq (b, llc::GT, val (b));
386
- // ab >= val(b)a
387
- mk_ineq (sign, m.var (), -val (b), a, llc::GE);
388
- }
389
- }
390
-
391
- void order::order_lemma_on_ab (const monic& m, const rational& sign, lpvar a, lpvar b, bool gt) {
392
- if (gt)
393
- order_lemma_on_ab_gt (m, sign, a, b);
394
- else
395
- order_lemma_on_ab_lt (m, sign, a, b);
396
- }
397
319
398
320
}
0 commit comments