Prerequisites
Description
Currently universe unification will not solve max u v =?= max u ?v or max u v =?= max v ?u. (Lean 3 would do this.)
This is causing some problems in mathlib4.
Steps to Reproduce
universe u v
-- This is a mock-up of the `HasLimitsOfSize` typeclass in mathlib4.
class HLOS.{a,b} (C : Type b) where
P : Type a
-- We only have an instance when there is a "universe inequality".
instance HLOS_max : HLOS.{a} (Type max a b) := sorry
example : HLOS.{a} (Type max a b) := HLOS_max.{a, max a b} -- Success
example : HLOS.{a} (Type max a b) := inferInstance -- Fails: stuck at max a b =?= max a ?u
-- In mathlib4 we currently make use of the following workaround:
abbrev TypeMax := Type max u v
instance (priority := high) HLOS_max' : HLOS.{a} (TypeMax.{a, b}) := sorry
example : HLOS.{a} (TypeMax.{a, b}) := HLOS_max'.{a} -- Success
example : HLOS.{a} (TypeMax.{a, b}) := inferInstance -- Success
-- However, these still fail
example : Type max v u = TypeMax.{v} := rfl -- Fails: `max u v =?= max v ?u`
example : Type max v u = TypeMax.{u} := rfl -- Fails: `max u v =?= max u ?u`
-- and there are situations in which, however much we try to use `TypeMax`,
-- we find failing syntheses of: `HLOS.{a} (Type max a b)`
Expected behavior:
It would be nice if this all succeeded!
Actual behavior:
Failures with stuck at max a b =?= max a ?u.
Reproduces how often:
Consistently.
Versions
Lean (version 4.0.0-nightly-2023-06-20, commit a44dd71ad62a, Release)
Additional Information
I have a small patch at #2298, which resolves this issue in a fairly conservative manner.
However changing universe unification seems scary, and I hesitate to suggest this as a solution. It does, however, compile mathlib4 cleanly, with no performance regression (indeed, perhaps a speed-up, although maybe within the margin of error).
See for example leanprover-community/mathlib4#5536 and leanprover-community/mathlib4#5534, which respectively don't use this patch (and hence fail) and do use this patch (and succeed).
Prerequisites
Description
Currently universe unification will not solve
max u v =?= max u ?vormax u v =?= max v ?u. (Lean 3 would do this.)This is causing some problems in mathlib4.
Steps to Reproduce
Expected behavior:
It would be nice if this all succeeded!
Actual behavior:
Failures with
stuck at max a b =?= max a ?u.Reproduces how often:
Consistently.
Versions
Additional Information
I have a small patch at #2298, which resolves this issue in a fairly conservative manner.
However changing universe unification seems scary, and I hesitate to suggest this as a solution. It does, however, compile mathlib4 cleanly, with no performance regression (indeed, perhaps a speed-up, although maybe within the margin of error).
See for example leanprover-community/mathlib4#5536 and leanprover-community/mathlib4#5534, which respectively don't use this patch (and hence fail) and do use this patch (and succeed).