lean4-htt/tests/lean/run/2689.lean
Mario Carneiro a00cf6330f
fix: add a missing case to Level.geq (#2689)
This PR adds a case to `Level.geq` that is present in the kernel's level
`is_geq` procedure, making them consistent with one another.

This came up during testing of `lean4lean`. Currently `Level.geq`
differs from `level::is_geq` in the case of `max u v >= imax u v`. The
elaborator function is overly pessimistic and yields `false` on this
while the kernel function yields true. This comes up concretely in the
`Trans` class:
```lean
class Trans (r : α → β → Sort u) (s : β → γ → Sort v) (t : outParam (α → γ → Sort w)) where
  trans : r a b → s b c → t a c
```
The type of this class is `Sort (max (max (max (max (max (max 1 u) u_1)
u_2) u_3) v) w)` (where `u_1 u_2 u_3` are the levels of `α β γ`), but if
you try writing that type explicitly then the `class` command fails.
Omitting the type leaves the `class` to infer the universe level (the
command assumes the level is correct, and the kernel agrees it is), but
including the type then the elaborator checks the level inequality with
`Level.geq` and fails.

---------

Co-authored-by: Kyle Miller <kmill31415@gmail.com>
2024-11-19 21:27:00 +00:00

36 lines
1.4 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-!
# Tests of universe constraints for inductive types
https://github.com/leanprover/lean4/pull/2689 corrected the elaborator's `Level.geq`,
which was missing cases that the kernel `is_geq` could handle.
-/
/-!
This always worked. The universe level of `Trans₁` is inferred from the fields.
-/
structure Trans₁ {α : Sort a} {β : Sort b} {γ : Sort c}
(r : α → β → Sort u) (s : β → γ → Sort v) (t : outParam (αγ → Sort w)) where
trans : r a b → s b c → t a c
/-!
Regression test: This was failing. An explicit universe invokes `Level.geq`.
-/
structure Trans₂ {α : Sort a} {β : Sort b} {γ : Sort c}
(r : α → β → Sort u) (s : β → γ → Sort v) (t : outParam (αγ → Sort w)) :
Sort (max 1 a b c u v w) where
trans : r a b → s b c → t a c
/-!
Regression test: This was failing. An explicit universe invokes `Level.geq`.
-/
inductive Trans₃ {α : Sort a} {β : Sort b} {γ : Sort c}
(r : α → β → Sort u) (s : β → γ → Sort v) (t : outParam (αγ → Sort w)) :
Sort (max 1 a b c u v w) where
| mk : (∀ a b c, r a b → s b c → t a c) → Trans₃ r s t
/-!
Regression test: This was failing due to the included `Type (max u v)`
even though this is the inferred universe.
-/
inductive I (α : Type u) (Hom : αα → Sort v) : Type (max u v) where
| mk (id : ∀ X : α, Hom X X)