/* Copyright (c) 2015 Daniel Selsam. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Daniel Selsam */ #pragma once #include "kernel/environment.h" #include "library/expr_pair.h" #include "library/io_state.h" #include "library/head_map.h" #include "util/priority_queue.h" namespace lean { /* Users can declare unification hints using the following structures: structure unification_constraint := {A : Type} (lhs : A) (rhs : A) structure unification_hint := (pattern : unification_constraint) (constraints : list unification_constraint) Example: definition both_zero_of_add_eq_zero [unify] (n₁ n₂ : ℕ) (s₁ : has_add ℕ) (s₂ : has_zero ℕ) : unification_hint := unification_hint.mk (unification_constraint.mk (@add ℕ s₁ n₁ n₂) (@zero ℕ s₂)) [unification_constraint.mk n₁ (@zero ℕ s₂), unification_constraint.mk n₂ (@zero ℕ s₂)] creates the following unification hint: m_lhs: add nat #1 #3 #2 m_rhs: zero nat #0 m_constraints: [(#3, zero nat #0), (#2, zero nat #0)] m_num_vars: #4 Note that once we have an assignment to all variables from matching, we must substitute the assignments in the constraints. */ class unification_hint { expr m_lhs; expr m_rhs; list m_constraints; unsigned m_num_vars; public: expr get_lhs() const { return m_lhs; } expr get_rhs() const { return m_rhs; } list get_constraints() const { return m_constraints; } unsigned get_num_vars() const { return m_num_vars; } unification_hint() {} unification_hint(expr const & lhs, expr const & rhs, list const & constraints, unsigned num_vars); format pp(unsigned priority, formatter const & fmt) const; }; struct unification_hint_cmp { int operator()(unification_hint const & uh1, unification_hint const & uh2) const; }; typedef priority_queue unification_hint_queue; typedef rb_map unification_hints; unification_hints get_unification_hints(environment const & env); void get_unification_hints(environment const & env, name const & n1, name const & n2, buffer & hints); format pp_unification_hints(unification_hints const & hints, formatter const & fmt); void initialize_unification_hint(); void finalize_unification_hint(); }