| /* | |
| Copyright (c) 2014 Microsoft Corporation. All rights reserved. | |
| Released under Apache 2.0 license as described in the file LICENSE. | |
| Author: Leonardo de Moura | |
| */ | |
| #pragma once | |
| namespace lean { | |
| class expr; | |
| // ======================================= | |
| // Structural equality | |
| /** \brief Binder information is ignored in the following predicate */ | |
| bool is_equal(expr const & a, expr const & b); | |
| inline bool operator==(expr const & a, expr const & b) { return is_equal(a, b); } | |
| inline bool operator!=(expr const & a, expr const & b) { return !operator==(a, b); } | |
| // ======================================= | |
| /** \brief Similar to ==, but it also compares binder information */ | |
| bool is_bi_equal(expr const & a, expr const & b); | |
| struct is_bi_equal_proc { bool operator()(expr const & e1, expr const & e2) const { return is_bi_equal(e1, e2); } }; | |
| /** Similar to is_bi_equal_proc, but it has a flag that allows us to switch select == or is_bi_equal */ | |
| struct is_cond_bi_equal_proc { | |
| bool m_use_bi; | |
| is_cond_bi_equal_proc(bool b):m_use_bi(b) {} | |
| bool operator()(expr const & e1, expr const & e2) const { return m_use_bi ? is_bi_equal(e1, e2) : e1 == e2; } | |
| }; | |
| } |