chore(kernel): move abstract_type_context to library

This commit is contained in:
Leonardo de Moura 2018-09-08 08:28:40 -07:00
parent 3e5f59d6df
commit dacc4c9cd6
15 changed files with 90 additions and 23 deletions

View file

@ -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 {

View file

@ -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)

View file

@ -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))

View file

@ -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)

View file

@ -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) {

View file

@ -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() {}

View file

@ -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"

View file

@ -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);
}

View file

@ -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();

View file

@ -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"

View file

@ -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. */

View file

@ -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 {
/**

View file

@ -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;

View file

@ -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"

View file

@ -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"