/*++
Copyright (c) 2012 Microsoft Corporation

Module Name:

    dl_mk_partial_equiv.h

Abstract:

    Rule transformer which identifies predicates that are partial equivalence relations.

Author:

    Nikolaj Bjorner (nbjorner) 2012-05-14

Revision History:

--*/


#ifndef _DL_MK_PARTIAL_EQUIVALENCE_TRANSFORMER_H_
#define _DL_MK_PARTIAL_EQUIVALENCE_TRANSFORMER_H_

#include "dl_context.h"
#include "dl_rule_transformer.h"

namespace datalog {

    class mk_partial_equivalence_transformer : public rule_transformer::plugin {
        ast_manager & m;
        context &     m_context;
    public:
        mk_partial_equivalence_transformer(context & ctx, unsigned priority=45000)
            : plugin(priority),
            m(ctx.get_manager()),
            m_context(ctx) {}

        rule_set * operator()(rule_set const & source, model_converter_ref& mc, proof_converter_ref& pc);

    private:

        bool is_symmetry(rule const* r);
        bool is_transitivity(rule const* r);
    };

};

#endif /* _DL_MK_PARTIAL_EQUIV_TRANSFORMER_H_ */


