feat(library): add simple normalization procedure
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
4103c85ce3
commit
11793e7998
3 changed files with 62 additions and 1 deletions
|
@ -1,6 +1,6 @@
|
||||||
add_library(library deep_copy.cpp expr_lt.cpp io_state.cpp occurs.cpp
|
add_library(library deep_copy.cpp expr_lt.cpp io_state.cpp occurs.cpp
|
||||||
kernel_bindings.cpp io_state_stream.cpp bin_app.cpp
|
kernel_bindings.cpp io_state_stream.cpp bin_app.cpp
|
||||||
resolve_macro.cpp kernel_serializer.cpp max_sharing.cpp)
|
resolve_macro.cpp kernel_serializer.cpp max_sharing.cpp normalize.cpp)
|
||||||
# placeholder.cpp fo_unify.cpp hop_match.cpp)
|
# placeholder.cpp fo_unify.cpp hop_match.cpp)
|
||||||
|
|
||||||
target_link_libraries(library ${LEAN_LIBS})
|
target_link_libraries(library ${LEAN_LIBS})
|
||||||
|
|
48
src/library/normalize.cpp
Normal file
48
src/library/normalize.cpp
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2014 Microsoft Corporation. All rights reserved.
|
||||||
|
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 "kernel/instantiate.h"
|
||||||
|
#include "kernel/abstract.h"
|
||||||
|
|
||||||
|
namespace lean {
|
||||||
|
static name g_tmp_prefix = name::mk_internal_unique_name();
|
||||||
|
|
||||||
|
class normalize_fn {
|
||||||
|
type_checker m_tc;
|
||||||
|
name_generator m_ngen;
|
||||||
|
|
||||||
|
expr normalize_binding(expr const & e) {
|
||||||
|
expr d = normalize(binding_domain(e));
|
||||||
|
expr l = mk_local(m_ngen.next(), binding_name(e), d);
|
||||||
|
expr b = abstract(normalize(instantiate(binding_body(e), l)), l);
|
||||||
|
return update_binding(e, d, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
expr normalize(expr e) {
|
||||||
|
e = m_tc.whnf(e);
|
||||||
|
switch (e.kind()) {
|
||||||
|
case expr_kind::Var: case expr_kind::Constant: case expr_kind::Sort:
|
||||||
|
case expr_kind::Meta: case expr_kind::Local: case expr_kind::Macro:
|
||||||
|
return e;
|
||||||
|
case expr_kind::Let:
|
||||||
|
lean_unreachable(); // LCOV_EXCL_LINE
|
||||||
|
case expr_kind::Lambda: case expr_kind::Pi:
|
||||||
|
return normalize_binding(e);
|
||||||
|
case expr_kind::App:
|
||||||
|
return update_app(e, app_fn(e), normalize(app_arg(e)));
|
||||||
|
}
|
||||||
|
lean_unreachable(); // LCOV_EXCL_LINE
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
normalize_fn(environment const & env):m_tc(env), m_ngen(g_tmp_prefix) {}
|
||||||
|
expr operator()(expr const & e) { return normalize(e); }
|
||||||
|
};
|
||||||
|
|
||||||
|
expr normalize(environment const & env, expr const & e) { return normalize_fn(env)(e); }
|
||||||
|
}
|
13
src/library/normalize.h
Normal file
13
src/library/normalize.h
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
/*
|
||||||
|
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 "kernel/expr.h"
|
||||||
|
|
||||||
|
namespace lean {
|
||||||
|
/** \brief Return the \c e normal form with respect to the environment \c env. */
|
||||||
|
expr normalize(environment const & env, expr const & e);
|
||||||
|
}
|
Loading…
Reference in a new issue