Rename define_uv -> add_uvar

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2013-08-09 15:33:34 -07:00
parent 3d9f9a12d1
commit 9fbe99bf58
7 changed files with 82 additions and 67 deletions

View file

@ -56,6 +56,7 @@ include_directories(${LEAN_SOURCE_DIR}/interval)
include_directories(${LEAN_SOURCE_DIR}/kernel) include_directories(${LEAN_SOURCE_DIR}/kernel)
include_directories(${LEAN_SOURCE_DIR}/kernel/arith) include_directories(${LEAN_SOURCE_DIR}/kernel/arith)
include_directories(${LEAN_SOURCE_DIR}/parsers) include_directories(${LEAN_SOURCE_DIR}/parsers)
include_directories(${LEAN_SOURCE_DIR}/frontend)
add_subdirectory(util) add_subdirectory(util)
set(EXTRA_LIBS ${EXTRA_LIBS} util) set(EXTRA_LIBS ${EXTRA_LIBS} util)
@ -67,6 +68,8 @@ add_subdirectory(kernel)
set(EXTRA_LIBS ${EXTRA_LIBS} kernel) set(EXTRA_LIBS ${EXTRA_LIBS} kernel)
add_subdirectory(kernel/arith) add_subdirectory(kernel/arith)
set(EXTRA_LIBS ${EXTRA_LIBS} kernel_arith) set(EXTRA_LIBS ${EXTRA_LIBS} kernel_arith)
add_subdirectory(frontend)
set(EXTRA_LIBS ${EXTRA_LIBS} frontend)
add_subdirectory(parsers) add_subdirectory(parsers)
set(EXTRA_LIBS ${EXTRA_LIBS} parser_common) set(EXTRA_LIBS ${EXTRA_LIBS} parser_common)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
@ -75,3 +78,4 @@ add_subdirectory(tests/util)
add_subdirectory(tests/util/numerics) add_subdirectory(tests/util/numerics)
add_subdirectory(tests/interval) add_subdirectory(tests/interval)
add_subdirectory(tests/kernel) add_subdirectory(tests/kernel)
add_subdirectory(tests/frontend)

View file

@ -187,8 +187,8 @@ MK_CONSTANT(eta_fn, name("Eta"));
MK_CONSTANT(imp_antisym_fn, name("ImpAntisym")); MK_CONSTANT(imp_antisym_fn, name("ImpAntisym"));
void add_basic_theory(environment & env) { void add_basic_theory(environment & env) {
env.define_uvar(uvar_name(m_lvl), level() + LEAN_DEFAULT_LEVEL_SEPARATION); env.add_uvar(uvar_name(m_lvl), level() + LEAN_DEFAULT_LEVEL_SEPARATION);
env.define_uvar(uvar_name(u_lvl), m_lvl + LEAN_DEFAULT_LEVEL_SEPARATION); env.add_uvar(uvar_name(u_lvl), m_lvl + LEAN_DEFAULT_LEVEL_SEPARATION);
expr p1 = Bool >> Bool; expr p1 = Bool >> Bool;
expr p2 = Bool >> p1; expr p2 = Bool >> p1;
expr f = Const("f"); expr f = Const("f");

View file

@ -152,7 +152,7 @@ struct environment::imp {
lean_unreachable(); lean_unreachable();
} }
level define_uvar(name const & n, level const & l) { level add_uvar(name const & n, level const & l) {
if (has_parent()) if (has_parent())
throw exception("invalid universe declaration, universe variables can only be declared in top-level environments"); throw exception("invalid universe declaration, universe variables can only be declared in top-level environments");
if (has_children()) if (has_children())
@ -298,18 +298,6 @@ environment::environment(std::shared_ptr<imp> const & ptr):
environment::~environment() { environment::~environment() {
} }
level environment::define_uvar(name const & n, level const & l) {
return m_imp->define_uvar(n, l);
}
bool environment::is_ge(level const & l1, level const & l2) const {
return m_imp->is_ge(l1, l2);
}
void environment::display_uvars(std::ostream & out) const {
m_imp->display_uvars(out);
}
environment environment::mk_child() const { environment environment::mk_child() const {
return environment(new imp(m_imp)); return environment(new imp(m_imp));
} }
@ -327,6 +315,18 @@ environment environment::parent() const {
return environment(m_imp->m_parent); return environment(m_imp->m_parent);
} }
level environment::add_uvar(name const & n, level const & l) {
return m_imp->add_uvar(n, l);
}
bool environment::is_ge(level const & l1, level const & l2) const {
return m_imp->is_ge(l1, l2);
}
void environment::display_uvars(std::ostream & out) const {
m_imp->display_uvars(out);
}
level environment::get_uvar(name const & n) const { level environment::get_uvar(name const & n) const {
return m_imp->get_uvar(n); return m_imp->get_uvar(n);
} }

View file

@ -30,30 +30,8 @@ public:
environment(); environment();
~environment(); ~environment();
/** // =======================================
\brief Define a new universe variable with name \c n and constraint <tt>n >= l</tt>. // Parent/Child environment management
Return the new variable.
\remark An exception is thrown if a universe inconsistency is detected.
*/
level define_uvar(name const & n, level const & l);
level define_uvar(name const & n) { return define_uvar(n, level()); }
/**
\brief Return true iff the constraint l1 >= l2 is implied by the constraints
in the environment.
*/
bool is_ge(level const & l1, level const & l2) const;
/** \brief Display universal variables, and their constraints */
void display_uvars(std::ostream & out) const;
/**
\brief Return universal variable with the given name.
Throw an exception if variable is not defined in this environment.
*/
level get_uvar(name const & n) const;
/** /**
\brief Create a child environment. This environment will only allow "read-only" operations until \brief Create a child environment. This environment will only allow "read-only" operations until
all children environments are deleted. all children environments are deleted.
@ -71,9 +49,38 @@ public:
\pre has_parent() \pre has_parent()
*/ */
environment parent() const; environment parent() const;
// =======================================
// =======================================
// Universe variables
/**
\brief Add a new universe variable with name \c n and constraint <tt>n >= l</tt>.
Return the new variable.
\remark An exception is thrown if a universe inconsistency is detected.
*/
level add_uvar(name const & n, level const & l);
level add_uvar(name const & n) { return add_uvar(n, level()); }
/**
\brief Return true iff the constraint l1 >= l2 is implied by the constraints
in the environment.
*/
bool is_ge(level const & l1, level const & l2) const;
/** \brief Display universal variables, and their constraints */
void display_uvars(std::ostream & out) const;
/**
\brief Return universal variable with the given name.
Throw an exception if variable is not defined in this environment.
*/
level get_uvar(name const & n) const;
// =======================================
// =======================================
// Environment Objects
enum class object_kind { Definition, Theorem, Var, Axiom }; enum class object_kind { Definition, Theorem, Var, Axiom };
/** /**
\brief Base class for environment objects \brief Base class for environment objects
It is just a place holder at this point. It is just a place holder at this point.
@ -208,12 +215,16 @@ public:
/** \brief Return an iterator to the end of the sequence of objects stored in this environment */ /** \brief Return an iterator to the end of the sequence of objects stored in this environment */
object_iterator end_objects() const { return object_iterator(*this, get_num_objects()); } object_iterator end_objects() const { return object_iterator(*this, get_num_objects()); }
// =======================================
// =======================================
// Pretty printing
/** \brief Display all objects stored in the environment */ /** \brief Display all objects stored in the environment */
void display_objects(std::ostream & out) const; void display_objects(std::ostream & out) const;
/** \brief Display universal variable constraints and objects stored in this environment and its parents. */ /** \brief Display universal variable constraints and objects stored in this environment and its parents. */
void display(std::ostream & out) const; void display(std::ostream & out) const;
// =======================================
}; };
inline std::ostream & operator<<(std::ostream & out, environment const & env) { env.display(out); return out; } inline std::ostream & operator<<(std::ostream & out, environment const & env) { env.display(out); return out; }
} }

View file

@ -18,8 +18,8 @@ using namespace lean;
static void tst1() { static void tst1() {
environment env; environment env;
level u = env.define_uvar("u", level() + 1); level u = env.add_uvar("u", level() + 1);
level w = env.define_uvar("w", u + 1); level w = env.add_uvar("w", u + 1);
lean_assert(!env.has_children()); lean_assert(!env.has_children());
lean_assert(!env.has_parent()); lean_assert(!env.has_parent());
{ {
@ -31,21 +31,21 @@ static void tst1() {
lean_assert(child.has_parent()); lean_assert(child.has_parent());
lean_assert(!env.has_parent()); lean_assert(!env.has_parent());
try { try {
level o = env.define_uvar("o", w + 1); level o = env.add_uvar("o", w + 1);
lean_unreachable(); lean_unreachable();
} catch (exception const & ex) { } catch (exception const & ex) {
std::cout << "expected error: " << ex.what() << "\n"; std::cout << "expected error: " << ex.what() << "\n";
} }
} }
std::cout << "tst1 checkpoint" << std::endl; std::cout << "tst1 checkpoint" << std::endl;
level o = env.define_uvar("o", w + 1); level o = env.add_uvar("o", w + 1);
lean_assert(!env.has_children()); lean_assert(!env.has_children());
env.display_uvars(std::cout); env.display_uvars(std::cout);
} }
static environment mk_child() { static environment mk_child() {
environment env; environment env;
level u = env.define_uvar("u", level() + 1); level u = env.add_uvar("u", level() + 1);
return env.mk_child(); return env.mk_child();
} }
@ -132,8 +132,8 @@ static void tst5() {
static void tst6() { static void tst6() {
environment env; environment env;
level u = env.define_uvar("u", level() + 1); level u = env.add_uvar("u", level() + 1);
level w = env.define_uvar("w", u + 1); level w = env.add_uvar("w", u + 1);
env.add_var("f", arrow(Type(u), Type(u))); env.add_var("f", arrow(Type(u), Type(u)));
expr t = Const("f")(Int); expr t = Const("f")(Int);
std::cout << "type of " << t << " is " << infer_type(t, env) << "\n"; std::cout << "type of " << t << " is " << infer_type(t, env) << "\n";

View file

@ -12,10 +12,10 @@ using namespace lean;
static void tst1() { static void tst1() {
environment env; environment env;
level l1 = env.define_uvar(name(name("l1"), "suffix"), level()); level l1 = env.add_uvar(name(name("l1"), "suffix"), level());
level l2 = env.define_uvar("l2", l1 + 10); level l2 = env.add_uvar("l2", l1 + 10);
level l3 = env.define_uvar("l3", max(l2, l1 + 3)); level l3 = env.add_uvar("l3", max(l2, l1 + 3));
level l4 = env.define_uvar("l4", max(l1 + 8, max(l2 + 2, l3 + 20))); level l4 = env.add_uvar("l4", max(l1 + 8, max(l2 + 2, l3 + 20)));
std::cout << pp(max(l1 + 8, max(l2 + 2, l3 + 20))) << "\n"; std::cout << pp(max(l1 + 8, max(l2 + 2, l3 + 20))) << "\n";
std::cout << pp(level()) << "\n"; std::cout << pp(level()) << "\n";
std::cout << pp(level()+1) << "\n"; std::cout << pp(level()+1) << "\n";
@ -26,9 +26,9 @@ static void tst1() {
static void tst2() { static void tst2() {
environment env; environment env;
level l1 = env.define_uvar("l1", level()); level l1 = env.add_uvar("l1", level());
try { try {
level l2 = env.define_uvar("l1", level()); level l2 = env.add_uvar("l1", level());
lean_unreachable(); lean_unreachable();
} }
catch (exception ex) { catch (exception ex) {
@ -38,10 +38,10 @@ static void tst2() {
static void tst3() { static void tst3() {
environment env; environment env;
level l1 = env.define_uvar("l1", level()); level l1 = env.add_uvar("l1", level());
level l2 = env.define_uvar("l2", l1 + ((1<<30) + 1024)); level l2 = env.add_uvar("l2", l1 + ((1<<30) + 1024));
try { try {
level l3 = env.define_uvar("l3", l2 + (1<<30)); level l3 = env.add_uvar("l3", l2 + (1<<30));
lean_unreachable(); lean_unreachable();
} }
catch (exception ex) { catch (exception ex) {
@ -51,12 +51,12 @@ static void tst3() {
static void tst4() { static void tst4() {
environment env; environment env;
level l1 = env.define_uvar("l1", level() + 1); level l1 = env.add_uvar("l1", level() + 1);
level l2 = env.define_uvar("l2", level() + 1); level l2 = env.add_uvar("l2", level() + 1);
level l3 = env.define_uvar("l3", max(l1, l2) + 1); level l3 = env.add_uvar("l3", max(l1, l2) + 1);
level l4 = env.define_uvar("l4", l3 + 1); level l4 = env.add_uvar("l4", l3 + 1);
level l5 = env.define_uvar("l5", l3 + 1); level l5 = env.add_uvar("l5", l3 + 1);
level l6 = env.define_uvar("l6", max(l4, l5) + 1); level l6 = env.add_uvar("l6", max(l4, l5) + 1);
lean_assert(!env.is_ge(l5 + 1, l6)); lean_assert(!env.is_ge(l5 + 1, l6));
lean_assert(env.is_ge(l6, l5)); lean_assert(env.is_ge(l6, l5));
lean_assert(env.is_ge(l6, max({l1, l2, l3, l4, l5}))); lean_assert(env.is_ge(l6, max({l1, l2, l3, l4, l5})));
@ -79,8 +79,8 @@ static void tst4() {
static void tst5() { static void tst5() {
environment env; environment env;
level l1 = env.define_uvar("l1", level() + 1); level l1 = env.add_uvar("l1", level() + 1);
level l2 = env.define_uvar("l2", level() + 1); level l2 = env.add_uvar("l2", level() + 1);
std::cout << max(l1, l1) << "\n"; std::cout << max(l1, l1) << "\n";
lean_assert(max(l1, l1) == l1); lean_assert(max(l1, l1) == l1);
lean_assert(max(l1+1, l1+1) == l1+1); lean_assert(max(l1+1, l1+1) == l1+1);

View file

@ -25,8 +25,8 @@ static void tst1() {
expr f = mk_pi("_", t0, t0); expr f = mk_pi("_", t0, t0);
std::cout << infer_type(f, env) << "\n"; std::cout << infer_type(f, env) << "\n";
lean_assert(infer_type(f, env) == Type(level()+1)); lean_assert(infer_type(f, env) == Type(level()+1));
level u = env.define_uvar("u", level() + 1); level u = env.add_uvar("u", level() + 1);
level v = env.define_uvar("v", level() + 1); level v = env.add_uvar("v", level() + 1);
expr g = mk_pi("_", Type(u), Type(v)); expr g = mk_pi("_", Type(u), Type(v));
std::cout << infer_type(g, env) << "\n"; std::cout << infer_type(g, env) << "\n";
lean_assert(infer_type(g, env) == Type(max(u+1, v+1))); lean_assert(infer_type(g, env) == Type(max(u+1, v+1)));
@ -48,7 +48,7 @@ static void tst1() {
static void tst2() { static void tst2() {
try{ try{
environment env; environment env;
level l1 = env.define_uvar("l1", level() + 1); level l1 = env.add_uvar("l1", level() + 1);
expr t0 = Type(); expr t0 = Type();
expr t1 = Type(l1); expr t1 = Type(l1);
expr F = expr F =