-
Notifications
You must be signed in to change notification settings - Fork 454
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: universe constraint approximations (#3981)
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.
- Loading branch information
1 parent
605cecd
commit 1630d9b
Showing
5 changed files
with
89 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
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` |