We add a new configuration flag for `isDefEq`: `Meta.Config.univApprox`. When it is true, we approximate the solution for universe constraints such as - `u =?= max u ?v`, we use `?v := u`, and ignore the solution `?v := 0`. - `max u v =?= max u ?w`, we use `?w := v`, and ignore the solution `?w := max u v`. We only apply these approximations when there the contraints cannot be postponed anymore. These approximations prevent error messages such as ``` error: stuck at solving universe constraint max u ?u.3430 =?= u ``` This kind of error seems to appear in several Mathlib files. We currently do not use these approximations while synthesizing type class instances.
20 lines
801 B
Text
20 lines
801 B
Text
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
|
|
|
|
-- 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
|
|
|
|
-- We solve the following examples using approximations
|
|
example : Type max v u = TypeMax.{v} := rfl -- Previously failed with: `max u v =?= max v ?u`
|
|
example : Type max v u = TypeMax.{u} := rfl -- Previously failed with: `max u v =?= max u ?u`
|