lean4-htt/src/library/fun_info.h

107 lines
4.1 KiB
C++

/*
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
*/
#pragma once
#include "library/type_context.h"
namespace lean {
/** \brief Function parameter information. */
class param_info {
unsigned m_implicit:1;
unsigned m_inst_implicit:1;
unsigned m_prop:1;
unsigned m_has_fwd_deps:1; // true if rest depends on this parameter
list<unsigned> m_back_deps; // previous arguments it depends on
public:
param_info(bool imp, bool inst_imp, bool prop, bool has_fwd_deps, list<unsigned> const & back_deps):
m_implicit(imp), m_inst_implicit(inst_imp), m_prop(prop),
m_has_fwd_deps(has_fwd_deps), m_back_deps(back_deps) {}
list<unsigned> const & get_back_deps() const { return m_back_deps; }
bool is_implicit() const { return m_implicit; }
bool is_inst_implicit() const { return m_inst_implicit; }
bool is_prop() const { return m_prop; }
bool has_fwd_deps() const { return m_has_fwd_deps; }
};
/** \brief Function information produced by get_fun_info procedures. */
class fun_info {
unsigned m_arity;
list<param_info> m_params_info;
list<unsigned> m_result_deps; // resulting type dependencies
public:
fun_info():m_arity(0) {}
fun_info(unsigned arity, list<param_info> const & info, list<unsigned> const & result_deps):
m_arity(arity), m_params_info(info), m_result_deps(result_deps) {}
unsigned get_arity() const { return m_arity; }
list<param_info> const & get_params_info() const { return m_params_info; }
list<unsigned> const & get_result_deps() const { return m_result_deps; }
};
fun_info get_fun_info(type_context & ctx, expr const & fn);
/** \brief Return information assuming the function has only nargs.
\pre nargs <= get_fun_info(ctx, fn).get_arity() */
fun_info get_fun_info(type_context & ctx, expr const & fn, unsigned nargs);
/** \brief Subsingleton parameter information */
class subsingleton_param_info {
/* m_specialized is true if the result of fun_info has been specifialized
using this argument.
For example, consider the function
f : Pi (A : Type), A -> A
Now, suppse we request get_specialize fun_info for the application
f unit a
fun_info_manager returns two param_info objects:
1) m_specialized = true
2) m_subsingleton = true
Note that, in general, the second argument of f is not a subsingleton,
but it is in this particular case/specialization.
\remark This bit is only set if it is a dependent parameter (i.e., m_is_dep is true).
Moreover, we only set m_specialized IF another parameter
becomes a subsingleton or proposition. */
unsigned short m_specialized;
unsigned short m_subsingleton;
public:
subsingleton_param_info(bool spec, bool ss):
m_specialized(spec), m_subsingleton(ss) {}
bool specialized() const { return m_specialized; }
bool is_subsingleton() const { return m_subsingleton; }
void set_specialized() { m_specialized = true; }
};
typedef subsingleton_param_info ss_param_info;
typedef list<ss_param_info> ss_param_infos;
list<ss_param_info> get_subsingleton_info(type_context & ctx, expr const & fn);
list<ss_param_info> get_subsingleton_info(type_context & ctx, expr const & fn, unsigned nargs);
/** \brief Return subsingleton parameter information for the function application.
This is more precise than \c get_subsingleton_info for dependent functions.
Example: given (f : Pi (A : Type), A -> A), \c get_specialized_fun_info for
f unit b
returns a \c fun_info with two param_info
1) m_specialized = true
2) m_subsingleton = true
The second argument is marked as subsingleton only because the resulting information
is taking into account the first argument. */
list<ss_param_info> get_specialized_subsingleton_info(type_context & ctx, expr const & app);
unsigned get_specialization_prefix_size(type_context & ctx, expr const & fn, unsigned nargs);
/** Clear thread local cache */
void clear_fun_info_cache();
void initialize_fun_info();
void finalize_fun_info();
}