mirror of
https://github.com/Z3Prover/z3
synced 2025-08-10 21:20:52 +00:00
add E-matching to EUF completion
This commit is contained in:
parent
9232ef579c
commit
7ca94e8fef
2 changed files with 88 additions and 22 deletions
|
@ -19,11 +19,12 @@ Author:
|
|||
|
||||
#include "ast/simplifiers/dependent_expr_state.h"
|
||||
#include "ast/euf/euf_egraph.h"
|
||||
#include "ast/euf/euf_mam.h"
|
||||
#include "ast/rewriter/th_rewriter.h"
|
||||
|
||||
namespace euf {
|
||||
|
||||
class completion : public dependent_expr_simplifier {
|
||||
class completion : public dependent_expr_simplifier, public on_binding_callback, public mam_solver {
|
||||
|
||||
struct stats {
|
||||
unsigned m_num_rewrites = 0;
|
||||
|
@ -31,16 +32,20 @@ namespace euf {
|
|||
};
|
||||
|
||||
egraph m_egraph;
|
||||
scoped_ptr<mam> m_mam;
|
||||
enode* m_tt, *m_ff;
|
||||
ptr_vector<expr> m_todo;
|
||||
enode_vector m_args, m_reps, m_nodes_to_canonize;
|
||||
expr_ref_vector m_canonical, m_eargs;
|
||||
expr_dependency_ref_vector m_deps;
|
||||
obj_map<quantifier, expr_dependency*> m_q2dep;
|
||||
unsigned m_epoch = 0;
|
||||
unsigned_vector m_epochs;
|
||||
th_rewriter m_rewriter;
|
||||
stats m_stats;
|
||||
bool m_has_new_eq = false;
|
||||
bool m_should_propagate = false;
|
||||
|
||||
|
||||
enode* mk_enode(expr* e);
|
||||
bool is_new_eq(expr* a, expr* b);
|
||||
|
@ -54,8 +59,10 @@ namespace euf {
|
|||
expr* get_canonical(expr* f, expr_dependency_ref& d);
|
||||
expr* get_canonical(enode* n);
|
||||
void set_canonical(enode* n, expr* e);
|
||||
void add_constraint(expr*f, expr_dependency* d);
|
||||
expr_dependency* explain_eq(enode* a, enode* b);
|
||||
expr_dependency* explain_conflict();
|
||||
expr_dependency* get_dependency(quantifier* q) { return m_q2dep.contains(q) ? m_q2dep[q] : nullptr; }
|
||||
public:
|
||||
completion(ast_manager& m, dependent_expr_state& fmls);
|
||||
char const* name() const override { return "euf-reduce"; }
|
||||
|
@ -64,5 +71,15 @@ namespace euf {
|
|||
void reduce() override;
|
||||
void collect_statistics(statistics& st) const override;
|
||||
void reset_statistics() override { m_stats.reset(); }
|
||||
|
||||
trail_stack& get_trail() override { return m_trail;}
|
||||
region& get_region() override { return m_trail.get_region(); }
|
||||
egraph& get_egraph() override { return m_egraph; }
|
||||
bool is_relevant(enode* n) const override { return true; }
|
||||
bool resource_limits_exceeded() const override { return false; }
|
||||
ast_manager& get_manager() override { return m; }
|
||||
|
||||
void on_binding(quantifier* q, app* pat, enode* const* binding, unsigned mg, unsigned ming, unsigned mx) override;
|
||||
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue