feat(kernel,frontends/lean/builtin_cmds): allow kernel extensions to report their builtin constants

This commit is contained in:
Leonardo de Moura 2015-05-29 16:28:16 -07:00
parent c07d14e94a
commit 7a0e198147
11 changed files with 26 additions and 6 deletions

View file

@ -71,12 +71,7 @@ static void print_axioms(parser & p) {
environment const & env = p.env(); environment const & env = p.env();
env.for_each_declaration([&](declaration const & d) { env.for_each_declaration([&](declaration const & d) {
name const & n = d.get_name(); name const & n = d.get_name();
if (!d.is_definition() && if (!d.is_definition() && !env.is_builtin(n)) {
!is_quotient_decl(env, n) &&
!is_hits_decl(env, n) &&
!inductive::is_inductive_decl(env, n) &&
!inductive::is_elim_rule(env, n) &&
!inductive::is_intro_rule(env, n)) {
p.regular_stream() << n << " : " << d.get_type() << endl; p.regular_stream() << n << " : " << d.get_type() << endl;
has_axioms = true; has_axioms = true;
} }

View file

@ -57,6 +57,7 @@ public:
bool impredicative() const { return m_impredicative; } bool impredicative() const { return m_impredicative; }
normalizer_extension const & norm_ext() const { return *(m_norm_ext.get()); } normalizer_extension const & norm_ext() const { return *(m_norm_ext.get()); }
bool is_recursor(environment const & env, name const & n) const { return m_norm_ext->is_recursor(env, n); } bool is_recursor(environment const & env, name const & n) const { return m_norm_ext->is_recursor(env, n); }
bool is_builtin(environment const & env, name const & n) const { return m_norm_ext->is_builtin(env, n); }
}; };
class environment_extension { class environment_extension {
@ -137,6 +138,8 @@ public:
bool is_recursor(name const & n) const { return m_header->is_recursor(*this, n); } bool is_recursor(name const & n) const { return m_header->is_recursor(*this, n); }
bool is_builtin(name const & n) const { return m_header->is_builtin(*this, n); }
/** \brief Return true iff the environment treats universe level 0 as an impredicative Prop */ /** \brief Return true iff the environment treats universe level 0 as an impredicative Prop */
bool impredicative() const { return m_header->impredicative(); } bool impredicative() const { return m_header->impredicative(); }

View file

@ -133,6 +133,10 @@ bool hits_normalizer_extension::is_recursor(environment const &, name const & n)
return n == *g_trunc_rec || n == *g_type_quotient_rec; return n == *g_trunc_rec || n == *g_type_quotient_rec;
} }
bool hits_normalizer_extension::is_builtin(environment const & env, name const & n) const {
return is_hits_decl(env, n);
}
bool is_hits_decl(environment const & env, name const & n) { bool is_hits_decl(environment const & env, name const & n) {
if (!get_extension(env).m_initialized) if (!get_extension(env).m_initialized)
return false; return false;

View file

@ -18,6 +18,7 @@ public:
virtual optional<expr> is_stuck(expr const & e, extension_context & ctx) const; virtual optional<expr> is_stuck(expr const & e, extension_context & ctx) const;
virtual bool supports(name const & feature) const; virtual bool supports(name const & feature) const;
virtual bool is_recursor(environment const & env, name const & n) const; virtual bool is_recursor(environment const & env, name const & n) const;
virtual bool is_builtin(environment const & env, name const & n) const;
}; };
/** \brief The following function must be invoked to register the builtin HITs computation rules in the kernel. */ /** \brief The following function must be invoked to register the builtin HITs computation rules in the kernel. */

View file

@ -957,6 +957,10 @@ bool inductive_normalizer_extension::is_recursor(environment const & env, name c
return static_cast<bool>(is_elim_rule(env, n)); return static_cast<bool>(is_elim_rule(env, n));
} }
bool inductive_normalizer_extension::is_builtin(environment const & env, name const & n) const {
return is_inductive_decl(env, n) || is_elim_rule(env, n) || is_intro_rule(env, n);
}
template<typename Ctx> template<typename Ctx>
optional<expr> is_elim_meta_app_core(Ctx & ctx, expr const & e) { optional<expr> is_elim_meta_app_core(Ctx & ctx, expr const & e) {
inductive_env_ext const & ext = get_extension(ctx.env()); inductive_env_ext const & ext = get_extension(ctx.env());

View file

@ -20,6 +20,7 @@ public:
virtual optional<expr> is_stuck(expr const & e, extension_context & ctx) const; virtual optional<expr> is_stuck(expr const & e, extension_context & ctx) const;
virtual bool supports(name const & feature) const; virtual bool supports(name const & feature) const;
virtual bool is_recursor(environment const & env, name const & n) const; virtual bool is_recursor(environment const & env, name const & n) const;
virtual bool is_builtin(environment const & env, name const & n) const;
}; };
/** \brief Introduction rule */ /** \brief Introduction rule */

View file

@ -15,6 +15,7 @@ public:
virtual optional<expr> is_stuck(expr const &, extension_context &) const { return none_expr(); } virtual optional<expr> is_stuck(expr const &, extension_context &) const { return none_expr(); }
virtual bool supports(name const &) const { return false; } virtual bool supports(name const &) const { return false; }
virtual bool is_recursor(environment const &, name const &) const { return false; } virtual bool is_recursor(environment const &, name const &) const { return false; }
virtual bool is_builtin(environment const &, name const &) const { return false; }
}; };
std::unique_ptr<normalizer_extension> mk_id_normalizer_extension() { std::unique_ptr<normalizer_extension> mk_id_normalizer_extension() {
@ -49,6 +50,10 @@ public:
virtual bool is_recursor(environment const & env, name const & n) const { virtual bool is_recursor(environment const & env, name const & n) const {
return m_ext1->is_recursor(env, n) || m_ext2->is_recursor(env, n); return m_ext1->is_recursor(env, n) || m_ext2->is_recursor(env, n);
} }
virtual bool is_builtin(environment const & env, name const & n) const {
return m_ext1->is_builtin(env, n) || m_ext2->is_builtin(env, n);
}
}; };
std::unique_ptr<normalizer_extension> compose(std::unique_ptr<normalizer_extension> && ext1, std::unique_ptr<normalizer_extension> && ext2) { std::unique_ptr<normalizer_extension> compose(std::unique_ptr<normalizer_extension> && ext1, std::unique_ptr<normalizer_extension> && ext2) {

View file

@ -26,6 +26,7 @@ public:
this method is only used for sanity checking. */ this method is only used for sanity checking. */
virtual bool supports(name const & feature) const = 0; virtual bool supports(name const & feature) const = 0;
virtual bool is_recursor(environment const & env, name const & n) const = 0; virtual bool is_recursor(environment const & env, name const & n) const = 0;
virtual bool is_builtin(environment const & env, name const & n) const = 0;
}; };
inline optional<pair<expr, constraint_seq>> none_ecs() { return optional<pair<expr, constraint_seq>>(); } inline optional<pair<expr, constraint_seq>> none_ecs() { return optional<pair<expr, constraint_seq>>(); }

