mirror of
https://github.com/Z3Prover/z3
synced 2025-04-29 03:45:51 +00:00
64 lines
1.9 KiB
C++
64 lines
1.9 KiB
C++
/*++
|
|
Copyright (c) 2020 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
euf_invariant.cpp
|
|
|
|
Abstract:
|
|
|
|
Check invariants for EUF solver.
|
|
|
|
Author:
|
|
|
|
Nikolaj Bjorner (nbjorner) 2020-09-07
|
|
|
|
--*/
|
|
|
|
#include "sat/smt/euf_solver.h"
|
|
|
|
namespace euf {
|
|
|
|
/**
|
|
\brief Check if expressions attached to bool_variables and enodes have a consistent assignment.
|
|
For all a, b. root(a) == root(b) ==> get_assignment(a) == get_assignment(b)
|
|
*/
|
|
|
|
void solver::check_eqc_bool_assignment() const {
|
|
for (enode* n : m_egraph.nodes()) {
|
|
VERIFY(!m.is_bool(n->get_expr()) ||
|
|
s().value(enode2literal(n)) == s().value(enode2literal(n->get_root())));
|
|
}
|
|
}
|
|
|
|
void solver::check_missing_bool_enode_propagation() const {
|
|
for (enode* n : m_egraph.nodes())
|
|
if (m.is_bool(n->get_expr()) && l_undef == s().value(enode2literal(n))) {
|
|
if (!n->is_root()) {
|
|
VERIFY(l_undef == s().value(enode2literal(n->get_root())));
|
|
}
|
|
else
|
|
for (enode* o : enode_class(n)) {
|
|
VERIFY(l_undef == s().value(enode2literal(o)));
|
|
}
|
|
}
|
|
}
|
|
|
|
void solver::check_missing_eq_propagation() const {
|
|
if (s().inconsistent())
|
|
return;
|
|
for (enode* n : m_egraph.nodes())
|
|
if (m.is_false(n->get_root()->get_expr()) &&
|
|
m.is_eq(n->get_expr()) &&
|
|
!m.is_bool(n->get_app()->get_arg(0)) &&
|
|
(n->get_arg(0)->get_root() == n->get_arg(1)->get_root())) {
|
|
enable_trace("euf");
|
|
TRACE("euf", display(tout << n->get_expr_id() << ": " << mk_pp(n->get_expr(), m) << "\n"
|
|
<< "#" << n->get_arg(0)->get_expr_id() << " == #" << n->get_arg(1)->get_expr_id() << " r: " << n->get_arg(0)->get_root_id() << "\n");
|
|
);
|
|
UNREACHABLE();
|
|
}
|
|
}
|
|
|
|
|
|
}
|