mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +00:00
This commit is contained in:
parent
d450fd4227
commit
abe3ef2382
|
@ -284,7 +284,6 @@ namespace bv {
|
||||||
}
|
}
|
||||||
|
|
||||||
void solver::register_true_false_bit(theory_var v, unsigned idx) {
|
void solver::register_true_false_bit(theory_var v, unsigned idx) {
|
||||||
SASSERT(s().value(m_bits[v][idx]) != l_undef);
|
|
||||||
sat::literal l = m_bits[v][idx];
|
sat::literal l = m_bits[v][idx];
|
||||||
SASSERT(l == mk_true() || ~l == mk_true());
|
SASSERT(l == mk_true() || ~l == mk_true());
|
||||||
bool is_true = l == mk_true();
|
bool is_true = l == mk_true();
|
||||||
|
@ -369,7 +368,7 @@ namespace bv {
|
||||||
sat::literal solver::mk_true() {
|
sat::literal solver::mk_true() {
|
||||||
if (m_true == sat::null_literal) {
|
if (m_true == sat::null_literal) {
|
||||||
ctx.push(value_trail<sat::literal>(m_true));
|
ctx.push(value_trail<sat::literal>(m_true));
|
||||||
m_true = ctx.internalize(m.mk_true(), false, false, false);
|
m_true = ctx.internalize(m.mk_true(), false, true, false);
|
||||||
}
|
}
|
||||||
return m_true;
|
return m_true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,14 +95,20 @@ namespace bv {
|
||||||
result.reset();
|
result.reset();
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
for (literal b : m_bits[v]) {
|
for (literal b : m_bits[v]) {
|
||||||
switch (ctx.s().value(b)) {
|
if (b == ~m_true)
|
||||||
case l_false:
|
;
|
||||||
break;
|
else if (b == m_true)
|
||||||
case l_undef:
|
|
||||||
return false;
|
|
||||||
case l_true:
|
|
||||||
result += power2(i);
|
result += power2(i);
|
||||||
break;
|
else {
|
||||||
|
switch (ctx.s().value(b)) {
|
||||||
|
case l_false:
|
||||||
|
break;
|
||||||
|
case l_undef:
|
||||||
|
return false;
|
||||||
|
case l_true:
|
||||||
|
result += power2(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,6 @@ struct goal2sat::imp : public sat::sat_internalizer {
|
||||||
expr_ref_vector m_trail;
|
expr_ref_vector m_trail;
|
||||||
func_decl_ref_vector m_unhandled_funs;
|
func_decl_ref_vector m_unhandled_funs;
|
||||||
bool m_default_external;
|
bool m_default_external;
|
||||||
bool m_xor_solver { false };
|
|
||||||
bool m_euf { false };
|
bool m_euf { false };
|
||||||
bool m_drat { false };
|
bool m_drat { false };
|
||||||
bool m_is_redundant { false };
|
bool m_is_redundant { false };
|
||||||
|
@ -108,7 +107,6 @@ struct goal2sat::imp : public sat::sat_internalizer {
|
||||||
sat_params sp(p);
|
sat_params sp(p);
|
||||||
m_ite_extra = p.get_bool("ite_extra", true);
|
m_ite_extra = p.get_bool("ite_extra", true);
|
||||||
m_max_memory = megabytes_to_bytes(p.get_uint("max_memory", UINT_MAX));
|
m_max_memory = megabytes_to_bytes(p.get_uint("max_memory", UINT_MAX));
|
||||||
m_xor_solver = p.get_bool("xor_solver", false);
|
|
||||||
m_euf = sp.euf();
|
m_euf = sp.euf();
|
||||||
m_drat = sp.drat_file().is_non_empty_string();
|
m_drat = sp.drat_file().is_non_empty_string();
|
||||||
}
|
}
|
||||||
|
@ -576,7 +574,7 @@ struct goal2sat::imp : public sat::sat_internalizer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void convert_iff2(app * t, bool root, bool sign) {
|
void convert_iff(app * t, bool root, bool sign) {
|
||||||
if (t->get_num_args() != 2)
|
if (t->get_num_args() != 2)
|
||||||
throw default_exception("unexpected number of arguments to xor");
|
throw default_exception("unexpected number of arguments to xor");
|
||||||
SASSERT(t->get_num_args() == 2);
|
SASSERT(t->get_num_args() == 2);
|
||||||
|
@ -611,13 +609,6 @@ struct goal2sat::imp : public sat::sat_internalizer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void convert_iff(app * t, bool root, bool sign) {
|
|
||||||
if (!m_euf && is_xor(t))
|
|
||||||
convert_ba(t, root, sign);
|
|
||||||
else
|
|
||||||
convert_iff2(t, root, sign);
|
|
||||||
}
|
|
||||||
|
|
||||||
func_decl_ref_vector const& interpreted_funs() {
|
func_decl_ref_vector const& interpreted_funs() {
|
||||||
auto* ext = dynamic_cast<euf::solver*>(m_solver.get_extension());
|
auto* ext = dynamic_cast<euf::solver*>(m_solver.get_extension());
|
||||||
if (ext)
|
if (ext)
|
||||||
|
@ -723,10 +714,6 @@ struct goal2sat::imp : public sat::sat_internalizer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_xor(app* t) const {
|
|
||||||
return m_xor_solver && m.is_iff(t) && m.is_iff(t->get_arg(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
struct scoped_stack {
|
struct scoped_stack {
|
||||||
imp& i;
|
imp& i;
|
||||||
sat::literal_vector& r;
|
sat::literal_vector& r;
|
||||||
|
@ -784,11 +771,6 @@ struct goal2sat::imp : public sat::sat_internalizer {
|
||||||
visit(t->get_arg(0), root, !sign);
|
visit(t->get_arg(0), root, !sign);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!m_euf && is_xor(t)) {
|
|
||||||
convert_ba(t, root, sign);
|
|
||||||
m_frame_stack.pop_back();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
unsigned num = t->get_num_args();
|
unsigned num = t->get_num_args();
|
||||||
while (m_frame_stack[fsz-1].m_idx < num) {
|
while (m_frame_stack[fsz-1].m_idx < num) {
|
||||||
expr * arg = t->get_arg(m_frame_stack[fsz-1].m_idx);
|
expr * arg = t->get_arg(m_frame_stack[fsz-1].m_idx);
|
||||||
|
|
Loading…
Reference in a new issue