This PR adds level instantiation and normalization in `getDecLevel` and `getDecLevel?` before calling `decLevel`. `getLevel` can return levels with uninstantiated metavariables or un-normalized structure, such as `max ?u ?v` where the metavariables have already been assigned. After instantiation and normalization (via `normalizeLevel`), a level like `max ?u ?v` (with `?u := 1, ?v := 0`) simplifies to `1 = succ 0`, which `decLevel` can decrement. Without this step, `decLevel` sees `max ?u ?v`, tries to decrement both arms, fails on a zero-valued arm, and reports "invalid universe level". Concretely, this fixes `for` loops with `mut` variables of sort-polymorphic type (e.g. `PProd Nat True`) where the state tuple's universe level ends up as an uninstantiated `max`. The expected-output change in `doNotation1.lean` is because the `for` loop's unit type now resolves to `Unit` instead of `PUnit` due to the improved level handling.
11 lines
428 B
Text
11 lines
428 B
Text
/-!
|
|
Test that `for` loops with `mut` variables of sort-polymorphic type (e.g. `PProd`) work correctly.
|
|
`PProd Nat True : Sort (max 1 0)` has a `Prop` component, so `getDecLevel` must see the fully
|
|
instantiated and normalized level `1` rather than `max ?u ?v` with unresolved metavariables.
|
|
-/
|
|
|
|
def foo : Unit := Id.run do
|
|
let mut x : PProd Nat True := ⟨0, trivial⟩
|
|
for _ in [true] do
|
|
x := ⟨0, trivial⟩
|
|
break
|