3
0
Fork 0
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:
Nikolaj Bjorner 2025-05-10 16:15:04 -07:00
parent 9232ef579c
commit 7ca94e8fef
2 changed files with 88 additions and 22 deletions

View file

@ -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;
};
}