mirror of
https://github.com/Z3Prover/z3
synced 2025-08-24 03:57:51 +00:00
add sat-euf
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
a7b51d04cd
commit
ecd3315a74
11 changed files with 474 additions and 52 deletions
|
@ -42,7 +42,7 @@ Notes:
|
|||
#include "tactic/generic_model_converter.h"
|
||||
#include<sstream>
|
||||
|
||||
struct goal2sat::imp {
|
||||
struct goal2sat::imp : public sat_internalizer {
|
||||
struct frame {
|
||||
app * m_t;
|
||||
unsigned m_root:1;
|
||||
|
@ -131,6 +131,18 @@ struct goal2sat::imp {
|
|||
return m_true;
|
||||
}
|
||||
|
||||
sat::bool_var add_bool_var(expr* t) override {
|
||||
sat::bool_var v = m_map.to_bool_var(t);
|
||||
if (v == sat::null_bool_var) {
|
||||
v = m_solver.add_var(true);
|
||||
m_map.insert(t, v);
|
||||
}
|
||||
else {
|
||||
m_solver.set_external(v);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
void convert_atom(expr * t, bool root, bool sign) {
|
||||
SASSERT(m.is_bool(t));
|
||||
sat::literal l;
|
||||
|
@ -149,7 +161,7 @@ struct goal2sat::imp {
|
|||
}
|
||||
else {
|
||||
bool ext = m_default_external || !is_uninterp_const(t) || m_interface_vars.contains(t);
|
||||
sat::bool_var v = m_solver.add_var(ext);
|
||||
v = m_solver.add_var(ext);
|
||||
m_map.insert(t, v);
|
||||
l = sat::literal(v, sign);
|
||||
TRACE("sat", tout << "new_var: " << v << ": " << mk_bounded_pp(t, m, 2) << " " << is_uninterp_const(t) << "\n";);
|
||||
|
@ -812,7 +824,7 @@ struct goal2sat::imp {
|
|||
}
|
||||
}
|
||||
|
||||
sat::literal internalize(expr* n) {
|
||||
sat::literal internalize(expr* n) override {
|
||||
SASSERT(m_result_stack.empty());
|
||||
process(n, false);
|
||||
SASSERT(m_result_stack.size() == 1);
|
||||
|
@ -820,6 +832,30 @@ struct goal2sat::imp {
|
|||
m_result_stack.reset();
|
||||
return result;
|
||||
}
|
||||
|
||||
bool is_bool_op(expr* t) const override {
|
||||
if (!is_app(t))
|
||||
return false;
|
||||
if (to_app(t)->get_family_id() == m.get_basic_family_id()) {
|
||||
switch (to_app(t)->get_decl_kind()) {
|
||||
case OP_OR:
|
||||
case OP_AND:
|
||||
case OP_TRUE:
|
||||
case OP_FALSE:
|
||||
case OP_NOT:
|
||||
return true;
|
||||
case OP_ITE:
|
||||
case OP_EQ:
|
||||
return m.is_bool(to_app(t)->get_arg(1));
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (to_app(t)->get_family_id() == pb.get_family_id())
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
void process(expr * n) {
|
||||
m_result_stack.reset();
|
||||
|
|
|
@ -34,6 +34,14 @@ Notes:
|
|||
#include "tactic/generic_model_converter.h"
|
||||
#include "sat/tactic/atom2bool_var.h"
|
||||
|
||||
|
||||
class sat_internalizer {
|
||||
public:
|
||||
virtual bool is_bool_op(expr* e) const = 0;
|
||||
virtual sat::literal internalize(expr* e) = 0;
|
||||
virtual sat::bool_var add_bool_var(expr* e) = 0;
|
||||
};
|
||||
|
||||
class goal2sat {
|
||||
struct imp;
|
||||
imp * m_imp;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue