mirror of
https://github.com/Z3Prover/z3
synced 2025-04-08 02:15:19 +00:00
Fix term-ite models in theory_fpa. Fixes #2857.
This commit is contained in:
parent
0e096c55a9
commit
77689ed002
|
@ -728,6 +728,33 @@ namespace smt {
|
|||
mg.register_factory(m_factory);
|
||||
}
|
||||
|
||||
enode* theory_fpa::ensure_enode(expr* e) {
|
||||
context& ctx = get_context();
|
||||
if (!ctx.e_internalized(e)) {
|
||||
ctx.internalize(e, false);
|
||||
}
|
||||
enode* n = ctx.get_enode(e);
|
||||
ctx.mark_as_relevant(n);
|
||||
return n;
|
||||
}
|
||||
|
||||
app* theory_fpa::get_ite_value(expr* e) {
|
||||
ast_manager & m = get_manager();
|
||||
expr* e1, *e2, *e3;
|
||||
while (m.is_ite(e, e1, e2, e3)) {
|
||||
if (get_root(e2) == get_root(e)) {
|
||||
e = e2;
|
||||
}
|
||||
else if (get_root(e3) == get_root(e)) {
|
||||
e = e3;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return to_app(e);
|
||||
}
|
||||
|
||||
model_value_proc * theory_fpa::mk_value(enode * n, model_generator & mg) {
|
||||
TRACE("t_fpa", tout << "mk_value for: " << mk_ismt2_pp(n->get_owner(), get_manager()) <<
|
||||
" (sort " << mk_ismt2_pp(get_manager().get_sort(n->get_owner()), get_manager()) << ")\n";);
|
||||
|
@ -735,7 +762,7 @@ namespace smt {
|
|||
ast_manager & m = get_manager();
|
||||
context & ctx = get_context();
|
||||
app_ref owner(m);
|
||||
owner = n->get_owner();
|
||||
owner = get_ite_value(n->get_owner());
|
||||
|
||||
// If the owner is not internalized, it doesn't have an enode associated.
|
||||
SASSERT(ctx.e_internalized(owner));
|
||||
|
|
|
@ -196,6 +196,10 @@ namespace smt {
|
|||
|
||||
app_ref wrap(expr * e);
|
||||
app_ref unwrap(expr * e, sort * s);
|
||||
|
||||
enode* ensure_enode(expr* e);
|
||||
enode* get_root(expr* a) { return ensure_enode(a)->get_root(); }
|
||||
app* get_ite_value(expr* e);
|
||||
};
|
||||
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue