2014-06-22 16:54:05 +00:00
|
|
|
local env = environment()
|
|
|
|
local N = Const("N")
|
|
|
|
env = add_decl(env, mk_var_decl("N", Type))
|
|
|
|
env = add_decl(env, mk_var_decl("f", mk_arrow(N, N)))
|
|
|
|
env = add_decl(env, mk_var_decl("a", N))
|
|
|
|
local f = Const("f")
|
|
|
|
local a = Const("a")
|
|
|
|
local m1 = mk_metavar("m1", mk_metavar("m2", mk_sort(mk_meta_univ("l"))))
|
|
|
|
local ngen = name_generator("tst")
|
2014-06-26 20:35:36 +00:00
|
|
|
local tc = type_checker(env, ngen)
|
2014-06-22 16:54:05 +00:00
|
|
|
assert(tc:num_scopes() == 0)
|
|
|
|
tc:push()
|
|
|
|
assert(tc:num_scopes() == 1)
|
|
|
|
print(tc:check(f(m1)))
|
2014-06-26 20:35:36 +00:00
|
|
|
assert(tc:next_cnstr())
|
|
|
|
assert(not tc:next_cnstr())
|
2014-06-22 16:54:05 +00:00
|
|
|
print(tc:check(f(f(m1))))
|
2014-06-26 20:35:36 +00:00
|
|
|
assert(not tc:next_cnstr()) -- New constraint is not generated
|
2014-06-22 16:54:05 +00:00
|
|
|
tc:pop() -- forget that we checked f(m1)
|
|
|
|
print(tc:check(f(m1)))
|
2014-06-26 20:35:36 +00:00
|
|
|
-- constraint is generated again
|
|
|
|
assert(tc:next_cnstr())
|
|
|
|
assert(not tc:next_cnstr())
|
2014-06-22 16:54:05 +00:00
|
|
|
check_error(function() tc:pop() end)
|