mirror of
https://github.com/Z3Prover/z3
synced 2025-04-13 12:28:44 +00:00
102 lines
2.6 KiB
C++
102 lines
2.6 KiB
C++
/*++
|
|
Copyright (c) 2006 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
dl_mk_interp_tail_simplifier.h
|
|
|
|
Abstract:
|
|
|
|
Rule transformer which simplifies interpreted tails
|
|
|
|
Author:
|
|
|
|
Krystof Hoder (t-khoder) 2011-10-01.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _DL_MK_INTERP_TAIL_SIMPLIFIER_H_
|
|
#define _DL_MK_INTERP_TAIL_SIMPLIFIER_H_
|
|
|
|
#include "dl_context.h"
|
|
#include "dl_rule_transformer.h"
|
|
#include "unifier.h"
|
|
#include "substitution.h"
|
|
|
|
namespace datalog {
|
|
|
|
class mk_interp_tail_simplifier : public rule_transformer::plugin {
|
|
|
|
class rule_substitution
|
|
{
|
|
ast_manager& m;
|
|
context& m_context;
|
|
substitution m_subst;
|
|
unifier m_unif;
|
|
|
|
rule * m_rule;
|
|
|
|
void apply(app * a, app_ref& res);
|
|
public:
|
|
rule_substitution(context & ctx)
|
|
: m(ctx.get_manager()), m_context(ctx), m_subst(m), m_unif(m), m_rule(0) {}
|
|
|
|
/**
|
|
Reset substitution and get it ready for working with rule r.
|
|
|
|
As long as this object is used without a reset, the rule r must exist.
|
|
*/
|
|
void reset(rule * r);
|
|
|
|
/** Reset subtitution and unify tail tgt_idx of the target rule and the head of the src rule */
|
|
bool unify(expr * e1, expr * e2);
|
|
|
|
void get_result(rule_ref & res);
|
|
|
|
void display(std::ostream& stm) {
|
|
m_subst.display(stm);
|
|
}
|
|
};
|
|
|
|
|
|
ast_manager & m;
|
|
context & m_context;
|
|
th_rewriter & m_simp;
|
|
|
|
rule_substitution m_rule_subst;
|
|
|
|
class normalizer_cfg;
|
|
|
|
void simplify_expr(app * a, expr_ref& res);
|
|
|
|
/** return true if some propagation was done */
|
|
bool propagate_variable_equivalences(rule * r, rule_ref& res);
|
|
|
|
/** Return true if something was modified */
|
|
bool transform_rules(const rule_set & orig, rule_set & tgt);
|
|
public:
|
|
mk_interp_tail_simplifier(context & ctx, unsigned priority=40000)
|
|
: plugin(priority),
|
|
m(ctx.get_manager()),
|
|
m_context(ctx),
|
|
m_simp(ctx.get_rewriter()),
|
|
m_rule_subst(ctx) {}
|
|
|
|
/**If rule should be retained, assign transformed version to res and return true;
|
|
if rule can be deleted, return false.
|
|
|
|
This method is kind of useful, so it's public to allow other rules to use it,
|
|
e.g. on their intermediate results.
|
|
*/
|
|
bool transform_rule(rule * r, rule_ref& res);
|
|
|
|
rule_set * operator()(rule_set const & source, model_converter_ref& mc, proof_converter_ref& pc);
|
|
};
|
|
|
|
};
|
|
|
|
#endif /* _DL_MK_INTERP_TAIL_SIMPLIFIER_H_ */
|
|
|