2014-06-21 20:37:44 +00:00
|
|
|
/*
|
|
|
|
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
|
|
|
|
#include <utility>
|
|
|
|
#include <functional>
|
|
|
|
#include "util/lua.h"
|
|
|
|
#include "util/lazy_list.h"
|
|
|
|
#include "util/name_generator.h"
|
2014-06-23 19:38:57 +00:00
|
|
|
#include "util/sexpr/options.h"
|
2014-06-21 20:37:44 +00:00
|
|
|
#include "kernel/constraint.h"
|
|
|
|
#include "kernel/environment.h"
|
|
|
|
#include "kernel/metavar.h"
|
|
|
|
|
2014-06-23 19:38:57 +00:00
|
|
|
#ifndef LEAN_DEFAULT_UNIFIER_MAX_STEPS
|
|
|
|
#define LEAN_DEFAULT_UNIFIER_MAX_STEPS 10000
|
|
|
|
#endif
|
|
|
|
|
2014-07-05 16:43:16 +00:00
|
|
|
#ifndef LEAN_DEFAULT_UNIFIER_UNFOLD_OPAQUE
|
|
|
|
#define LEAN_DEFAULT_UNIFIER_UNFOLD_OPAQUE false
|
|
|
|
#endif
|
|
|
|
|
2014-06-21 20:37:44 +00:00
|
|
|
namespace lean {
|
2014-06-25 15:30:09 +00:00
|
|
|
unsigned get_unifier_max_steps(options const & opts);
|
2014-07-05 16:43:16 +00:00
|
|
|
bool get_unifier_unfold_opaque(options const & opts);
|
2014-06-25 15:30:09 +00:00
|
|
|
|
2014-06-30 01:26:07 +00:00
|
|
|
bool is_simple_meta(expr const & e);
|
|
|
|
|
2014-06-21 20:37:44 +00:00
|
|
|
enum class unify_status { Solved, Failed, Unsupported };
|
|
|
|
/**
|
|
|
|
\brief Handle the easy-cases: first-order unification, higher-order patterns, identical terms, and terms without metavariables.
|
|
|
|
|
|
|
|
This function assumes that all assigned metavariables have been substituted.
|
|
|
|
*/
|
|
|
|
std::pair<unify_status, substitution> unify_simple(substitution const & s, expr const & lhs, expr const & rhs, justification const & j);
|
|
|
|
std::pair<unify_status, substitution> unify_simple(substitution const & s, level const & lhs, level const & rhs, justification const & j);
|
|
|
|
std::pair<unify_status, substitution> unify_simple(substitution const & s, constraint const & c);
|
|
|
|
|
|
|
|
lazy_list<substitution> unify(environment const & env, unsigned num_cs, constraint const * cs, name_generator const & ngen,
|
2014-07-05 17:15:32 +00:00
|
|
|
bool use_exception = true, unsigned max_steps = LEAN_DEFAULT_UNIFIER_MAX_STEPS,
|
|
|
|
bool unfold_opaque = LEAN_DEFAULT_UNIFIER_UNFOLD_OPAQUE);
|
2014-07-05 16:43:16 +00:00
|
|
|
lazy_list<substitution> unify(environment const & env, unsigned num_cs, constraint const * cs, name_generator const & ngen,
|
2014-07-05 17:15:32 +00:00
|
|
|
bool use_exception, options const & o);
|
2014-07-05 16:43:16 +00:00
|
|
|
lazy_list<substitution> unify(environment const & env, expr const & lhs, expr const & rhs, name_generator const & ngen,
|
2014-07-05 17:15:32 +00:00
|
|
|
substitution const & s = substitution(), unsigned max_steps = LEAN_DEFAULT_UNIFIER_MAX_STEPS,
|
|
|
|
bool unfold_opaque = LEAN_DEFAULT_UNIFIER_UNFOLD_OPAQUE);
|
2014-07-03 18:15:43 +00:00
|
|
|
lazy_list<substitution> unify(environment const & env, expr const & lhs, expr const & rhs, name_generator const & ngen, substitution const & s,
|
2014-07-05 17:15:32 +00:00
|
|
|
options const & o);
|
2014-06-23 19:38:57 +00:00
|
|
|
|
|
|
|
class unifier_exception : public exception {
|
|
|
|
justification m_jst;
|
2014-06-25 16:41:25 +00:00
|
|
|
substitution m_subst;
|
2014-06-23 19:38:57 +00:00
|
|
|
public:
|
2014-06-25 16:41:25 +00:00
|
|
|
unifier_exception(justification const & j, substitution const & s):exception("unifier exception"), m_jst(j), m_subst(s) {}
|
|
|
|
virtual exception * clone() const { return new unifier_exception(m_jst, m_subst); }
|
2014-06-23 19:38:57 +00:00
|
|
|
virtual void rethrow() const { throw *this; }
|
|
|
|
justification const & get_justification() const { return m_jst; }
|
2014-06-25 16:41:25 +00:00
|
|
|
substitution const & get_substitution() const { return m_subst; }
|
2014-06-23 19:38:57 +00:00
|
|
|
};
|
2014-06-21 20:37:44 +00:00
|
|
|
|
|
|
|
void open_unifier(lua_State * L);
|
|
|
|
}
|