View file

@ -126,6 +126,10 @@ bool quotient_normalizer_extension::is_recursor(environment const &, name const
return n == *g_quotient_lift || n == *g_quotient_ind; return n == *g_quotient_lift || n == *g_quotient_ind;
} }
bool quotient_normalizer_extension::is_builtin(environment const & env, name const & n) const {
return is_quotient_decl(env, n);
}
bool is_quotient_decl(environment const & env, name const & n) { bool is_quotient_decl(environment const & env, name const & n) {
if (!get_extension(env).m_initialized) if (!get_extension(env).m_initialized)
return false; return false;

View file

@ -16,6 +16,7 @@ public:
virtual optional<expr> is_stuck(expr const & e, extension_context & ctx) const; virtual optional<expr> is_stuck(expr const & e, extension_context & ctx) const;
virtual bool supports(name const & feature) const; virtual bool supports(name const & feature) const;
virtual bool is_recursor(environment const & env, name const & n) const; virtual bool is_recursor(environment const & env, name const & n) const;
virtual bool is_builtin(environment const & env, name const & n) const;
}; };
/** \brief The following function must be invoked to register the quotient type computation rules in the kernel. */ /** \brief The following function must be invoked to register the quotient type computation rules in the kernel. */

View file

@ -137,6 +137,7 @@ public:
virtual optional<expr> is_stuck(expr const &, extension_context &) const { return none_expr(); } virtual optional<expr> is_stuck(expr const &, extension_context &) const { return none_expr(); }
virtual bool supports(name const &) const { return false; } virtual bool supports(name const &) const { return false; }
virtual bool is_recursor(environment const &, name const &) const { return false; } virtual bool is_recursor(environment const &, name const &) const { return false; }
virtual bool is_builtin(environment const &, name const &) const { return false; }
}; };
static void tst3() { static void tst3() {