chore(kernel): move abstract_type_context to library
This commit is contained in:
parent
3e5f59d6df
commit
dacc4c9cd6
15 changed files with 90 additions and 23 deletions
|
|
@ -15,7 +15,7 @@ Author: Leonardo de Moura
|
|||
#include "util/sexpr/options.h"
|
||||
#include "util/sexpr/format.h"
|
||||
#include "kernel/environment.h"
|
||||
#include "kernel/abstract_type_context.h"
|
||||
#include "library/abstract_type_context.h"
|
||||
#include "frontends/lean/token_table.h"
|
||||
|
||||
namespace lean {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
add_library(kernel OBJECT level.cpp expr.cpp expr_eq_fn.cpp
|
||||
for_each_fn.cpp replace_fn.cpp abstract.cpp
|
||||
instantiate.cpp local_ctx.cpp declaration.cpp environment.cpp
|
||||
type_checker.cpp init_module.cpp expr_cache.cpp equiv_manager.cpp quot.cpp
|
||||
abstract_type_context.cpp inductive.cpp)
|
||||
for_each_fn.cpp replace_fn.cpp abstract.cpp instantiate.cpp
|
||||
local_ctx.cpp declaration.cpp environment.cpp type_checker.cpp
|
||||
init_module.cpp expr_cache.cpp equiv_manager.cpp quot.cpp
|
||||
inductive.cpp)
|
||||
|
|
|
|||
|
|
@ -16,12 +16,11 @@ Author: Leonardo de Moura
|
|||
#include "kernel/local_ctx.h"
|
||||
#include "kernel/expr_maps.h"
|
||||
#include "kernel/equiv_manager.h"
|
||||
#include "kernel/abstract_type_context.h"
|
||||
|
||||
namespace lean {
|
||||
/** \brief Lean Type Checker. It can also be used to infer types, check whether a
|
||||
type \c A is convertible to a type \c B, etc. */
|
||||
class type_checker : public abstract_type_context {
|
||||
class type_checker {
|
||||
/* In the type checker cache, we must take into account binder information.
|
||||
Examples:
|
||||
The type of (lambda x : A, t) is (Pi x : A, typeof(t))
|
||||
|
|
|
|||
|
|
@ -16,4 +16,4 @@ add_library(library OBJECT deep_copy.cpp expr_lt.cpp io_state.cpp
|
|||
check.cpp parray.cpp process.cpp
|
||||
pipe.cpp handle.cpp profiling.cpp time_task.cpp abstract_context_cache.cpp
|
||||
context_cache.cpp scope_pos_info_provider.cpp error_msgs.cpp formatter.cpp pos_info_provider.cpp
|
||||
derive_attribute.cpp)
|
||||
derive_attribute.cpp abstract_type_context.cpp)
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ Released under Apache 2.0 license as described in the file LICENSE.
|
|||
Author: Leonardo de Moura
|
||||
*/
|
||||
#include "util/fresh_name.h"
|
||||
#include "kernel/abstract_type_context.h"
|
||||
#include "kernel/abstract.h"
|
||||
#include "library/abstract_type_context.h"
|
||||
|
||||
namespace lean {
|
||||
expr abstract_type_context::push_local(name const & pp_name, expr const & type, binder_info bi) {
|
||||
|
|
@ -8,12 +8,6 @@ Author: Leonardo de Moura
|
|||
#include "kernel/expr.h"
|
||||
|
||||
namespace lean {
|
||||
/** \brief This is a basic API for implementing macro definitions,
|
||||
kernel extensions, formatters, etc.
|
||||
|
||||
\remark This class will eventually replace the class extension_context.
|
||||
|
||||
TODO(Leo): try to remove this class from Lean4. */
|
||||
class abstract_type_context {
|
||||
public:
|
||||
virtual ~abstract_type_context() {}
|
||||
|
|
@ -8,7 +8,7 @@ Author: Leonardo de Moura
|
|||
#include <memory>
|
||||
#include <string>
|
||||
#include "runtime/sstream.h"
|
||||
#include "kernel/abstract_type_context.h"
|
||||
#include "library/abstract_type_context.h"
|
||||
#include "library/annotation.h"
|
||||
#include "library/pos_info_provider.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -5,10 +5,78 @@ Released under Apache 2.0 license as described in the file LICENSE.
|
|||
Author: Leonardo de Moura
|
||||
*/
|
||||
#include "util/name_generator.h"
|
||||
#include "kernel/type_checker.h"
|
||||
#include "library/util.h"
|
||||
#include "library/constants.h"
|
||||
|
||||
namespace lean {
|
||||
static name * g_constructions_fresh = nullptr;
|
||||
|
||||
static level get_level(type_checker & ctx, expr const & A) {
|
||||
expr S = ctx.whnf(ctx.infer(A));
|
||||
if (!is_sort(S))
|
||||
throw exception("invalid expression, sort expected");
|
||||
return sort_level(S);
|
||||
}
|
||||
|
||||
expr mk_and_intro(type_checker & ctx, expr const & Ha, expr const & Hb) {
|
||||
return mk_app(mk_constant(get_and_intro_name()), ctx.infer(Ha), ctx.infer(Hb), Ha, Hb);
|
||||
}
|
||||
|
||||
expr mk_and_elim_left(type_checker & ctx, expr const & H) {
|
||||
expr a_and_b = ctx.whnf(ctx.infer(H));
|
||||
return mk_app(mk_constant(get_and_elim_left_name()), app_arg(app_fn(a_and_b)), app_arg(a_and_b), H);
|
||||
}
|
||||
|
||||
expr mk_and_elim_right(type_checker & ctx, expr const & H) {
|
||||
expr a_and_b = ctx.whnf(ctx.infer(H));
|
||||
return mk_app(mk_constant(get_and_elim_right_name()), app_arg(app_fn(a_and_b)), app_arg(a_and_b), H);
|
||||
}
|
||||
|
||||
expr mk_pprod(type_checker & ctx, expr const & A, expr const & B) {
|
||||
level l1 = get_level(ctx, A);
|
||||
level l2 = get_level(ctx, B);
|
||||
return mk_app(mk_constant(get_pprod_name(), {l1, l2}), A, B);
|
||||
}
|
||||
|
||||
expr mk_pprod_mk(type_checker & ctx, expr const & a, expr const & b) {
|
||||
expr A = ctx.infer(a);
|
||||
expr B = ctx.infer(b);
|
||||
level l1 = get_level(ctx, A);
|
||||
level l2 = get_level(ctx, B);
|
||||
return mk_app(mk_constant(get_pprod_mk_name(), {l1, l2}), A, B, a, b);
|
||||
}
|
||||
|
||||
expr mk_pprod_fst(type_checker & ctx, expr const & p) {
|
||||
expr AxB = ctx.whnf(ctx.infer(p));
|
||||
expr const & A = app_arg(app_fn(AxB));
|
||||
expr const & B = app_arg(AxB);
|
||||
return mk_app(mk_constant(get_pprod_fst_name(), const_levels(get_app_fn(AxB))), A, B, p);
|
||||
}
|
||||
|
||||
expr mk_pprod_snd(type_checker & ctx, expr const & p) {
|
||||
expr AxB = ctx.whnf(ctx.infer(p));
|
||||
expr const & A = app_arg(app_fn(AxB));
|
||||
expr const & B = app_arg(AxB);
|
||||
return mk_app(mk_constant(get_pprod_snd_name(), const_levels(get_app_fn(AxB))), A, B, p);
|
||||
}
|
||||
|
||||
expr mk_pprod(type_checker & ctx, expr const & a, expr const & b, bool prop) {
|
||||
return prop ? mk_and(a, b) : mk_pprod(ctx, a, b);
|
||||
}
|
||||
|
||||
expr mk_pprod_mk(type_checker & ctx, expr const & a, expr const & b, bool prop) {
|
||||
return prop ? mk_and_intro(ctx, a, b) : mk_pprod_mk(ctx, a, b);
|
||||
}
|
||||
|
||||
expr mk_pprod_fst(type_checker & ctx, expr const & p, bool prop) {
|
||||
return prop ? mk_and_elim_left(ctx, p) : mk_pprod_fst(ctx, p);
|
||||
}
|
||||
|
||||
expr mk_pprod_snd(type_checker & ctx, expr const & p, bool prop) {
|
||||
return prop ? mk_and_elim_right(ctx, p) : mk_pprod_snd(ctx, p);
|
||||
}
|
||||
|
||||
name_generator mk_constructions_name_generator() {
|
||||
return name_generator(*g_constructions_fresh);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,8 +6,14 @@ Author: Leonardo de Moura
|
|||
*/
|
||||
#pragma once
|
||||
#include "util/name_generator.h"
|
||||
#include "kernel/type_checker.h"
|
||||
|
||||
namespace lean {
|
||||
expr mk_pprod(type_checker & ctx, expr const & a, expr const & b, bool prop);
|
||||
expr mk_pprod_mk(type_checker & ctx, expr const & a, expr const & b, bool prop);
|
||||
expr mk_pprod_fst(type_checker & ctx, expr const & p, bool prop);
|
||||
expr mk_pprod_snd(type_checker & ctx, expr const & p, bool prop);
|
||||
|
||||
name_generator mk_constructions_name_generator();
|
||||
void initialize_constructions_util();
|
||||
void finalize_constructions_util();
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ Author: Leonardo de Moura
|
|||
#pragma once
|
||||
#include <string>
|
||||
#include "kernel/environment.h"
|
||||
#include "kernel/abstract_type_context.h"
|
||||
#include "library/abstract_type_context.h"
|
||||
#include "library/exception.h"
|
||||
#include "library/io_state.h"
|
||||
#include "library/ext_exception.h"
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ Author: Leonardo de Moura
|
|||
*/
|
||||
#pragma once
|
||||
#include "kernel/environment.h"
|
||||
#include "kernel/abstract_type_context.h"
|
||||
#include "library/abstract_type_context.h"
|
||||
|
||||
namespace lean {
|
||||
/** \brief Return true iff the given environment contains a sorry macro. */
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ Author: Leonardo de Moura
|
|||
*/
|
||||
#include <string>
|
||||
#include "kernel/environment.h"
|
||||
#include "kernel/abstract_type_context.h"
|
||||
#include "library/abstract_type_context.h"
|
||||
|
||||
namespace lean {
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ Author: Leonardo de Moura
|
|||
#include <string>
|
||||
#include "util/sexpr/option_declarations.h"
|
||||
#include "kernel/environment.h"
|
||||
#include "kernel/type_checker.h"
|
||||
#include "library/type_context.h"
|
||||
#include "library/io_state.h"
|
||||
#include "library/trace.h"
|
||||
#include "library/messages.h"
|
||||
|
|
@ -175,7 +175,7 @@ struct silent_ios_helper {
|
|||
};
|
||||
|
||||
MK_THREAD_LOCAL_GET_DEF(silent_ios_helper, get_silent_ios_helper);
|
||||
MK_THREAD_LOCAL_GET(type_checker, get_dummy_tc, get_dummy_env());
|
||||
MK_THREAD_LOCAL_GET(type_context_old, get_dummy_tc, get_dummy_env());
|
||||
|
||||
scope_trace_silent::scope_trace_silent(bool flag) {
|
||||
m_old_value = g_silent;
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ Author: Leonardo de Moura
|
|||
#include "util/lbool.h"
|
||||
#include "util/fresh_name.h"
|
||||
#include "kernel/environment.h"
|
||||
#include "kernel/abstract_type_context.h"
|
||||
#include "library/abstract_type_context.h"
|
||||
#include "library/idx_metavar.h"
|
||||
#include "library/projection.h"
|
||||
#include "library/metavar_context.h"
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ Author: Leonardo de Moura
|
|||
#include "kernel/instantiate.h"
|
||||
#include "kernel/type_checker.h"
|
||||
#include "kernel/abstract.h"
|
||||
#include "kernel/abstract_type_context.h"
|
||||
#include "kernel/inductive.h"
|
||||
#include "library/abstract_type_context.h"
|
||||
#include "library/error_msgs.h"
|
||||
#include "library/locals.h"
|
||||
#include "library/util.h"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue