/*++ Copyright (c) 2006 Microsoft Corporation Module Name: mam.h Abstract: Matching Abstract Machine Author: Leonardo de Moura (leonardo) 2007-02-13. Revision History: --*/ #ifndef _MAM_H_ #define _MAM_H_ #include"ast.h" #include"smt_types.h" namespace smt { /** \brief Matching Abstract Machine (MAM) */ class mam { protected: context & m_context; std::ostream * m_trace_stream; public: mam(context & ctx, std::ostream *trace): m_context(ctx), m_trace_stream(trace) { } virtual ~mam() { } virtual void add_pattern(quantifier * q, app * mp) = 0; virtual void push_scope() = 0; virtual void pop_scope(unsigned num_scopes) = 0; virtual void match() = 0; virtual void rematch(bool use_irrelevant = false) = 0; virtual bool has_work() const = 0; virtual void relevant_eh(enode * n, bool lazy) = 0; virtual void add_eq_eh(enode * r1, enode * r2) = 0; virtual void reset() = 0; virtual void display(std::ostream& out) = 0; virtual void on_match(quantifier * q, app * pat, unsigned num_bindings, enode * const * bindings, unsigned max_generation, ptr_vector & used_enodes) = 0; virtual bool is_shared(enode * n) const = 0; #ifdef Z3DEBUG virtual bool check_missing_instances() = 0; #endif }; mam * mk_mam(context & ctx, std::ostream *trace); }; #endif /* _MAM_H_ */