lean4-htt/src/kernel/environment.h

109 lines
3.9 KiB
C++

/*
Copyright (c) 2013-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 <utility>
#include <memory>
#include <vector>
#include "runtime/optional.h"
#include "util/rc.h"
#include "util/list.h"
#include "util/rb_map.h"
#include "util/name_set.h"
#include "util/name_map.h"
#include "kernel/expr.h"
#include "kernel/declaration.h"
#ifndef LEAN_BELIEVER_TRUST_LEVEL
/* If an environment E is created with a trust level > LEAN_BELIEVER_TRUST_LEVEL, then
we can add declarations to E without type checking them. */
#define LEAN_BELIEVER_TRUST_LEVEL 1024
#endif
namespace lean {
class environment_extension {
public:
virtual ~environment_extension() {}
};
class environment : public object_ref {
friend class add_inductive_fn;
void check_name(name const & n) const;
void check_duplicated_univ_params(names ls) const;
void add_core(constant_info const & info);
void mark_quot_initialized();
environment add(constant_info const & info) const;
environment add_axiom(declaration const & d, bool check) const;
environment add_definition(declaration const & d, bool check) const;
environment add_theorem(declaration const & d, bool check) const;
environment add_opaque(declaration const & d, bool check) const;
environment add_mutual(declaration const & d, bool check) const;
environment add_quot() const;
environment add_inductive(declaration const & d) const;
public:
environment(unsigned trust_lvl = 0);
environment(environment const & other):object_ref(other) {}
environment(environment && other):object_ref(other) {}
explicit environment(b_obj_arg o, bool b):object_ref(o, b) {}
explicit environment(obj_arg o):object_ref(o) {}
~environment() {}
environment & operator=(environment const & other) { object_ref::operator=(other); return *this; }
environment & operator=(environment && other) { object_ref::operator=(other); return *this; }
/** \brief Return the trust level of this environment. */
unsigned trust_lvl() const;
bool is_quot_initialized() const;
void set_main_module(name const & n);
name get_main_module() const;
/** \brief Return information for the constant with name \c n (if it is defined in this environment). */
optional<constant_info> find(name const & n) const;
/** \brief Return information for the constant with name \c n. Throws and exception if constant declaration does not exist in this environment. */
constant_info get(name const & n) const;
/** \brief Extends the current environment with the given declaration */
environment add(declaration const & d, bool check = true) const;
/** \brief Register an environment extension. Every environment
object may contain this extension. The argument \c initial is
the initial value for the new extensions. The extension object
can be retrieved using the given token (unsigned integer) returned
by this method.
\remark The extension objects are created on demand.
\see get_extension */
static unsigned register_extension(environment_extension * initial);
/** \brief Return the extension with the given id. */
environment_extension const & get_extension(unsigned extid) const;
/** \brief Update the environment extension with the given id. */
environment update(unsigned extid, environment_extension * ext) const;
/** \brief Apply the function \c f to each constant */
void for_each_constant(std::function<void(constant_info const & d)> const & f) const;
/** \brief Pointer equality */
friend bool is_eqp(environment const & e1, environment const & e2) {
return e1.raw() == e2.raw();
}
void display_stats() const;
};
void check_no_metavar_no_fvar(environment const & env, name const & n, expr const & e);
void initialize_environment();
void finalize_environment();
}