2014-05-15 23:48:47 +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
|
2014-05-24 17:45:00 +00:00
|
|
|
#include <utility>
|
2014-05-25 13:05:31 +00:00
|
|
|
#include "util/lua.h"
|
2014-05-15 23:48:47 +00:00
|
|
|
#include "kernel/environment.h"
|
2014-05-24 17:45:00 +00:00
|
|
|
#include "library/expr_pair.h"
|
|
|
|
#include "library/io_state.h"
|
|
|
|
|
2014-05-15 23:48:47 +00:00
|
|
|
namespace lean {
|
|
|
|
/**
|
|
|
|
\brief Add an new coercion in the given environment.
|
|
|
|
|
|
|
|
There are three kinds of coercions supported
|
|
|
|
1- From type C to type D
|
|
|
|
type of f must have the form:
|
|
|
|
{l1 ... lk} Pi (x1 : A1) ... (xn : An) (y: C.{l1 ... lk} x1 ... xn), D.{L1 ... Lr} t1 ... tm
|
|
|
|
- C and D are constants.
|
|
|
|
- l1 ... lk are universe level parameters
|
|
|
|
- L1 ... Lr are universe level expressions
|
|
|
|
- t1 ... tm are level expressions
|
|
|
|
|
|
|
|
2- From type to sort
|
|
|
|
type of f must have the form:
|
|
|
|
{l1 ... lk} Pi (x1 : A1) ... (xn : An) (y: C.{l1 ... lk} x1 ... xn) (x : A), B
|
|
|
|
|
|
|
|
3- From type to function type
|
|
|
|
type of f must have the form:
|
|
|
|
{l1 ... lk} Pi (x1 : A1) ... (xn : An) (y: C.{l1 ... lk} x1 ... xn), Type.{L}
|
|
|
|
|
|
|
|
\pre \c f is a constant defined in \c env.
|
2014-05-24 17:45:00 +00:00
|
|
|
|
|
|
|
\remark \c ios is used to report warning messages.
|
2014-05-15 23:48:47 +00:00
|
|
|
*/
|
2014-06-26 15:08:39 +00:00
|
|
|
environment add_coercion(environment const & env, name const & f, io_state const & ios);
|
2014-05-24 17:45:00 +00:00
|
|
|
environment add_coercion(environment const & env, name const & f, name const & C, io_state const & ios);
|
2014-05-25 15:38:50 +00:00
|
|
|
bool is_coercion(environment const & env, name const & f);
|
2014-05-15 23:48:47 +00:00
|
|
|
bool is_coercion(environment const & env, expr const & f);
|
2014-05-24 17:45:00 +00:00
|
|
|
/** \brief Return true iff the given environment has coercions from a user-class named \c C. */
|
|
|
|
bool has_coercions_from(environment const & env, name const & C);
|
|
|
|
bool has_coercions_from(environment const & env, expr const & C);
|
2014-06-27 01:38:27 +00:00
|
|
|
/** \brief Return true iff the given environment has coercions to a user-class named \c D. */
|
|
|
|
bool has_coercions_to(environment const & env, name const & D);
|
2014-05-24 17:45:00 +00:00
|
|
|
/**
|
|
|
|
\brief Return a coercion (if it exists) from (C_name.{l1 lk} t_1 ... t_n) to the class named D.
|
|
|
|
The coercion is a unary function that takes a term of type (C_name.{l1 lk} t_1 ... t_n) and returns
|
|
|
|
and element of type (D.{L_1 L_o} s_1 ... s_m)
|
|
|
|
*/
|
|
|
|
optional<expr> get_coercion(environment const & env, expr const & C, name const & D);
|
|
|
|
optional<expr> get_coercion_to_sort(environment const & env, expr const & C);
|
|
|
|
optional<expr> get_coercion_to_fun(environment const & env, expr const & C);
|
|
|
|
/**
|
|
|
|
\brief Return all user coercions C >-> D for the type C of the form (C_name.{l1 ... lk} t_1 ... t_n)
|
2014-05-25 18:35:47 +00:00
|
|
|
The result is a pair (user-class D, coercion, coercion type), and is stored in the result buffer \c result.
|
2014-05-24 17:45:00 +00:00
|
|
|
The Boolean result is true if at least one pair is added to \c result.
|
|
|
|
|
|
|
|
\remark The most recent coercions occur first.
|
|
|
|
*/
|
2014-05-25 18:35:47 +00:00
|
|
|
bool get_user_coercions(environment const & env, expr const & C, buffer<std::tuple<name, expr, expr>> & result);
|
2014-05-25 13:05:31 +00:00
|
|
|
|
2014-05-25 14:24:58 +00:00
|
|
|
void for_each_coercion_user(environment const & env,
|
|
|
|
std::function<void(name const &, name const &, expr const &, level_param_names const &, unsigned)> const & f);
|
|
|
|
void for_each_coercion_sort(environment const & env,
|
|
|
|
std::function<void(name const &, expr const &, level_param_names const &, unsigned)> const & f);
|
|
|
|
void for_each_coercion_fun(environment const & env,
|
|
|
|
std::function<void(name const &, expr const &, level_param_names const &, unsigned)> const & f);
|
|
|
|
|
2014-05-25 13:05:31 +00:00
|
|
|
void open_coercion(lua_State * L);
|
2014-05-15 23:48:47 +00:00
|
|
|
}
|