3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-20 12:53:38 +00:00

add occurs check to other nla_basic lemmas

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2020-05-09 20:50:27 -07:00
parent 4890c3ce31
commit 30de76b529
21 changed files with 94 additions and 301 deletions

View file

@ -1,21 +1,10 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Revision History:
--*/ --*/
#pragma once #pragma once
#include "math/lp/numeric_pair.h" #include "math/lp/numeric_pair.h"

View file

@ -1,21 +1,10 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Revision History:
--*/ --*/
#pragma once #pragma once
#include <initializer_list> #include <initializer_list>
#include "math/lp/nla_defs.h" #include "math/lp/nla_defs.h"

View file

@ -1,21 +1,8 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Revision History:
--*/ --*/
#include "util/lbool.h" #include "util/lbool.h"
#include "math/lp/nex_creator.h" #include "math/lp/nex_creator.h"

View file

@ -1,21 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#pragma once #pragma once
#include <map> #include <map>

View file

@ -1,22 +1,12 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#include "math/lp/nla_basics_lemmas.h" #include "math/lp/nla_basics_lemmas.h"
#include "math/lp/nla_core.h" #include "math/lp/nla_core.h"
#include "math/lp/factorization_factory_imp.h" #include "math/lp/factorization_factory_imp.h"
@ -164,9 +154,7 @@ void basics::generate_sign_lemma(const monic& m, const monic& n, const rational&
); );
c().mk_ineq(m.var(), -sign, n.var(), llc::EQ); c().mk_ineq(m.var(), -sign, n.var(), llc::EQ);
explain(m); explain(m);
TRACE("nla_solver", tout << "m exp = "; _().print_explanation(_().current_expl(), tout););
explain(n); explain(n);
TRACE("nla_solver", tout << "n exp = "; _().print_explanation(_().current_expl(), tout););
} }
// try to find a variable j such that val(j) = 0 // try to find a variable j such that val(j) = 0
// and the bounds on j contain 0 as an inner point // and the bounds on j contain 0 as an inner point
@ -336,8 +324,9 @@ bool basics::basic_lemma_for_mon_neutral_monic_to_factor_derived(const monic& rm
if (abs(val(j)) == abs_mv && c().vars_are_equiv(j, mon_var) && if (abs(val(j)) == abs_mv && c().vars_are_equiv(j, mon_var) &&
(mon_var_is_sep_from_zero || c().var_is_separated_from_zero(j))) { (mon_var_is_sep_from_zero || c().var_is_separated_from_zero(j))) {
jl = j; jl = j;
break;
} }
else if (j == jl)
return false;
} }
if (jl == null_lpvar) if (jl == null_lpvar)
return false; return false;
@ -546,16 +535,16 @@ bool basics::basic_lemma_for_mon_neutral_monic_to_factor_model_based_fm(const mo
for (auto j : m.vars() ) { for (auto j : m.vars() ) {
if (abs(val(j)) == abs_mv) { if (abs(val(j)) == abs_mv) {
jl = j; jl = j;
break;
} }
else if (jl == j)
return false;
} }
if (jl == null_lpvar) if (jl == null_lpvar)
return false; return false;
lpvar not_one_j = null_lpvar; lpvar not_one_j = null_lpvar;
unsigned num_occs = 0;
for (auto j : m.vars() ) { for (auto j : m.vars() ) {
if (j == jl) { if (j == jl) {
++num_occs;
continue; continue;
} }
if (abs(val(j)) != rational(1)) { if (abs(val(j)) != rational(1)) {
@ -564,9 +553,6 @@ bool basics::basic_lemma_for_mon_neutral_monic_to_factor_model_based_fm(const mo
} }
} }
if (num_occs > 1)
return false;
if (not_one_j == null_lpvar) { if (not_one_j == null_lpvar) {
return false; return false;
} }
@ -589,8 +575,17 @@ bool basics::basic_lemma_for_mon_neutral_monic_to_factor_model_based_fm(const mo
return true; return true;
} }
// use the fact /**
// 1 * 1 ... * 1 * x * 1 ... * 1 = x m = f1 * f2 * .. * fn
where
- at most one fi evaluates to something different from +1 or -1
- sign = f1 * ... f_{i-1} * f_{i+1} * ..
- sign = +1 or -1
- add lemma
- /\_{j != i} f_j = val(f_j) => m = sign * f_i
or
- /\_j f_j = val(f_j) => m = sign
*/
bool basics::basic_lemma_for_mon_neutral_from_factors_to_monic_model_based_fm(const monic& m) { bool basics::basic_lemma_for_mon_neutral_from_factors_to_monic_model_based_fm(const monic& m) {
lpvar not_one = null_lpvar; lpvar not_one = null_lpvar;
rational sign(1); rational sign(1);
@ -648,21 +643,24 @@ bool basics::basic_lemma_for_mon_neutral_monic_to_factor_model_based(const monic
return false; return false;
} }
lpvar jl = null_lpvar; lpvar jl = null_lpvar;
for (auto j : f ) { for (auto fc : f) {
if (abs(val(j)) == abs_mv) { lpvar j = var(fc);
jl = var(j); if (abs(val(fc)) == abs_mv) {
break; jl = j;
} }
else if (j == jl)
return false;
} }
if (jl == null_lpvar) if (jl == null_lpvar)
return false; return false;
lpvar not_one_j = null_lpvar; lpvar not_one_j = null_lpvar;
for (auto j : f ) { for (auto fc : f) {
if (var(j) == jl) { if (var(fc) == jl) {
continue; continue;
} }
if (abs(val(j)) != rational(1)) { if (abs(val(fc)) != rational(1)) {
not_one_j = var(j); not_one_j = var(fc);
break; break;
} }
} }
@ -704,7 +702,6 @@ void basics::basic_lemma_for_mon_neutral_model_based(const monic& rm, const fact
} }
/** /**
- m := f1*f2*.. - m := f1*f2*..
- f_i are factors of m - f_i are factors of m
- at most one variable among f_i evaluates to something else than -1, +1. - at most one variable among f_i evaluates to something else than -1, +1.

View file

@ -1,20 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#pragma once #pragma once

View file

@ -1,21 +1,10 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#include "math/lp/nla_common.h" #include "math/lp/nla_common.h"
#include "math/lp/nla_core.h" #include "math/lp/nla_core.h"

View file

@ -1,20 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#pragma once #pragma once

View file

@ -6,8 +6,8 @@ Module Name:
nla_core.cpp nla_core.cpp
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
--*/ --*/
#include "math/lp/nla_core.h" #include "math/lp/nla_core.h"
@ -843,7 +843,7 @@ bool core::is_octagon_term(const lp::lar_term& t, bool & sign, lpvar& i, lpvar &
return false; return false;
bool seen_minus = false; bool seen_minus = false;
bool seen_plus = false; bool seen_plus = false;
i = -1; i = null_lpvar;
for(const auto & p : t) { for(const auto & p : t) {
const auto & c = p.coeff(); const auto & c = p.coeff();
if (c == 1) { if (c == 1) {
@ -853,12 +853,12 @@ bool core::is_octagon_term(const lp::lar_term& t, bool & sign, lpvar& i, lpvar &
} else { } else {
return false; return false;
} }
if (i == static_cast<lpvar>(-1)) if (i == null_lpvar)
i = p.column(); i = p.column();
else else
j = p.column(); j = p.column();
} }
SASSERT(j != static_cast<unsigned>(-1)); SASSERT(j != null_lpvar);
sign = (seen_minus && seen_plus)? false : true; sign = (seen_minus && seen_plus)? false : true;
return true; return true;
} }

View file

@ -6,8 +6,8 @@
nla_core.h nla_core.h
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
--*/ --*/
#pragma once #pragma once
@ -46,7 +46,7 @@ const lpvar null_lpvar = UINT_MAX;
inline int rat_sign(const rational& r) { return r.is_pos()? 1 : ( r.is_neg()? -1 : 0); } inline int rat_sign(const rational& r) { return r.is_pos()? 1 : ( r.is_neg()? -1 : 0); }
inline rational rrat_sign(const rational& r) { return rational(rat_sign(r)); } inline rational rrat_sign(const rational& r) { return rational(rat_sign(r)); }
inline bool is_set(unsigned j) { return static_cast<int>(j) != -1; } inline bool is_set(unsigned j) { return j != null_lpvar; }
inline bool is_even(unsigned k) { return (k >> 1) << 1 == k; } inline bool is_even(unsigned k) { return (k >> 1) << 1 == k; }
struct ineq { struct ineq {
lp::lconstraint_kind m_cmp; lp::lconstraint_kind m_cmp;

View file

@ -1,19 +1,10 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/

View file

@ -1,20 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#pragma once #pragma once

View file

@ -1,21 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#include "math/lp/nla_basics_lemmas.h" #include "math/lp/nla_basics_lemmas.h"
#include "math/lp/nla_core.h" #include "math/lp/nla_core.h"

View file

@ -1,21 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#pragma once #pragma once
namespace nla { namespace nla {

View file

@ -1,20 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner) Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Revision History:
--*/ --*/
#include "math/lp/nla_order_lemmas.h" #include "math/lp/nla_order_lemmas.h"
@ -105,7 +94,8 @@ void order::order_lemma_on_factor_binomial_explore(const monic& ac, bool k) {
lpvar c = ac.vars()[k]; lpvar c = ac.vars()[k];
for (monic const& bd : _().emons().get_products_of(c)) { for (monic const& bd : _().emons().get_products_of(c)) {
if (bd.var() == ac.var()) continue; if (bd.var() == ac.var())
continue;
TRACE("nla_solver", tout << "bd = " << pp_mon_with_vars(_(), bd);); TRACE("nla_solver", tout << "bd = " << pp_mon_with_vars(_(), bd););
order_lemma_on_factor_binomial_rm(ac, k, bd); order_lemma_on_factor_binomial_rm(ac, k, bd);
if (done()) { if (done()) {
@ -262,13 +252,13 @@ void order::generate_ol_eq(const monic& ac,
const factor& b) { const factor& b) {
new_lemma lemma(_(), __FUNCTION__); new_lemma lemma(_(), __FUNCTION__);
#if 0 IF_VERBOSE(100,
IF_VERBOSE(0, verbose_stream() << var_val(ac) << "(" << mul_val(ac) << "): " << ac verbose_stream()
<< " " << ab_cmp << " " << var_val(bc) << "(" << mul_val(bc) << "): " << bc << "\n" << var_val(ac) << "(" << mul_val(ac) << "): " << ac
<< " a " << sign_a << "*v" << var(a) << " " << val(a) << "\n" << " " << var_val(bc) << "(" << mul_val(bc) << "): " << bc << "\n"
<< " b " << sign_b << "*v" << var(b) << " " << val(b) << "\n" << " a " << "*v" << var(a) << " " << val(a) << "\n"
<< " c " << sign_c << "*v" << var(c) << " " << val(c) << "\n"); << " b " << "*v" << var(b) << " " << val(b) << "\n"
#endif << " c " << "*v" << var(c) << " " << val(c) << "\n");
// ac == bc // ac == bc
mk_ineq(c.var(),llc::EQ); // c is not equal to zero mk_ineq(c.var(),llc::EQ); // c is not equal to zero
mk_ineq(ac.var(), -rational(1), bc.var(), llc::NE); mk_ineq(ac.var(), -rational(1), bc.var(), llc::NE);
@ -288,13 +278,11 @@ void order::generate_ol(const monic& ac,
const factor& b) { const factor& b) {
new_lemma lemma(_(), __FUNCTION__); new_lemma lemma(_(), __FUNCTION__);
#if 0 IF_VERBOSE(100, verbose_stream() << var_val(ac) << "(" << mul_val(ac) << "): " << ac
IF_VERBOSE(0, verbose_stream() << var_val(ac) << "(" << mul_val(ac) << "): " << ac << " " << var_val(bc) << "(" << mul_val(bc) << "): " << bc << "\n"
<< " " << ab_cmp << " " << var_val(bc) << "(" << mul_val(bc) << "): " << bc << "\n" << " a " << "*v" << var(a) << " " << val(a) << "\n"
<< " a " << sign_a << "*v" << var(a) << " " << val(a) << "\n" << " b " << "*v" << var(b) << " " << val(b) << "\n"
<< " b " << sign_b << "*v" << var(b) << " " << val(b) << "\n" << " c " << "*v" << var(c) << " " << val(c) << "\n");
<< " c " << sign_c << "*v" << var(c) << " " << val(c) << "\n");
#endif
// fix the sign of c // fix the sign of c
_().negate_relation(c.var(), rational(0)); _().negate_relation(c.var(), rational(0));
_().negate_var_relation_strictly(ac.var(), bc.var()); _().negate_var_relation_strictly(ac.var(), bc.var());

View file

@ -1,20 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#pragma once #pragma once

View file

@ -1,21 +1,10 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Revision History:
--*/ --*/
#pragma once #pragma once

View file

@ -1,21 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#include "math/lp/nla_solver.h" #include "math/lp/nla_solver.h"
#include <map> #include <map>

View file

@ -1,20 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#pragma once #pragma once

View file

@ -1,20 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#include "math/lp/nla_tangent_lemmas.h" #include "math/lp/nla_tangent_lemmas.h"

View file

@ -1,21 +1,9 @@
/*++ /*++
Copyright (c) 2017 Microsoft Corporation Copyright (c) 2017 Microsoft Corporation
Module Name:
<name>
Abstract:
<abstract>
Author: Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach) Lev Nachmanson (levnach)
Nikolaj Bjorner (nbjorner)
Revision History:
--*/ --*/
#pragma once #pragma once
#include "util/rational.h" #include "util/rational.h"