mirror of
https://github.com/Z3Prover/z3
synced 2025-04-08 10:25:18 +00:00
finish is-fixed
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
e5767bf2b8
commit
c00591daaf
|
@ -58,6 +58,15 @@ namespace bv {
|
|||
m_bb.set_flat(false);
|
||||
}
|
||||
|
||||
bool solver::is_fixed(euf::theory_var v, expr_ref& val, sat::literal_vector& lits) {
|
||||
numeral n;
|
||||
if (!get_fixed_value(v, n))
|
||||
return false;
|
||||
val = bv.mk_numeral(n, m_bits[v].size());
|
||||
lits.append(m_bits[v]);
|
||||
return true;
|
||||
}
|
||||
|
||||
void solver::fixed_var_eh(theory_var v1) {
|
||||
numeral val1, val2;
|
||||
VERIFY(get_fixed_value(v1, val1));
|
||||
|
|
|
@ -226,6 +226,7 @@ namespace bv {
|
|||
void get_bits(euf::enode* n, expr_ref_vector& r);
|
||||
void get_arg_bits(app* n, unsigned idx, expr_ref_vector& r);
|
||||
void fixed_var_eh(theory_var v);
|
||||
bool is_fixed(euf::theory_var v, expr_ref& val, sat::literal_vector& lits) override;
|
||||
bool is_bv(theory_var v) const { return bv.is_bv(var2expr(v)); }
|
||||
void register_true_false_bit(theory_var v, unsigned i);
|
||||
void add_bit(theory_var v, sat::literal lit);
|
||||
|
|
|
@ -762,6 +762,25 @@ namespace euf {
|
|||
}
|
||||
|
||||
bool solver::is_fixed(euf::enode* n, expr_ref& val, sat::literal_vector& explain) {
|
||||
if (n->bool_var() != sat::null_bool_var) {
|
||||
switch (s().value(n->bool_var())) {
|
||||
case l_true:
|
||||
val = m.mk_true();
|
||||
explain.push_back(sat::literal(n->bool_var()));
|
||||
return true;
|
||||
case l_false:
|
||||
val = m.mk_false();
|
||||
explain.push_back(~sat::literal(n->bool_var()));
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (auto const& thv : enode_th_vars(n)) {
|
||||
auto* th = m_id2solver.get(thv.get_id(), nullptr);
|
||||
if (th && !th->is_fixed(thv.get_var(), val, explain))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -118,6 +118,8 @@ namespace euf {
|
|||
|
||||
virtual bool enable_ackerman_axioms(euf::enode* n) const { return true; }
|
||||
|
||||
virtual bool is_fixed(euf::theory_var v, expr_ref& val, sat::literal_vector& lits) { return false; }
|
||||
|
||||
virtual void relevant_eh(euf::enode* n) {}
|
||||
|
||||
/**
|
||||
|
|
|
@ -2922,7 +2922,7 @@ namespace smt {
|
|||
while (l) {
|
||||
theory_id tid = l->get_id();
|
||||
auto* p = m_theories.get_plugin(tid);
|
||||
if (p && p->is_fixed(l->get_var(), val, explain))
|
||||
if (p && p->is_fixed_propagated(l->get_var(), val, explain))
|
||||
return true;
|
||||
l = l->get_next();
|
||||
}
|
||||
|
|
|
@ -620,7 +620,7 @@ namespace smt {
|
|||
/**
|
||||
* \brief theory plugin for fixed values.
|
||||
*/
|
||||
virtual bool is_fixed(theory_var v, expr_ref& val, literal_vector & explain) { return false; }
|
||||
virtual bool is_fixed_propagated(theory_var v, expr_ref& val, literal_vector & explain) { return false; }
|
||||
};
|
||||
|
||||
};
|
||||
|
|
|
@ -519,7 +519,7 @@ namespace smt {
|
|||
}
|
||||
}
|
||||
|
||||
bool theory_bv::is_fixed(theory_var v, expr_ref& val, literal_vector& lits) {
|
||||
bool theory_bv::is_fixed_propagated(theory_var v, expr_ref& val, literal_vector& lits) {
|
||||
numeral r;
|
||||
enode* n = get_enode(v);
|
||||
if (!get_fixed_value(v, r))
|
||||
|
|
|
@ -282,7 +282,7 @@ namespace smt {
|
|||
void collect_statistics(::statistics & st) const override;
|
||||
|
||||
bool get_fixed_value(app* x, numeral & result) const;
|
||||
bool is_fixed(theory_var v, expr_ref& val, literal_vector& explain) override;
|
||||
bool is_fixed_propagated(theory_var v, expr_ref& val, literal_vector& explain) override;
|
||||
|
||||
bool check_assignment(theory_var v);
|
||||
bool check_invariant();
|
||||
|
|
Loading…
Reference in a new issue