fix(kernel/typechecker): allow elaborator to infer (Type U+1)
In the new test elab8.lean, the parameter B is in (Type U+1). Before, this commit, the type checker was forcing all metavariables that must be types to be <= (Type U). This restriction was preventing the elaborator from succeeding in reasonable cases. Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
2368b4097c
commit
8c1f6b9055
5 changed files with 11 additions and 1 deletions
|
@ -16,6 +16,7 @@ namespace lean {
|
||||||
// Bultin universe variables m and u
|
// Bultin universe variables m and u
|
||||||
static level u_lvl(name("U"));
|
static level u_lvl(name("U"));
|
||||||
expr const TypeU = Type(u_lvl);
|
expr const TypeU = Type(u_lvl);
|
||||||
|
expr const TypeU1 = Type(u_lvl+1);
|
||||||
// =======================================
|
// =======================================
|
||||||
|
|
||||||
// =======================================
|
// =======================================
|
||||||
|
|
|
@ -11,6 +11,7 @@ Author: Leonardo de Moura
|
||||||
namespace lean {
|
namespace lean {
|
||||||
// See src/builtin/kernel.lean for signatures.
|
// See src/builtin/kernel.lean for signatures.
|
||||||
extern expr const TypeU;
|
extern expr const TypeU;
|
||||||
|
extern expr const TypeU1; // Type (U+1)
|
||||||
|
|
||||||
/** \brief Return the Lean Boolean type. */
|
/** \brief Return the Lean Boolean type. */
|
||||||
expr mk_bool_type();
|
expr mk_bool_type();
|
||||||
|
|
|
@ -58,7 +58,7 @@ class type_checker::imp {
|
||||||
return u;
|
return u;
|
||||||
if (has_metavar(u) && m_menv && m_uc) {
|
if (has_metavar(u) && m_menv && m_uc) {
|
||||||
justification jst = mk_type_expected_justification(ctx, s);
|
justification jst = mk_type_expected_justification(ctx, s);
|
||||||
m_uc->push_back(mk_convertible_constraint(ctx, e, TypeU, jst));
|
m_uc->push_back(mk_convertible_constraint(ctx, e, TypeU1, jst));
|
||||||
return u;
|
return u;
|
||||||
}
|
}
|
||||||
u = normalize(e, ctx, true);
|
u = normalize(e, ctx, true);
|
||||||
|
|
3
tests/lean/elab8.lean
Normal file
3
tests/lean/elab8.lean
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
definition D1 (A : (Type U)) (B : Nat → (Type U)) := true
|
||||||
|
definition D2 (A : (Type U)) (B : A → (Type U)) := true
|
||||||
|
definition D3 (A : (Type U)) (B : A → (Type U)) := false
|
5
tests/lean/elab8.lean.expected.out
Normal file
5
tests/lean/elab8.lean.expected.out
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
Set: pp::colors
|
||||||
|
Set: pp::unicode
|
||||||
|
Defined: D1
|
||||||
|
Defined: D2
|
||||||
|
Defined: D3
|
Loading…
Reference in a new issue