test(elaborator): add simple test
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
1548ffabb1
commit
b1b49e86e7
5 changed files with 81 additions and 2 deletions
|
@ -149,6 +149,7 @@ add_subdirectory(tests/util/interval)
|
||||||
add_subdirectory(tests/kernel)
|
add_subdirectory(tests/kernel)
|
||||||
add_subdirectory(tests/library)
|
add_subdirectory(tests/library)
|
||||||
add_subdirectory(tests/library/rewriter)
|
add_subdirectory(tests/library/rewriter)
|
||||||
|
add_subdirectory(tests/library/elaborator)
|
||||||
add_subdirectory(tests/frontends/lean)
|
add_subdirectory(tests/frontends/lean)
|
||||||
|
|
||||||
# Include style check
|
# Include style check
|
||||||
|
|
|
@ -112,7 +112,7 @@ format unification_constraint_choice::pp(formatter const & fmt, options const &
|
||||||
format or_op = unicode ? format("\u2295") : format("OR");
|
format or_op = unicode ? format("\u2295") : format("OR");
|
||||||
format body;
|
format body;
|
||||||
for (unsigned i = 0; i < m_num_choices; i++) {
|
for (unsigned i = 0; i < m_num_choices; i++) {
|
||||||
body += format{m_fmt, eq_op, fmt(m_ctx, m_choices[i], false, opts)};
|
body += group(paren(format{m_fmt, space(), eq_op, compose(line(), fmt(m_ctx, m_choices[i], false, opts))}));
|
||||||
if (i + 1 < m_num_choices)
|
if (i + 1 < m_num_choices)
|
||||||
body += format{space(), or_op, line()};
|
body += format{space(), or_op, line()};
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,21 +4,36 @@ Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
|
|
||||||
Author: Leonardo de Moura
|
Author: Leonardo de Moura
|
||||||
*/
|
*/
|
||||||
|
#include "util/pdeque.h"
|
||||||
|
#include "kernel/formatter.h"
|
||||||
#include "library/elaborator/elaborator.h"
|
#include "library/elaborator/elaborator.h"
|
||||||
|
|
||||||
namespace lean {
|
namespace lean {
|
||||||
class elaborator::imp {
|
class elaborator::imp {
|
||||||
|
typedef pdeque<unification_constraint> cnstr_queue;
|
||||||
|
|
||||||
|
struct state {
|
||||||
|
unsigned m_id;
|
||||||
|
metavar_env m_menv;
|
||||||
|
cnstr_queue m_queue;
|
||||||
|
};
|
||||||
|
|
||||||
environment const & m_env;
|
environment const & m_env;
|
||||||
std::shared_ptr<synthesizer> m_synthesizer;
|
std::shared_ptr<synthesizer> m_synthesizer;
|
||||||
std::shared_ptr<elaborator_plugin> m_plugin;
|
std::shared_ptr<elaborator_plugin> m_plugin;
|
||||||
bool m_interrupted;
|
bool m_interrupted;
|
||||||
public:
|
public:
|
||||||
imp(environment const & env, metavar_env const &, unsigned, unification_constraint const *,
|
imp(environment const & env, metavar_env const &, unsigned num_cnstrs, unification_constraint const * cnstrs,
|
||||||
std::shared_ptr<synthesizer> const & s, std::shared_ptr<elaborator_plugin> const & p):
|
std::shared_ptr<synthesizer> const & s, std::shared_ptr<elaborator_plugin> const & p):
|
||||||
m_env(env),
|
m_env(env),
|
||||||
m_synthesizer(s),
|
m_synthesizer(s),
|
||||||
m_plugin(p) {
|
m_plugin(p) {
|
||||||
m_interrupted = false;
|
m_interrupted = false;
|
||||||
|
|
||||||
|
formatter fmt = mk_simple_formatter();
|
||||||
|
for (unsigned i = 0; i < num_cnstrs; i++) {
|
||||||
|
std::cout << cnstrs[i].pp(fmt, options(), true) << "\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
substitution next() {
|
substitution next() {
|
||||||
|
|
3
src/tests/library/elaborator/CMakeLists.txt
Normal file
3
src/tests/library/elaborator/CMakeLists.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
add_executable(elaborator_tst elaborator.cpp)
|
||||||
|
target_link_libraries(elaborator_tst ${EXTRA_LIBS})
|
||||||
|
add_test(elaborator_tst ${CMAKE_CURRENT_BINARY_DIR}/elaborator_tst)
|
60
src/tests/library/elaborator/elaborator.cpp
Normal file
60
src/tests/library/elaborator/elaborator.cpp
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2013 Microsoft Corporation. All rights reserved.
|
||||||
|
Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
|
|
||||||
|
Author: Leonardo de Moura
|
||||||
|
*/
|
||||||
|
#include "util/test.h"
|
||||||
|
#include "kernel/environment.h"
|
||||||
|
#include "kernel/type_checker.h"
|
||||||
|
#include "kernel/abstract.h"
|
||||||
|
#include "library/arith/arith.h"
|
||||||
|
#include "library/all/all.h"
|
||||||
|
#include "library/elaborator/elaborator.h"
|
||||||
|
using namespace lean;
|
||||||
|
|
||||||
|
static void tst1() {
|
||||||
|
environment env;
|
||||||
|
import_all(env);
|
||||||
|
metavar_env menv;
|
||||||
|
buffer<unification_constraint> ucs;
|
||||||
|
type_checker checker(env);
|
||||||
|
expr list = Const("list");
|
||||||
|
expr nil = Const("nil");
|
||||||
|
expr cons = Const("cons");
|
||||||
|
expr A = Const("A");
|
||||||
|
env.add_var("list", Type() >> Type());
|
||||||
|
env.add_var("nil", Pi({A, Type()}, list(A)));
|
||||||
|
env.add_var("cons", Pi({A, Type()}, A >> (list(A) >> list(A))));
|
||||||
|
env.add_var("a", Int);
|
||||||
|
env.add_var("b", Int);
|
||||||
|
env.add_var("n", Nat);
|
||||||
|
env.add_var("m", Nat);
|
||||||
|
expr a = Const("a");
|
||||||
|
expr b = Const("b");
|
||||||
|
expr n = Const("n");
|
||||||
|
expr m = Const("m");
|
||||||
|
expr m1 = menv.mk_metavar();
|
||||||
|
expr m2 = menv.mk_metavar();
|
||||||
|
expr m3 = menv.mk_metavar();
|
||||||
|
expr A1 = menv.mk_metavar();
|
||||||
|
expr A2 = menv.mk_metavar();
|
||||||
|
expr A3 = menv.mk_metavar();
|
||||||
|
expr A4 = menv.mk_metavar();
|
||||||
|
expr F = cons(A1, m1(a), cons(A2, m2(n), cons(A3, m3(b), nil(A4))));
|
||||||
|
std::cout << F << "\n";
|
||||||
|
std::cout << checker.infer_type(F, context(), &menv, ucs) << "\n";
|
||||||
|
expr int_id = Fun({a, Int}, a);
|
||||||
|
expr nat_id = Fun({a, Nat}, a);
|
||||||
|
ucs.push_back(mk_choice_constraint(context(), m1, { int_id, mk_int_to_real_fn() }, trace()));
|
||||||
|
ucs.push_back(mk_choice_constraint(context(), m2, { nat_id, mk_nat_to_int_fn(), mk_nat_to_real_fn() }, trace()));
|
||||||
|
ucs.push_back(mk_choice_constraint(context(), m3, { int_id, mk_int_to_real_fn() }, trace()));
|
||||||
|
elaborator elb(env, menv, ucs.size(), ucs.data());
|
||||||
|
substitution s = elb.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
tst1();
|
||||||
|
return has_violations() ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue