diff --git a/src/smt/tactic/smt_tactic_core.cpp b/src/smt/tactic/smt_tactic_core.cpp index 3aa2df869..a65d0eba7 100644 --- a/src/smt/tactic/smt_tactic_core.cpp +++ b/src/smt/tactic/smt_tactic_core.cpp @@ -306,6 +306,34 @@ public: throw tactic_exception(ex.msg()); } } + + void user_propagate_init( + void* ctx, + user_propagator::push_eh_t& push_eh, + user_propagator::pop_eh_t& pop_eh, + user_propagator::fresh_eh_t& fresh_eh) override { + m_ctx->user_propagate_init(ctx, push_eh, pop_eh, fresh_eh); + } + + void user_propagate_register_fixed(user_propagator::fixed_eh_t& fixed_eh) override { + m_ctx->user_propagate_register_fixed(fixed_eh); + } + + void user_propagate_register_final(user_propagator::final_eh_t& final_eh) override { + m_ctx->user_propagate_register_final(final_eh); + } + + void user_propagate_register_eq(user_propagator::eq_eh_t& eq_eh) override { + m_ctx->user_propagate_register_eq(eq_eh); + } + + void user_propagate_register_diseq(user_propagator::eq_eh_t& diseq_eh) override { + m_ctx->user_propagate_register_diseq(diseq_eh); + } + + unsigned user_propagate_register(expr* e) override { + return m_ctx->user_propagate_register(e); + } }; static tactic * mk_seq_smt_tactic(params_ref const & p) { diff --git a/src/solver/tactic2solver.cpp b/src/solver/tactic2solver.cpp index 761c202cf..0e949aa67 100644 --- a/src/solver/tactic2solver.cpp +++ b/src/solver/tactic2solver.cpp @@ -84,6 +84,34 @@ public: void set_phase(phase* p) override { } void move_to_front(expr* e) override { } + void user_propagate_init( + void* ctx, + user_propagator::push_eh_t& push_eh, + user_propagator::pop_eh_t& pop_eh, + user_propagator::fresh_eh_t& fresh_eh) override { + m_tactic->user_propagate_init(ctx, push_eh, pop_eh, fresh_eh); + } + + void user_propagate_register_fixed(user_propagator::fixed_eh_t& fixed_eh) override { + m_tactic->user_propagate_register_fixed(fixed_eh); + } + + void user_propagate_register_final(user_propagator::final_eh_t& final_eh) override { + m_tactic->user_propagate_register_final(final_eh); + } + + void user_propagate_register_eq(user_propagator::eq_eh_t& eq_eh) override { + m_tactic->user_propagate_register_eq(eq_eh); + } + + void user_propagate_register_diseq(user_propagator::eq_eh_t& diseq_eh) override { + m_tactic->user_propagate_register_diseq(diseq_eh); + } + + unsigned user_propagate_register(expr* e) override { + return m_tactic->user_propagate_register(e); + } + expr_ref_vector cube(expr_ref_vector& vars, unsigned ) override { set_reason_unknown("cubing is not supported on tactics"); diff --git a/src/tactic/tactic.h b/src/tactic/tactic.h index de04c9453..4fe23ad32 100644 --- a/src/tactic/tactic.h +++ b/src/tactic/tactic.h @@ -23,6 +23,7 @@ Notes: #include "util/params.h" #include "util/lbool.h" #include "util/statistics.h" +#include "tactic/user_propagator_base.h" #include "tactic/goal.h" #include "tactic/tactic_exception.h" @@ -30,7 +31,7 @@ class progress_callback; typedef ptr_buffer goal_buffer; -class tactic { +class tactic : public user_propagator::core { unsigned m_ref_count; public: tactic():m_ref_count(0) {} @@ -76,6 +77,14 @@ public: static void checkpoint(ast_manager& m); + void user_propagate_init( + void* ctx, + user_propagator::push_eh_t& push_eh, + user_propagator::pop_eh_t& pop_eh, + user_propagator::fresh_eh_t& fresh_eh) override { + throw default_exception("tactic does not support user propagation"); + } + protected: friend class nary_tactical; friend class binary_tactical; diff --git a/src/tactic/tactical.cpp b/src/tactic/tactical.cpp index 07be90518..568bb792d 100644 --- a/src/tactic/tactical.cpp +++ b/src/tactic/tactical.cpp @@ -164,6 +164,34 @@ public: return translate_core(m); } + void user_propagate_init( + void* ctx, + user_propagator::push_eh_t& push_eh, + user_propagator::pop_eh_t& pop_eh, + user_propagator::fresh_eh_t& fresh_eh) override { + m_t2->user_propagate_init(ctx, push_eh, pop_eh, fresh_eh); + } + + void user_propagate_register_fixed(user_propagator::fixed_eh_t& fixed_eh) override { + m_t2->user_propagate_register_fixed(fixed_eh); + } + + void user_propagate_register_final(user_propagator::final_eh_t& final_eh) override { + m_t2->user_propagate_register_final(final_eh); + } + + void user_propagate_register_eq(user_propagator::eq_eh_t& eq_eh) override { + m_t2->user_propagate_register_eq(eq_eh); + } + + void user_propagate_register_diseq(user_propagator::eq_eh_t& diseq_eh) override { + m_t2->user_propagate_register_diseq(diseq_eh); + } + + unsigned user_propagate_register(expr* e) override { + return m_t2->user_propagate_register(e); + } + }; tactic * and_then(tactic * t1, tactic * t2) {